From dfc9351ba41161c8726e9fde41cdc0466375d7c4 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 1 Oct 2010 15:39:11 +0200 Subject: [PATCH] msi: Set more 64-bit properties. --- dlls/msi/package.c | 50 ++++++++++--- dlls/msi/tests/install.c | 3 +- dlls/msi/tests/package.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 226 insertions(+), 14 deletions(-) diff --git a/dlls/msi/package.c b/dlls/msi/package.c index d2a5a83e26e..ecd263237fb 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -659,6 +659,9 @@ static VOID set_installer_properties(MSIPACKAGE *package) static const WCHAR szMsiAMD64[] = { 'M','s','i','A','M','D','6','4',0 }; static const WCHAR szMsix64[] = { 'M','s','i','x','6','4',0 }; static const WCHAR szSystem64Folder[] = { 'S','y','s','t','e','m','6','4','F','o','l','d','e','r',0 }; + static const WCHAR szCommonFiles64Folder[] = { 'C','o','m','m','o','n','F','i','l','e','s','6','4','F','o','l','d','e','r',0 }; + static const WCHAR szProgramFiles64Folder[] = { 'P','r','o','g','r','a','m','F','i','l','e','s','6','4','F','o','l','d','e','r',0 }; + static const WCHAR szVersionNT64[] = { 'V','e','r','s','i','o','n','N','T','6','4',0 }; static const WCHAR szUserInfo[] = { 'S','O','F','T','W','A','R','E','\\', 'M','i','c','r','o','s','o','f','t','\\', @@ -698,14 +701,6 @@ static VOID set_installer_properties(MSIPACKAGE *package) * RedirectedDllSupport */ - SHGetFolderPathW(NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, pth); - strcatW(pth, szBackSlash); - msi_set_property(package->db, szCommonFilesFolder, pth); - - SHGetFolderPathW(NULL, CSIDL_PROGRAM_FILES, NULL, 0, pth); - strcatW(pth, szBackSlash); - msi_set_property(package->db, szProgramFilesFolder, pth); - SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, 0, pth); strcatW(pth, szBackSlash); msi_set_property(package->db, szCommonAppDataFolder, pth); @@ -828,20 +823,53 @@ static VOID set_installer_properties(MSIPACKAGE *package) sprintfW( bufstr, szFormat, MSI_MAJORVERSION * 100); msi_set_property( package->db, szVersionDatabase, bufstr ); - GetSystemInfo( &sys_info ); + GetNativeSystemInfo( &sys_info ); + sprintfW( bufstr, szIntFormat, sys_info.wProcessorLevel ); if (sys_info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { - sprintfW( bufstr, szIntFormat, sys_info.wProcessorLevel ); msi_set_property( package->db, szIntel, bufstr ); + + GetSystemDirectoryW( pth, MAX_PATH ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szSystemFolder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szProgramFilesFolder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szCommonFilesFolder, pth ); } else if (sys_info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { - sprintfW( bufstr, szIntFormat, sys_info.wProcessorLevel ); msi_set_property( package->db, szMsiAMD64, bufstr ); msi_set_property( package->db, szMsix64, bufstr ); + msi_set_property( package->db, szVersionNT64, verstr ); GetSystemDirectoryW( pth, MAX_PATH ); + PathAddBackslashW( pth ); msi_set_property( package->db, szSystem64Folder, pth ); + + GetSystemWow64DirectoryW( pth, MAX_PATH ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szSystemFolder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szProgramFiles64Folder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILESX86, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szProgramFilesFolder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szCommonFiles64Folder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES_COMMONX86, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szCommonFilesFolder, pth ); } /* Screen properties. */ diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index f232b5023ad..7e60cb54ee9 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -3448,7 +3448,8 @@ static BOOL get_system_dirs(void) } size = MAX_PATH; - if (RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size)) { + if (RegQueryValueExA(hkey, "CommonFilesDir (x86)", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size) && + RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size)) { RegCloseKey(hkey); return FALSE; } diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c index 948922f4c82..cd4c4f206ab 100644 --- a/dlls/msi/tests/package.c +++ b/dlls/msi/tests/package.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "wine/test.h" @@ -34,6 +35,7 @@ static const char msifile[] = "winetest-package.msi"; static char CURR_DIR[MAX_PATH]; static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR); +static HRESULT (WINAPI *pSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR); static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*); static BOOL (WINAPI *pGetTokenInformation)( HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD ); @@ -42,6 +44,7 @@ static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); static LONG (WINAPI *pRegDeleteKeyExW)(HKEY, LPCWSTR, REGSAM, DWORD); static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); static void (WINAPI *pGetSystemInfo)(LPSYSTEM_INFO); +static UINT (WINAPI *pGetSystemWow64DirectoryA)(LPSTR, UINT); static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD); static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*); @@ -51,12 +54,14 @@ static void init_functionpointers(void) HMODULE hmsi = GetModuleHandleA("msi.dll"); HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); + HMODULE hshell32 = GetModuleHandleA("shell32.dll"); HMODULE hsrclient; #define GET_PROC(mod, func) \ p ## func = (void*)GetProcAddress(mod, #func); GET_PROC(hmsi, MsiApplyMultiplePatchesA); + GET_PROC(hshell32, SHGetFolderPathA); GET_PROC(hadvapi32, ConvertSidToStringSidA); GET_PROC(hadvapi32, GetTokenInformation); @@ -65,6 +70,7 @@ static void init_functionpointers(void) GET_PROC(hadvapi32, RegDeleteKeyExW) GET_PROC(hkernel32, IsWow64Process) GET_PROC(hkernel32, GetSystemInfo) + GET_PROC(hkernel32, GetSystemWow64DirectoryA) hsrclient = LoadLibraryA("srclient.dll"); GET_PROC(hsrclient, SRRemoveRestorePoint); @@ -9575,7 +9581,7 @@ static void test_installprops(void) int res; UINT r; REGSAM access = KEY_ALL_ACCESS; - BOOL wow64; + BOOL wow64 = FALSE; SYSTEM_INFO si; if (pIsWow64Process && pIsWow64Process(GetCurrentProcess(), &wow64) && wow64) @@ -9687,7 +9693,7 @@ static void test_installprops(void) r = MsiGetProperty(hpkg, "ScreenY", buf, &size); ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf)); - if (pGetSystemInfo) + if (pGetSystemInfo && pSHGetFolderPathA) { pGetSystemInfo(&si); if (S(U(si)).wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) @@ -9708,8 +9714,185 @@ static void test_installprops(void) size = MAX_PATH; r = MsiGetProperty(hpkg, "System64Folder", buf, &size); ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + GetSystemDirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "SystemFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pGetSystemWow64DirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFiles64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILESX86, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFiles64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES_COMMONX86, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "VersionNT64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); ok(buf[0], "property not set\n"); } + else if (S(U(si)).wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) + { + if (!wow64) + { + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "MsiAMD64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "Msix64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "System64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "SystemFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + GetSystemDirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFiles64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFiles64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "VersionNT64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + } + else + { + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "MsiAMD64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(buf[0], "property not set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "Msix64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(buf[0], "property not set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "System64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + GetSystemDirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "SystemFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pGetSystemWow64DirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFilesFolder64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILESX86, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFilesFolder64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES_COMMONX86, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "VersionNT64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(buf[0], "property not set\n"); + } + } } CloseHandle(hkey1); -- 2.11.4.GIT