[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