Commit dfc9351b authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

msi: Set more 64-bit properties.

parent ddbf3c75
...@@ -659,6 +659,9 @@ static VOID set_installer_properties(MSIPACKAGE *package) ...@@ -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 szMsiAMD64[] = { 'M','s','i','A','M','D','6','4',0 };
static const WCHAR szMsix64[] = { 'M','s','i','x','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 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[] = { static const WCHAR szUserInfo[] = {
'S','O','F','T','W','A','R','E','\\', 'S','O','F','T','W','A','R','E','\\',
'M','i','c','r','o','s','o','f','t','\\', 'M','i','c','r','o','s','o','f','t','\\',
...@@ -698,14 +701,6 @@ static VOID set_installer_properties(MSIPACKAGE *package) ...@@ -698,14 +701,6 @@ static VOID set_installer_properties(MSIPACKAGE *package)
* RedirectedDllSupport * 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); SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, 0, pth);
strcatW(pth, szBackSlash); strcatW(pth, szBackSlash);
msi_set_property(package->db, szCommonAppDataFolder, pth); msi_set_property(package->db, szCommonAppDataFolder, pth);
...@@ -828,20 +823,53 @@ static VOID set_installer_properties(MSIPACKAGE *package) ...@@ -828,20 +823,53 @@ static VOID set_installer_properties(MSIPACKAGE *package)
sprintfW( bufstr, szFormat, MSI_MAJORVERSION * 100); sprintfW( bufstr, szFormat, MSI_MAJORVERSION * 100);
msi_set_property( package->db, szVersionDatabase, bufstr ); 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) if (sys_info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
{ {
sprintfW( bufstr, szIntFormat, sys_info.wProcessorLevel );
msi_set_property( package->db, szIntel, bufstr ); 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) 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, szMsiAMD64, bufstr );
msi_set_property( package->db, szMsix64, bufstr ); msi_set_property( package->db, szMsix64, bufstr );
msi_set_property( package->db, szVersionNT64, verstr );
GetSystemDirectoryW( pth, MAX_PATH ); GetSystemDirectoryW( pth, MAX_PATH );
PathAddBackslashW( pth );
msi_set_property( package->db, szSystem64Folder, 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. */ /* Screen properties. */
......
...@@ -3448,7 +3448,8 @@ static BOOL get_system_dirs(void) ...@@ -3448,7 +3448,8 @@ static BOOL get_system_dirs(void)
} }
size = MAX_PATH; 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); RegCloseKey(hkey);
return FALSE; return FALSE;
} }
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <msi.h> #include <msi.h>
#include <msiquery.h> #include <msiquery.h>
#include <srrestoreptapi.h> #include <srrestoreptapi.h>
#include <shlobj.h>
#include "wine/test.h" #include "wine/test.h"
...@@ -34,6 +35,7 @@ static const char msifile[] = "winetest-package.msi"; ...@@ -34,6 +35,7 @@ static const char msifile[] = "winetest-package.msi";
static char CURR_DIR[MAX_PATH]; static char CURR_DIR[MAX_PATH];
static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR); 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 *pConvertSidToStringSidA)(PSID, LPSTR*);
static BOOL (WINAPI *pGetTokenInformation)( HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD ); static BOOL (WINAPI *pGetTokenInformation)( HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD );
...@@ -42,6 +44,7 @@ static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); ...@@ -42,6 +44,7 @@ static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD);
static LONG (WINAPI *pRegDeleteKeyExW)(HKEY, LPCWSTR, REGSAM, DWORD); static LONG (WINAPI *pRegDeleteKeyExW)(HKEY, LPCWSTR, REGSAM, DWORD);
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
static void (WINAPI *pGetSystemInfo)(LPSYSTEM_INFO); static void (WINAPI *pGetSystemInfo)(LPSYSTEM_INFO);
static UINT (WINAPI *pGetSystemWow64DirectoryA)(LPSTR, UINT);
static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD); static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD);
static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*); static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*);
...@@ -51,12 +54,14 @@ static void init_functionpointers(void) ...@@ -51,12 +54,14 @@ static void init_functionpointers(void)
HMODULE hmsi = GetModuleHandleA("msi.dll"); HMODULE hmsi = GetModuleHandleA("msi.dll");
HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
HMODULE hshell32 = GetModuleHandleA("shell32.dll");
HMODULE hsrclient; HMODULE hsrclient;
#define GET_PROC(mod, func) \ #define GET_PROC(mod, func) \
p ## func = (void*)GetProcAddress(mod, #func); p ## func = (void*)GetProcAddress(mod, #func);
GET_PROC(hmsi, MsiApplyMultiplePatchesA); GET_PROC(hmsi, MsiApplyMultiplePatchesA);
GET_PROC(hshell32, SHGetFolderPathA);
GET_PROC(hadvapi32, ConvertSidToStringSidA); GET_PROC(hadvapi32, ConvertSidToStringSidA);
GET_PROC(hadvapi32, GetTokenInformation); GET_PROC(hadvapi32, GetTokenInformation);
...@@ -65,6 +70,7 @@ static void init_functionpointers(void) ...@@ -65,6 +70,7 @@ static void init_functionpointers(void)
GET_PROC(hadvapi32, RegDeleteKeyExW) GET_PROC(hadvapi32, RegDeleteKeyExW)
GET_PROC(hkernel32, IsWow64Process) GET_PROC(hkernel32, IsWow64Process)
GET_PROC(hkernel32, GetSystemInfo) GET_PROC(hkernel32, GetSystemInfo)
GET_PROC(hkernel32, GetSystemWow64DirectoryA)
hsrclient = LoadLibraryA("srclient.dll"); hsrclient = LoadLibraryA("srclient.dll");
GET_PROC(hsrclient, SRRemoveRestorePoint); GET_PROC(hsrclient, SRRemoveRestorePoint);
...@@ -9575,7 +9581,7 @@ static void test_installprops(void) ...@@ -9575,7 +9581,7 @@ static void test_installprops(void)
int res; int res;
UINT r; UINT r;
REGSAM access = KEY_ALL_ACCESS; REGSAM access = KEY_ALL_ACCESS;
BOOL wow64; BOOL wow64 = FALSE;
SYSTEM_INFO si; SYSTEM_INFO si;
if (pIsWow64Process && pIsWow64Process(GetCurrentProcess(), &wow64) && wow64) if (pIsWow64Process && pIsWow64Process(GetCurrentProcess(), &wow64) && wow64)
...@@ -9687,7 +9693,7 @@ static void test_installprops(void) ...@@ -9687,7 +9693,7 @@ static void test_installprops(void)
r = MsiGetProperty(hpkg, "ScreenY", buf, &size); r = MsiGetProperty(hpkg, "ScreenY", buf, &size);
ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf)); ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf));
if (pGetSystemInfo) if (pGetSystemInfo && pSHGetFolderPathA)
{ {
pGetSystemInfo(&si); pGetSystemInfo(&si);
if (S(U(si)).wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) if (S(U(si)).wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
...@@ -9708,8 +9714,185 @@ static void test_installprops(void) ...@@ -9708,8 +9714,185 @@ static void test_installprops(void)
size = MAX_PATH; size = MAX_PATH;
r = MsiGetProperty(hpkg, "System64Folder", buf, &size); r = MsiGetProperty(hpkg, "System64Folder", buf, &size);
ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); 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"); 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); CloseHandle(hkey1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment