Commit b198f4f2 authored by James Hawkins's avatar James Hawkins Committed by Alexandre Julliard

msi: Add the ability to open multiple users' component keys.

parent 930b429d
...@@ -2859,9 +2859,11 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package) ...@@ -2859,9 +2859,11 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
continue; continue;
if (package->Context == MSIINSTALLCONTEXT_MACHINE) if (package->Context == MSIINSTALLCONTEXT_MACHINE)
rc = MSIREG_OpenLocalUserDataComponentKey(comp->ComponentId, &hkey, TRUE); rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, szLocalSid,
&hkey, TRUE);
else else
rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, &hkey, TRUE); rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, NULL,
&hkey, TRUE);
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
continue; continue;
......
...@@ -618,7 +618,7 @@ UINT WINAPI MsiGetProductCodeW(LPCWSTR szComponent, LPWSTR szBuffer) ...@@ -618,7 +618,7 @@ UINT WINAPI MsiGetProductCodeW(LPCWSTR szComponent, LPWSTR szBuffer)
if (!squash_guid(szComponent, squished_comp)) if (!squash_guid(szComponent, squished_comp))
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
if (MSIREG_OpenUserDataComponentKey(szComponent, &compkey, FALSE) != ERROR_SUCCESS && if (MSIREG_OpenUserDataComponentKey(szComponent, NULL, &compkey, FALSE) != ERROR_SUCCESS &&
MSIREG_OpenLocalSystemComponentKey(szComponent, &compkey, FALSE) != ERROR_SUCCESS) MSIREG_OpenLocalSystemComponentKey(szComponent, &compkey, FALSE) != ERROR_SUCCESS)
{ {
return ERROR_UNKNOWN_COMPONENT; return ERROR_UNKNOWN_COMPONENT;
...@@ -1326,7 +1326,7 @@ static BOOL msi_comp_find_prodcode(LPWSTR squished_pc, ...@@ -1326,7 +1326,7 @@ static BOOL msi_comp_find_prodcode(LPWSTR squished_pc,
if (context == MSIINSTALLCONTEXT_MACHINE) if (context == MSIINSTALLCONTEXT_MACHINE)
r = MSIREG_OpenLocalSystemComponentKey(comp, &hkey, FALSE); r = MSIREG_OpenLocalSystemComponentKey(comp, &hkey, FALSE);
else else
r = MSIREG_OpenUserDataComponentKey(comp, &hkey, FALSE); r = MSIREG_OpenUserDataComponentKey(comp, NULL, &hkey, FALSE);
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
return FALSE; return FALSE;
...@@ -1777,7 +1777,7 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent, ...@@ -1777,7 +1777,7 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent,
state = INSTALLSTATE_UNKNOWN; state = INSTALLSTATE_UNKNOWN;
if (MSIREG_OpenLocalSystemComponentKey(szComponent, &hkey, FALSE) == ERROR_SUCCESS || if (MSIREG_OpenLocalSystemComponentKey(szComponent, &hkey, FALSE) == ERROR_SUCCESS ||
MSIREG_OpenUserDataComponentKey(szComponent, &hkey, FALSE) == ERROR_SUCCESS) MSIREG_OpenUserDataComponentKey(szComponent, NULL, &hkey, FALSE) == ERROR_SUCCESS)
{ {
path = msi_reg_get_val_str(hkey, squished_pc); path = msi_reg_get_val_str(hkey, squished_pc);
RegCloseKey(hkey); RegCloseKey(hkey);
...@@ -1803,7 +1803,7 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent, ...@@ -1803,7 +1803,7 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent,
RegCloseKey(hkey); RegCloseKey(hkey);
if (MSIREG_OpenLocalSystemComponentKey(szComponent, &hkey, FALSE) == ERROR_SUCCESS || if (MSIREG_OpenLocalSystemComponentKey(szComponent, &hkey, FALSE) == ERROR_SUCCESS ||
MSIREG_OpenUserDataComponentKey(szComponent, &hkey, FALSE) == ERROR_SUCCESS) MSIREG_OpenUserDataComponentKey(szComponent, NULL, &hkey, FALSE) == ERROR_SUCCESS)
{ {
msi_free(path); msi_free(path);
path = msi_reg_get_val_str(hkey, squished_pc); path = msi_reg_get_val_str(hkey, squished_pc);
...@@ -1991,9 +1991,9 @@ INSTALLSTATE WINAPI MsiQueryFeatureStateW(LPCWSTR szProduct, LPCWSTR szFeature) ...@@ -1991,9 +1991,9 @@ INSTALLSTATE WINAPI MsiQueryFeatureStateW(LPCWSTR szProduct, LPCWSTR szFeature)
StringFromGUID2(&guid, comp, GUID_SIZE); StringFromGUID2(&guid, comp, GUID_SIZE);
if (machine) if (machine)
rc = MSIREG_OpenLocalUserDataComponentKey(comp, &hkey, FALSE); rc = MSIREG_OpenUserDataComponentKey(comp, szLocalSid, &hkey, FALSE);
else else
rc = MSIREG_OpenUserDataComponentKey(comp, &hkey, FALSE); rc = MSIREG_OpenUserDataComponentKey(comp, NULL, &hkey, FALSE);
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
{ {
......
...@@ -773,8 +773,8 @@ extern UINT MSIREG_OpenInstallerFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL c ...@@ -773,8 +773,8 @@ extern UINT MSIREG_OpenInstallerFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL c
UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context,
HKEY *key, BOOL create); HKEY *key, BOOL create);
extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create); extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create);
extern UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create); extern UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid,
extern UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create); 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, LPCWSTR szUserSid, extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, LPCWSTR szUserSid,
HKEY* key, BOOL create); HKEY* key, BOOL create);
......
...@@ -753,24 +753,6 @@ UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create) ...@@ -753,24 +753,6 @@ UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create)
return rc; return rc;
} }
UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create)
{
WCHAR comp[GUID_SIZE];
WCHAR keypath[0x200];
TRACE("%s\n", debugstr_w(szComponent));
if (!squash_guid(szComponent, comp))
return ERROR_FUNCTION_FAILED;
TRACE("squished (%s)\n", debugstr_w(comp));
sprintfW(keypath, szUserDataComp_fmt, szLocalSid, comp);
if (create)
return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
}
UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent) UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent)
{ {
WCHAR comp[GUID_SIZE]; WCHAR comp[GUID_SIZE];
...@@ -785,7 +767,8 @@ UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent) ...@@ -785,7 +767,8 @@ UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent)
return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
} }
UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create) UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid,
HKEY *key, BOOL create)
{ {
UINT rc; UINT rc;
WCHAR comp[GUID_SIZE]; WCHAR comp[GUID_SIZE];
...@@ -797,21 +780,26 @@ UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create ...@@ -797,21 +780,26 @@ UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create
return ERROR_FUNCTION_FAILED; return ERROR_FUNCTION_FAILED;
TRACE("squished (%s)\n", debugstr_w(comp)); TRACE("squished (%s)\n", debugstr_w(comp));
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, szUserDataComp_fmt, usersid, comp); sprintfW(keypath, szUserDataComp_fmt, usersid, comp);
LocalFree(usersid);
}
else
sprintfW(keypath, szUserDataComp_fmt, szUserSid, comp);
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;
} }
...@@ -1433,7 +1421,7 @@ UINT WINAPI MsiEnumClientsW(LPCWSTR szComponent, DWORD index, LPWSTR szProduct) ...@@ -1433,7 +1421,7 @@ UINT WINAPI MsiEnumClientsW(LPCWSTR szComponent, DWORD index, LPWSTR szProduct)
if (!szComponent || !*szComponent || !szProduct) if (!szComponent || !*szComponent || !szProduct)
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
if (MSIREG_OpenUserDataComponentKey(szComponent, &hkeyComp, FALSE) != ERROR_SUCCESS && if (MSIREG_OpenUserDataComponentKey(szComponent, NULL, &hkeyComp, FALSE) != ERROR_SUCCESS &&
MSIREG_OpenLocalSystemComponentKey(szComponent, &hkeyComp, FALSE) != ERROR_SUCCESS) MSIREG_OpenLocalSystemComponentKey(szComponent, &hkeyComp, FALSE) != ERROR_SUCCESS)
return ERROR_UNKNOWN_COMPONENT; return ERROR_UNKNOWN_COMPONENT;
......
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