Piotr Caban : msi: Check HKLM/Software/Classes/Installer/ Components path while looking for components.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Sep 9 09:57:36 CDT 2015
Module: wine
Branch: master
Commit: e8f4fea5a0a99e82b538b03b3b0299cceab114db
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e8f4fea5a0a99e82b538b03b3b0299cceab114db
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Sep 9 09:55:35 2015 +0200
msi: Check HKLM/Software/Classes/Installer/Components path while looking for components.
---
dlls/msi/registry.c | 12 +++++++++++-
dlls/msi/tests/action.c | 41 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index 2106ab2..e797f1e 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -173,6 +173,10 @@ static const WCHAR szUserComponents[] = {
'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
'I','n','s','t','a','l','l','e','r','\\','C','o','m','p','o','n','e','n','t','s','\\',0};
+static const WCHAR szInstaller_Components[] = {
+ 'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s','\\',
+ 'I','n','s','t','a','l','l','e','r','\\','C','o','m','p','o','n','e','n','t','s','\\',0};
+
static const WCHAR szUserFeatures[] = {
'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
'I','n','s','t','a','l','l','e','r','\\','F','e','a','t','u','r','e','s','\\',0};
@@ -650,6 +654,7 @@ UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, LPCWSTR szUserSid, MSIINS
UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY *key, BOOL create)
{
WCHAR squished_cc[GUID_SIZE], keypath[0x200];
+ UINT ret;
if (!squash_guid(szComponent, squished_cc)) return ERROR_FUNCTION_FAILED;
TRACE("%s squished %s\n", debugstr_w(szComponent), debugstr_w(squished_cc));
@@ -658,7 +663,12 @@ UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY *key, BOOL create)
strcatW(keypath, squished_cc);
if (create) return RegCreateKeyW(HKEY_CURRENT_USER, keypath, key);
- return RegOpenKeyW(HKEY_CURRENT_USER, keypath, key);
+ ret = RegOpenKeyW(HKEY_CURRENT_USER, keypath, key);
+ if (ret != ERROR_FILE_NOT_FOUND) return ret;
+
+ strcpyW(keypath, szInstaller_Components);
+ strcatW(keypath, squished_cc);
+ return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
}
UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid, HKEY *key, BOOL create)
diff --git a/dlls/msi/tests/action.c b/dlls/msi/tests/action.c
index 435aeeb..2aa5b0b 100644
--- a/dlls/msi/tests/action.c
+++ b/dlls/msi/tests/action.c
@@ -5854,10 +5854,14 @@ static void test_publish_components(void)
{
static const char keypath[] =
"Software\\Microsoft\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA";
+ static const char keypath2[] =
+ "Software\\Classes\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA";
UINT r;
LONG res;
HKEY key;
+ BYTE *data;
+ DWORD size;
if (is_process_limited())
{
@@ -5879,13 +5883,48 @@ static void test_publish_components(void)
}
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+ size = 0;
+ r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}",
+ "english.txt", INSTALLMODE_DEFAULT, NULL, &size);
+ ok(r == ERROR_SUCCESS, "MsiProvideQualifiedCompontent returned %d\n", r);
+
res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key);
ok(res == ERROR_SUCCESS, "components key not created %d\n", res);
- res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, NULL);
+ res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, &size);
+ ok(res == ERROR_SUCCESS, "value not found %d\n", res);
+
+ data = HeapAlloc(GetProcessHeap(), 0, size);
+ res = RegQueryValueExA(key, "english.txt", NULL, NULL, data, &size);
ok(res == ERROR_SUCCESS, "value not found %d\n", res);
RegCloseKey(key);
+ res = RegDeleteKeyA(HKEY_CURRENT_USER, keypath);
+ ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res);
+
+ res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath2, &key);
+ ok(res == ERROR_SUCCESS, "RegCreateKey failed %d\n", res);
+
+ res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size);
+ ok(res == ERROR_SUCCESS, "RegSetValueEx failed %d\n", res);
+ RegCloseKey(key);
+
+ size = 0;
+ r = MsiProvideQualifiedComponentA("{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}",
+ "english.txt", INSTALLMODE_DEFAULT, NULL, &size);
+ ok(r == ERROR_SUCCESS, "MsiProvideQualifiedCompontent returned %d\n", r);
+
+ res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, keypath2);
+ ok(res == ERROR_SUCCESS, "RegDeleteKey failed %d\n", res);
+
+ res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &key);
+ ok(res == ERROR_SUCCESS, "RegCreateKey failed %d\n", res);
+
+ res = RegSetValueExA(key, "english.txt", 0, REG_MULTI_SZ, data, size);
+ ok(res == ERROR_SUCCESS, "RegSetValueEx failed %d\n", res);
+ HeapFree(GetProcessHeap(), 0, data);
+ RegCloseKey(key);
+
r = MsiInstallProductA(msifile, "REMOVE=ALL");
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
More information about the wine-cvs
mailing list