James Hawkins : msi: Add the ability to open multiple users product keys.

Alexandre Julliard julliard at winehq.org
Tue Dec 9 06:24:33 CST 2008


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

Author: James Hawkins <jhawkins at codeweavers.com>
Date:   Tue Dec  9 00:20:56 2008 -0600

msi: Add the ability to open multiple users product keys.

---

 dlls/msi/action.c   |    6 +++-
 dlls/msi/helpers.c  |    1 +
 dlls/msi/msi.c      |    2 +-
 dlls/msi/msipriv.h  |    5 ++-
 dlls/msi/registry.c |   56 +++++++++++++++++++-------------------------------
 5 files changed, 30 insertions(+), 40 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 5d9ba65..e11421b 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -3589,13 +3589,15 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
 
     if (package->Context == MSIINSTALLCONTEXT_MACHINE)
     {
-        rc = MSIREG_OpenLocalUserDataProductKey(package->ProductCode, &hudkey, TRUE);
+        rc = MSIREG_OpenUserDataProductKey(package->ProductCode, szLocalSid,
+                                           &hudkey, TRUE);
         if (rc != ERROR_SUCCESS)
             goto end;
     }
     else
     {
-        rc = MSIREG_OpenUserDataProductKey(package->ProductCode, &hudkey, TRUE);
+        rc = MSIREG_OpenUserDataProductKey(package->ProductCode, NULL,
+                                           &hudkey, TRUE);
         if (rc != ERROR_SUCCESS)
             goto end;
     }
diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c
index d15d79a..5c9dfd0 100644
--- a/dlls/msi/helpers.c
+++ b/dlls/msi/helpers.c
@@ -41,6 +41,7 @@ const WCHAR cszSourceDir[] = {'S','o','u','r','c','e','D','i','r',0};
 const WCHAR cszSOURCEDIR[] = {'S','O','U','R','C','E','D','I','R',0};
 const WCHAR cszRootDrive[] = {'R','O','O','T','D','R','I','V','E',0};
 const WCHAR cszbs[]={'\\',0};
+const WCHAR szLocalSid[] = {'S','-','1','-','5','-','1','8',0};
 
 LPWSTR build_icon_path(MSIPACKAGE *package, LPCWSTR icon_name )
 {
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 68c0706..7de78f9 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -1785,7 +1785,7 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent,
         state = INSTALLSTATE_ABSENT;
 
         if ((MSIREG_OpenLocalSystemProductKey(szProduct, &hkey, FALSE) == ERROR_SUCCESS ||
-            MSIREG_OpenUserDataProductKey(szProduct, &hkey, FALSE) == ERROR_SUCCESS) &&
+            MSIREG_OpenUserDataProductKey(szProduct, NULL, &hkey, FALSE) == ERROR_SUCCESS) &&
             msi_reg_get_val_dword(hkey, wininstaller, &version) &&
             GetFileAttributesW(path) != INVALID_FILE_ATTRIBUTES)
         {
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index b72e1d7..ed2e349 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -776,8 +776,8 @@ extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL cr
 extern UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);
-extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, HKEY* key, BOOL create);
-extern UINT MSIREG_OpenLocalUserDataProductKey(LPCWSTR szProduct, HKEY* key, BOOL create);
+extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, LPCWSTR szUserSid,
+                                          HKEY* key, BOOL create);
 extern UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenLocalSystemInstallProps(LPCWSTR szProduct, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
@@ -1042,6 +1042,7 @@ extern const WCHAR cszSourceDir[];
 extern const WCHAR cszSOURCEDIR[];
 extern const WCHAR cszRootDrive[];
 extern const WCHAR cszbs[];
+extern const WCHAR szLocalSid[];
 
 /* memory allocation macro functions */
 static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index b413b6f..c624ffd 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -244,8 +244,6 @@ static const WCHAR szInstaller_ClassesUpgrade_fmt[] = {
 'U','p','g','r','a','d','e','C','o','d','e','s','\\',
 '%','s',0};
 
-static const WCHAR localsid[] = {'S','-','1','-','5','-','1','8',0};
-
 BOOL unsquash_guid(LPCWSTR in, LPWSTR out)
 {
     DWORD i,n=0;
@@ -713,7 +711,7 @@ UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context
 
     if (context == MSIINSTALLCONTEXT_MACHINE)
     {
-        sprintfW(keypath, szUserDataFeatures_fmt, localsid, squished_pc);
+        sprintfW(keypath, szUserDataFeatures_fmt, szLocalSid, squished_pc);
     }
     else
     {
@@ -765,7 +763,7 @@ UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL c
         return ERROR_FUNCTION_FAILED;
     TRACE("squished (%s)\n", debugstr_w(comp));
 
-    sprintfW(keypath, szUserDataComp_fmt, localsid, comp);
+    sprintfW(keypath, szUserDataComp_fmt, szLocalSid, comp);
 
     if (create)
         return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
@@ -783,7 +781,7 @@ UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent)
         return ERROR_FUNCTION_FAILED;
     TRACE("squished (%s)\n", debugstr_w(comp));
 
-    sprintfW(keypath, szUserDataComp_fmt, localsid, comp);
+    sprintfW(keypath, szUserDataComp_fmt, szLocalSid, comp);
     return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
 }
 
@@ -842,7 +840,8 @@ UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent)
     return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
 }
 
-UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, HKEY *key, BOOL create)
+UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, LPCWSTR szUserSid,
+                                   HKEY *key, BOOL create)
 {
     UINT rc;
     WCHAR squished_pc[GUID_SIZE];
@@ -854,21 +853,26 @@ UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, HKEY *key, BOOL create)
         return ERROR_FUNCTION_FAILED;
     TRACE("squished (%s)\n", debugstr_w(squished_pc));
 
-    rc = get_user_sid(&usersid);
-    if (rc != ERROR_SUCCESS || !usersid)
+    if (!szUserSid)
     {
-        ERR("Failed to retrieve user SID: %d\n", rc);
-        return rc;
-    }
+        rc = get_user_sid(&usersid);
+        if (rc != ERROR_SUCCESS || !usersid)
+        {
+            ERR("Failed to retrieve user SID: %d\n", rc);
+            return rc;
+        }
 
-    sprintfW(keypath, szUserDataProd_fmt, usersid, squished_pc);
+        sprintfW(keypath, szUserDataProd_fmt, usersid, squished_pc);
+        LocalFree(usersid);
+    }
+    else
+        sprintfW(keypath, szUserDataProd_fmt, szUserSid, squished_pc);
 
     if (create)
         rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
     else
         rc = RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
 
-    LocalFree(usersid);
     return rc;
 }
 
@@ -898,24 +902,6 @@ UINT MSIREG_OpenUserDataPatchKey(LPWSTR patch, HKEY *key, BOOL create)
     return rc;
 }
 
-UINT MSIREG_OpenLocalUserDataProductKey(LPCWSTR szProduct, HKEY *key, BOOL create)
-{
-    WCHAR squished_pc[GUID_SIZE];
-    WCHAR keypath[0x200];
-
-    TRACE("%s\n", debugstr_w(szProduct));
-    if (!squash_guid(szProduct, squished_pc))
-        return ERROR_FUNCTION_FAILED;
-    TRACE("squished (%s)\n", debugstr_w(squished_pc));
-
-    sprintfW(keypath, szUserDataProd_fmt, localsid, squished_pc);
-
-    if (create)
-        return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
-
-    return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
-}
-
 static UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, LPCWSTR szUserSID,
                                     HKEY *key, BOOL create)
 {
@@ -960,7 +946,7 @@ UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY *key,
 UINT MSIREG_OpenLocalSystemInstallProps(LPCWSTR szProduct, HKEY *key,
                                         BOOL create)
 {
-    return MSIREG_OpenInstallProps(szProduct, localsid, key, create);
+    return MSIREG_OpenInstallProps(szProduct, szLocalSid, key, create);
 }
 
 UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct)
@@ -1780,7 +1766,7 @@ static UINT msi_get_patch_state(LPCWSTR prodcode, LPCWSTR usersid,
     *state = MSIPATCHSTATE_INVALID;
 
     /* FIXME: usersid might not be current user */
-    r = MSIREG_OpenUserDataProductKey(prodcode, &prod, FALSE);
+    r = MSIREG_OpenUserDataProductKey(prodcode, NULL, &prod, FALSE);
     if (r != ERROR_SUCCESS)
         return ERROR_NO_MORE_ITEMS;
 
@@ -1912,7 +1898,7 @@ static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid,
         {
             usersid = szEmpty;
 
-            if (MSIREG_OpenLocalUserDataProductKey(prodcode, &localprod, FALSE) == ERROR_SUCCESS &&
+            if (MSIREG_OpenUserDataProductKey(prodcode, szLocalSid, &localprod, FALSE) == ERROR_SUCCESS &&
                 RegOpenKeyExW(localprod, szPatches, 0, KEY_READ, &localpatch) == ERROR_SUCCESS &&
                 RegOpenKeyExW(localpatch, ptr, 0, KEY_READ, &patchkey) == ERROR_SUCCESS)
             {
@@ -1988,7 +1974,7 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
     if (!szProductCode || !squash_guid(szProductCode, squished_pc))
         return ERROR_INVALID_PARAMETER;
 
-    if (!lstrcmpW(szUserSid, localsid))
+    if (!lstrcmpW(szUserSid, szLocalSid))
         return ERROR_INVALID_PARAMETER;
 
     if (dwContext & MSIINSTALLCONTEXT_MACHINE && szUserSid)




More information about the wine-cvs mailing list