diff --git a/rostests/apitests/advapi32/CMakeLists.txt b/rostests/apitests/advapi32/CMakeLists.txt index dd8802967fa..dcc8a352c70 100644 --- a/rostests/apitests/advapi32/CMakeLists.txt +++ b/rostests/apitests/advapi32/CMakeLists.txt @@ -6,6 +6,7 @@ list(APPEND SOURCE LockDatabase.c QueryServiceConfig2.c RegEnumValueW.c + RegQueryInfoKey.c RtlEncryptMemory.c SaferIdentifyLevel.c testlist.c) diff --git a/rostests/apitests/advapi32/RegQueryInfoKey.c b/rostests/apitests/advapi32/RegQueryInfoKey.c new file mode 100644 index 00000000000..b6f1360d3e4 --- /dev/null +++ b/rostests/apitests/advapi32/RegQueryInfoKey.c @@ -0,0 +1,76 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: LGPLv2.1+ - See COPYING.Lib in the top level directory + * PURPOSE: Test for RegQueryInfoKey + * PROGRAMMER: Thomas Faber + */ + +#include + +#define WIN32_NO_STATUS +#include + +#define TestKeyAccess(da, er, es) TestKeyAccess_(__FILE__, __LINE__, da, er, es) +static +VOID +TestKeyAccess_( + _In_ PCSTR File, + _In_ INT Line, + _In_ REGSAM DesiredAccess, + _In_ LONG ExpectedReturn, + _In_ BOOLEAN ExpectSd) +{ + DWORD cbSd; + HKEY hKey; + LONG ret; + + ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software", 0, DesiredAccess, &hKey); + ok_(File, Line)(ret == NO_ERROR, "RegOpenKeyEx returned %ld\n", ret); + if (ret == NO_ERROR) + { + cbSd = 0x55555555; + ret = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &cbSd, NULL); + ok_(File, Line)(ret == ExpectedReturn, "RegQueryInfoKeyW returned %ld\n", ret); + if (ExpectSd) + ok_(File, Line)(cbSd != 0 && cbSd != 0x55555555, "RegQueryInfoKeyW - cbSd = %lu\n", cbSd); + else + ok_(File, Line)(cbSd == 0, "RegQueryInfoKeyW - cbSd = %lu\n", cbSd); + + cbSd = 0x55555555; + ret = RegQueryInfoKeyA(hKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &cbSd, NULL); + ok_(File, Line)(ret == ExpectedReturn, "RegQueryInfoKeyA returned %ld\n", ret); + if (ExpectSd) + ok_(File, Line)(cbSd != 0 && cbSd != 0x55555555, "RegQueryInfoKeyA - cbSd = %lu\n", cbSd); + else + ok_(File, Line)(cbSd == 0, "RegQueryInfoKeyA - cbSd = %lu\n", cbSd); + ret = RegCloseKey(hKey); + ok_(File, Line)(ret == NO_ERROR, "RegCloseKey returned %ld\n", ret); + } + else + { + skip_(File, Line)("No key handle\n"); + } +} + +START_TEST(RegQueryInfoKey) +{ + /* 0 access just fails the open */ + if (0) + TestKeyAccess(0, ERROR_ACCESS_DENIED, FALSE); + /* Without KEY_QUERY_VALUE we can't query anything */ + TestKeyAccess(READ_CONTROL, ERROR_ACCESS_DENIED, FALSE); + /* Without READ_CONTROL we'll get success but SD size will yield 0 */ + TestKeyAccess(KEY_QUERY_VALUE, NO_ERROR, FALSE); + /* With the two combined we get everything */ + TestKeyAccess(KEY_QUERY_VALUE | READ_CONTROL, NO_ERROR, TRUE); + /* Write rights give us everything too */ + TestKeyAccess(KEY_SET_VALUE, NO_ERROR, TRUE); + TestKeyAccess(KEY_CREATE_SUB_KEY, NO_ERROR, TRUE); + TestKeyAccess(KEY_CREATE_LINK, NO_ERROR, TRUE); + TestKeyAccess(DELETE, NO_ERROR, TRUE); + TestKeyAccess(WRITE_DAC, NO_ERROR, TRUE); + TestKeyAccess(WRITE_OWNER, NO_ERROR, TRUE); + /* But these return nothing */ + TestKeyAccess(KEY_ENUMERATE_SUB_KEYS, ERROR_ACCESS_DENIED, FALSE); + TestKeyAccess(KEY_NOTIFY, ERROR_ACCESS_DENIED, FALSE); +} diff --git a/rostests/apitests/advapi32/testlist.c b/rostests/apitests/advapi32/testlist.c index 4c35a7b85d9..93c626e2cd4 100644 --- a/rostests/apitests/advapi32/testlist.c +++ b/rostests/apitests/advapi32/testlist.c @@ -9,6 +9,7 @@ extern void func_HKEY_CLASSES_ROOT(void); extern void func_LockDatabase(void); extern void func_QueryServiceConfig2(void); extern void func_RegEnumValueW(void); +extern void func_RegQueryInfoKey(void); extern void func_RtlEncryptMemory(void); extern void func_SaferIdentifyLevel(void); @@ -19,7 +20,8 @@ const struct test winetest_testlist[] = { "HKEY_CLASSES_ROOT", func_HKEY_CLASSES_ROOT }, { "LockDatabase" , func_LockDatabase }, { "QueryServiceConfig2", func_QueryServiceConfig2 }, - { "RegEnumValueW", func_RegEnumValueW}, + { "RegEnumValueW", func_RegEnumValueW }, + { "RegQueryInfoKey", func_RegQueryInfoKey }, { "RtlEncryptMemory", func_RtlEncryptMemory }, { "SaferIdentifyLevel", func_SaferIdentifyLevel },