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