[PATCH 0/1] MR10075: wow64win: Redirect system32 in NtGdiMakeFontDir().
From: Elizabeth Figura <zfigura@codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58963 --- dlls/wow64win/gdi.c | 31 ++++++++++++++++++++++++++++++- dlls/wow64win/syscall.c | 5 +++++ dlls/wow64win/wow64win_private.h | 1 + 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/dlls/wow64win/gdi.c b/dlls/wow64win/gdi.c index 5a38f1860cf..22119fdafa2 100644 --- a/dlls/wow64win/gdi.c +++ b/dlls/wow64win/gdi.c @@ -82,6 +82,32 @@ static DWORD gdi_handle_type( HGDIOBJ obj ) return handle & NTGDI_HANDLE_TYPE_MASK; } +static const WCHAR *get_machine_wow64_dir( USHORT machine ) +{ + switch (machine) + { + case IMAGE_FILE_MACHINE_TARGET_HOST: return L"\\??\\C:\\windows\\system32\\"; + case IMAGE_FILE_MACHINE_I386: return L"\\??\\C:\\windows\\syswow64\\"; + case IMAGE_FILE_MACHINE_ARMNT: return L"\\??\\C:\\windows\\sysarm32\\"; + default: return NULL; + } +} + +static const WCHAR *redirect_path( const WCHAR *path ) +{ + static const WCHAR sysdir[] = L"\\??\\C:\\windows\\system32\\"; + size_t sysdir_len = wcslen( sysdir ); + size_t len = wcslen( path ); + WCHAR *ret; + + if (NtCurrentTeb()->TlsSlots[WOW64_TLS_FILESYSREDIR]) return path; + if (wcsnicmp( path, sysdir, sysdir_len )) return path; + ret = Wow64AllocateTemp( (len + 1) * sizeof(WCHAR) ); + memcpy( ret, get_machine_wow64_dir( current_machine ), sizeof(sysdir) - sizeof(WCHAR) ); + memcpy( ret + sysdir_len, path + sysdir_len, len - sysdir_len + 1 ); + return ret; +} + NTSTATUS WINAPI wow64_NtGdiAbortDoc( UINT *args ) { HDC hdc = get_handle( &args ); @@ -2373,7 +2399,10 @@ NTSTATUS WINAPI wow64_NtGdiMakeFontDir( UINT *args ) WCHAR *path = get_ptr( &args ); UINT len = get_ulong( &args ); - return NtGdiMakeFontDir( embed, buffer, size, path, len ); + /* Windows does not redirect the path here, which is presumably a bug. + * Stratego (1997) tries to create a font resource in system32 + * and fails on 64-bit Windows. */ + return NtGdiMakeFontDir( embed, buffer, size, redirect_path( path ), len ); } NTSTATUS WINAPI wow64_NtGdiMaskBlt( UINT *args ) diff --git a/dlls/wow64win/syscall.c b/dlls/wow64win/syscall.c index 624b3f995dd..4b4bfb1d93b 100644 --- a/dlls/wow64win/syscall.c +++ b/dlls/wow64win/syscall.c @@ -29,6 +29,9 @@ #include "rtlsupportapi.h" #include "wow64win_private.h" +static USHORT native_machine; +USHORT current_machine = 0; + static void DECLSPEC_NORETURN stub_syscall( const char *name ) { EXCEPTION_RECORD record; @@ -74,5 +77,7 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, void *reserved ) if (reason != DLL_PROCESS_ATTACH) return TRUE; LdrDisableThreadCalloutsForDll( inst ); NtCurrentTeb()->Peb->KernelCallbackTable = user_callbacks; + RtlWow64GetProcessMachines( GetCurrentProcess(), ¤t_machine, &native_machine ); + if (!current_machine) current_machine = native_machine; return TRUE; } diff --git a/dlls/wow64win/wow64win_private.h b/dlls/wow64win/wow64win_private.h index 956e38636a9..fc973f3b864 100644 --- a/dlls/wow64win/wow64win_private.h +++ b/dlls/wow64win/wow64win_private.h @@ -28,6 +28,7 @@ ALL_SYSCALLS32 #undef SYSCALL_ENTRY +extern USHORT current_machine; extern ntuser_callback user_callbacks[]; struct object_attr64 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10075
participants (2)
-
Elizabeth Figura -
Elizabeth Figura (@zfigura)