Author: tfaber
Date: Sun Jun 21 08:50:10 2015
New Revision: 68225

URL: http://svn.reactos.org/svn/reactos?rev=68225&view=rev
Log:
[NTDLL_APITEST]
- Add a test for SystemFlagsInformation that demonstrates the parameter checks 
performed by NtQuerySystemInformation/NtSetSystemInformation
CORE-9849

Modified:
    trunk/rostests/apitests/ntdll/SystemInfo.c

Modified: trunk/rostests/apitests/ntdll/SystemInfo.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/SystemInfo.c?rev=68225&r1=68224&r2=68225&view=diff
==============================================================================
--- trunk/rostests/apitests/ntdll/SystemInfo.c  [iso-8859-1] (original)
+++ trunk/rostests/apitests/ntdll/SystemInfo.c  [iso-8859-1] Sun Jun 21 
08:50:10 2015
@@ -3,33 +3,182 @@
  * LICENSE:         GPL - See COPYING in the top level directory
  * PURPOSE:         Test for NtQuery/SetSystemInformation
  * PROGRAMMERS:     Timo Kreuzer
+ *                  Thomas Faber <[email protected]>
  */
 
 #include <apitest.h>
 
 #define WIN32_NO_STATUS
 #include <ndk/exfuncs.h>
-
+#include <ndk/rtlfuncs.h>
+#include <ndk/setypes.h>
+
+#define ntv6(x) (LOBYTE(LOWORD(GetVersion())) >= 6 ? (x) : 0)
+
+static
 void
-GetPrivilege()
+Test_Flags(void)
 {
-    HANDLE hToken;
-    TOKEN_PRIVILEGES tkp;
-
-    OpenProcessToken(GetCurrentProcess(),
-                     TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                     &hToken);
-
-    LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, &tkp.Privileges[0].Luid);
-
-    tkp.PrivilegeCount = 1;
-    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
-
-    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
-    CloseHandle(hToken);
+    NTSTATUS Status;
+    ULONG ReturnLength;
+    ULONG Flags;
+    ULONG Buffer[2];
+    ULONG Buffer2[2];
+    PSYSTEM_FLAGS_INFORMATION FlagsInfo = (PVOID)Buffer;
+    BOOLEAN PrivilegeEnabled;
+
+    /* Query */
+    ReturnLength = 0x55555555;
+    Status = NtQuerySystemInformation(SystemFlagsInformation, NULL, 0, 
&ReturnLength);
+    ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation 
returned %lx\n", Status);
+    ok(ReturnLength == 0 ||
+       ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = 
%lu\n", ReturnLength);
+
+    ReturnLength = 0x55555555;
+    Status = NtQuerySystemInformation(SystemFlagsInformation, NULL, 
sizeof(SYSTEM_FLAGS_INFORMATION) - 1, &ReturnLength);
+    ok(Status == STATUS_ACCESS_VIOLATION, "NtQuerySystemInformation returned 
%lx\n", Status);
+    ok(ReturnLength == 0x55555555, "ReturnLength = %lu\n", ReturnLength);
+
+    ReturnLength = 0x55555555;
+    Status = NtQuerySystemInformation(SystemFlagsInformation, (PVOID)2, 0, 
&ReturnLength);
+    ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation 
returned %lx\n", Status);
+    ok(ReturnLength == 0 ||
+       ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = 
%lu\n", ReturnLength);
+
+    ReturnLength = 0x55555555;
+    Status = NtQuerySystemInformation(SystemFlagsInformation, (PVOID)4, 0, 
&ReturnLength);
+    ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation 
returned %lx\n", Status);
+    ok(ReturnLength == 0 ||
+       ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = 
%lu\n", ReturnLength);
+
+    ReturnLength = 0x55555555;
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, 
(PUCHAR)FlagsInfo + 2, sizeof(SYSTEM_FLAGS_INFORMATION), &ReturnLength);
+    ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtQuerySystemInformation 
returned %lx\n", Status);
+    ok(ReturnLength == 0x55555555, "ReturnLength = %lu\n", ReturnLength);
+    ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+
+    ReturnLength = 0x55555555;
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, 
(PUCHAR)FlagsInfo + 2, sizeof(SYSTEM_FLAGS_INFORMATION) - 1, &ReturnLength);
+    ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtQuerySystemInformation 
returned %lx\n", Status);
+    ok(ReturnLength == 0x55555555, "ReturnLength = %lu\n", ReturnLength);
+    ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+
+    ReturnLength = 0x55555555;
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION) - 1, &ReturnLength);
+    ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation 
returned %lx\n", Status);
+    ok(ReturnLength == 0 ||
+       ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = 
%lu\n", ReturnLength);
+    ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+
+    ReturnLength = 0x55555555;
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION), &ReturnLength);
+    ok(Status == STATUS_SUCCESS, "NtQuerySystemInformation returned %lx\n", 
Status);
+    ok(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION), "ReturnLength = 
%lu\n", ReturnLength);
+    ok(FlagsInfo->Flags != 0x55555555, "Flags = %lx\n", FlagsInfo->Flags);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+    Flags = FlagsInfo->Flags;
+
+    ReturnLength = 0x55555555;
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION) + 1, &ReturnLength);
+    ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation 
returned %lx\n", Status);
+    ok(ReturnLength == 0 ||
+       ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = 
%lu\n", ReturnLength);
+    ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION), NULL);
+    ok(Status == STATUS_SUCCESS, "NtQuerySystemInformation returned %lx\n", 
Status);
+    ok(FlagsInfo->Flags == Flags, "Flags = %lx, expected %lx\n", 
FlagsInfo->Flags, Flags);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION), (PVOID)4);
+    ok(Status == STATUS_ACCESS_VIOLATION, "NtQuerySystemInformation returned 
%lx\n", Status);
+    ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION), (PVOID)2);
+    ok(Status == STATUS_ACCESS_VIOLATION, "NtQuerySystemInformation returned 
%lx\n", Status);
+    ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION), (PVOID)1);
+    ok(Status == STATUS_ACCESS_VIOLATION, "NtQuerySystemInformation returned 
%lx\n", Status);
+    ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+
+    RtlFillMemory(Buffer2, sizeof(Buffer2), 0x55);
+    RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+    Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION), (PULONG)((PUCHAR)Buffer2 + 1));
+    ok(Status == STATUS_SUCCESS, "NtQuerySystemInformation returned %lx\n", 
Status);
+    ok(FlagsInfo->Flags == Flags, "Flags = %lx, expected %lx\n", 
FlagsInfo->Flags, Flags);
+    ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
+    ok(Buffer2[0] == 0x00000455, "Buffer2[0] = %lx\n", Buffer2[0]);
+    ok(Buffer2[1] == 0x55555500, "Buffer2[1] = %lx\n", Buffer2[1]);
+
+    /* Set */
+    Status = NtSetSystemInformation(SystemFlagsInformation, NULL, 0);
+    ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtSetSystemInformation returned 
%lx\n", Status);
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, NULL, 
sizeof(SYSTEM_FLAGS_INFORMATION) - 1);
+    ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtSetSystemInformation returned 
%lx\n", Status);
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, NULL, 
sizeof(SYSTEM_FLAGS_INFORMATION));
+    ok(Status == STATUS_ACCESS_DENIED, "NtSetSystemInformation returned 
%lx\n", Status);
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, (PVOID)2, 
sizeof(SYSTEM_FLAGS_INFORMATION));
+    ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtSetSystemInformation 
returned %lx\n", Status);
+
+    Status = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, 
&PrivilegeEnabled);
+    if (!NT_SUCCESS(Status))
+    {
+        skip("Cannot acquire SeDebugPrivilege\n");
+        return;
+    }
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, NULL, 
sizeof(SYSTEM_FLAGS_INFORMATION));
+    ok(Status == STATUS_ACCESS_VIOLATION, "NtSetSystemInformation returned 
%lx\n", Status);
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, (PVOID)2, 
sizeof(SYSTEM_FLAGS_INFORMATION));
+    ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtSetSystemInformation 
returned %lx\n", Status);
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, (PVOID)4, 
sizeof(SYSTEM_FLAGS_INFORMATION));
+    ok(Status == STATUS_ACCESS_VIOLATION, "NtSetSystemInformation returned 
%lx\n", Status);
+
+    FlagsInfo->Flags = Flags;
+    Status = NtSetSystemInformation(SystemFlagsInformation, (PUCHAR)FlagsInfo 
+ 2, sizeof(SYSTEM_FLAGS_INFORMATION));
+    ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtSetSystemInformation 
returned %lx\n", Status);
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, (PUCHAR)FlagsInfo 
+ 2, sizeof(SYSTEM_FLAGS_INFORMATION) - 1);
+    ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtSetSystemInformation 
returned %lx\n", Status);
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION) - 1);
+    ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtSetSystemInformation returned 
%lx\n", Status);
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION) + 1);
+    ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtSetSystemInformation returned 
%lx\n", Status);
+
+    Status = NtSetSystemInformation(SystemFlagsInformation, FlagsInfo, 
sizeof(SYSTEM_FLAGS_INFORMATION));
+    ok(Status == STATUS_SUCCESS, "NtSetSystemInformation returned %lx\n", 
Status);
+
+    ok(FlagsInfo->Flags == Flags, "Flags = %lx, expected %lu\n", 
FlagsInfo->Flags, Flags);
+
+    Status = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, PrivilegeEnabled, FALSE, 
&PrivilegeEnabled);
+    ok(Status == STATUS_SUCCESS, "RtlAdjustPrivilege returned %lx\n", Status);
 }
 
