ok( !strcmp( value, "Test" ), "value is '%s' instead of Test\n", value );
ok( !strcmp( data, "foobar" ), "data is '%s' instead of foobar\n", data );
+ if (pRegGetValueA) /* avoid a crash on Windows 2000 */
+ {
+ /* no value and no val_count parameter */
+ data_count = 20;
+ type = 1234;
+ strcpy( data, "xxxxxxxxxx" );
+ res = RegEnumValueA( test_key, 0, NULL, NULL, NULL, &type, (BYTE*)data, &data_count );
+ ok( res == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", res );
+
+ /* no value parameter */
+ val_count = 20;
+ data_count = 20;
+ type = 1234;
+ strcpy( data, "xxxxxxxxxx" );
+ res = RegEnumValueA( test_key, 0, NULL, &val_count, NULL, &type, (BYTE*)data, &data_count );
+ ok( res == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", res );
+
+ /* no val_count parameter */
+ data_count = 20;
+ type = 1234;
+ strcpy( value, "xxxxxxxxxx" );
+ strcpy( data, "xxxxxxxxxx" );
+ res = RegEnumValueA( test_key, 0, value, NULL, NULL, &type, (BYTE*)data, &data_count );
+ ok( res == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", res );
+ }
+
/* Unicode tests */
SetLastError(0xdeadbeef);
ok( !memcmp( valueW, testW, sizeof(testW) ), "value is not 'Test'\n" );
ok( !memcmp( dataW, foobarW, sizeof(foobarW) ), "data is not 'foobar'\n" );
+ if (pRegGetValueA) /* avoid a crash on Windows 2000 */
+ {
+ /* no valueW and no val_count parameter */
+ data_count = 20;
+ type = 1234;
+ memcpy( dataW, xxxW, sizeof(xxxW) );
+ res = RegEnumValueW( test_key, 0, NULL, NULL, NULL, &type, (BYTE*)dataW, &data_count );
+ ok( res == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", res );
+
+ /* no valueW parameter */
+ val_count = 20;
+ data_count = 20;
+ type = 1234;
+ memcpy( dataW, xxxW, sizeof(xxxW) );
+ res = RegEnumValueW( test_key, 0, NULL, &val_count, NULL, &type, (BYTE*)dataW, &data_count );
+ ok( res == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", res );
+
+ /* no val_count parameter */
+ data_count = 20;
+ type = 1234;
+ memcpy( valueW, xxxW, sizeof(xxxW) );
+ memcpy( dataW, xxxW, sizeof(xxxW) );
+ res = RegEnumValueW( test_key, 0, valueW, NULL, NULL, &type, (BYTE*)dataW, &data_count );
+ ok( res == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", res );
+ }
+
cleanup:
RegDeleteKeyA(test_key, "");
RegCloseKey(test_key);
ok(ret == ERROR_INVALID_HANDLE || ret == ERROR_BADKEY, /* Windows 95 returns BADKEY */
"expected ERROR_INVALID_HANDLE or ERROR_BADKEY, got %d\n", ret);
ok(hkResult == hkPreserve, "expected hkResult == hkPreserve\n");
- RegCloseKey(hkResult);
/* send in NULL hkResult */
ret = RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Test", NULL);
"expected ERROR_SUCCESS, ERROR_BAD_PATHNAME or ERROR_FILE_NOT_FOUND, got %d\n", ret);
RegCloseKey(hkResult);
+ /* NULL or empty subkey of special root */
+ hkResult = NULL;
+ ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, NULL, 0, KEY_QUERY_VALUE, &hkResult);
+ ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
+ ok(hkResult == HKEY_CLASSES_ROOT, "expected hkResult == HKEY_CLASSES_ROOT\n");
+
+ hkResult = NULL;
+ ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, "", 0, KEY_QUERY_VALUE, &hkResult);
+ ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
+ ok(hkResult == HKEY_CLASSES_ROOT, "expected hkResult == HKEY_CLASSES_ROOT\n");
+
+ hkResult = NULL;
+ ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, "\\", 0, KEY_QUERY_VALUE, &hkResult);
+ ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
+ ok(hkResult != HKEY_CLASSES_ROOT, "expected hkResult to be a new key\n");
+ ok(!RegCloseKey(hkResult), "got invalid hkey\n");
+
+ /* empty subkey of existing handle */
+ hkResult = hkPreserve;
+ ret = RegOpenKeyExA(hkPreserve, "", 0, KEY_QUERY_VALUE, &hkResult);
+ ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
+ ok(hkResult != hkPreserve, "expected hkResult != hkPreserve\n");
+ ok(!RegCloseKey(hkResult), "got invalid hkey\n");
+
+ /* NULL subkey of existing handle */
+ hkResult = hkPreserve;
+ ret = RegOpenKeyExA(hkPreserve, NULL, 0, KEY_QUERY_VALUE, &hkResult);
+ ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
+ ok(hkResult != hkPreserve, "expected hkResult != hkPreserve\n");
+ ok(!RegCloseKey(hkResult), "got invalid hkey\n");
+
+ /* empty subkey of NULL */
+ hkResult = hkPreserve;
+ ret = RegOpenKeyExA(NULL, "", 0, KEY_QUERY_VALUE, &hkResult);
+ ok(ret == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %d\n", ret);
+ ok(hkResult == hkPreserve, "expected hkResult == hkPreserve\n");
+
+ RegCloseKey(hkPreserve);
+
/* WOW64 flags */
hkResult = NULL;
ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software", 0, KEY_READ|KEY_WOW64_32KEY, &hkResult);
RegCloseKey(key);
}
-static void test_reg_save_key(void)
-{
- DWORD ret;
-
- ret = RegSaveKeyA(hkey_main, "saved_key", NULL);
- ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
-}
-
-static void test_reg_load_key(void)
-{
- DWORD ret;
- HKEY hkHandle;
-
- ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", "saved_key");
- ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
-
- ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &hkHandle);
- ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
-
- RegCloseKey(hkHandle);
-}
-
-static void test_reg_unload_key(void)
-{
- DWORD ret;
-
- ret = RegUnLoadKeyA(HKEY_LOCAL_MACHINE, "Test");
- ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
-
- DeleteFileA("saved_key");
- DeleteFileA("saved_key.LOG");
-}
-
static BOOL set_privileges(LPCSTR privilege, BOOL set)
{
TOKEN_PRIVILEGES tp;
return TRUE;
}
+static void test_reg_save_key(void)
+{
+ DWORD ret;
+
+ if (!set_privileges(SE_BACKUP_NAME, TRUE) ||
+ !set_privileges(SE_RESTORE_NAME, FALSE))
+ {
+ win_skip("Failed to set SE_BACKUP_NAME privileges, skipping tests\n");
+ return;
+ }
+
+ ret = RegSaveKeyA(hkey_main, "saved_key", NULL);
+ ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
+
+ set_privileges(SE_BACKUP_NAME, FALSE);
+}
+
+static void test_reg_load_key(void)
+{
+ DWORD ret;
+ HKEY hkHandle;
+
+ if (!set_privileges(SE_RESTORE_NAME, TRUE) ||
+ !set_privileges(SE_BACKUP_NAME, FALSE))
+ {
+ win_skip("Failed to set SE_RESTORE_NAME privileges, skipping tests\n");
+ return;
+ }
+
+ ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", "saved_key");
+ ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
+
+ set_privileges(SE_RESTORE_NAME, FALSE);
+
+ ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &hkHandle);
+ ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
+
+ RegCloseKey(hkHandle);
+}
+
+static void test_reg_unload_key(void)
+{
+ DWORD ret;
+
+ if (!set_privileges(SE_RESTORE_NAME, TRUE) ||
+ !set_privileges(SE_BACKUP_NAME, FALSE))
+ {
+ win_skip("Failed to set SE_RESTORE_NAME privileges, skipping tests\n");
+ return;
+ }
+
+ ret = RegUnLoadKeyA(HKEY_LOCAL_MACHINE, "Test");
+ ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", ret);
+
+ set_privileges(SE_RESTORE_NAME, FALSE);
+
+ DeleteFileA("saved_key");
+ DeleteFileA("saved_key.LOG");
+}
+
/* tests that show that RegConnectRegistry and
OpenSCManager accept computer names without the
\\ prefix (what MSDN says). */
RegCloseKey(subkey);
}
+static void test_reg_query_info(void)
+{
+ HKEY subkey;
+ HKEY subsubkey;
+ LONG ret;
+ char classbuffer[32];
+ WCHAR classbufferW[32];
+ char expectbuffer[32];
+ WCHAR expectbufferW[32];
+ char subkey_class[] = "subkey class";
+ WCHAR subkey_classW[] = {'s','u','b','k','e','y',' ','c','l','a','s','s',0};
+ char subsubkey_class[] = "subsubkey class";
+ DWORD classlen;
+ DWORD subkeys, maxsubkeylen, maxclasslen;
+ DWORD values, maxvaluenamelen, maxvaluelen;
+ DWORD sdlen;
+ FILETIME lastwrite;
+
+ ret = RegCreateKeyExA(hkey_main, "subkey", 0, subkey_class, 0, KEY_ALL_ACCESS, NULL, &subkey, NULL);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ /* all parameters NULL */
+ ret = RegQueryInfoKeyA(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_INVALID_HANDLE, "ret = %d\n", ret);
+
+ ret = RegQueryInfoKeyW(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_INVALID_HANDLE, "ret = %d\n", ret);
+
+ /* not requesting any information */
+ ret = RegQueryInfoKeyA(subkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+
+ ret = RegQueryInfoKeyW(subkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+
+ /* class without length is invalid */
+ memset(classbuffer, 0x55, sizeof(classbuffer));
+ ret = RegQueryInfoKeyA(subkey, classbuffer, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_INVALID_PARAMETER, "ret = %d\n", ret);
+ ok(classbuffer[0] == 0x55, "classbuffer[0] = 0x%x\n", classbuffer[0]);
+
+ memset(classbufferW, 0x55, sizeof(classbufferW));
+ ret = RegQueryInfoKeyW(subkey, classbufferW, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_INVALID_PARAMETER, "ret = %d\n", ret);
+ ok(classbufferW[0] == 0x5555, "classbufferW[0] = 0x%x\n", classbufferW[0]);
+
+ /* empty key */
+ sdlen = 0;
+ ret = RegQueryInfoKeyA(subkey, NULL, &classlen, NULL, &subkeys, &maxsubkeylen, &maxclasslen, &values, &maxvaluenamelen, &maxvaluelen, &sdlen, &lastwrite);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(classlen == strlen(subkey_class), "classlen = %u\n", classlen);
+ ok(subkeys == 0, "subkeys = %u\n", subkeys);
+ ok(maxsubkeylen == 0, "maxsubkeylen = %u\n", maxsubkeylen);
+ ok(maxclasslen == 0, "maxclasslen = %u\n", maxclasslen);
+ ok(values == 0, "values = %u\n", values);
+ ok(maxvaluenamelen == 0, "maxvaluenamelen = %u\n", maxvaluenamelen);
+ ok(maxvaluelen == 0, "maxvaluelen = %u\n", maxvaluelen);
+ todo_wine ok(sdlen != 0, "sdlen = %u\n", sdlen);
+ ok(lastwrite.dwLowDateTime != 0, "lastwrite.dwLowDateTime = %u\n", lastwrite.dwLowDateTime);
+ ok(lastwrite.dwHighDateTime != 0, "lastwrite.dwHighDateTime = %u\n", lastwrite.dwHighDateTime);
+
+ sdlen = 0;
+ ret = RegQueryInfoKeyW(subkey, NULL, &classlen, NULL, &subkeys, &maxsubkeylen, &maxclasslen, &values, &maxvaluenamelen, &maxvaluelen, &sdlen, &lastwrite);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(classlen == strlen(subkey_class), "classlen = %u\n", classlen);
+ ok(subkeys == 0, "subkeys = %u\n", subkeys);
+ ok(maxsubkeylen == 0, "maxsubkeylen = %u\n", maxsubkeylen);
+ ok(maxclasslen == 0, "maxclasslen = %u\n", maxclasslen);
+ ok(values == 0, "values = %u\n", values);
+ ok(maxvaluenamelen == 0, "maxvaluenamelen = %u\n", maxvaluenamelen);
+ ok(maxvaluelen == 0, "maxvaluelen = %u\n", maxvaluelen);
+ todo_wine ok(sdlen != 0, "sdlen = %u\n", sdlen);
+ ok(lastwrite.dwLowDateTime != 0, "lastwrite.dwLowDateTime = %u\n", lastwrite.dwLowDateTime);
+ ok(lastwrite.dwHighDateTime != 0, "lastwrite.dwHighDateTime = %u\n", lastwrite.dwHighDateTime);
+
+ ret = RegCreateKeyExA(subkey, "subsubkey", 0, subsubkey_class, 0, KEY_ALL_ACCESS, NULL, &subsubkey, NULL);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ ret = RegSetValueExA(subkey, NULL, 0, REG_SZ, (const BYTE*)"data", 5);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ /* with subkey & default value */
+ sdlen = 0;
+ ret = RegQueryInfoKeyA(subkey, NULL, &classlen, NULL, &subkeys, &maxsubkeylen, &maxclasslen, &values, &maxvaluenamelen, &maxvaluelen, &sdlen, &lastwrite);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(classlen == strlen(subkey_class), "classlen = %u\n", classlen);
+ ok(subkeys == 1, "subkeys = %u\n", subkeys);
+ ok(maxsubkeylen == strlen("subsubkey"), "maxsubkeylen = %u\n", maxsubkeylen);
+ ok(maxclasslen == strlen(subsubkey_class), "maxclasslen = %u\n", maxclasslen);
+ ok(values == 1, "values = %u\n", values);
+ ok(maxvaluenamelen == 0, "maxvaluenamelen = %u\n", maxvaluenamelen);
+ ok(maxvaluelen == sizeof("data") * sizeof(WCHAR), "maxvaluelen = %u\n", maxvaluelen);
+ todo_wine ok(sdlen != 0, "sdlen = %u\n", sdlen);
+ ok(lastwrite.dwLowDateTime != 0, "lastwrite.dwLowDateTime = %u\n", lastwrite.dwLowDateTime);
+ ok(lastwrite.dwHighDateTime != 0, "lastwrite.dwHighDateTime = %u\n", lastwrite.dwHighDateTime);
+
+ sdlen = 0;
+ ret = RegQueryInfoKeyW(subkey, NULL, &classlen, NULL, &subkeys, &maxsubkeylen, &maxclasslen, &values, &maxvaluenamelen, &maxvaluelen, &sdlen, &lastwrite);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(classlen == strlen(subkey_class), "classlen = %u\n", classlen);
+ ok(subkeys == 1, "subkeys = %u\n", subkeys);
+ ok(maxsubkeylen == strlen("subsubkey"), "maxsubkeylen = %u\n", maxsubkeylen);
+ ok(maxclasslen == strlen(subsubkey_class), "maxclasslen = %u\n", maxclasslen);
+ ok(values == 1, "values = %u\n", values);
+ ok(maxvaluenamelen == 0, "maxvaluenamelen = %u\n", maxvaluenamelen);
+ ok(maxvaluelen == sizeof("data") * sizeof(WCHAR), "maxvaluelen = %u\n", maxvaluelen);
+ todo_wine ok(sdlen != 0, "sdlen = %u\n", sdlen);
+ ok(lastwrite.dwLowDateTime != 0, "lastwrite.dwLowDateTime = %u\n", lastwrite.dwLowDateTime);
+ ok(lastwrite.dwHighDateTime != 0, "lastwrite.dwHighDateTime = %u\n", lastwrite.dwHighDateTime);
+
+ ret = RegSetValueExA(subkey, "value one", 0, REG_SZ, (const BYTE*)"first value data", 17);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ ret = RegSetValueExA(subkey, "value 2", 0, REG_SZ, (const BYTE*)"second value data", 18);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ /* with named value */
+ ret = RegQueryInfoKeyA(subkey, NULL, &classlen, NULL, &subkeys, &maxsubkeylen, &maxclasslen, &values, &maxvaluenamelen, &maxvaluelen, &sdlen, &lastwrite);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(values == 3, "values = %u\n", values);
+ ok(maxvaluenamelen == strlen("value one"), "maxvaluenamelen = %u\n", maxvaluenamelen);
+ ok(maxvaluelen == sizeof("second value data") * sizeof(WCHAR), "maxvaluelen = %u\n", maxvaluelen);
+
+ ret = RegQueryInfoKeyW(subkey, NULL, &classlen, NULL, &subkeys, &maxsubkeylen, &maxclasslen, &values, &maxvaluenamelen, &maxvaluelen, &sdlen, &lastwrite);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(values == 3, "values = %u\n", values);
+ ok(maxvaluenamelen == strlen("value one"), "maxvaluenamelen = %u\n", maxvaluenamelen);
+ ok(maxvaluelen == sizeof("second value data") * sizeof(WCHAR), "maxvaluelen = %u\n", maxvaluelen);
+
+ /* class name with zero size buffer */
+ memset(classbuffer, 0x55, sizeof(classbuffer));
+ classlen = 0;
+ ret = RegQueryInfoKeyA(subkey, classbuffer, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(classlen == strlen(subkey_class) /* win2k */ ||
+ classlen == 0, "classlen = %u\n", classlen);
+ memset(expectbuffer, 0x55, sizeof(expectbuffer));
+ ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)), "classbuffer was modified\n");
+
+ memset(classbufferW, 0x55, sizeof(classbufferW));
+ classlen = 0;
+ ret = RegQueryInfoKeyW(subkey, classbufferW, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(classlen == strlen(subkey_class) /* win2k */ ||
+ classlen == 0, "classlen = %u\n", classlen);
+ memset(expectbufferW, 0x55, sizeof(expectbufferW));
+ ok(!memcmp(classbufferW, expectbufferW, sizeof(classbufferW)), "classbufferW was modified\n");
+
+ /* class name with one char buffer */
+ memset(classbuffer, 0x55, sizeof(classbuffer));
+ classlen = 1;
+ ret = RegQueryInfoKeyA(subkey, classbuffer, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_MORE_DATA, "ret = %d\n", ret);
+ ok(classlen == 0, "classlen = %u\n", classlen);
+ memset(expectbuffer, 0x55, sizeof(expectbuffer));
+ expectbuffer[0] = 0;
+ ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)), "classbuffer was modified\n");
+
+ memset(classbufferW, 0x55, sizeof(classbufferW));
+ classlen = 1;
+ ret = RegQueryInfoKeyW(subkey, classbufferW, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_INSUFFICIENT_BUFFER, "ret = %d\n", ret);
+ ok(classlen == 0 /* win8 */ ||
+ classlen == strlen(subkey_class), "classlen = %u\n", classlen);
+ memset(expectbufferW, 0x55, sizeof(expectbufferW));
+ ok(!memcmp(classbufferW, expectbufferW, sizeof(classbufferW)), "classbufferW was modified\n");
+
+ /* class name with buffer one char too small */
+ memset(classbuffer, 0x55, sizeof(classbuffer));
+ classlen = sizeof(subkey_class) - 1;
+ ret = RegQueryInfoKeyA(subkey, classbuffer, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_MORE_DATA, "ret = %d\n", ret);
+ ok(classlen == sizeof(subkey_class) - 2, "classlen = %u\n", classlen);
+ memset(expectbuffer, 0x55, sizeof(expectbuffer));
+ strcpy(expectbuffer, subkey_class);
+ expectbuffer[sizeof(subkey_class) - 2] = 0;
+ expectbuffer[sizeof(subkey_class) - 1] = 0x55;
+ ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)),
+ "classbuffer = %.*s, expected %s\n",
+ (int)sizeof(classbuffer), classbuffer, expectbuffer);
+
+ memset(classbufferW, 0x55, sizeof(classbufferW));
+ classlen = sizeof(subkey_class) - 1;
+ ret = RegQueryInfoKeyW(subkey, classbufferW, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_INSUFFICIENT_BUFFER, "ret = %d\n", ret);
+ ok(classlen == sizeof(subkey_class) - 2 /* win8 */ ||
+ classlen == strlen(subkey_class), "classlen = %u\n", classlen);
+ memset(expectbufferW, 0x55, sizeof(expectbufferW));
+ ok(!memcmp(classbufferW, expectbufferW, sizeof(classbufferW)), "classbufferW was modified\n");
+
+ /* class name with large enough buffer */
+ memset(classbuffer, 0x55, sizeof(classbuffer));
+ classlen = sizeof(subkey_class);
+ ret = RegQueryInfoKeyA(subkey, classbuffer, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(classlen == sizeof(subkey_class) - 1, "classlen = %u\n", classlen);
+ memset(expectbuffer, 0x55, sizeof(expectbuffer));
+ strcpy(expectbuffer, subkey_class);
+ ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)),
+ "classbuffer = \"%.*s\", expected %s\n",
+ (int)sizeof(classbuffer), classbuffer, expectbuffer);
+
+ memset(classbufferW, 0x55, sizeof(classbufferW));
+ classlen = sizeof(subkey_class);
+ ret = RegQueryInfoKeyW(subkey, classbufferW, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ ok(ret == ERROR_SUCCESS, "ret = %d\n", ret);
+ ok(classlen == sizeof(subkey_class) - 1, "classlen = %u\n", classlen);
+ memset(expectbufferW, 0x55, sizeof(expectbufferW));
+ lstrcpyW(expectbufferW, subkey_classW);
+ ok(!memcmp(classbufferW, expectbufferW, sizeof(classbufferW)),
+ "classbufferW = %s, expected %s\n",
+ wine_dbgstr_wn(classbufferW, sizeof(classbufferW) / sizeof(WCHAR)), wine_dbgstr_w(expectbufferW));
+
+ RegDeleteKeyA(subsubkey, "");
+ RegCloseKey(subsubkey);
+ RegDeleteKeyA(subkey, "");
+ RegCloseKey(subkey);
+}
+
static void test_string_termination(void)
{
HKEY subkey;
test_reg_close_key();
test_reg_delete_key();
test_reg_query_value();
+ test_reg_query_info();
test_string_termination();
test_symlinks();
test_redirection();
test_classesroot_enum();
test_classesroot_mask();
- /* SaveKey/LoadKey require the SE_BACKUP_NAME privilege to be set */
- if (set_privileges(SE_BACKUP_NAME, TRUE) &&
- set_privileges(SE_RESTORE_NAME, TRUE))
- {
- test_reg_save_key();
- test_reg_load_key();
- test_reg_unload_key();
-
- set_privileges(SE_BACKUP_NAME, FALSE);
- set_privileges(SE_RESTORE_NAME, FALSE);
- }
+ test_reg_save_key();
+ test_reg_load_key();
+ test_reg_unload_key();
test_reg_delete_tree();
test_rw_order();