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