[PATCH 03/27] [Kernel32]: ActCtx: added basic structures for storing
assembly information
Eric Pouech
eric.pouech at wanadoo.fr
Sat Apr 28 07:21:20 CDT 2007
A+
---
dlls/kernel32/actctx.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 76 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index 7cc0593..7d95d4d 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -48,12 +48,70 @@ #define ACTCTX_FAKE_COOKIE ((ULONG_PTR)
#define ACTCTX_MAGIC 0xC07E3E11
+struct file_info
+{
+ ULONG type;
+ LPCWSTR info;
+};
+
+struct version
+{
+ ULONG major;
+ ULONG minor;
+ ULONG build;
+ ULONG revision;
+};
+
+struct assembly_identity
+{
+ LPCWSTR 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;
ULONG ref_count;
+ struct assembly* assemblies;
+ ULONG num_assemblies;
};
+static struct assembly* add_assembly(struct actctx* actctx, enum assembly_type at)
+{
+ struct assembly* assembly;
+
+ if (!actctx->num_assemblies)
+ actctx->assemblies = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct assembly));
+ else
+ actctx->assemblies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ actctx->assemblies,
+ (actctx->num_assemblies + 1) * 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, (void*)ai->name);
+}
+
/***********************************************************************
* CreateActCtxA (KERNEL32.@)
*
@@ -140,6 +198,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);
@@ -155,6 +214,16 @@ HANDLE WINAPI CreateActCtxW(PCACTCTXW pA
actctx->magic = ACTCTX_MAGIC;
actctx->ref_count = 1;
+ actctx->assemblies = NULL;
+ actctx->num_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)
{
@@ -265,6 +334,13 @@ void WINAPI ReleaseActCtx(HANDLE hActCtx
{
if (--actctx->ref_count == 0)
{
+ 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