Zhiyi Zhang : rundll32: Activate context at ID 123 before calling library functions.

Alexandre Julliard julliard at winehq.org
Wed Apr 13 15:14:46 CDT 2022


Module: wine
Branch: master
Commit: d1d91288ffe4a2e3ac9ea6e1b643de4ccd549754
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d1d91288ffe4a2e3ac9ea6e1b643de4ccd549754

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Wed Apr 13 17:40:47 2022 +0800

rundll32: Activate context at ID 123 before calling library functions.

This is required to enable common control v6 for library functions called by rundll32.exe.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/rundll32/rundll32.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/programs/rundll32/rundll32.c b/programs/rundll32/rundll32.c
index fe9d17f0f48..2fb87fb8a50 100644
--- a/programs/rundll32/rundll32.c
+++ b/programs/rundll32/rundll32.c
@@ -276,9 +276,12 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine
     HWND hWnd;
     LPWSTR szDllName,szEntryPoint;
     void *entry_point = NULL;
-    BOOL unicode = FALSE, win16 = FALSE;
+    BOOL unicode = FALSE, win16 = FALSE, activated = FALSE;
+    HMODULE hDll, hCtx = INVALID_HANDLE_VALUE;
+    WCHAR path[MAX_PATH];
     STARTUPINFOW info;
-    HMODULE hDll;
+    ULONG_PTR cookie;
+    ACTCTXW ctx;
 
     hWnd=NULL;
     hDll=NULL;
@@ -301,6 +304,21 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine
         szEntryPoint = get_next_arg(&szCmdLine);
     WINE_TRACE("EntryPoint=%s\n",wine_dbgstr_w(szEntryPoint));
 
+    /* Activate context before DllMain() is called */
+    if (SearchPathW(NULL, szDllName, NULL, ARRAY_SIZE(path), path, NULL))
+    {
+        memset(&ctx, 0, sizeof(ctx));
+        ctx.cbSize = sizeof(ctx);
+        ctx.lpSource = path;
+        ctx.lpResourceName = MAKEINTRESOURCEW(123);
+        ctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID;
+        hCtx = CreateActCtxW(&ctx);
+        if (hCtx != INVALID_HANDLE_VALUE)
+            activated = ActivateActCtx(hCtx, &cookie);
+        else
+            WINE_TRACE("No manifest at ID 123 in %s\n", wine_dbgstr_w(path));
+    }
+
     /* Load the library */
     hDll=LoadLibraryW(szDllName);
     if (hDll) entry_point = get_entry_point32( hDll, szEntryPoint, &unicode );
@@ -367,6 +385,9 @@ CLEANUP:
         DestroyWindow(hWnd);
     if (hDll)
         FreeLibrary(hDll);
+    if (activated)
+        DeactivateActCtx(0, cookie);
+    ReleaseActCtx(hCtx);
     HeapFree(GetProcessHeap(),0,szDllName);
     return 0; /* rundll32 always returns 0! */
 }




More information about the wine-cvs mailing list