James Hawkins : msi: Fix the ProcessComponents action to handle the package context.

Alexandre Julliard julliard at winehq.org
Wed Jun 18 12:58:08 CDT 2008


Module: wine
Branch: master
Commit: 288af81a7cd8e3a809160259e8f1aec8d54a2cef
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=288af81a7cd8e3a809160259e8f1aec8d54a2cef

Author: James Hawkins <jhawkins at codeweavers.com>
Date:   Wed Jun 18 00:51:13 2008 -0500

msi: Fix the ProcessComponents action to handle the package context.

---

 dlls/msi/action.c        |   13 +++++++++++--
 dlls/msi/msipriv.h       |    2 ++
 dlls/msi/registry.c      |   36 ++++++++++++++++++++++++++++++++++--
 dlls/msi/tests/install.c |   25 +++++++++++++++++++++++++
 4 files changed, 72 insertions(+), 4 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index ca7da98..30bb7cf 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -2886,7 +2886,11 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
             if (!comp->FullKeypath)
                 continue;
 
-            rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, &hkey, TRUE);
+            if (package->Context == MSIINSTALLCONTEXT_MACHINE)
+                rc = MSIREG_OpenLocalUserDataComponentKey(comp->ComponentId, &hkey, TRUE);
+            else
+                rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, &hkey, TRUE);
+
             if (rc != ERROR_SUCCESS)
                 continue;
 
@@ -2904,7 +2908,12 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
             RegCloseKey(hkey);
         }
         else if (ACTION_VerifyComponentForAction(comp, INSTALLSTATE_ABSENT))
-            MSIREG_DeleteUserDataComponentKey(comp->ComponentId);
+        {
+            if (package->Context == MSIINSTALLCONTEXT_MACHINE)
+                MSIREG_DeleteLocalUserDataComponentKey(comp->ComponentId);
+            else
+                MSIREG_DeleteUserDataComponentKey(comp->ComponentId);
+        }
 
         /* UI stuff */
         uirow = MSI_CreateRecord(3);
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 6dcd267..0982065 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -768,6 +768,7 @@ extern UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create);
+extern UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenProductsKey(LPCWSTR szProduct, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);
@@ -786,6 +787,7 @@ extern UINT MSIREG_OpenLocalSystemComponentKey(LPCWSTR szComponent, HKEY *key, B
 extern UINT MSIREG_OpenLocalClassesProductKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenLocalManagedProductKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
 extern UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct);
+extern UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent);
 extern UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent);
 
 extern LPWSTR msi_reg_get_val_str( HKEY hkey, LPCWSTR name );
diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index 37558e7..6135b47 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -214,6 +214,8 @@ static const WCHAR szInstaller_LocalManagedProd_fmt[] = {
 'I','n','s','t','a','l','l','e','r','\\',
 'P','r','o','d','u','c','t','s','\\','%','s',0};
 
+static const WCHAR localsid[] = {'S','-','1','-','5','-','1','8',0};
+
 BOOL unsquash_guid(LPCWSTR in, LPWSTR out)
 {
     DWORD i,n=0;
@@ -666,6 +668,38 @@ UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create)
     return rc;
 }
 
+UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create)
+{
+    WCHAR comp[GUID_SIZE];
+    WCHAR keypath[0x200];
+
+    TRACE("%s\n", debugstr_w(szComponent));
+    if (!squash_guid(szComponent, comp))
+        return ERROR_FUNCTION_FAILED;
+    TRACE("squished (%s)\n", debugstr_w(comp));
+
+    sprintfW(keypath, szUserDataComp_fmt, localsid, comp);
+
+    if (create)
+        return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+
+    return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+}
+
+UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent)
+{
+    WCHAR comp[GUID_SIZE];
+    WCHAR keypath[0x200];
+
+    TRACE("%s\n", debugstr_w(szComponent));
+    if (!squash_guid(szComponent, comp))
+        return ERROR_FUNCTION_FAILED;
+    TRACE("squished (%s)\n", debugstr_w(comp));
+
+    sprintfW(keypath, szUserDataComp_fmt, localsid, comp);
+    return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
+}
+
 UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create)
 {
     UINT rc;
@@ -795,8 +829,6 @@ UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY *key,
 UINT MSIREG_OpenLocalSystemInstallProps(LPCWSTR szProduct, HKEY *key,
                                         BOOL create)
 {
-    static const WCHAR localsid[] = {'S','-','1','-','5','-','1','8',0};
-
     return MSIREG_OpenInstallProps(szProduct, localsid, key, create);
 }
 
diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c
index 410121d..bf329a1 100644
--- a/dlls/msi/tests/install.c
+++ b/dlls/msi/tests/install.c
@@ -2773,6 +2773,31 @@ static void test_publish_processcomponents(void)
     RegDeleteKeyA(comp, "");
     RegCloseKey(comp);
 
+    /* ProcessComponents, machine */
+    r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1 ALLUSERS=1");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n");
+    ok(delete_pf("msitest", FALSE), "File not installed\n");
+
+    sprintf(keypath, keyfmt, "S-1-5-18");
+
+    res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    size = MAX_PATH;
+    res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB",
+                           NULL, NULL, (LPBYTE)val, &size);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+    ok(!lstrcmpA(val, "C:\\Program Files\\msitest\\maximus"),
+       "Expected \"%s\", got \"%s\"\n", "C:\\Program Files\\msitest\\maximus", val);
+
+    res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey);
+    ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
+
+    RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB");
+    RegDeleteKeyA(comp, "");
+    RegCloseKey(comp);
+
     DeleteFile(msifile);
     DeleteFile("msitest\\maximus");
     RemoveDirectory("msitest");




More information about the wine-cvs mailing list