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