Commit 930b429d authored by James Hawkins's avatar James Hawkins Committed by Alexandre Julliard

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

parent 947c4c31
...@@ -3589,13 +3589,15 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package) ...@@ -3589,13 +3589,15 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
if (package->Context == MSIINSTALLCONTEXT_MACHINE) if (package->Context == MSIINSTALLCONTEXT_MACHINE)
{ {
rc = MSIREG_OpenLocalUserDataProductKey(package->ProductCode, &hudkey, TRUE); rc = MSIREG_OpenUserDataProductKey(package->ProductCode, szLocalSid,
&hudkey, TRUE);
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
goto end; goto end;
} }
else else
{ {
rc = MSIREG_OpenUserDataProductKey(package->ProductCode, &hudkey, TRUE); rc = MSIREG_OpenUserDataProductKey(package->ProductCode, NULL,
&hudkey, TRUE);
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
goto end; goto end;
} }
......
...@@ -41,6 +41,7 @@ const WCHAR cszSourceDir[] = {'S','o','u','r','c','e','D','i','r',0}; ...@@ -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 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 cszRootDrive[] = {'R','O','O','T','D','R','I','V','E',0};
const WCHAR cszbs[]={'\\',0}; const WCHAR cszbs[]={'\\',0};
const WCHAR szLocalSid[] = {'S','-','1','-','5','-','1','8',0};
LPWSTR build_icon_path(MSIPACKAGE *package, LPCWSTR icon_name ) LPWSTR build_icon_path(MSIPACKAGE *package, LPCWSTR icon_name )
{ {
......
...@@ -1785,7 +1785,7 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent, ...@@ -1785,7 +1785,7 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent,
state = INSTALLSTATE_ABSENT; state = INSTALLSTATE_ABSENT;
if ((MSIREG_OpenLocalSystemProductKey(szProduct, &hkey, FALSE) == ERROR_SUCCESS || 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) && msi_reg_get_val_dword(hkey, wininstaller, &version) &&
GetFileAttributesW(path) != INVALID_FILE_ATTRIBUTES) GetFileAttributesW(path) != INVALID_FILE_ATTRIBUTES)
{ {
......
...@@ -776,8 +776,8 @@ extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL cr ...@@ -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_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
extern UINT MSIREG_OpenUserDataComponentKey(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_OpenPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);
extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, HKEY* key, BOOL create); extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, LPCWSTR szUserSid,
extern UINT MSIREG_OpenLocalUserDataProductKey(LPCWSTR szProduct, HKEY* key, BOOL create); HKEY* key, BOOL create);
extern UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, 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_OpenLocalSystemInstallProps(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create); extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
...@@ -1042,6 +1042,7 @@ extern const WCHAR cszSourceDir[]; ...@@ -1042,6 +1042,7 @@ extern const WCHAR cszSourceDir[];
extern const WCHAR cszSOURCEDIR[]; extern const WCHAR cszSOURCEDIR[];
extern const WCHAR cszRootDrive[]; extern const WCHAR cszRootDrive[];
extern const WCHAR cszbs[]; extern const WCHAR cszbs[];
extern const WCHAR szLocalSid[];
/* memory allocation macro functions */ /* memory allocation macro functions */
static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1); static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
......
...@@ -244,8 +244,6 @@ static const WCHAR szInstaller_ClassesUpgrade_fmt[] = { ...@@ -244,8 +244,6 @@ static const WCHAR szInstaller_ClassesUpgrade_fmt[] = {
'U','p','g','r','a','d','e','C','o','d','e','s','\\', 'U','p','g','r','a','d','e','C','o','d','e','s','\\',
'%','s',0}; '%','s',0};
static const WCHAR localsid[] = {'S','-','1','-','5','-','1','8',0};
BOOL unsquash_guid(LPCWSTR in, LPWSTR out) BOOL unsquash_guid(LPCWSTR in, LPWSTR out)
{ {
DWORD i,n=0; DWORD i,n=0;
...@@ -713,7 +711,7 @@ UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context ...@@ -713,7 +711,7 @@ UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context
if (context == MSIINSTALLCONTEXT_MACHINE) if (context == MSIINSTALLCONTEXT_MACHINE)
{ {
sprintfW(keypath, szUserDataFeatures_fmt, localsid, squished_pc); sprintfW(keypath, szUserDataFeatures_fmt, szLocalSid, squished_pc);
} }
else else
{ {
...@@ -765,7 +763,7 @@ UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL c ...@@ -765,7 +763,7 @@ UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL c
return ERROR_FUNCTION_FAILED; return ERROR_FUNCTION_FAILED;
TRACE("squished (%s)\n", debugstr_w(comp)); TRACE("squished (%s)\n", debugstr_w(comp));
sprintfW(keypath, szUserDataComp_fmt, localsid, comp); sprintfW(keypath, szUserDataComp_fmt, szLocalSid, comp);
if (create) if (create)
return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
...@@ -783,7 +781,7 @@ UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent) ...@@ -783,7 +781,7 @@ UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent)
return ERROR_FUNCTION_FAILED; return ERROR_FUNCTION_FAILED;
TRACE("squished (%s)\n", debugstr_w(comp)); 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); return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
} }
...@@ -842,7 +840,8 @@ UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent) ...@@ -842,7 +840,8 @@ UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent)
return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); 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; UINT rc;
WCHAR squished_pc[GUID_SIZE]; WCHAR squished_pc[GUID_SIZE];
...@@ -854,21 +853,26 @@ UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, HKEY *key, BOOL create) ...@@ -854,21 +853,26 @@ UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, HKEY *key, BOOL create)
return ERROR_FUNCTION_FAILED; return ERROR_FUNCTION_FAILED;
TRACE("squished (%s)\n", debugstr_w(squished_pc)); TRACE("squished (%s)\n", debugstr_w(squished_pc));
rc = get_user_sid(&usersid); if (!szUserSid)
if (rc != ERROR_SUCCESS || !usersid)
{ {
ERR("Failed to retrieve user SID: %d\n", rc); rc = get_user_sid(&usersid);
return rc; 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) if (create)
rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
else else
rc = RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); rc = RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
LocalFree(usersid);
return rc; return rc;
} }
...@@ -898,24 +902,6 @@ UINT MSIREG_OpenUserDataPatchKey(LPWSTR patch, HKEY *key, BOOL create) ...@@ -898,24 +902,6 @@ UINT MSIREG_OpenUserDataPatchKey(LPWSTR patch, HKEY *key, BOOL create)
return rc; 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, static UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, LPCWSTR szUserSID,
HKEY *key, BOOL create) HKEY *key, BOOL create)
{ {
...@@ -960,7 +946,7 @@ UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY *key, ...@@ -960,7 +946,7 @@ UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY *key,
UINT MSIREG_OpenLocalSystemInstallProps(LPCWSTR szProduct, HKEY *key, UINT MSIREG_OpenLocalSystemInstallProps(LPCWSTR szProduct, HKEY *key,
BOOL create) BOOL create)
{ {
return MSIREG_OpenInstallProps(szProduct, localsid, key, create); return MSIREG_OpenInstallProps(szProduct, szLocalSid, key, create);
} }
UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct) UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct)
...@@ -1780,7 +1766,7 @@ static UINT msi_get_patch_state(LPCWSTR prodcode, LPCWSTR usersid, ...@@ -1780,7 +1766,7 @@ static UINT msi_get_patch_state(LPCWSTR prodcode, LPCWSTR usersid,
*state = MSIPATCHSTATE_INVALID; *state = MSIPATCHSTATE_INVALID;
/* FIXME: usersid might not be current user */ /* FIXME: usersid might not be current user */
r = MSIREG_OpenUserDataProductKey(prodcode, &prod, FALSE); r = MSIREG_OpenUserDataProductKey(prodcode, NULL, &prod, FALSE);
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
return ERROR_NO_MORE_ITEMS; return ERROR_NO_MORE_ITEMS;
...@@ -1912,7 +1898,7 @@ static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid, ...@@ -1912,7 +1898,7 @@ static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid,
{ {
usersid = szEmpty; 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(localprod, szPatches, 0, KEY_READ, &localpatch) == ERROR_SUCCESS &&
RegOpenKeyExW(localpatch, ptr, 0, KEY_READ, &patchkey) == ERROR_SUCCESS) RegOpenKeyExW(localpatch, ptr, 0, KEY_READ, &patchkey) == ERROR_SUCCESS)
{ {
...@@ -1988,7 +1974,7 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid, ...@@ -1988,7 +1974,7 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
if (!szProductCode || !squash_guid(szProductCode, squished_pc)) if (!szProductCode || !squash_guid(szProductCode, squished_pc))
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
if (!lstrcmpW(szUserSid, localsid)) if (!lstrcmpW(szUserSid, szLocalSid))
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
if (dwContext & MSIINSTALLCONTEXT_MACHINE && szUserSid) if (dwContext & MSIINSTALLCONTEXT_MACHINE && szUserSid)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment