+/*
+ * PROJECT: ReactOS API tests
+ * LICENSE: GPLv2+ - See COPYING in the top level directory
+ * PURPOSE: Test for the RegEnumKey API
+ * PROGRAMMER: Thomas Faber & Doug Lyons
+ */
+
+#include <apitest.h>
+
+#define WIN32_NO_STATUS
+#include <winreg.h>
+
+START_TEST(RegEnumKey)
+{
+ LONG ErrorCode;
+ HKEY TestKey;
+ HKEY hKey;
+ WCHAR nameBuf[4];
+ DWORD nameLen;
+
+ /* Base key for our test */
+ ErrorCode = RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\ReactOS_apitest", 0, NULL, 0, KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS, NULL, &hKey, NULL);
+ ok_dec(ErrorCode, ERROR_SUCCESS);
+
+ /* Create 1 char subkey */
+ ErrorCode = RegCreateKeyExW(hKey, L"1", 0, NULL, 0, READ_CONTROL, NULL, &TestKey, NULL);
+ ok_dec(ErrorCode, ERROR_SUCCESS);
+ RegCloseKey(TestKey);
+
+ /* Enumerate first key with space for 1 char */
+ nameLen = 1;
+ FillMemory(nameBuf, sizeof(nameBuf), 0x55);
+ ErrorCode = RegEnumKeyExW(hKey, 0, nameBuf, &nameLen, NULL, NULL, NULL, NULL);
+ ok_dec(ErrorCode, ERROR_MORE_DATA);
+ ok_hex(nameBuf[0], 0x5555);
+ ok_hex(nameBuf[1], 0x5555);
+ ok_dec(nameLen, 1);
+
+ /* Enumerate first key with space for 2 chars */
+ nameLen = 2;
+ FillMemory(nameBuf, sizeof(nameBuf), 0x55);
+ ErrorCode = RegEnumKeyExW(hKey, 0, nameBuf, &nameLen, NULL, NULL, NULL, NULL);
+ ok_dec(ErrorCode, ERROR_SUCCESS);
+ ok_hex(nameBuf[0], L'1');
+ ok_hex(nameBuf[1], 0);
+ ok_hex(nameBuf[2], 0x5555);
+ ok_dec(nameLen, 1);
+
+ /* Delete the subkey */
+ ErrorCode = RegDeleteKeyW(hKey, L"1");
+ ok_dec(ErrorCode, ERROR_SUCCESS);
+
+ /* Create 2 char subkey */
+ ErrorCode = RegCreateKeyExW(hKey, L"12", 0, NULL, 0, READ_CONTROL, NULL, &TestKey, NULL);
+ ok_dec(ErrorCode, ERROR_SUCCESS);
+ RegCloseKey(TestKey);
+
+ /* Enumerate first key with space for 2 chars */
+ FillMemory(nameBuf, sizeof(nameBuf), 0x55);
+ nameLen = 2;
+ ErrorCode = RegEnumKeyExW(hKey, 0, nameBuf, &nameLen, NULL, NULL, NULL, NULL);
+ ok_dec(ErrorCode, ERROR_MORE_DATA);
+ ok_hex(nameBuf[0], 0x5555);
+ ok_hex(nameBuf[1], 0x5555);
+ ok(nameLen == 2, "nameLen = %ld, expected 2\n", nameLen);
+
+ /* Enumerate first key with space for 3 chars */
+ FillMemory(nameBuf, sizeof(nameBuf), 0x55);
+ nameLen = 3;
+ ErrorCode = RegEnumKeyExW(hKey, 0, nameBuf, &nameLen, NULL, NULL, NULL, NULL);
+ ok_dec(ErrorCode, ERROR_SUCCESS);
+ ok_hex(nameBuf[0], L'1');
+ ok_hex(nameBuf[1], L'2');
+ ok_hex(nameBuf[2], 0);
+ ok_hex(nameBuf[3], 0x5555);
+ ok(nameLen == 2, "nameLen = %ld, expected 2\n", nameLen);
+
+ /* Delete the subkey */
+ ErrorCode = RegDeleteKeyW(hKey, L"12");
+ ok_dec(ErrorCode, ERROR_SUCCESS);
+
+ /* Delete our parent key */
+ ErrorCode = RegDeleteKeyW(hKey, L"");
+ ok_dec(ErrorCode, ERROR_SUCCESS);
+ RegCloseKey(hKey);
+}