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

msi: Add the ability to query a specific context for install properties.

parent 880b9199
...@@ -4158,19 +4158,10 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package) ...@@ -4158,19 +4158,10 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package)
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
return rc; return rc;
if (package->Context == MSIINSTALLCONTEXT_MACHINE) rc = MSIREG_OpenInstallProps(package->ProductCode, package->Context,
{ NULL, &props, TRUE);
rc = MSIREG_OpenInstallProps(package->ProductCode, szLocalSid, if (rc != ERROR_SUCCESS)
&props, TRUE); goto done;
if (rc != ERROR_SUCCESS)
goto done;
}
else
{
rc = MSIREG_OpenCurrentUserInstallProps(package->ProductCode, &props, TRUE);
if (rc != ERROR_SUCCESS)
goto done;
}
msi_make_package_local(package, props); msi_make_package_local(package, props);
...@@ -4428,11 +4419,8 @@ static UINT ACTION_RegisterUser(MSIPACKAGE *package) ...@@ -4428,11 +4419,8 @@ static UINT ACTION_RegisterUser(MSIPACKAGE *package)
if (!productid) if (!productid)
return ERROR_SUCCESS; return ERROR_SUCCESS;
if (package->Context == MSIINSTALLCONTEXT_MACHINE) rc = MSIREG_OpenInstallProps(package->ProductCode, package->Context,
rc = MSIREG_OpenInstallProps(package->ProductCode, szLocalSid, &hkey, TRUE); NULL, &hkey, TRUE);
else
rc = MSIREG_OpenCurrentUserInstallProps(package->ProductCode, &hkey, TRUE);
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
goto end; goto end;
......
...@@ -107,12 +107,7 @@ static UINT MSI_OpenProductW(LPCWSTR szProduct, MSIPACKAGE **package) ...@@ -107,12 +107,7 @@ static UINT MSI_OpenProductW(LPCWSTR szProduct, MSIPACKAGE **package)
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
return r; return r;
if (context == MSIINSTALLCONTEXT_MACHINE) r = MSIREG_OpenInstallProps(szProduct, context, NULL, &props, FALSE);
r = MSIREG_OpenInstallProps(szProduct, szLocalSid, &props, FALSE);
else if (context == MSIINSTALLCONTEXT_USERMANAGED ||
context == MSIINSTALLCONTEXT_USERUNMANAGED)
r = MSIREG_OpenCurrentUserInstallProps(szProduct, &props, FALSE);
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
return ERROR_UNKNOWN_PRODUCT; return ERROR_UNKNOWN_PRODUCT;
...@@ -406,11 +401,8 @@ static UINT msi_open_package(LPCWSTR product, MSIINSTALLCONTEXT context, ...@@ -406,11 +401,8 @@ static UINT msi_open_package(LPCWSTR product, MSIINSTALLCONTEXT context,
static const WCHAR szLocalPackage[] = { static const WCHAR szLocalPackage[] = {
'L','o','c','a','l','P','a','c','k','a','g','e',0}; 'L','o','c','a','l','P','a','c','k','a','g','e',0};
if (context == MSIINSTALLCONTEXT_MACHINE)
r = MSIREG_OpenInstallProps(product, szLocalSid, &props, FALSE);
else
r = MSIREG_OpenCurrentUserInstallProps(product, &props, FALSE);
r = MSIREG_OpenInstallProps(product, context, NULL, &props, FALSE);
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
return ERROR_BAD_CONFIGURATION; return ERROR_BAD_CONFIGURATION;
...@@ -693,12 +685,12 @@ static LPWSTR msi_reg_get_value(HKEY hkey, LPCWSTR name, DWORD *type) ...@@ -693,12 +685,12 @@ static LPWSTR msi_reg_get_value(HKEY hkey, LPCWSTR name, DWORD *type)
static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute, static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
awstring *szValue, LPDWORD pcchValueBuf) awstring *szValue, LPDWORD pcchValueBuf)
{ {
MSIINSTALLCONTEXT context = MSIINSTALLCONTEXT_USERUNMANAGED;
UINT r = ERROR_UNKNOWN_PROPERTY; UINT r = ERROR_UNKNOWN_PROPERTY;
HKEY prodkey, userdata, source; HKEY prodkey, userdata, source;
LPWSTR val = NULL; LPWSTR val = NULL;
WCHAR squished_pc[GUID_SIZE]; WCHAR squished_pc[GUID_SIZE];
WCHAR packagecode[GUID_SIZE]; WCHAR packagecode[GUID_SIZE];
BOOL classes = FALSE;
BOOL badconfig = FALSE; BOOL badconfig = FALSE;
LONG res; LONG res;
DWORD save, type = REG_NONE; DWORD save, type = REG_NONE;
...@@ -729,13 +721,10 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute, ...@@ -729,13 +721,10 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
(r = MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE, (r = MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE,
&prodkey, FALSE)) == ERROR_SUCCESS) &prodkey, FALSE)) == ERROR_SUCCESS)
{ {
classes = TRUE; context = MSIINSTALLCONTEXT_MACHINE;
} }
if (classes) MSIREG_OpenInstallProps(szProduct, context, NULL, &userdata, FALSE);
MSIREG_OpenInstallProps(szProduct, szLocalSid, &userdata, FALSE);
else
MSIREG_OpenCurrentUserInstallProps(szProduct, &userdata, FALSE);
if (!lstrcmpW(szAttribute, INSTALLPROPERTY_HELPLINKW) || if (!lstrcmpW(szAttribute, INSTALLPROPERTY_HELPLINKW) ||
!lstrcmpW(szAttribute, INSTALLPROPERTY_HELPTELEPHONEW) || !lstrcmpW(szAttribute, INSTALLPROPERTY_HELPTELEPHONEW) ||
...@@ -1038,15 +1027,17 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid, ...@@ -1038,15 +1027,17 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
if (dwContext == MSIINSTALLCONTEXT_MACHINE && szUserSid) if (dwContext == MSIINSTALLCONTEXT_MACHINE && szUserSid)
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
/* FIXME: dwContext is provided, no need to search for it */
MSIREG_OpenProductKey(szProductCode, MSIINSTALLCONTEXT_USERMANAGED, MSIREG_OpenProductKey(szProductCode, MSIINSTALLCONTEXT_USERMANAGED,
&managed, FALSE); &managed, FALSE);
MSIREG_OpenProductKey(szProductCode, MSIINSTALLCONTEXT_USERUNMANAGED, MSIREG_OpenProductKey(szProductCode, MSIINSTALLCONTEXT_USERUNMANAGED,
&prod, FALSE); &prod, FALSE);
MSIREG_OpenInstallProps(szProductCode, dwContext, NULL, &props, FALSE);
if (dwContext == MSIINSTALLCONTEXT_USERUNMANAGED) if (dwContext == MSIINSTALLCONTEXT_USERUNMANAGED)
{ {
package = INSTALLPROPERTY_LOCALPACKAGEW; package = INSTALLPROPERTY_LOCALPACKAGEW;
MSIREG_OpenCurrentUserInstallProps(szProductCode, &props, FALSE);
if (!props && !prod) if (!props && !prod)
goto done; goto done;
...@@ -1054,7 +1045,6 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid, ...@@ -1054,7 +1045,6 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
else if (dwContext == MSIINSTALLCONTEXT_USERMANAGED) else if (dwContext == MSIINSTALLCONTEXT_USERMANAGED)
{ {
package = managed_local_package; package = managed_local_package;
MSIREG_OpenCurrentUserInstallProps(szProductCode, &props, FALSE);
if (!props && !managed) if (!props && !managed)
goto done; goto done;
...@@ -1062,7 +1052,6 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid, ...@@ -1062,7 +1052,6 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
else if (dwContext == MSIINSTALLCONTEXT_MACHINE) else if (dwContext == MSIINSTALLCONTEXT_MACHINE)
{ {
package = INSTALLPROPERTY_LOCALPACKAGEW; package = INSTALLPROPERTY_LOCALPACKAGEW;
MSIREG_OpenInstallProps(szProductCode, szLocalSid, &props, FALSE);
MSIREG_OpenProductKey(szProductCode, dwContext, &classes, FALSE); MSIREG_OpenProductKey(szProductCode, dwContext, &classes, FALSE);
if (!props && !classes) if (!props && !classes)
...@@ -1373,11 +1362,7 @@ static BOOL msi_comp_find_package(LPCWSTR prodcode, MSIINSTALLCONTEXT context) ...@@ -1373,11 +1362,7 @@ static BOOL msi_comp_find_package(LPCWSTR prodcode, MSIINSTALLCONTEXT context)
'M','a','n','a','g','e','d','L','o','c','a','l','P','a','c','k','a','g','e',0 'M','a','n','a','g','e','d','L','o','c','a','l','P','a','c','k','a','g','e',0
}; };
if (context == MSIINSTALLCONTEXT_MACHINE) r = MSIREG_OpenInstallProps(prodcode, context, NULL, &hkey, FALSE);
r = MSIREG_OpenInstallProps(prodcode, szLocalSid, &hkey, FALSE);
else
r = MSIREG_OpenCurrentUserInstallProps(prodcode, &hkey, FALSE);
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
return FALSE; return FALSE;
...@@ -1491,9 +1476,9 @@ INSTALLSTATE WINAPI MsiQueryProductStateA(LPCSTR szProduct) ...@@ -1491,9 +1476,9 @@ INSTALLSTATE WINAPI MsiQueryProductStateA(LPCSTR szProduct)
INSTALLSTATE WINAPI MsiQueryProductStateW(LPCWSTR szProduct) INSTALLSTATE WINAPI MsiQueryProductStateW(LPCWSTR szProduct)
{ {
MSIINSTALLCONTEXT context = MSIINSTALLCONTEXT_USERUNMANAGED;
INSTALLSTATE state = INSTALLSTATE_ADVERTISED; INSTALLSTATE state = INSTALLSTATE_ADVERTISED;
HKEY prodkey = 0, userdata = 0; HKEY prodkey = 0, userdata = 0;
BOOL user = TRUE;
DWORD val; DWORD val;
UINT r; UINT r;
...@@ -1515,21 +1500,12 @@ INSTALLSTATE WINAPI MsiQueryProductStateW(LPCWSTR szProduct) ...@@ -1515,21 +1500,12 @@ INSTALLSTATE WINAPI MsiQueryProductStateW(LPCWSTR szProduct)
MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE, MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE,
&prodkey, FALSE) == ERROR_SUCCESS) &prodkey, FALSE) == ERROR_SUCCESS)
{ {
user = FALSE; context = MSIINSTALLCONTEXT_MACHINE;
} }
if (user) r = MSIREG_OpenInstallProps(szProduct, context, NULL, &userdata, FALSE);
{ if (r != ERROR_SUCCESS)
r = MSIREG_OpenCurrentUserInstallProps(szProduct, &userdata, FALSE); goto done;
if (r != ERROR_SUCCESS)
goto done;
}
else
{
r = MSIREG_OpenInstallProps(szProduct, szLocalSid, &userdata, FALSE);
if (r != ERROR_SUCCESS)
goto done;
}
if (!msi_reg_get_val_dword(userdata, szWindowsInstaller, &val)) if (!msi_reg_get_val_dword(userdata, szWindowsInstaller, &val))
goto done; goto done;
...@@ -1987,7 +1963,8 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent, ...@@ -1987,7 +1963,8 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent,
state = INSTALLSTATE_ABSENT; state = INSTALLSTATE_ABSENT;
if ((MSIREG_OpenInstallProps(szProduct, szLocalSid, &hkey, FALSE) == ERROR_SUCCESS || if ((MSIREG_OpenInstallProps(szProduct, MSIINSTALLCONTEXT_MACHINE, NULL,
&hkey, FALSE) == ERROR_SUCCESS ||
MSIREG_OpenUserDataProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED, MSIREG_OpenUserDataProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED,
NULL, &hkey, FALSE) == ERROR_SUCCESS) && NULL, &hkey, FALSE) == ERROR_SUCCESS) &&
msi_reg_get_val_dword(hkey, wininstaller, &version) && msi_reg_get_val_dword(hkey, wininstaller, &version) &&
...@@ -2652,8 +2629,10 @@ static USERINFOSTATE MSI_GetUserInfo(LPCWSTR szProduct, ...@@ -2652,8 +2629,10 @@ static USERINFOSTATE MSI_GetUserInfo(LPCWSTR szProduct,
return USERINFOSTATE_UNKNOWN; return USERINFOSTATE_UNKNOWN;
} }
if (MSIREG_OpenCurrentUserInstallProps(szProduct, &props, FALSE) != ERROR_SUCCESS && if (MSIREG_OpenInstallProps(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED,
MSIREG_OpenInstallProps(szProduct, szLocalSid, &props, FALSE) != ERROR_SUCCESS) NULL, &props, FALSE) != ERROR_SUCCESS &&
MSIREG_OpenInstallProps(szProduct, MSIINSTALLCONTEXT_MACHINE,
NULL, &props, FALSE) != ERROR_SUCCESS)
{ {
RegCloseKey(hkey); RegCloseKey(hkey);
return USERINFOSTATE_ABSENT; return USERINFOSTATE_ABSENT;
......
...@@ -780,9 +780,8 @@ extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT d ...@@ -780,9 +780,8 @@ extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT d
LPCWSTR szUserSid, HKEY *key, BOOL create); LPCWSTR szUserSid, HKEY *key, BOOL create);
extern UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext, extern UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext,
HKEY *key, BOOL create); HKEY *key, BOOL create);
extern UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY* key, BOOL create); extern UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext,
extern UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, LPCWSTR szUserSID, LPCWSTR szUserSid, HKEY *key, BOOL create);
HKEY *key, BOOL create);
extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create); extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create); extern UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_DeleteProductKey(LPCWSTR szProduct); extern UINT MSIREG_DeleteProductKey(LPCWSTR szProduct);
......
...@@ -871,10 +871,11 @@ UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext, ...@@ -871,10 +871,11 @@ UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext,
return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
} }
UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, LPCWSTR szUserSID, UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext,
HKEY *key, BOOL create) LPCWSTR szUserSid, HKEY *key, BOOL create)
{ {
UINT rc; UINT rc;
LPWSTR usersid;
WCHAR squished_pc[GUID_SIZE]; WCHAR squished_pc[GUID_SIZE];
WCHAR keypath[0x200]; WCHAR keypath[0x200];
...@@ -883,33 +884,27 @@ UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, LPCWSTR szUserSID, ...@@ -883,33 +884,27 @@ UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, LPCWSTR szUserSID,
return ERROR_FUNCTION_FAILED; return ERROR_FUNCTION_FAILED;
TRACE("squished (%s)\n", debugstr_w(squished_pc)); TRACE("squished (%s)\n", debugstr_w(squished_pc));
sprintfW(keypath, szInstallProperties_fmt, szUserSID, squished_pc); if (dwContext == MSIINSTALLCONTEXT_MACHINE)
sprintfW(keypath, szInstallProperties_fmt, szLocalSid, squished_pc);
if (create) else if (szUserSid)
rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); sprintfW(keypath, szInstallProperties_fmt, szUserSid, squished_pc);
else else
rc = RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
return rc;
}
UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY *key,
BOOL create)
{
UINT rc;
LPWSTR usersid;
rc = get_user_sid(&usersid);
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, szInstallProperties_fmt, usersid, squished_pc);
LocalFree(usersid);
} }
rc = MSIREG_OpenInstallProps(szProduct, usersid, key, create); if (create)
return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
LocalFree(usersid); return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
return rc;
} }
UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct) UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct)
......
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