[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
This commit is contained in:
Giannis Adamopoulos 2018-02-20 10:58:14 +02:00
parent 730d81b9f7
commit ac950ea01d

View file

@ -49,30 +49,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
static const BOOL is_win64 = sizeof(void *) > sizeof(int); 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 ########## ########## Combining and Constructing paths ##########
*/ */
@ -1513,16 +1489,23 @@ static HRESULT _SHGetDefaultValue(HANDLE hToken, BYTE folder, LPWSTR pszPath)
if (!pszPath) if (!pszPath)
return E_INVALIDARG; return E_INVALIDARG;
switch (folder) if (!is_win64)
{ {
case CSIDL_PROGRAM_FILES: BOOL is_wow64;
if (IsWow64())
folder = CSIDL_PROGRAM_FILESX86; switch (folder)
break; {
case CSIDL_PROGRAM_FILES_COMMON: case CSIDL_PROGRAM_FILES:
if (IsWow64()) case CSIDL_PROGRAM_FILESX86:
folder = CSIDL_PROGRAM_FILESX86; IsWow64Process( GetCurrentProcess(), &is_wow64 );
break; 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) switch (CSIDL_Data[folder].type)