[KMTESTS]
authorThomas Faber <thomas.faber@reactos.org>
Fri, 22 Jul 2011 11:51:18 +0000 (11:51 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Fri, 22 Jul 2011 11:51:18 +0000 (11:51 +0000)
- small structure improvement in kmt_test.h
- add globals to allow easy checking for UP/MP & Free/Checked builds, as that is required for some tests
- add KernelType example test demonstrating the above
- add a function to restore the irql (allows some failing tests to exit gracefully)

svn path=/branches/GSoC_2011/KMTestSuite/; revision=52781

kmtests/CMakeLists.txt
kmtests/example/KernelType.c [new file with mode: 0644]
kmtests/include/kmt_test.h
kmtests/kmtest_drv.rbuild
kmtests/kmtest_drv/kmtest_drv.c
kmtests/kmtest_drv/kmtest_standalone.c
kmtests/kmtest_drv/testlist.c

index 0a80c96..56742eb 100644 (file)
@@ -14,6 +14,7 @@ list(APPEND KMTEST_DRV_SOURCE
     kmtest_drv/testlist.c
 
     example/Example.c
+    example/KernelType.c
     ntos_ex/ExHardError.c
     ntos_ex/ExInterlocked.c
     ntos_ex/ExPools.c
diff --git a/kmtests/example/KernelType.c b/kmtests/example/KernelType.c
new file mode 100644 (file)
index 0000000..1c4b9ba
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * PROJECT:         ReactOS kernel-mode tests
+ * LICENSE:         GPLv2+ - See COPYING in the top level directory
+ * PURPOSE:         Kernel-Mode Test Suite Kernel Type example test
+ * PROGRAMMER:      Thomas Faber <thfabba@gmx.de>
+ */
+
+#include <ntddk.h>
+#include <kmt_test.h>
+
+START_TEST(KernelType)
+{
+    if (KmtIsMultiProcessorBuild)
+        trace("This is a MultiProcessor kernel\n");
+    else
+        trace("This is a Uniprocessor kernel\n");
+    if (KmtIsCheckedBuild)
+        trace("This is a Checked kernel\n");
+    else
+        trace("This is a Free kernel\n");
+}
index 7cd4049..50bb102 100644 (file)
@@ -79,6 +79,11 @@ typedef struct
     PKMT_RESULTBUFFER ResultBuffer;
     PMDL Mdl;
 } KMT_DEVICE_EXTENSION, *PKMT_DEVICE_EXTENSION;
+
+extern BOOLEAN KmtIsCheckedBuild;
+extern BOOLEAN KmtIsMultiProcessorBuild;
+
+VOID KmtSetIrql(IN KIRQL NewIrql);
 #elif defined KMT_USER_MODE
 DWORD KmtRunKernelTest(IN PCSTR TestName);
 
@@ -146,9 +151,22 @@ BOOLEAN KmtSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, ...)
                                              FILE_ANY_ACCESS)
 
 #if defined KMT_DEFINE_TEST_FUNCTIONS
-PKMT_RESULTBUFFER ResultBuffer = NULL;
 
-#if defined KMT_USER_MODE
+#if defined KMT_KERNEL_MODE
+BOOLEAN KmtIsCheckedBuild;
+BOOLEAN KmtIsMultiProcessorBuild;
+
+VOID KmtSetIrql(IN KIRQL NewIrql)
+{
+    KIRQL Irql = KeGetCurrentIrql();
+    if (Irql > NewIrql)
+        KeLowerIrql(NewIrql);
+    else if (Irql < NewIrql)
+        KeRaiseIrql(NewIrql, &Irql);
+}
+
+INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0);
+#elif defined KMT_USER_MODE
 static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T LogBufferMaxLength)
 {
     PKMT_RESULTBUFFER Buffer = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(KMT_RESULTBUFFER, LogBuffer[LogBufferMaxLength]));
@@ -166,8 +184,12 @@ static VOID KmtFreeResultBuffer(PKMT_RESULTBUFFER Buffer)
 {
     HeapFree(GetProcessHeap(), 0, Buffer);
 }
+
+#define KmtVSNPrintF vsnprintf
 #endif /* defined KMT_USER_MODE */
 
