From: "Huw D. M. Davies" huw@codeweavers.com
https://www.winehq.org/pipermail/wine-devel/2022-April/213620.html
Co-authored-by: Davide Beatrici git@davidebeatrici.dev --- dlls/ntdll/loader.c | 11 ++++++++++- dlls/ntdll/unix/env.c | 12 +++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 043bce67ea9..1b706c14b04 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -1572,7 +1572,16 @@ static NTSTATUS MODULE_InitDLL( WINE_MODREF *wm, UINT reason, LPVOID lpReserved if (wm->ldr.Flags & LDR_DONT_RESOLVE_REFS) return STATUS_SUCCESS; if (wm->ldr.TlsIndex != -1) call_tls_callbacks( wm->ldr.DllBase, reason ); if (wm->ldr.Flags & LDR_WINE_INTERNAL && reason == DLL_PROCESS_ATTACH) - unix_funcs->init_builtin_dll( wm->ldr.DllBase ); + { + UNICODE_STRING name, value = { 0 }; + + RtlInitUnicodeString( &name, L"WINEWOW64" ); + if (RtlQueryEnvironmentVariable_U( NULL, &name, &value ) != STATUS_VARIABLE_NOT_FOUND) + TRACE("WINEWOW64 env var found, not calling init_builtin_dll()\n"); + else + unix_funcs->init_builtin_dll( wm->ldr.DllBase ); + } + if (!entry) return STATUS_SUCCESS;
if (TRACE_ON(relay)) diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 105038a34cb..dc9a2adf9a3 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -1929,7 +1929,17 @@ static RTL_USER_PROCESS_PARAMETERS *build_initial_params( void **module ) if (!status) { if (main_image_info.ImageCharacteristics & IMAGE_FILE_DLL) status = STATUS_INVALID_IMAGE_FORMAT; - if (main_image_info.Machine != current_machine) status = STATUS_INVALID_IMAGE_FORMAT; + if (main_image_info.Machine != current_machine) + { + static const WCHAR wow64W[] = {'W','I','N','E','W','O','W','6','4'}; + + if (find_env_var( env, env_pos, wow64W, ARRAY_SIZE(wow64W) )) + TRACE("WINEWOW64 env var found, ignoring arch mismatch (current: %04x, image: %04x)\n", + current_machine, + main_image_info.Machine); + else + status = STATUS_INVALID_IMAGE_FORMAT; + } }
if (status) /* try launching it through start.exe */