Module: wine Branch: master Commit: 930b429d1ee5310690da2f437e52a76bfde1d345 URL: http://source.winehq.org/git/wine.git/?a=commit;h=930b429d1ee5310690da2f437e...
Author: James Hawkins jhawkins@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)