[PATCH 03/27] [Kernel32]: ActCtx: added basic structures for storing assembly information

Eric Pouech eric.pouech at wanadoo.fr
Mon May 7 14:49:54 CDT 2007


---

 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 @@ WINE_DEFAULT_DEBUG_CHANNEL(actctx);
 
 #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 pActCtx)
 
     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