-
+static
 void
 Test_TimeAdjustment(void)
 {
@@ -37,6 +186,7 @@
     SYSTEM_SET_TIME_ADJUST_INFORMATION SetTimeInfo;
     NTSTATUS Status;
     ULONG ReturnLength;
+    BOOLEAN PrivilegeEnabled;
 
     SetTimeInfo.TimeAdjustment = 0;
     SetTimeInfo.Enable = 0;
@@ -54,7 +204,12 @@
     ok_ntstatus(Status, STATUS_PRIVILEGE_NOT_HELD);
 
     /* Get the required privilege */
-    GetPrivilege();
+    Status = RtlAdjustPrivilege(SE_SYSTEMTIME_PRIVILEGE, TRUE, FALSE, 
&PrivilegeEnabled);
+    if (!NT_SUCCESS(Status))
+    {
+        skip("Cannot acquire SeSystemTimePrivilege\n");
+        return;
+    }
 
     /* Test wrong length */
     Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
@@ -110,9 +265,12 @@
                                     sizeof(SetTimeInfo));
     ok_ntstatus(Status, STATUS_SUCCESS);
 
+    Status = RtlAdjustPrivilege(SE_SYSTEMTIME_PRIVILEGE, PrivilegeEnabled, 
FALSE, &PrivilegeEnabled);
+    ok(Status == STATUS_SUCCESS, "RtlAdjustPrivilege returned %lx\n", Status);
 }
 
 START_TEST(NtSystemInformation)
 {
+    Test_Flags();
     Test_TimeAdjustment();
 }


Reply via email to