[PATCH 01/11] [Kernel32]: ActCtx: added basic structures for storing
assembly information
Eric Pouech
eric.pouech at wanadoo.fr
Wed May 9 15:07:29 CDT 2007
---
dlls/kernel32/actctx.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 87 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index 06bc8e5..0546c77 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -48,12 +48,80 @@ WINE_DEFAULT_DEBUG_CHANNEL(actctx);
#define ACTCTX_MAGIC 0xC07E3E11
+struct file_info
+{
+ ULONG type;
+ LPWSTR info;
+};
+
+struct version
+{
+ ULONG major;
+ ULONG minor;
+ ULONG build;
+ ULONG revision;
+};
+
+struct assembly_identity
+{
+ LPWSTR 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;
+};
+
struct actctx
{
ULONG magic;
LONG ref_count;
+ struct assembly* assemblies;
+ unsigned num_assemblies;
+ unsigned allocated_assemblies;
};
+static struct assembly* add_assembly(struct actctx* actctx, enum assembly_type at)
+{
+ struct assembly* assembly;
+
+ if (actctx->num_assemblies == actctx->allocated_assemblies)
+ {
+ if (actctx->allocated_assemblies)
+ {
+ actctx->allocated_assemblies *= 2;
+ actctx->assemblies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ actctx->assemblies,
+ actctx->allocated_assemblies * sizeof(struct assembly));
+ }
+ else
+ {
+ actctx->allocated_assemblies = 1;
+ actctx->assemblies = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct assembly));
+ }
+ }
+ if (!actctx->assemblies) return NULL;
+
+ assembly = &actctx->assemblies[actctx->num_assemblies++];
+ assembly->type = at;
+
+ return assembly;
+}
+
+static void free_assembly_identity(struct assembly_identity *ai)
+{
+ HeapFree(GetProcessHeap(), 0, ai->name);
+}
+
/***********************************************************************
* CreateActCtxA (KERNEL32.@)
*
@@ -139,6 +207,7 @@ done:
HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
{
struct actctx* actctx;
+ struct assembly* assembly;
DWORD ret = ERROR_SUCCESS;
TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
@@ -154,6 +223,17 @@ HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
actctx->magic = ACTCTX_MAGIC;
actctx->ref_count = 1;
+ actctx->assemblies = NULL;
+ actctx->num_assemblies = 0;
+ actctx->allocated_assemblies = 0;
+
+ assembly = add_assembly(actctx, APPLICATION_MANIFEST);
+ assembly->id.name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR));
+ assembly->id.version.major = 1;
+ assembly->id.version.minor = assembly->id.version.build =
+ assembly->id.version.revision = 0;
+ assembly->manifest.info = NULL;
+ assembly->manifest.type = ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE;
if (ret == ERROR_SUCCESS)
{
@@ -264,6 +344,13 @@ void WINAPI ReleaseActCtx(HANDLE hActCtx)
{
if (!InterlockedDecrement( &actctx->ref_count ))
{
+ unsigned i;
+
+ for (i = 0; i < actctx->num_assemblies; i++)
+ {
+ free_assembly_identity(&actctx->assemblies[i].id);
+ }
+ HeapFree(GetProcessHeap(), 0, actctx->assemblies);
actctx->magic = 0;
HeapFree(GetProcessHeap(), 0, actctx);
}
More information about the wine-patches
mailing list