From ac950ea01d31e8a2a1058ae9d621ff1da91c736c Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Tue, 20 Feb 2018 10:58:14 +0200 Subject: [PATCH] [SHELL32] shellpath: sync a part of _SHGetDefaultValue with wine on 32bit builds CSIDL_PROGRAM_FILESX86 is treated as CSIDL_PROGRAM_FILES and on wow64 builds CSIDL_PROGRAM_FILES gets treated as CSIDL_PROGRAM_FILESX86 --- dll/win32/shell32/wine/shellpath.c | 49 ++++++++++-------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/dll/win32/shell32/wine/shellpath.c b/dll/win32/shell32/wine/shellpath.c index 3e2cd089ad5..df6d98b2f27 100644 --- a/dll/win32/shell32/wine/shellpath.c +++ b/dll/win32/shell32/wine/shellpath.c @@ -49,30 +49,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); static const BOOL is_win64 = sizeof(void *) > sizeof(int); -typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); - -static LPFN_ISWOW64PROCESS fnIsWow64Process = NULL; - -BOOL IsWow64() -{ - BOOL bIsWow64 = FALSE; - - if (!fnIsWow64Process) - { - fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( - GetModuleHandle(TEXT("kernel32")), "IsWow64Process"); - } - - if (!fnIsWow64Process) - return FALSE; - - if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) - return FALSE; - - return bIsWow64; -} - - /* ########## Combining and Constructing paths ########## */ @@ -1513,16 +1489,23 @@ static HRESULT _SHGetDefaultValue(HANDLE hToken, BYTE folder, LPWSTR pszPath) if (!pszPath) return E_INVALIDARG; - switch (folder) + if (!is_win64) { - case CSIDL_PROGRAM_FILES: - if (IsWow64()) - folder = CSIDL_PROGRAM_FILESX86; - break; - case CSIDL_PROGRAM_FILES_COMMON: - if (IsWow64()) - folder = CSIDL_PROGRAM_FILESX86; - break; + BOOL is_wow64; + + switch (folder) + { + case CSIDL_PROGRAM_FILES: + case CSIDL_PROGRAM_FILESX86: + IsWow64Process( GetCurrentProcess(), &is_wow64 ); + folder = is_wow64 ? CSIDL_PROGRAM_FILESX86 : CSIDL_PROGRAM_FILES; + break; + case CSIDL_PROGRAM_FILES_COMMON: + case CSIDL_PROGRAM_FILES_COMMONX86: + IsWow64Process( GetCurrentProcess(), &is_wow64 ); + folder = is_wow64 ? CSIDL_PROGRAM_FILES_COMMONX86 : CSIDL_PROGRAM_FILES_COMMON; + break; + } } switch (CSIDL_Data[folder].type)