https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d778d04a16a2cb67bef157...
commit d778d04a16a2cb67bef1574b8272c6e4d91b75dd Author: Bișoc George fraizeraust99@gmail.com AuthorDate: Fri Apr 17 12:47:09 2020 +0200 Commit: GitHub noreply@github.com CommitDate: Fri Apr 17 13:47:09 2020 +0300
[APITEST][NTDLL] Implement RtlGetNtProductType testcase (#2489) --- modules/rostests/apitests/ntdll/CMakeLists.txt | 1 + .../rostests/apitests/ntdll/RtlGetNtProductType.c | 97 ++++++++++++++++++++++ modules/rostests/apitests/ntdll/testlist.c | 2 + 3 files changed, 100 insertions(+)
diff --git a/modules/rostests/apitests/ntdll/CMakeLists.txt b/modules/rostests/apitests/ntdll/CMakeLists.txt index 7da1843babe..d03b29806c9 100644 --- a/modules/rostests/apitests/ntdll/CMakeLists.txt +++ b/modules/rostests/apitests/ntdll/CMakeLists.txt @@ -56,6 +56,7 @@ list(APPEND SOURCE RtlGetFullPathName_UstrEx.c RtlGetLengthWithoutTrailingPathSeperators.c RtlGetLongestNtPathLength.c + RtlGetNtProductType.c RtlHandle.c RtlImageRvaToVa.c RtlIsNameLegalDOS8Dot3.c diff --git a/modules/rostests/apitests/ntdll/RtlGetNtProductType.c b/modules/rostests/apitests/ntdll/RtlGetNtProductType.c new file mode 100644 index 00000000000..7f148c13ebc --- /dev/null +++ b/modules/rostests/apitests/ntdll/RtlGetNtProductType.c @@ -0,0 +1,97 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: Tests for the RtlGetNtProductType API + * COPYRIGHT: Copyright 2020 Bișoc George <fraizeraust99 at gmail dot com> + */ + +#include "precomp.h" +#include <winbase.h> +#include <winreg.h> + +static +BOOLEAN +ReturnNtProduct(PDWORD ProductNtType) +{ + LONG Result; + HKEY Key; + WCHAR Data[20]; + DWORD Size = sizeof(Data); + + Result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"SYSTEM\CurrentControlSet\Control\ProductOptions", + 0, + KEY_QUERY_VALUE, + &Key); + if (Result != ERROR_SUCCESS) + { + *ProductNtType = 0; + return FALSE; + } + + Result = RegQueryValueExW(Key, + L"ProductType", + NULL, + NULL, + (PBYTE)&Data, + &Size); + if (Result != ERROR_SUCCESS) + { + RegCloseKey(Key); + *ProductNtType = 0; + return FALSE; + } + + if (wcscmp(Data, L"WinNT") == 0) + { + *ProductNtType = NtProductWinNt; + RegCloseKey(Key); + return TRUE; + } + + if (wcscmp(Data, L"LanmanNT") == 0) + { + *ProductNtType = NtProductLanManNt; + RegCloseKey(Key); + return TRUE; + } + + if (wcscmp(Data, L"ServerNT") == 0) + { + *ProductNtType = NtProductServer; + RegCloseKey(Key); + return TRUE; + } + + *ProductNtType = 0; + RegCloseKey(Key); + return FALSE; +} + +START_TEST(RtlGetNtProductType) +{ + BOOLEAN Ret; + DWORD ProductNtType; + NT_PRODUCT_TYPE ProductType = NtProductWinNt; + + /* + * Wrap the call in SEH. This ensures the testcase won't crash but also + * it proves to us that RtlGetNtProductType() throws an exception if a NULL + * argument is being passed to caller as output. + */ + StartSeh() + RtlGetNtProductType(NULL); + EndSeh(STATUS_ACCESS_VIOLATION); + + /* Query the product type normally from the Registry */ + Ret = ReturnNtProduct(&ProductNtType); + if (!Ret) + { + ok(Ret, "Failed to query the product type value!\n"); + } + + /* Now, get the product type from the NTDLL system call */ + Ret = RtlGetNtProductType(&ProductType); + ok(Ret == TRUE, "Expected a valid product type value (and TRUE as returned success code) but got %u as status.\n", Ret); + ok(ProductNtType == ProductType, "Expected the product type value to be the same but got %lu (original value pointed by RtlGetNtProductType() is %d).\n", ProductNtType, ProductType); +} diff --git a/modules/rostests/apitests/ntdll/testlist.c b/modules/rostests/apitests/ntdll/testlist.c index 76357f6ece6..7b3155314eb 100644 --- a/modules/rostests/apitests/ntdll/testlist.c +++ b/modules/rostests/apitests/ntdll/testlist.c @@ -55,6 +55,7 @@ extern void func_RtlGetFullPathName_Ustr(void); extern void func_RtlGetFullPathName_UstrEx(void); extern void func_RtlGetLengthWithoutTrailingPathSeperators(void); extern void func_RtlGetLongestNtPathLength(void); +extern void func_RtlGetNtProductType(void); extern void func_RtlHandle(void); extern void func_RtlImageRvaToVa(void); extern void func_RtlIsNameLegalDOS8Dot3(void); @@ -123,6 +124,7 @@ const struct test winetest_testlist[] = { "RtlGetFullPathName_UstrEx", func_RtlGetFullPathName_UstrEx }, { "RtlGetLengthWithoutTrailingPathSeperators", func_RtlGetLengthWithoutTrailingPathSeperators }, { "RtlGetLongestNtPathLength", func_RtlGetLongestNtPathLength }, + { "RtlGetNtProductType", func_RtlGetNtProductType }, { "RtlHandle", func_RtlHandle }, { "RtlImageRvaToVa", func_RtlImageRvaToVa }, { "RtlIsNameLegalDOS8Dot3", func_RtlIsNameLegalDOS8Dot3 },