msi: Allow the enumeration of other users' patches.

This commit is contained in:
James Hawkins 2009-03-22 14:30:16 -07:00 committed by Alexandre Julliard
parent f7c615b188
commit c965d839f9
6 changed files with 72 additions and 51 deletions

View File

@ -3675,7 +3675,7 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
if (!msi_check_publish(package)) if (!msi_check_publish(package))
return ERROR_SUCCESS; return ERROR_SUCCESS;
rc = MSIREG_OpenProductKey(package->ProductCode, package->Context, rc = MSIREG_OpenProductKey(package->ProductCode, NULL, package->Context,
&hukey, TRUE); &hukey, TRUE);
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
goto end; goto end;

View File

@ -51,13 +51,14 @@ static UINT msi_locate_product(LPCWSTR szProduct, MSIINSTALLCONTEXT *context)
*context = MSIINSTALLCONTEXT_NONE; *context = MSIINSTALLCONTEXT_NONE;
if (MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERMANAGED, if (MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_USERMANAGED,
&hkey, FALSE) == ERROR_SUCCESS) &hkey, FALSE) == ERROR_SUCCESS)
*context = MSIINSTALLCONTEXT_USERMANAGED; *context = MSIINSTALLCONTEXT_USERMANAGED;
else if (MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE, else if (MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_MACHINE,
&hkey, FALSE) == ERROR_SUCCESS) &hkey, FALSE) == ERROR_SUCCESS)
*context = MSIINSTALLCONTEXT_MACHINE; *context = MSIINSTALLCONTEXT_MACHINE;
else if (MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED, else if (MSIREG_OpenProductKey(szProduct, NULL,
MSIINSTALLCONTEXT_USERUNMANAGED,
&hkey, FALSE) == ERROR_SUCCESS) &hkey, FALSE) == ERROR_SUCCESS)
*context = MSIINSTALLCONTEXT_USERUNMANAGED; *context = MSIINSTALLCONTEXT_USERUNMANAGED;
@ -639,11 +640,14 @@ UINT WINAPI MsiGetProductCodeW(LPCWSTR szComponent, LPWSTR szBuffer)
sz = GUID_SIZE; sz = GUID_SIZE;
unsquash_guid(squished_prod, szBuffer); unsquash_guid(squished_prod, szBuffer);
if (MSIREG_OpenProductKey(szBuffer, MSIINSTALLCONTEXT_USERMANAGED, if (MSIREG_OpenProductKey(szBuffer, NULL,
MSIINSTALLCONTEXT_USERMANAGED,
&prodkey, FALSE) == ERROR_SUCCESS || &prodkey, FALSE) == ERROR_SUCCESS ||
MSIREG_OpenProductKey(szBuffer, MSIINSTALLCONTEXT_USERUNMANAGED, MSIREG_OpenProductKey(szBuffer, NULL,
MSIINSTALLCONTEXT_USERUNMANAGED,
&prodkey, FALSE) == ERROR_SUCCESS || &prodkey, FALSE) == ERROR_SUCCESS ||
MSIREG_OpenProductKey(szBuffer, MSIINSTALLCONTEXT_MACHINE, MSIREG_OpenProductKey(szBuffer, NULL,
MSIINSTALLCONTEXT_MACHINE,
&prodkey, FALSE) == ERROR_SUCCESS) &prodkey, FALSE) == ERROR_SUCCESS)
{ {
RegCloseKey(prodkey); RegCloseKey(prodkey);
@ -714,12 +718,15 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
if (!squash_guid(szProduct, squished_pc)) if (!squash_guid(szProduct, squished_pc))
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
if ((r = MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERMANAGED, if ((r = MSIREG_OpenProductKey(szProduct, NULL,
MSIINSTALLCONTEXT_USERMANAGED,
&prodkey, FALSE)) != ERROR_SUCCESS && &prodkey, FALSE)) != ERROR_SUCCESS &&
(r = MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED, (r = MSIREG_OpenProductKey(szProduct, NULL,
MSIINSTALLCONTEXT_USERUNMANAGED,
&prodkey, FALSE)) != ERROR_SUCCESS && &prodkey, FALSE)) != ERROR_SUCCESS &&
(r = MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE, (r = MSIREG_OpenProductKey(szProduct, NULL,
&prodkey, FALSE)) == ERROR_SUCCESS) MSIINSTALLCONTEXT_MACHINE,
&prodkey, FALSE)) == ERROR_SUCCESS)
{ {
context = MSIINSTALLCONTEXT_MACHINE; context = MSIINSTALLCONTEXT_MACHINE;
} }
@ -1028,9 +1035,9 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
/* FIXME: dwContext is provided, no need to search for it */ /* FIXME: dwContext is provided, no need to search for it */
MSIREG_OpenProductKey(szProductCode, MSIINSTALLCONTEXT_USERMANAGED, MSIREG_OpenProductKey(szProductCode, NULL,MSIINSTALLCONTEXT_USERMANAGED,
&managed, FALSE); &managed, FALSE);
MSIREG_OpenProductKey(szProductCode, MSIINSTALLCONTEXT_USERUNMANAGED, MSIREG_OpenProductKey(szProductCode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
&prod, FALSE); &prod, FALSE);
MSIREG_OpenInstallProps(szProductCode, dwContext, NULL, &props, FALSE); MSIREG_OpenInstallProps(szProductCode, dwContext, NULL, &props, FALSE);
@ -1052,7 +1059,7 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
else if (dwContext == MSIINSTALLCONTEXT_MACHINE) else if (dwContext == MSIINSTALLCONTEXT_MACHINE)
{ {
package = INSTALLPROPERTY_LOCALPACKAGEW; package = INSTALLPROPERTY_LOCALPACKAGEW;
MSIREG_OpenProductKey(szProductCode, dwContext, &classes, FALSE); MSIREG_OpenProductKey(szProductCode, NULL, dwContext, &classes, FALSE);
if (!props && !classes) if (!props && !classes)
goto done; goto done;
@ -1314,7 +1321,7 @@ UINT WINAPI MsiGetPatchInfoExW(LPCWSTR szPatchCode, LPCWSTR szProductCode,
if (!lstrcmpW(szProperty, INSTALLPROPERTY_TRANSFORMSW)) if (!lstrcmpW(szProperty, INSTALLPROPERTY_TRANSFORMSW))
{ {
if (MSIREG_OpenProductKey(szProductCode, dwContext, if (MSIREG_OpenProductKey(szProductCode, NULL, dwContext,
&prod, FALSE) != ERROR_SUCCESS) &prod, FALSE) != ERROR_SUCCESS)
goto done; goto done;
@ -1483,7 +1490,7 @@ static BOOL msi_comp_find_prod_key(LPCWSTR prodcode, MSIINSTALLCONTEXT context)
UINT r; UINT r;
HKEY hkey; HKEY hkey;
r = MSIREG_OpenProductKey(prodcode, context, &hkey, FALSE); r = MSIREG_OpenProductKey(prodcode, NULL, context, &hkey, FALSE);
RegCloseKey(hkey); RegCloseKey(hkey);
return (r == ERROR_SUCCESS); return (r == ERROR_SUCCESS);
} }
@ -1632,11 +1639,11 @@ INSTALLSTATE WINAPI MsiQueryProductStateW(LPCWSTR szProduct)
if (lstrlenW(szProduct) != GUID_SIZE - 1) if (lstrlenW(szProduct) != GUID_SIZE - 1)
return INSTALLSTATE_INVALIDARG; return INSTALLSTATE_INVALIDARG;
if (MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERMANAGED, if (MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_USERMANAGED,
&prodkey, FALSE) != ERROR_SUCCESS && &prodkey, FALSE) != ERROR_SUCCESS &&
MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED, MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
&prodkey, FALSE) != ERROR_SUCCESS && &prodkey, FALSE) != ERROR_SUCCESS &&
MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE, MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_MACHINE,
&prodkey, FALSE) == ERROR_SUCCESS) &prodkey, FALSE) == ERROR_SUCCESS)
{ {
context = MSIINSTALLCONTEXT_MACHINE; context = MSIINSTALLCONTEXT_MACHINE;
@ -2115,9 +2122,10 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent,
} }
if (state != INSTALLSTATE_LOCAL && if (state != INSTALLSTATE_LOCAL &&
(MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED, (MSIREG_OpenProductKey(szProduct, NULL,
MSIINSTALLCONTEXT_USERUNMANAGED,
&hkey, FALSE) == ERROR_SUCCESS || &hkey, FALSE) == ERROR_SUCCESS ||
MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE, MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_MACHINE,
&hkey, FALSE) == ERROR_SUCCESS)) &hkey, FALSE) == ERROR_SUCCESS))
{ {
RegCloseKey(hkey); RegCloseKey(hkey);
@ -2758,11 +2766,11 @@ static USERINFOSTATE MSI_GetUserInfo(LPCWSTR szProduct,
if (!szProduct || !squash_guid(szProduct, squished_pc)) if (!szProduct || !squash_guid(szProduct, squished_pc))
return USERINFOSTATE_INVALIDARG; return USERINFOSTATE_INVALIDARG;
if (MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERMANAGED, if (MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_USERMANAGED,
&hkey, FALSE) != ERROR_SUCCESS && &hkey, FALSE) != ERROR_SUCCESS &&
MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED, MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
&hkey, FALSE) != ERROR_SUCCESS && &hkey, FALSE) != ERROR_SUCCESS &&
MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE, MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_MACHINE,
&hkey, FALSE) != ERROR_SUCCESS) &hkey, FALSE) != ERROR_SUCCESS)
{ {
return USERINFOSTATE_UNKNOWN; return USERINFOSTATE_UNKNOWN;

View File

@ -760,8 +760,8 @@ extern BOOL encode_base85_guid(GUID *,LPWSTR);
extern BOOL decode_base85_guid(LPCWSTR,GUID*); extern BOOL decode_base85_guid(LPCWSTR,GUID*);
extern UINT MSIREG_OpenUninstallKey(LPCWSTR szProduct, HKEY* key, BOOL create); extern UINT MSIREG_OpenUninstallKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_DeleteUninstallKey(LPCWSTR szProduct); extern UINT MSIREG_DeleteUninstallKey(LPCWSTR szProduct);
extern UINT MSIREG_OpenProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, extern UINT MSIREG_OpenProductKey(LPCWSTR szProduct, LPCWSTR szUserSid,
HKEY* key, BOOL create); MSIINSTALLCONTEXT context, HKEY* key, BOOL create);
extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context,
HKEY *key, BOOL create); HKEY *key, BOOL create);
extern UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create); extern UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);

