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)
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. */
......
......@@ -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;
}
......
......@@ -27,6 +27,7 @@
#include <msi.h>
#include <msiquery.h>
#include <srrestoreptapi.h>
#include <shlobj.h>
#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);
......
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