https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d778d04a16a2cb67bef1574b8272c6e4d91b75dd

commit d778d04a16a2cb67bef1574b8272c6e4d91b75dd
Author:     Bișoc George <[email protected]>
AuthorDate: Fri Apr 17 12:47:09 2020 +0200
Commit:     GitHub <[email protected]>
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 },

Reply via email to