Eric Pouech : ntdll:
Added basic structures for storing activation context assembly
information .
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 20 06:02:05 CDT 2007
Module: wine
Branch: master
Commit: 5f92f1f90113f2cac731243d89c841f8d4d11751
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5f92f1f90113f2cac731243d89c841f8d4d11751
Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date: Thu Jul 19 17:09:09 2007 +0200
ntdll: Added basic structures for storing activation context assembly information.
---
dlls/ntdll/actctx.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 115 insertions(+), 1 deletions(-)
diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index 2595061..74aeba0 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -50,13 +50,95 @@ WINE_DEFAULT_DEBUG_CHANNEL(actctx);
#define ACTCTX_MAGIC 0xC07E3E11
+struct file_info
+{
+ ULONG type;
+ WCHAR *info;
+};
+
+struct version
+{
+ USHORT major;
+ USHORT minor;
+ USHORT build;
+ USHORT revision;
+};
+
+struct assembly_identity
+{
+ WCHAR *name;
+ struct version version;
+};
+
+enum assembly_type
+{
+ APPLICATION_MANIFEST,
+ ASSEMBLY_MANIFEST
+};
+
+struct assembly
+{
+ enum assembly_type type;
+ struct assembly_identity id;
+ struct file_info manifest;
+};
+
typedef struct _ACTIVATION_CONTEXT
{
ULONG magic;
int ref_count;
+ struct file_info config;
+ struct file_info appdir;
+ struct assembly *assemblies;
+ unsigned int num_assemblies;
+ unsigned int allocated_assemblies;
} ACTIVATION_CONTEXT;
+static WCHAR *strdupW(const WCHAR* str)
+{
+ WCHAR* ptr;
+
+ if (!str) return NULL;
+ if (!(ptr = RtlAllocateHeap(GetProcessHeap(), 0, (strlenW(str) + 1) * sizeof(WCHAR))))
+ return NULL;
+ return strcpyW(ptr, str);
+}
+
+static struct assembly *add_assembly(ACTIVATION_CONTEXT *actctx, enum assembly_type at)
+{
+ struct assembly *assembly;
+
+ if (actctx->num_assemblies == actctx->allocated_assemblies)
+ {
+ void *ptr;
+ unsigned int new_count;
+ if (actctx->assemblies)
+ {
+ new_count = actctx->allocated_assemblies * 2;
+ ptr = RtlReAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY,
+ actctx->assemblies, new_count * sizeof(*assembly) );
+ }
+ else
+ {
+ new_count = 4;
+ ptr = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, new_count * sizeof(*assembly) );
+ }
+ if (!ptr) return NULL;
+ actctx->assemblies = ptr;
+ actctx->allocated_assemblies = new_count;
+ }
+
+ assembly = &actctx->assemblies[actctx->num_assemblies++];
+ assembly->type = at;
+ return assembly;
+}
+
+static void free_assembly_identity(struct assembly_identity *ai)
+{
+ RtlFreeHeap( GetProcessHeap(), 0, ai->name );
+}
+
static ACTIVATION_CONTEXT *check_actctx( HANDLE h )
{
ACTIVATION_CONTEXT *actctx = h;
@@ -80,6 +162,16 @@ static void actctx_release( ACTIVATION_CONTEXT *actctx )
{
if (interlocked_xchg_add( &actctx->ref_count, -1 ) == 1)
{
+ unsigned int i;
+
+ for (i = 0; i < actctx->num_assemblies; i++)
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, actctx->assemblies[i].manifest.info );
+ free_assembly_identity(&actctx->assemblies[i].id);
+ }
+ RtlFreeHeap( GetProcessHeap(), 0, actctx->config.info );
+ RtlFreeHeap( GetProcessHeap(), 0, actctx->appdir.info );
+ RtlFreeHeap( GetProcessHeap(), 0, actctx->assemblies );
actctx->magic = 0;
RtlFreeHeap( GetProcessHeap(), 0, actctx );
}
@@ -97,6 +189,7 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle, const void *ptr )
{
const ACTCTXW *pActCtx = ptr; /* FIXME: not the right structure */
ACTIVATION_CONTEXT *actctx;
+ struct assembly *assembly;
TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
@@ -104,14 +197,35 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle, const void *ptr )
(pActCtx->dwFlags & ~ACTCTX_FLAGS_ALL))
return STATUS_INVALID_PARAMETER;
- if (!(actctx = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*actctx) )))
+ if (!(actctx = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*actctx) )))
return STATUS_NO_MEMORY;
actctx->magic = ACTCTX_MAGIC;
actctx->ref_count = 1;
+ if (!(assembly = add_assembly( actctx, APPLICATION_MANIFEST ))) goto error;
+ if (!(assembly->id.name = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR) )))
+ goto error;
+ assembly->id.version.major = 1;
+ assembly->id.version.minor = 0;
+ assembly->id.version.build = 0;
+ assembly->id.version.revision = 0;
+ assembly->manifest.type = ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE;
+ assembly->manifest.info = NULL;
+
+ actctx->config.type = ACTIVATION_CONTEXT_PATH_TYPE_NONE;
+ actctx->config.info = NULL;
+ actctx->appdir.type = ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE;
+ if (pActCtx->dwFlags & ACTCTX_FLAG_APPLICATION_NAME_VALID)
+ actctx->appdir.info = strdupW( pActCtx->lpApplicationName );
+
*handle = actctx;
return STATUS_SUCCESS;
+
+error:
+ RtlFreeHeap( GetProcessHeap(), 0, assembly );
+ RtlFreeHeap( GetProcessHeap(), 0, actctx );
+ return STATUS_NO_MEMORY;
}
More information about the wine-cvs
mailing list