[PATCH 03/11] [Kernel32]: ActCtx: now storing path info for app & config in manifest

Eric Pouech eric.pouech at wanadoo.fr
Wed May 9 15:07:42 CDT 2007


---

 dlls/kernel32/actctx.c |   33 ++++++++++++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletions(-)

diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index e951b05..36e65c2 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -95,6 +95,8 @@ struct actctx
 {
     ULONG               magic;
     LONG                ref_count;
+    struct file_info    config;
+    struct file_info    app;
     struct assembly*    assemblies;
     unsigned            num_assemblies;
     unsigned            allocated_assemblies;
@@ -108,6 +110,16 @@ struct actctx_loader
     unsigned            allocated_dependencies;
 };
 
+static WCHAR* strdupW(const WCHAR* str)
+{
+    WCHAR*      ptr;
+
+    if (!str) return NULL;
+    if (!(ptr = HeapAlloc(GetProcessHeap(), 0, (strlenW(str) + 1) * sizeof(WCHAR))))
+        return NULL;
+    return strcpyW(ptr, str);
+}
+
 static struct assembly* add_assembly(struct actctx* actctx, enum assembly_type at)
 {
     struct assembly*    assembly;
@@ -333,6 +345,8 @@ HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
     struct actctx*      actctx;
     struct assembly*    assembly;
     LPCWSTR             resname = NULL;
+    WCHAR               app_path[MAX_PATH];
+    LPWSTR              tmp;
     DWORD               ret = ERROR_SUCCESS;
 
     TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
@@ -348,6 +362,21 @@ HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
 
     actctx->magic = ACTCTX_MAGIC;
     actctx->ref_count = 1;
+    actctx->app.type = ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE;
+    if (pActCtx->dwFlags & ACTCTX_FLAG_APPLICATION_NAME_VALID)
+    {
+        tmp = (LPWSTR)pActCtx->lpApplicationName;
+    }
+    else
+    {
+        GetModuleFileNameW(NULL, app_path, sizeof(app_path) / sizeof(WCHAR));
+        for (tmp = app_path + lstrlenW(app_path); tmp >= app_path && *tmp != '\\'; tmp--);
+        tmp[1] = 0;
+        tmp = app_path;
+    }
+    actctx->app.info = strdupW(tmp);
+    actctx->config.type = ACTIVATION_CONTEXT_PATH_TYPE_NONE;
+    actctx->config.info = NULL;
     actctx->assemblies = NULL;
     actctx->num_assemblies = 0;
     actctx->allocated_assemblies = 0;
@@ -498,10 +527,12 @@ void WINAPI ReleaseActCtx(HANDLE hActCtx)
 
             for (i = 0; i < actctx->num_assemblies; i++)
             {
+                HeapFree(GetProcessHeap(), 0, actctx->assemblies[i].manifest.info);
                 free_assembly_identity(&actctx->assemblies[i].id);
             }
             HeapFree(GetProcessHeap(), 0, actctx->assemblies);
-            actctx->magic = 0;
+            HeapFree(GetProcessHeap(), 0, actctx->config.info);
+            HeapFree(GetProcessHeap(), 0, actctx->app.info);
             HeapFree(GetProcessHeap(), 0, actctx);
         }
     }





More information about the wine-patches mailing list