msi: Handle the machine context in MsiQueryFeatureState.
This commit is contained in:
parent
200eba3b94
commit
72fedf7d88
|
@ -1812,6 +1812,7 @@ INSTALLSTATE WINAPI MsiQueryFeatureStateW(LPCWSTR szProduct, LPCWSTR szFeature)
|
|||
HKEY hkey;
|
||||
INSTALLSTATE r;
|
||||
BOOL missing = FALSE;
|
||||
BOOL machine = FALSE;
|
||||
|
||||
TRACE("%s %s\n", debugstr_w(szProduct), debugstr_w(szFeature));
|
||||
|
||||
|
@ -1824,7 +1825,11 @@ INSTALLSTATE WINAPI MsiQueryFeatureStateW(LPCWSTR szProduct, LPCWSTR szFeature)
|
|||
if (MSIREG_OpenManagedFeaturesKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS &&
|
||||
MSIREG_OpenUserFeaturesKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS)
|
||||
{
|
||||
return INSTALLSTATE_UNKNOWN;
|
||||
rc = MSIREG_OpenLocalClassesFeaturesKey(szProduct, &hkey, FALSE);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
return INSTALLSTATE_UNKNOWN;
|
||||
|
||||
machine = TRUE;
|
||||
}
|
||||
|
||||
parent_feature = msi_reg_get_val_str( hkey, szFeature );
|
||||
|
@ -1838,8 +1843,11 @@ INSTALLSTATE WINAPI MsiQueryFeatureStateW(LPCWSTR szProduct, LPCWSTR szFeature)
|
|||
if (r == INSTALLSTATE_ABSENT)
|
||||
return r;
|
||||
|
||||
/* now check if it's complete or advertised */
|
||||
rc = MSIREG_OpenUserDataFeaturesKey(szProduct, &hkey, FALSE);
|
||||
if (machine)
|
||||
rc = MSIREG_OpenLocalUserDataFeaturesKey(szProduct, &hkey, FALSE);
|
||||
else
|
||||
rc = MSIREG_OpenUserDataFeaturesKey(szProduct, &hkey, FALSE);
|
||||
|
||||
if (rc != ERROR_SUCCESS)
|
||||
return INSTALLSTATE_ADVERTISED;
|
||||
|
||||
|
@ -1863,7 +1871,12 @@ INSTALLSTATE WINAPI MsiQueryFeatureStateW(LPCWSTR szProduct, LPCWSTR szFeature)
|
|||
}
|
||||
|
||||
StringFromGUID2(&guid, comp, GUID_SIZE);
|
||||
rc = MSIREG_OpenUserDataComponentKey(comp, &hkey, FALSE);
|
||||
|
||||
if (machine)
|
||||
rc = MSIREG_OpenLocalUserDataComponentKey(comp, &hkey, FALSE);
|
||||
else
|
||||
rc = MSIREG_OpenUserDataComponentKey(comp, &hkey, FALSE);
|
||||
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
msi_free(components);
|
||||
|
|
|
@ -930,10 +930,7 @@ static void test_MsiQueryFeatureState(void)
|
|||
|
||||
/* feature value exists */
|
||||
state = MsiQueryFeatureStateA(prodcode, "feature");
|
||||
todo_wine
|
||||
{
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
}
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
|
||||
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\");
|
||||
lstrcatA(keypath, "S-1-5-18\\Products\\");
|
||||
|
@ -945,46 +942,31 @@ static void test_MsiQueryFeatureState(void)
|
|||
|
||||
/* userdata features key exists */
|
||||
state = MsiQueryFeatureStateA(prodcode, "feature");
|
||||
todo_wine
|
||||
{
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
}
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
|
||||
res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)"aaaaaaaaaaaaaaaaaaa", 20);
|
||||
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
||||
|
||||
state = MsiQueryFeatureStateA(prodcode, "feature");
|
||||
todo_wine
|
||||
{
|
||||
ok(state == INSTALLSTATE_BADCONFIG, "Expected INSTALLSTATE_BADCONFIG, got %d\n", state);
|
||||
}
|
||||
ok(state == INSTALLSTATE_BADCONFIG, "Expected INSTALLSTATE_BADCONFIG, got %d\n", state);
|
||||
|
||||
res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)"aaaaaaaaaaaaaaaaaaaa", 21);
|
||||
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
||||
|
||||
state = MsiQueryFeatureStateA(prodcode, "feature");
|
||||
todo_wine
|
||||
{
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
}
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
|
||||
res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)"aaaaaaaaaaaaaaaaaaaaa", 22);
|
||||
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
||||
|
||||
state = MsiQueryFeatureStateA(prodcode, "feature");
|
||||
todo_wine
|
||||
{
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
}
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
|
||||
res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)comp_base85, 21);
|
||||
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
||||
|
||||
state = MsiQueryFeatureStateA(prodcode, "feature");
|
||||
todo_wine
|
||||
{
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
}
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
|
||||
lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\");
|
||||
lstrcatA(keypath, "S-1-5-18\\Components\\");
|
||||
|
@ -994,28 +976,19 @@ static void test_MsiQueryFeatureState(void)
|
|||
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
||||
|
||||
state = MsiQueryFeatureStateA(prodcode, "feature");
|
||||
todo_wine
|
||||
{
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
}
|
||||
ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state);
|
||||
|
||||
res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"", 1);
|
||||
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
||||
|
||||
state = MsiQueryFeatureStateA(prodcode, "feature");
|
||||
todo_wine
|
||||
{
|
||||
ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
|
||||
}
|
||||
ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
|
||||
|
||||
res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"apple", 1);
|
||||
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
|
||||
|
||||
state = MsiQueryFeatureStateA(prodcode, "feature");
|
||||
todo_wine
|
||||
{
|
||||
ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
|
||||
}
|
||||
ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state);
|
||||
|
||||
RegDeleteValueA(compkey, prod_squashed);
|
||||
RegDeleteKeyA(compkey, "");
|
||||
|
|
Loading…
Reference in New Issue