+PKMT_RESULTBUFFER ResultBuffer = NULL;
+
 static VOID KmtAddToLogBuffer(PKMT_RESULTBUFFER Buffer, PCSTR String, SIZE_T Length)
 {
     LONG OldLength;
@@ -191,12 +213,6 @@ static VOID KmtAddToLogBuffer(PKMT_RESULTBUFFER Buffer, PCSTR String, SIZE_T Len
     memcpy(&Buffer->LogBuffer[OldLength], String, Length);
 }
 
-#ifdef KMT_KERNEL_MODE
-INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0);
-#elif defined KMT_USER_MODE
-#define KmtVSNPrintF vsnprintf
-#endif /* defined KMT_USER_MODE */
-
 KMT_FORMAT(ms_printf, 5, 0)
 static SIZE_T KmtXVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR FileAndLine, PCSTR Prepend, PCSTR Format, va_list Arguments)
 {
index 81550a3..e79a67f 100644 (file)
@@ -12,6 +12,7 @@
        </directory>
        <directory name="example">
                <file>Example.c</file>
+               <file>KernelType.c</file>
        </directory>
        <directory name="ntos_ex">
                <file>ExHardError.c</file>
index 38c5951..6612567 100644 (file)
@@ -6,6 +6,8 @@
  */
 
 #include <ntddk.h>
+#include <ntifs.h>
+#include <ndk/ketypes.h>
 #include <ntstrsafe.h>
 #include <limits.h>
 #include <pseh/pseh2.h>
@@ -49,6 +51,7 @@ DriverEntry(
     NTSTATUS Status = STATUS_SUCCESS;
     UNICODE_STRING DeviceName;
     PKMT_DEVICE_EXTENSION DeviceExtension;
+    PKPRCB Prcb;
 
     PAGED_CODE();
 
@@ -56,6 +59,10 @@ DriverEntry(
 
     DPRINT("DriverEntry\n");
 
+    Prcb = KeGetCurrentPrcb();
+    KmtIsCheckedBuild = (Prcb->BuildType & PRCB_BUILD_DEBUG) != 0;
+    KmtIsMultiProcessorBuild = (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR) == 0;
+
     RtlInitUnicodeString(&DeviceName, KMTEST_DEVICE_DRIVER_PATH);
     Status = IoCreateDevice(DriverObject, sizeof(KMT_DEVICE_EXTENSION),
                             &DeviceName,
index b3e856b..42dc161 100644 (file)
@@ -6,6 +6,8 @@
  */
 
 #include <ntddk.h>
+#include <ntifs.h>
+#include <ndk/ketypes.h>
 
 #define KMT_DEFINE_TEST_FUNCTIONS
 #include <kmt_test.h>
@@ -104,11 +106,16 @@ DriverEntry(
     PCWSTR DeviceNameSuffix;
     INT Flags = 0;
     int i;
+    PKPRCB Prcb;
 
     PAGED_CODE();
 
     DPRINT("DriverEntry\n");
 
+    Prcb = KeGetCurrentPrcb();
+    KmtIsCheckedBuild = (Prcb->BuildType & PRCB_BUILD_DEBUG) != 0;
+    KmtIsMultiProcessorBuild = (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR) == 0;
+
     /* get the Kmtest device, so that we get a ResultBuffer pointer */
     RtlInitUnicodeString(&KmtestDeviceName, KMTEST_DEVICE_DRIVER_PATH);
     Status = IoGetDeviceObjectPointer(&KmtestDeviceName, FILE_ALL_ACCESS, &KmtestFileObject, &KmtestDeviceObject);
index 48ff9e8..8ef84a5 100644 (file)
@@ -23,6 +23,7 @@ KMT_TESTFUNC Test_KeApc;
 KMT_TESTFUNC Test_KeDpc;
 KMT_TESTFUNC Test_KeIrql;
 KMT_TESTFUNC Test_KeProcessor;
+KMT_TESTFUNC Test_KernelType;
 KMT_TESTFUNC Test_ObCreate;
 
 const KMT_TEST TestList[] =
@@ -42,6 +43,7 @@ const KMT_TEST TestList[] =
     { "KeDpc",                              Test_KeDpc },
     { "KeIrql",                             Test_KeIrql },
     { "KeProcessor",                        Test_KeProcessor },
+    { "KernelType",                         Test_KernelType },
     { "ObCreate",                           Test_ObCreate },
     { NULL,                                 NULL }
 };