msi/tests: Simplify and clarify WriteRegistryValues and RemoveRegistryValues tests.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2018-06-01 21:48:21 -05:00 committed by Alexandre Julliard
parent 91e418073f
commit 3c2b229431
1 changed files with 182 additions and 432 deletions

View File

@ -183,7 +183,7 @@ static const char property_dat[] =
"SERVDISP\tTestServiceDisp\n"
"SERVDISP2\tTestServiceDisp2\n"
"MSIFASTINSTALL\t1\n"
"regdata15\t#x01\n";
"regdata17\t#1\n";
static const char env_install_exec_seq_dat[] =
"Action\tCondition\tSequence\n"
@ -634,8 +634,8 @@ static const char wrv_component_dat[] =
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"augustus\t\tMSITESTDIR\t0\t\taugustus\n"
"caesar\t\tMSITESTDIR\t1\t\t\n";
"augustus\t{bafe0297-cbcc-4e08-8a78-7e9b83456eef}\tMSITESTDIR\t0\t\t\n"
"caesar\t{bafe0298-cbcc-4e08-8a78-7e9b83456eef}\tMSITESTDIR\t1\t\t\n";
static const char wrv_feature_dat[] =
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
@ -655,23 +655,51 @@ static const char wrv_registry_dat[] =
"Registry\tRoot\tKey\tName\tValue\tComponent_\n"
"s72\ti2\tl255\tL255\tL0\ts72\n"
"Registry\tRegistry\n"
"regdata\t2\tSOFTWARE\\Wine\\msitest\tValue\t[~]one[~]two[~]three\taugustus\n"
"regdata1\t2\tSOFTWARE\\Wine\\msitest\t*\t\taugustus\n"
"regdata2\t2\tSOFTWARE\\Wine\\msitest\t*\t#%\taugustus\n"
"regdata3\t2\tSOFTWARE\\Wine\\msitest\t*\t#x\taugustus\n"
"regdata4\t2\tSOFTWARE\\Wine\\msitest\\VisualStudio\\10.0\\AD7Metrics\\Exception\\{049EC4CC-30D2-4032-9256-EE18EB41B62B}\\Common Language Runtime Exceptions\\System.Workflow.ComponentModel.Serialization\\System.Workflow.ComponentModel.Serialization.WorkflowMarkupSerializationException\tlong\tkey\taugustus\n"
"regdata5\t2\tSOFTWARE\\Wine\\msitest\tValue1\t[~]one[~]\taugustus\n"
"regdata6\t2\tSOFTWARE\\Wine\\msitest\tValue2\t[~]two\taugustus\n"
"regdata7\t2\tSOFTWARE\\Wine\\msitest\tValue3\tone[~]\taugustus\n"
"regdata8\t2\tSOFTWARE\\Wine\\msitest\tValue4\tone[~]two\taugustus\n"
"regdata9\t2\tSOFTWARE\\Wine\\msitest\tValue5\t[~]one[~]two[~]three\taugustus\n"
"regdata10\t2\tSOFTWARE\\Wine\\msitest\tValue6\t[~]\taugustus\n"
"regdata11\t2\tSOFTWARE\\Wine\\msitest\tValue7\t[~]two\taugustus\n"
"regdata12\t2\tSOFTWARE\\Wine\\msitest\tValue8\t#1\taugustus\n"
"regdata13\t2\tSOFTWARE\\Wine\\msitest\tValue9\t#x1\taugustus\n"
"regdata14\t2\tSOFTWARE\\Wine\\msitest\tValue10\t#x01\taugustus\n"
"regdata15\t2\tSOFTWARE\\Wine\\msitest\tValue11\t[regdata15]\taugustus\n"
"regdata16\t2\tSOFTWARE\\Wine\\msitest\tValue12\t#1\tcaesar\n";
"regdata0\t1\tmsitest\tsz\tstring\taugustus\n"
"regdata1\t1\tmsitest\tmultisz\tone[~]two[~]three\taugustus\n"
"regdata2\t1\tmsitest\texpandsz\t#%string\taugustus\n"
"regdata3\t1\tmsitest\tdword\t#123\taugustus\n"
"regdata4\t1\tmsitest\tbinary\t#x01234567\taugustus\n"
"regdata5\t1\tmsitest\t\tdefault\taugustus\n"
"regdata6\t1\tmsitest\\subkey\t*\t\taugustus\n"
"regdata7\t1\tmsitest\\subkey\t*\t#%\taugustus\n"
"regdata8\t1\tmsitest\\subkey\t*\t#x\taugustus\n"
"regdata9\t1\tmsitest\\VisualStudio\\10.0\\AD7Metrics\\Exception\\{049EC4CC-30D2-4032-9256-EE18EB41B62B}\\Common Language Runtime Exceptions\\System.Workflow.ComponentModel.Serialization\\System.Workflow.ComponentModel.Serialization.WorkflowMarkupSerializationException\tlong\tkey\taugustus\n"
"regdata10\t1\tmsitest\tValue1\t[~]one[~]\taugustus\n"
"regdata11\t1\tmsitest\tValue2\t[~]two\taugustus\n"
"regdata12\t1\tmsitest\tValue3\tone[~]\taugustus\n"
"regdata13\t1\tmsitest\tValue4\tone[~]two\taugustus\n"
"regdata14\t1\tmsitest\tValue5\t[~]one[~]two[~]three\taugustus\n"
"regdata15\t1\tmsitest\tValue6\t[~]\taugustus\n"
"regdata16\t1\tmsitest\tValue7\t[~]two\taugustus\n"
"regdata17\t1\tmsitest\tformat\t[regdata17]\taugustus\n"
"regdata18\t1\tmsitest\tsource\t#1\tcaesar\n"
"regdata19\t1\tmsitest\\create\t+\t\taugustus\n"
"regdata20\t1\tmsitest\\delete\t-\t\taugustus\n";
static const char wrv_remove_registry_dat[] =
"RemoveRegistry\tRoot\tKey\tName\tComponent_\n"
"s72\ti2\tl255\tL255\ts72\n"
"RemoveRegistry\tRemoveRegistry\n"
"regdata0\t1\tmsitest\tinstremove\taugustus\n"
"regdata1\t1\tmsitest\\instremove\t-\taugustus\n";
static const char wrv_install_exec_seq_dat[] =
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveRegistryValues\t\t4900\n"
"WriteRegistryValues\t\t5000\n"
"RegisterProduct\t\t6100\n"
"PublishFeatures\t\t6200\n"
"PublishProduct\t\t6300\n"
"InstallFinalize\t\t6600\n";
static const char cf_directory_dat[] =
"Directory\tDirectory_Parent\tDefaultDir\n"
@ -1289,65 +1317,6 @@ static const char rd_custom_action_dat[] =
"rd_immediate\t1\tcustom.dll\trd_present\n"
"rd_deferred\t1025\tcustom.dll\trd_absent\n";
static const char rrv_file_dat[] =
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
"File\tFile\n"
"registry.txt\tregistry\tregistry.txt\t1000\t\t\t8192\t1\n";
static const char rrv_feature_dat[] =
"Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"
"s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"
"Feature\tFeature\n"
"registry\t\t\tregistry feature\t1\t2\tMSITESTDIR\t0\n";
static const char rrv_feature_comp_dat[] =
"Feature_\tComponent_\n"
"s38\ts72\n"
"FeatureComponents\tFeature_\tComponent_\n"
"registry\tregistry\n";
static const char rrv_component_dat[] =
"Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"
"s72\tS38\ts72\ti2\tS255\tS72\n"
"Component\tComponent\n"
"registry\t{DA97585B-962D-45EB-AD32-DA15E60CA9EE}\tMSITESTDIR\t0\t\tregistry.txt\n";
static const char rrv_registry_dat[] =
"Registry\tRoot\tKey\tName\tValue\tComponent_\n"
"s72\ti2\tl255\tL255\tL0\ts72\n"
"Registry\tRegistry\n"
"reg1\t2\tSOFTWARE\\Wine\\keyA\t\tA\tregistry\n"
"reg2\t2\tSOFTWARE\\Wine\\keyA\tvalueA\tA\tregistry\n"
"reg3\t2\tSOFTWARE\\Wine\\key1\t-\t\tregistry\n";
static const char rrv_remove_registry_dat[] =
"RemoveRegistry\tRoot\tKey\tName\tComponent_\n"
"s72\ti2\tl255\tL255\ts72\n"
"RemoveRegistry\tRemoveRegistry\n"
"reg1\t2\tSOFTWARE\\Wine\\keyB\t\tregistry\n"
"reg2\t2\tSOFTWARE\\Wine\\keyB\tValueB\tregistry\n"
"reg3\t2\tSOFTWARE\\Wine\\key2\t-\tregistry\n";
static const char rrv_install_exec_seq_dat[] =
"Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"LaunchConditions\t\t100\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"CostFinalize\t\t1000\n"
"InstallValidate\t\t1400\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"RemoveFiles\t\t1700\n"
"InstallFiles\t\t2000\n"
"RemoveRegistryValues\t\t3000\n"
"RegisterProduct\t\t5000\n"
"PublishFeatures\t\t5100\n"
"PublishProduct\t\t5200\n"
"InstallFinalize\t\t6000\n";
static const char frp_file_dat[] =
"File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"
"s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"
@ -2055,11 +2024,11 @@ static const msi_table wrv_tables[] =
ADD_TABLE(directory),
ADD_TABLE(wrv_feature),
ADD_TABLE(wrv_feature_comp),
ADD_TABLE(ci2_file),
ADD_TABLE(install_exec_seq),
ADD_TABLE(rof_media),
ADD_TABLE(wrv_install_exec_seq),
ADD_TABLE(property),
ADD_TABLE(media),
ADD_TABLE(wrv_registry),
ADD_TABLE(wrv_remove_registry),
};
static const msi_table cf_tables[] =
@ -2232,20 +2201,6 @@ static const msi_table rd_tables[] =
ADD_TABLE(property)
};
static const msi_table rrv_tables[] =
{
ADD_TABLE(directory),
ADD_TABLE(rrv_component),
ADD_TABLE(rrv_feature),
ADD_TABLE(rrv_feature_comp),
ADD_TABLE(rrv_file),
ADD_TABLE(rrv_registry),
ADD_TABLE(rrv_remove_registry),
ADD_TABLE(rrv_install_exec_seq),
ADD_TABLE(media),
ADD_TABLE(property)
};
static const msi_table frp_tables[] =
{
ADD_TABLE(directory),
@ -2368,75 +2323,6 @@ static const msi_table rep_tables[] =
ADD_TABLE(media)
};
/* based on RegDeleteTreeW from dlls/advapi32/registry.c */
static LSTATUS action_RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey, REGSAM access)
{
LONG ret;
DWORD dwMaxSubkeyLen, dwMaxValueLen;
DWORD dwMaxLen, dwSize;
char szNameBuf[MAX_PATH], *lpszName = szNameBuf;
HKEY hSubKey = hKey;
if(lpszSubKey)
{
ret = RegOpenKeyExA(hKey, lpszSubKey, 0, access, &hSubKey);
if (ret) return ret;
}
ret = RegQueryInfoKeyA(hSubKey, NULL, NULL, NULL, NULL,
&dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
if (ret) goto cleanup;
dwMaxSubkeyLen++;
dwMaxValueLen++;
dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
if (dwMaxLen > sizeof(szNameBuf))
{
/* Name too big: alloc a buffer for it */
if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen)))
{
ret = ERROR_NOT_ENOUGH_MEMORY;
goto cleanup;
}
}
/* Recursively delete all the subkeys */
while (TRUE)
{
dwSize = dwMaxLen;
if (RegEnumKeyExA(hSubKey, 0, lpszName, &dwSize, NULL,
NULL, NULL, NULL)) break;
ret = action_RegDeleteTreeA(hSubKey, lpszName, access);
if (ret) goto cleanup;
}
if (lpszSubKey)
{
if (pRegDeleteKeyExA)
ret = pRegDeleteKeyExA(hKey, lpszSubKey, access, 0);
else
ret = RegDeleteKeyA(hKey, lpszSubKey);
}
else
while (TRUE)
{
dwSize = dwMaxLen;
if (RegEnumValueA(hKey, 0, lpszName, &dwSize,
NULL, NULL, NULL, NULL)) break;
ret = RegDeleteValueA(hKey, lpszName);
if (ret) goto cleanup;
}
cleanup:
if (lpszName != szNameBuf)
HeapFree(GetProcessHeap(), 0, lpszName);
if(lpszSubKey)
RegCloseKey(hSubKey);
return ret;
}
/* cabinet definitions */
/* make the max size large so there is only one cab file */
@ -2608,6 +2494,25 @@ static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase
}
}
static void check_reg_multi(HKEY prodkey, const char *name, const char *expect, DWORD line)
{
char val[MAX_PATH];
DWORD size, type;
LONG res;
size = MAX_PATH;
val[0] = '\0';
res = RegQueryValueExA(prodkey, name, NULL, &type, (BYTE *)val, &size);
if (res != ERROR_SUCCESS || type != REG_MULTI_SZ)
{
ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n");
return;
}
ok_(__FILE__, line)(!memcmp(val, expect, size), "wrong data\n");
}
static void check_reg_dword(HKEY prodkey, LPCSTR name, DWORD expected, DWORD line)
{
DWORD val, size, type;
@ -2643,6 +2548,9 @@ static void check_reg_dword(HKEY prodkey, LPCSTR name, DWORD expected, DWORD lin
RegDeleteValueA(prodkey, name); \
} while(0)
#define CHECK_REG_MULTI(key, name, expect) \
check_reg_multi(key, name, expect, __LINE__);
#define CHECK_REG_DWORD(prodkey, name, expected) \
check_reg_dword(prodkey, name, expected, __LINE__);
@ -4737,12 +4645,11 @@ error:
static void test_write_registry_values(void)
{
UINT r;
LONG res;
HKEY hkey;
HKEY hkey, subkey;
DWORD type, size;
CHAR path[MAX_PATH];
BYTE buf[8];
char buf[20];
LONG res;
UINT r;
if (is_process_limited())
{
@ -4751,18 +4658,12 @@ static void test_write_registry_values(void)
}
CreateDirectoryA("msitest", NULL);
create_file("msitest\\augustus", 500);
create_database(msifile, wrv_tables, sizeof(wrv_tables) / sizeof(msi_table));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
if (is_64bit)
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wow6432Node\\Wine\\msitest", 0, NULL, 0,
KEY_ALL_ACCESS, NULL, &hkey, NULL);
else
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, NULL, 0, KEY_ALL_ACCESS,
NULL, &hkey, NULL);
res = RegCreateKeyA(HKEY_CURRENT_USER, "msitest", &hkey);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
res = RegSetValueExA(hkey, "Value1", 0, REG_MULTI_SZ, (const BYTE *)"two\0", 5);
@ -4779,7 +4680,13 @@ static void test_write_registry_values(void)
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
res = RegSetValueExA(hkey, "Value7", 0, REG_SZ, (const BYTE *)"one", 4);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
RegCloseKey(hkey);
res = RegSetValueExA(hkey, "instremove", 0, REG_SZ, (const BYTE *)"val", 3);
ok(!res, "got %u\n", res);
res = RegCreateKeyA(hkey, "instremove", &subkey);
ok(!res, "got %u\n", res);
RegCloseKey(subkey);
r = MsiInstallProductA(msifile, NULL);
if (r == ERROR_INSTALL_PACKAGE_REJECTED)
@ -4788,157 +4695,120 @@ static void test_write_registry_values(void)
goto error;
}
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n");
ok(delete_pf("msitest", FALSE), "Directory not created\n");
if (is_64bit)
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wow6432Node\\Wine\\msitest", 0, KEY_ALL_ACCESS, &hkey);
else
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, KEY_ALL_ACCESS, &hkey);
CHECK_REG_STR(hkey, "sz", "string");
CHECK_REG_MULTI(hkey, "multisz", "one\0two\0three\0");
CHECK_REG_DWORD(hkey, "dword", 123);
size = sizeof(buf);
res = RegQueryValueExA(hkey, "expandsz", NULL, &type, (BYTE *)buf, &size);
ok(!res, "got %u\n", res);
ok(type == REG_EXPAND_SZ, "got %d\n", type);
ok(!strcmp(buf, "string"), "got %s\n", buf);
size = sizeof(buf);
res = RegQueryValueExA(hkey, "binary", NULL, &type, (BYTE *)buf, &size);
ok(!res, "got %u\n", res);
ok(type == REG_BINARY, "got %d\n", type);
ok(size == 4, "got size %u\n", size);
ok(!memcmp(buf, "\x01\x23\x45\x67", 4), "wrong data\n");
CHECK_REG_STR(hkey, "", "default");
res = RegOpenKeyA(hkey, "VisualStudio", &subkey);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
RegCloseKey(subkey);
size = MAX_PATH;
type = 0xdeadbeef;
memset(path, 'a', MAX_PATH);
res = RegQueryValueExA(hkey, "Value", NULL, &type, (LPBYTE)path, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(!memcmp(path, "one\0two\0three\0\0", size), "Wrong multi-sz data\n");
ok(size == 15, "Expected 15, got %d\n", size);
ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
CHECK_REG_MULTI(hkey, "Value1", "one\0");
CHECK_REG_MULTI(hkey, "Value2", "one\0two\0");
CHECK_REG_MULTI(hkey, "Value3", "one\0two\0");
CHECK_REG_MULTI(hkey, "Value4", "one\0two\0");
CHECK_REG_MULTI(hkey, "Value5", "one\0two\0three\0");
CHECK_REG_MULTI(hkey, "Value6", "");
CHECK_REG_MULTI(hkey, "Value7", "two\0");
CHECK_REG_DWORD(hkey, "format", 1);
CHECK_REG_DWORD(hkey, "source", 1);
res = RegOpenKeyA(hkey, "subkey", &subkey);
ok(!res, "got %u\n", res);
res = RegQueryValueExA(subkey, "", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
RegCloseKey(subkey);
res = RegOpenKeyA(hkey, "create", &subkey);
ok(!res, "got %u\n", res);
RegCloseKey(subkey);
res = RegOpenKeyA(hkey, "delete", &subkey);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegCreateKeyA(hkey, "delete", &subkey);
ok(!res, "got %u\n", res);
RegCloseKey(subkey);
res = RegQueryValueExA(hkey, "instremove", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegOpenKeyA(hkey, "instremove", &subkey);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
r = MsiInstallProductA(msifile, "REMOVE=ALL");
ok(!r, "got %u\n", r);
res = RegQueryValueExA(hkey, "sz", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "multisz", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "dword", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "expandsz", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "binary", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = action_RegDeleteTreeA(hkey, "VisualStudio", KEY_ALL_ACCESS);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
res = RegOpenKeyA(hkey, "VisualStudio", &subkey);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
size = MAX_PATH;
type = 0xdeadbeef;
memset(path, 'a', MAX_PATH);
res = RegQueryValueExA(hkey, "Value1", NULL, &type, (LPBYTE)path, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(!memcmp(path, "one\0", size), "Wrong multi-sz data\n");
ok(size == 5, "Expected 5, got %d\n", size);
ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
res = RegQueryValueExA(hkey, "Value1", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "Value4", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "Value5", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "Value6", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "Value7", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
size = MAX_PATH;
type = 0xdeadbeef;
memset(path, 'a', MAX_PATH);
res = RegQueryValueExA(hkey, "Value2", NULL, &type, (LPBYTE)path, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(!memcmp(path, "one\0two\0", size), "Wrong multi-sz data\n");
ok(size == 9, "Expected 9, got %d\n", size);
ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
todo_wine {
CHECK_REG_MULTI(hkey, "Value2", "one\0");
CHECK_REG_MULTI(hkey, "Value3", "two\0");
}
size = MAX_PATH;
type = 0xdeadbeef;
memset(path, 'a', MAX_PATH);
res = RegQueryValueExA(hkey, "Value3", NULL, &type, (LPBYTE)path, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(!memcmp(path, "one\0two\0", size), "Wrong multi-sz data\n");
ok(size == 9, "Expected 9, got %d\n", size);
ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
res = RegQueryValueExA(hkey, "format", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
res = RegQueryValueExA(hkey, "source", NULL, NULL, NULL, NULL);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
size = MAX_PATH;
type = 0xdeadbeef;
memset(path, 'a', MAX_PATH);
res = RegQueryValueExA(hkey, "Value4", NULL, &type, (LPBYTE)path, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(!memcmp(path, "one\0two\0", size), "Wrong multi-sz data\n");
ok(size == 9, "Expected 9, got %d\n", size);
ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
res = RegOpenKeyA(hkey, "subkey", &subkey);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
size = MAX_PATH;
type = 0xdeadbeef;
memset(path, 'a', MAX_PATH);
res = RegQueryValueExA(hkey, "Value5", NULL, &type, (LPBYTE)path, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(!memcmp(path, "one\0two\0three\0", size), "Wrong multi-sz data\n");
ok(size == 15, "Expected 15, got %d\n", size);
ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
res = RegOpenKeyA(hkey, "create", &subkey);
ok(!res, "got %u\n", res);
RegCloseKey(subkey);
res = RegDeleteKeyA(hkey, "create");
ok(!res, "got %u\n", res);
size = MAX_PATH;
type = 0xdeadbeef;
memset(path, 'a', MAX_PATH);
res = RegQueryValueExA(hkey, "Value6", NULL, &type, (LPBYTE)path, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(!memcmp(path, "", size), "Wrong multi-sz data\n");
ok(size == 1, "Expected 1, got %d\n", size);
ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
res = RegOpenKeyA(hkey, "delete", &subkey);
ok(res == ERROR_FILE_NOT_FOUND, "got %u\n", res);
size = MAX_PATH;
type = 0xdeadbeef;
memset(path, 'a', MAX_PATH);
res = RegQueryValueExA(hkey, "Value7", NULL, &type, (LPBYTE)path, &size);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
ok(!memcmp(path, "two\0", size), "Wrong multi-sz data\n");
ok(size == 5, "Expected 5, got %d\n", size);
ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type);
size = sizeof(buf);
type = 0xdeadbeef;
memset(buf, 0, size);
res = RegQueryValueExA(hkey, "Value8", NULL, &type, buf, &size);
ok(res == ERROR_SUCCESS, "got %u\n", res);
ok(*(DWORD *)buf == 1, "got %u\n", *(DWORD *)buf);
ok(size == 4, "got %u\n", size);
ok(type == REG_DWORD, "got %u\n", type);
size = sizeof(buf);
type = 0xdeadbeef;
memset(buf, 0, size);
res = RegQueryValueExA(hkey, "Value9", NULL, &type, buf, &size);
ok(res == ERROR_SUCCESS, "got %u\n", res);
ok(buf[0] == 1, "got %u\n", buf[0]);
ok(size == 1, "got %u\n", size);
ok(type == REG_BINARY, "got %u\n", type);
size = sizeof(buf);
type = 0xdeadbeef;
memset(buf, 0, size);
res = RegQueryValueExA(hkey, "Value10", NULL, &type, buf, &size);
ok(res == ERROR_SUCCESS, "got %u\n", res);
ok(buf[0] == 1, "got %u\n", buf[0]);
ok(size == 1, "got %u\n", size);
ok(type == REG_BINARY, "got %u\n", type);
size = sizeof(buf);
type = 0xdeadbeef;
memset(buf, 0, size);
res = RegQueryValueExA(hkey, "Value11", NULL, &type, buf, &size);
ok(res == ERROR_SUCCESS, "got %u\n", res);
ok(buf[0] == 1, "got %u\n", buf[0]);
ok(size == 1, "got %u\n", size);
ok(type == REG_BINARY, "got %u\n", type);
size = sizeof(buf);
type = 0xdeadbeef;
memset(buf, 0, size);
res = RegQueryValueExA(hkey, "Value12", NULL, &type, buf, &size);
ok(res == ERROR_SUCCESS, "got %u\n", res);
ok(*(DWORD *)buf == 1, "got %u\n", *(DWORD *)buf);
ok(size == 4, "got %u\n", size);
ok(type == REG_DWORD, "got %u\n", type);
RegDeleteValueA(hkey, "Value");
RegDeleteValueA(hkey, "Value1");
RegDeleteValueA(hkey, "Value2");
RegDeleteValueA(hkey, "Value3");
RegDeleteValueA(hkey, "Value4");
RegDeleteValueA(hkey, "Value5");
RegDeleteValueA(hkey, "Value6");
RegDeleteValueA(hkey, "Value7");
RegDeleteValueA(hkey, "Value8");
RegDeleteValueA(hkey, "Value9");
RegDeleteValueA(hkey, "Value10");
RegDeleteValueA(hkey, "Value11");
RegDeleteValueA(hkey, "Value12");
RegCloseKey(hkey);
RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest");
res = RegDeleteKeyA(HKEY_CURRENT_USER, "msitest");
ok(!res, "got %u\n", res);
error:
DeleteFileA(msifile);
DeleteFileA("msitest\\augustus");
RemoveDirectoryA("msitest");
}
@ -5840,125 +5710,6 @@ error:
DeleteFileA(msifile);
}
static void test_remove_registry_values(void)
{
UINT r;
LONG res;
HKEY key;
REGSAM access = KEY_ALL_ACCESS;
if (is_process_limited())
{
skip("process is limited\n");
return;
}
create_test_files();
create_file("msitest\\registry.txt", 1000);
create_database(msifile, rrv_tables, sizeof(rrv_tables) / sizeof(msi_table));
if (is_wow64)
access |= KEY_WOW64_64KEY;
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", 0, NULL, 0, access, NULL, &key, NULL);
RegSetValueExA(key, "value1", 0, REG_SZ, (const BYTE *)"1", 2);
RegCloseKey(key);
RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", 0, NULL, 0, access, NULL, &key, NULL);
RegSetValueExA(key, "value2", 0, REG_SZ, (const BYTE *)"2", 2);
RegCloseKey(key);
RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", 0, NULL, 0, access, NULL, &key, NULL);
RegSetValueExA(key, "", 0, REG_SZ, (const BYTE *)"default", 8);
RegSetValueExA(key, "valueA", 0, REG_SZ, (const BYTE *)"A", 2);
RegSetValueExA(key, "valueB", 0, REG_SZ, (const BYTE *)"B", 2);
RegCloseKey(key);
RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", 0, NULL, 0, access, NULL, &key, NULL);
RegSetValueExA(key, "", 0, REG_SZ, (const BYTE *)"default", 8);
RegSetValueExA(key, "valueB", 0, REG_SZ, (const BYTE *)"B", 2);
RegCloseKey(key);
r = MsiInstallProductA(msifile, NULL);
if (r == ERROR_INSTALL_PACKAGE_REJECTED)
{
skip("Not enough rights to perform tests\n");
goto error;
}
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", 0, access, &key);
ok(res == ERROR_SUCCESS, "key removed\n");
RegCloseKey(key);
if (is_64bit)
{
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Wine\\key2", 0, KEY_ALL_ACCESS, &key);
ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
}
else
{
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", 0, KEY_ALL_ACCESS, &key);
ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
}
res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", 0, NULL, 0, access, NULL, &key, NULL);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
RegCloseKey(key);
r = MsiInstallProductA(msifile, "REMOVE=ALL");
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
if (is_64bit)
{
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Wine\\key1", 0, KEY_ALL_ACCESS, &key);
ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
}
else
{
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", 0, KEY_ALL_ACCESS, &key);
ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
}
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", 0, access, &key);
ok(res == ERROR_SUCCESS, "key removed\n");
RegCloseKey(key);
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", 0, access, &key);
ok(res == ERROR_SUCCESS, "key removed\n");
RegCloseKey(key);
if (is_64bit)
{
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Wine\\keyB", 0, KEY_ALL_ACCESS, &key);
ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
}
else
{
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", 0, KEY_ALL_ACCESS, &key);
ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n");
}
delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", access);
delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", access);
delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine", access);
ok(!delete_pf("msitest\\registry.txt", TRUE), "file not removed\n");
ok(!delete_pf("msitest", FALSE), "directory not removed\n");
error:
delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", access);
delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", access);
delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", access);
delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", access);
DeleteFileA("msitest\\registry.txt");
delete_test_files();
DeleteFileA(msifile);
}
static void test_find_related_products(void)
{
UINT r;
@ -6669,7 +6420,6 @@ START_TEST(action)
test_create_remove_shortcut();
test_publish_components();
test_remove_duplicate_files();
test_remove_registry_values();
test_find_related_products();
test_ini_values();
test_register_class_info();