https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d778d04a16a2cb67bef15…
commit d778d04a16a2cb67bef1574b8272c6e4d91b75dd
Author: Bișoc George <fraizeraust99(a)gmail.com>
AuthorDate: Fri Apr 17 12:47:09 2020 +0200
Commit: GitHub <noreply(a)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 },