From 930b429d1ee5310690da2f437e52a76bfde1d345 Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Tue, 9 Dec 2008 00:20:56 -0600 Subject: [PATCH] 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 5d9ba654ddf..e11421bfc57 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 d15d79a2e5f..5c9dfd017ec 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 68c0706d9ba..7de78f9dd36 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 b72e1d7f630..ed2e34913ce 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 b413b6f768e..c624ffdd098 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)