View File

@ -504,11 +504,11 @@ UINT MSIREG_DeleteUninstallKey(LPCWSTR szProduct)
return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
} }
UINT MSIREG_OpenProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, UINT MSIREG_OpenProductKey(LPCWSTR szProduct, LPCWSTR szUserSid,
HKEY *key, BOOL create) MSIINSTALLCONTEXT context, HKEY *key, BOOL create)
{ {
UINT r; UINT r;
LPWSTR usersid; LPWSTR usersid = NULL;
HKEY root = HKEY_LOCAL_MACHINE; HKEY root = HKEY_LOCAL_MACHINE;
WCHAR squished_pc[GUID_SIZE]; WCHAR squished_pc[GUID_SIZE];
WCHAR keypath[MAX_PATH]; WCHAR keypath[MAX_PATH];
@ -531,14 +531,20 @@ UINT MSIREG_OpenProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context,
} }
else else
{ {
r = get_user_sid(&usersid); if (!szUserSid)
if (r != ERROR_SUCCESS || !usersid)
{ {
ERR("Failed to retrieve user SID: %d\n", r); r = get_user_sid(&usersid);
return r; if (r != ERROR_SUCCESS || !usersid)
{
ERR("Failed to retrieve user SID: %d\n", r);
return r;
}
szUserSid = usersid;
} }
sprintfW(keypath, szInstaller_LocalManagedProd_fmt, usersid, squished_pc); sprintfW(keypath, szInstaller_LocalManagedProd_fmt,
szUserSid, squished_pc);
LocalFree(usersid); LocalFree(usersid);
} }
@ -1659,6 +1665,7 @@ done:
} }
static UINT msi_get_patch_state(LPCWSTR prodcode, LPCWSTR usersid, static UINT msi_get_patch_state(LPCWSTR prodcode, LPCWSTR usersid,
MSIINSTALLCONTEXT context,
LPWSTR patch, MSIPATCHSTATE *state) LPWSTR patch, MSIPATCHSTATE *state)
{ {
DWORD type, val, size; DWORD type, val, size;
@ -1672,9 +1679,8 @@ static UINT msi_get_patch_state(LPCWSTR prodcode, LPCWSTR usersid,
*state = MSIPATCHSTATE_INVALID; *state = MSIPATCHSTATE_INVALID;
/* FIXME: usersid might not be current user */ r = MSIREG_OpenUserDataProductKey(prodcode, context,
r = MSIREG_OpenUserDataProductKey(prodcode, MSIINSTALLCONTEXT_USERUNMANAGED, usersid, &prod, FALSE);
NULL, &prod, FALSE);
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
return ERROR_NO_MORE_ITEMS; return ERROR_NO_MORE_ITEMS;
@ -1723,7 +1729,8 @@ static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid,
static const WCHAR szState[] = {'S','t','a','t','e',0}; static const WCHAR szState[] = {'S','t','a','t','e',0};
static const WCHAR szEmpty[] = {0}; static const WCHAR szEmpty[] = {0};
if (MSIREG_OpenProductKey(prodcode, context, &prod, FALSE) != ERROR_SUCCESS) if (MSIREG_OpenProductKey(prodcode, usersid, context,
&prod, FALSE) != ERROR_SUCCESS)
return ERROR_NO_MORE_ITEMS; return ERROR_NO_MORE_ITEMS;
size = 0; size = 0;
@ -1784,7 +1791,8 @@ static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid,
{ {
if (!(filter & MSIPATCHSTATE_APPLIED)) if (!(filter & MSIPATCHSTATE_APPLIED))
{ {
temp = msi_get_patch_state(prodcode, usersid, ptr, &state); temp = msi_get_patch_state(prodcode, usersid, context,
ptr, &state);
if (temp == ERROR_BAD_CONFIGURATION) if (temp == ERROR_BAD_CONFIGURATION)
{ {
r = ERROR_BAD_CONFIGURATION; r = ERROR_BAD_CONFIGURATION;
@ -1799,7 +1807,8 @@ static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid,
{ {
if (!(filter & MSIPATCHSTATE_APPLIED)) if (!(filter & MSIPATCHSTATE_APPLIED))
{ {
temp = msi_get_patch_state(prodcode, usersid, ptr, &state); temp = msi_get_patch_state(prodcode, usersid, context,
ptr, &state);
if (temp == ERROR_BAD_CONFIGURATION) if (temp == ERROR_BAD_CONFIGURATION)
{ {
r = ERROR_BAD_CONFIGURATION; r = ERROR_BAD_CONFIGURATION;
@ -2061,11 +2070,11 @@ UINT WINAPI MsiEnumPatchesW(LPCWSTR szProduct, DWORD iPatchIndex,
if (!lpPatchBuf || !lpTransformsBuf || !pcchTransformsBuf) if (!lpPatchBuf || !lpTransformsBuf || !pcchTransformsBuf)
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
if (MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERMANAGED, if (MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_USERMANAGED,
&prod, FALSE) != ERROR_SUCCESS && &prod, FALSE) != ERROR_SUCCESS &&
MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED, MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
&prod, FALSE) != ERROR_SUCCESS && &prod, FALSE) != ERROR_SUCCESS &&
MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE, MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_MACHINE,
&prod, FALSE) != ERROR_SUCCESS) &prod, FALSE) != ERROR_SUCCESS)
return ERROR_UNKNOWN_PRODUCT; return ERROR_UNKNOWN_PRODUCT;

View File

@ -64,21 +64,24 @@ static UINT OpenSourceKey(LPCWSTR szProduct, HKEY* key, DWORD dwOptions,
if (dwOptions & MSICODE_PATCH) if (dwOptions & MSICODE_PATCH)
rc = MSIREG_OpenUserPatchesKey(szProduct, &rootkey, create); rc = MSIREG_OpenUserPatchesKey(szProduct, &rootkey, create);
else else
rc = MSIREG_OpenProductKey(szProduct, context, &rootkey, create); rc = MSIREG_OpenProductKey(szProduct, NULL, context,
&rootkey, create);
} }
else if (context == MSIINSTALLCONTEXT_USERMANAGED) else if (context == MSIINSTALLCONTEXT_USERMANAGED)
{ {
if (dwOptions & MSICODE_PATCH) if (dwOptions & MSICODE_PATCH)
rc = MSIREG_OpenUserPatchesKey(szProduct, &rootkey, create); rc = MSIREG_OpenUserPatchesKey(szProduct, &rootkey, create);
else else
rc = MSIREG_OpenProductKey(szProduct, context, &rootkey, create); rc = MSIREG_OpenProductKey(szProduct, NULL, context,
&rootkey, create);
} }
else if (context == MSIINSTALLCONTEXT_MACHINE) else if (context == MSIINSTALLCONTEXT_MACHINE)
{ {
if (dwOptions & MSICODE_PATCH) if (dwOptions & MSICODE_PATCH)
rc = MSIREG_OpenPatchesKey(szProduct, &rootkey, create); rc = MSIREG_OpenPatchesKey(szProduct, &rootkey, create);
else else
rc = MSIREG_OpenProductKey(szProduct, context, &rootkey, create); rc = MSIREG_OpenProductKey(szProduct, NULL, context,
&rootkey, create);
} }
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
@ -903,13 +906,14 @@ UINT WINAPI MsiSourceListAddSourceW( LPCWSTR szProduct, LPCWSTR szUserName,
msi_free(psid); msi_free(psid);
} }
r = MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERMANAGED, r = MSIREG_OpenProductKey(szProduct, NULL,
&hkey, FALSE); MSIINSTALLCONTEXT_USERMANAGED, &hkey, FALSE);
if (r == ERROR_SUCCESS) if (r == ERROR_SUCCESS)
context = MSIINSTALLCONTEXT_USERMANAGED; context = MSIINSTALLCONTEXT_USERMANAGED;
else else
{ {
r = MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED, r = MSIREG_OpenProductKey(szProduct, NULL,
MSIINSTALLCONTEXT_USERUNMANAGED,
&hkey, FALSE); &hkey, FALSE);
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
return ERROR_UNKNOWN_PRODUCT; return ERROR_UNKNOWN_PRODUCT;

View File

@ -119,7 +119,7 @@ static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param)
uirow = MSI_CreateRecord(1); uirow = MSI_CreateRecord(1);
attributes = MSI_RecordGetInteger(rec,5); attributes = MSI_RecordGetInteger(rec,5);
while (rc == ERROR_SUCCESS) while (rc == ERROR_SUCCESS)
{ {
rc = RegEnumValueW(hkey, index, product, &sz, NULL, NULL, NULL, NULL); rc = RegEnumValueW(hkey, index, product, &sz, NULL, NULL, NULL, NULL);
@ -137,7 +137,7 @@ static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param)
INT r; INT r;
unsquash_guid(product, productid); unsquash_guid(product, productid);
rc = MSIREG_OpenProductKey(productid, package->Context, rc = MSIREG_OpenProductKey(productid, NULL, package->Context,
&hukey, FALSE); &hukey, FALSE);
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
{ {