Author: tfaber
Date: Sat Jul 9 22:02:54 2011
New Revision: 52592
URL:
http://svn.reactos.org/svn/reactos?rev=52592&view=rev
Log:
[KMTESTS]
- decrease log buffer size because ROS has a problem with unlocking it otherwise ;)
- add test for critical/guarded regions
- add test for executive resources (part 1)
Added:
branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExResource.c (with props)
branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeApc.c (with props)
Modified:
branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt
branches/GSoC_2011/KMTestSuite/kmtests/kmtest/kmtest.c
branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild
branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c
branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeDpc.c
Modified: branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/C…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt [iso-8859-1] Sat Jul 9 22:02:54
2011
@@ -15,11 +15,13 @@
example/Example.c
ntos_ex/ExPools.c
+ ntos_ex/ExResource.c
ntos_ex/ExTimer.c
ntos_fsrtl/FsRtlExpression.c
ntos_io/IoDeviceInterface.c
ntos_io/IoIrp.c
ntos_io/IoMdl.c
+ ntos_ke/KeApc.c
ntos_ke/KeDpc.c
ntos_ke/KeIrql.c
ntos_ke/KeProcessor.c
Modified: branches/GSoC_2011/KMTestSuite/kmtests/kmtest/kmtest.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/k…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/kmtest/kmtest.c [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/kmtest/kmtest.c [iso-8859-1] Sat Jul 9
22:02:54 2011
@@ -23,7 +23,7 @@
#define SERVICE_NAME L"Kmtest"
#define SERVICE_PATH L"kmtest_drv.sys"
-#define LOGBUFFER_SIZE 65000
+#define LOGBUFFER_SIZE 16364
#define RESULTBUFFER_SIZE FIELD_OFFSET(KMT_RESULTBUFFER, LogBuffer[LOGBUFFER_SIZE])
HANDLE KmtestHandle;
Modified: branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/k…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild [iso-8859-1] Sat Jul 9
22:02:54 2011
@@ -14,6 +14,7 @@
</directory>
<directory name="ntos_ex">
<file>ExPools.c</file>
+ <file>ExResource.c</file>
<file>ExTimer.c</file>
</directory>
<directory name="ntos_fsrtl">
@@ -25,6 +26,7 @@
<file>IoMdl.c</file>
</directory>
<directory name="ntos_ke">
+ <file>KeApc.c</file>
<file>KeDpc.c</file>
<file>KeIrql.c</file>
<file>KeProcessor.c</file>
Modified: branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/k…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c [iso-8859-1] Sat Jul 9
22:02:54 2011
@@ -10,11 +10,13 @@
KMT_TESTFUNC Test_Example;
KMT_TESTFUNC Test_ExPools;
+KMT_TESTFUNC Test_ExResource;
KMT_TESTFUNC Test_ExTimer;
KMT_TESTFUNC Test_FsRtlExpression;
KMT_TESTFUNC Test_IoDeviceInterface;
KMT_TESTFUNC Test_IoIrp;
KMT_TESTFUNC Test_IoMdl;
+KMT_TESTFUNC Test_KeApc;
KMT_TESTFUNC Test_KeDpc;
KMT_TESTFUNC Test_KeIrql;
KMT_TESTFUNC Test_KeProcessor;
@@ -24,11 +26,13 @@
{
{ "Example", Test_Example },
{ "ExPools", Test_ExPools },
+ { "ExResource", Test_ExResource },
{ "ExTimer", Test_ExTimer },
{ "FsRtlExpression", Test_FsRtlExpression },
{ "IoDeviceInterface", Test_IoDeviceInterface },
{ "IoIrp", Test_IoIrp },
{ "IoMdl", Test_IoMdl },
+ { "KeApc", Test_KeApc },
{ "KeDpc", Test_KeDpc },
{ "KeIrql", Test_KeIrql },
{ "KeProcessor", Test_KeProcessor },
Added: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExResource.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/n…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExResource.c (added)
+++ branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExResource.c [iso-8859-1] Sat Jul 9
22:02:54 2011
@@ -1,0 +1,270 @@
+/*
+ * PROJECT: ReactOS kernel-mode tests
+ * LICENSE: GPLv2+ - See COPYING in the top level directory
+ * PURPOSE: Kernel-Mode Test Suite Executive Resource test
+ * PROGRAMMER: Thomas Faber <thfabba(a)gmx.de>
+ */
+
+#undef NTDDI_VERSION
+#define NTDDI_VERSION NTDDI_WS03SP1
+#include <ntddk.h>
+#include <ntifs.h>
+#include <ndk/extypes.h>
+#include <kmt_test.h>
+#include <pseh/pseh2.h>
+
+//#define NDEBUG
+#include <debug.h>
+
+/* TODO: this is the Windows Server 2003 version! ROS should use this!
+ * This declaration can be removed once ROS headers are corrected */
+typedef struct _ERESOURCE_2K3 {
+ LIST_ENTRY SystemResourcesList;
+ POWNER_ENTRY OwnerTable;
+ SHORT ActiveCount;
+ USHORT Flag;
+ volatile PKSEMAPHORE SharedWaiters;
+ volatile PKEVENT ExclusiveWaiters;
+ OWNER_ENTRY OwnerThreads[2];
+ ULONG ContentionCount;
+ USHORT NumberOfSharedWaiters;
+ USHORT NumberOfExclusiveWaiters;
+#if defined(_WIN64)
+ PVOID Reserved2; /* TODO: not sure if this should be in here for 2k3 */
+#endif
+ _ANONYMOUS_UNION union {
+ PVOID Address;
+ ULONG_PTR CreatorBackTraceIndex;
+ } DUMMYUNIONNAME;
+ KSPIN_LOCK SpinLock;
+} ERESOURCE_2K3, *PERESOURCE_2K3;
+
+#define CheckResourceFields(Res) do
\
+{
\
+ ok_eq_pointer((Res)->SystemResourcesList.Flink->Blink,
&(Res)->SystemResourcesList); \
+ ok_eq_pointer((Res)->SystemResourcesList.Blink->Flink,
&(Res)->SystemResourcesList); \
+ ok_eq_pointer((Res)->OwnerTable, NULL);
\
+ ok_eq_int((Res)->ActiveCount, 0);
\
+ ok_eq_uint((Res)->Flag, 0);
\
+ ok_eq_pointer((Res)->SharedWaiters, NULL);
\
+ ok_eq_pointer((Res)->ExclusiveWaiters, NULL);
\
+ ok_eq_pointer((PVOID)(Res)->OwnerThreads[0].OwnerThread, NULL);
\
+ ok_eq_ulong((Res)->OwnerThreads[0].TableSize, 0LU);
\
+ ok_eq_pointer((PVOID)(Res)->OwnerThreads[1].OwnerThread, NULL);
\
+ ok_eq_ulong((Res)->OwnerThreads[1].TableSize, 0LU);
\
+ ok_eq_ulong((Res)->ContentionCount, 0LU);
\
+ ok_eq_uint((Res)->NumberOfSharedWaiters, 0);
\
+ ok_eq_uint((Res)->NumberOfExclusiveWaiters, 0);
\
+ /* ok_eq_pointer((Res)->Reserved2, NULL); */
\
+ ok_eq_pointer((Res)->Address, NULL);
\
+ ok_eq_pointer((PVOID)(Res)->SpinLock, NULL);
\
+} while (0)
+
+#define CheckResourceStatus(Res, Exclusive, Shared, ExclusiveWaiters, SharedWaiters) do
\
+{
\
+ if (Exclusive)
\
+ ok_bool_true(ExIsResourceAcquiredExclusiveLite(Res),
"ExIsResourceAcquiredExclusiveLite returned"); \
+ else
\
+ ok_bool_false(ExIsResourceAcquiredExclusiveLite(Res),
"ExIsResourceAcquiredExclusiveLite returned"); \
+ ok_eq_ulong(ExIsResourceAcquiredSharedLite(Res), Shared);
\
+ ok_eq_ulong(ExGetExclusiveWaiterCount(Res), ExclusiveWaiters);
\
+ ok_eq_ulong(ExGetSharedWaiterCount(Res), SharedWaiters);
\
+} while (0)
+
+static
+VOID
+TestResourceSharedAccess(
+ IN PERESOURCE Res)
+{
+ LONG Count = 0;
+
+ KeEnterCriticalRegion();
+ ok_bool_true(ExAcquireResourceSharedLite(Res, FALSE),
"ExAcquireResourceSharedLite returned"); ++Count;
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+
+ ok_bool_true(ExAcquireResourceSharedLite(Res, FALSE),
"ExAcquireResourceSharedLite returned"); ++Count;
+ ok_bool_true(ExAcquireResourceSharedLite(Res, TRUE),
"ExAcquireResourceSharedLite returned"); ++Count;
+ ok_bool_true(ExAcquireSharedStarveExclusive(Res, FALSE),
"ExAcquireSharedStarveExclusive returned"); ++Count;
+ ok_bool_true(ExAcquireSharedStarveExclusive(Res, TRUE),
"ExAcquireSharedStarveExclusive returned"); ++Count;
+ ok_bool_true(ExAcquireSharedWaitForExclusive(Res, FALSE),
"ExAcquireSharedWaitForExclusive returned"); ++Count;
+ ok_bool_true(ExAcquireSharedWaitForExclusive(Res, TRUE),
"ExAcquireSharedWaitForExclusive returned"); ++Count;
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+
+ /* this one fails, TRUE would deadlock */
+ ok_bool_false(ExAcquireResourceExclusiveLite(Res, FALSE),
"ExAcquireResourceExclusiveLite returned");
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+
+ /* this must not crash or deadlock (but can assert) */
+ ExConvertExclusiveToSharedLite(Res);
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+
+ while (Count--)
+ ExReleaseResourceLite(Res);
+ KeLeaveCriticalRegion();
+}
+
+static
+VOID
+TestResourceExclusiveAccess(
+ IN PERESOURCE Res)
+{
+ LONG Count = 0;
+
+ KeEnterCriticalRegion();
+ ok_bool_true(ExAcquireResourceExclusiveLite(Res, FALSE),
"ExAcquireResourceExclusiveLite returned"); ++Count;
+
+ CheckResourceStatus(Res, TRUE, Count, 0LU, 0LU);
+
+ ok_bool_true(ExAcquireResourceExclusiveLite(Res, TRUE),
"ExAcquireResourceExclusiveLite returned"); ++Count;
+ CheckResourceStatus(Res, TRUE, Count, 0LU, 0LU);
+
+ ok_bool_true(ExAcquireResourceSharedLite(Res, FALSE),
"ExAcquireResourceSharedLite returned"); ++Count;
+ ok_bool_true(ExAcquireResourceSharedLite(Res, TRUE),
"ExAcquireResourceSharedLite returned"); ++Count;
+ ok_bool_true(ExAcquireSharedStarveExclusive(Res, FALSE),
"ExAcquireSharedStarveExclusive returned"); ++Count;
+ ok_bool_true(ExAcquireSharedStarveExclusive(Res, TRUE),
"ExAcquireSharedStarveExclusive returned"); ++Count;
+ ok_bool_true(ExAcquireSharedWaitForExclusive(Res, FALSE),
"ExAcquireSharedWaitForExclusive returned"); ++Count;
+ ok_bool_true(ExAcquireSharedWaitForExclusive(Res, TRUE),
"ExAcquireSharedWaitForExclusive returned"); ++Count;
+ CheckResourceStatus(Res, TRUE, Count, 0LU, 0LU);
+
+ ExConvertExclusiveToSharedLite(Res);
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+
+ while (Count--)
+ ExReleaseResourceLite(Res);
+ KeLeaveCriticalRegion();
+}
+
+static
+VOID
+TestResourceUndocumentedShortcuts(
+ IN PERESOURCE Res,
+ IN BOOLEAN AreApcsDisabled)
+{
+ PVOID Ret;
+ LONG Count = 0;
+
+ ok_bool_false(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_uint(KeAreAllApcsDisabled(), AreApcsDisabled);
+
+ /* ExEnterCriticalRegionAndAcquireResourceShared,
ExEnterCriticalRegionAndAcquireSharedWaitForExclusive */
+ Count = 0;
+ Ret = ExEnterCriticalRegionAndAcquireResourceShared(Res); ++Count;
+ ok_eq_pointer(Ret, KeGetCurrentThread()->Win32Thread);
+ ok_bool_true(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_bool(KeAreAllApcsDisabled(), AreApcsDisabled);
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+
+ Ret = ExEnterCriticalRegionAndAcquireResourceShared(Res); ++Count;
+ ok_eq_pointer(Ret, KeGetCurrentThread()->Win32Thread);
+ ok_bool_true(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_bool(KeAreAllApcsDisabled(), AreApcsDisabled);
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+
+ ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(Res); ++Count;
+ ok_eq_pointer(Ret, KeGetCurrentThread()->Win32Thread);
+ ok_bool_true(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_bool(KeAreAllApcsDisabled(), AreApcsDisabled);
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+
+ while (Count-- > 1)
+ {
+ ExReleaseResourceAndLeaveCriticalRegion(Res);
+ ok_bool_true(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_bool(KeAreAllApcsDisabled(), AreApcsDisabled);
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+ }
+
+ ExReleaseResourceAndLeaveCriticalRegion(Res);
+ ok_bool_false(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_bool(KeAreAllApcsDisabled(), AreApcsDisabled);
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+
+ /* ExEnterCriticalRegionAndAcquireResourceExclusive */
+ Count = 0;
+ ok_bool_false(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_bool(KeAreAllApcsDisabled(), AreApcsDisabled);
+ Ret = ExEnterCriticalRegionAndAcquireResourceExclusive(Res); ++Count;
+ ok_eq_pointer(Ret, KeGetCurrentThread()->Win32Thread);
+ ok_bool_true(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_bool(KeAreAllApcsDisabled(), AreApcsDisabled);
+ CheckResourceStatus(Res, TRUE, Count, 0LU, 0LU);
+
+ Ret = ExEnterCriticalRegionAndAcquireResourceExclusive(Res); ++Count;
+ ok_eq_pointer(Ret, KeGetCurrentThread()->Win32Thread);
+ ok_bool_true(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_bool(KeAreAllApcsDisabled(), AreApcsDisabled);
+ CheckResourceStatus(Res, TRUE, Count, 0LU, 0LU);
+
+ ExReleaseResourceAndLeaveCriticalRegion(Res); --Count;
+ ok_bool_true(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_bool(KeAreAllApcsDisabled(), AreApcsDisabled);
+ CheckResourceStatus(Res, TRUE, Count, 0LU, 0LU);
+
+ ExReleaseResourceAndLeaveCriticalRegion(Res); --Count;
+ ok_bool_false(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ ok_eq_uint(KeAreAllApcsDisabled(), AreApcsDisabled);
+ CheckResourceStatus(Res, FALSE, Count, 0LU, 0LU);
+}
+
+START_TEST(ExResource)
+{
+ NTSTATUS Status;
+ ERESOURCE Res;
+ KIRQL Irql;
+
+ /* this must be true even with the different structure versions */
+ ASSERT(sizeof(ERESOURCE) == sizeof(ERESOURCE_2K3));
+
+ /* functional tests & internals */
+ Irql = KeRaiseIrqlToDpcLevel();
+ Status = ExInitializeResourceLite(&Res);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ KeLowerIrql(APC_LEVEL);
+
+ Status = ExDeleteResourceLite(&Res);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ KeLowerIrql(Irql);
+
+ memset(&Res, 0x55, sizeof Res);
+ Status = ExInitializeResourceLite(&Res);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ CheckResourceFields((PERESOURCE_2K3)&Res);
+
+ CheckResourceStatus(&Res, FALSE, 0LU, 0LU, 0LU);
+
+ TestResourceSharedAccess(&Res);
+ CheckResourceStatus(&Res, FALSE, 0LU, 0LU, 0LU);
+
+ TestResourceExclusiveAccess(&Res);
+ CheckResourceStatus(&Res, FALSE, 0LU, 0LU, 0LU);
+
+ TestResourceUndocumentedShortcuts(&Res, FALSE);
+ CheckResourceStatus(&Res, FALSE, 0LU, 0LU, 0LU);
+ KeRaiseIrql(APC_LEVEL, &Irql);
+ TestResourceUndocumentedShortcuts(&Res, TRUE);
+ KeLowerIrql(Irql);
+ ok_bool_false(KeAreApcsDisabled(), "KeAreApcsDisabled returned");
+ CheckResourceStatus(&Res, FALSE, 0LU, 0LU, 0LU);
+
+ /* ExReinitializeResourceLite cleans up after us */
+ Status = ExReinitializeResourceLite(&Res);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ CheckResourceFields((PERESOURCE_2K3)&Res);
+ CheckResourceStatus(&Res, FALSE, 0LU, 0LU, 0LU);
+
+ Status = ExDeleteResourceLite(&Res);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+
+ /* parameter checks */
+ Status = STATUS_SUCCESS;
+ _SEH2_TRY {
+ ExInitializeResourceLite(NULL);
+ } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
+ Status = _SEH2_GetExceptionCode();
+ } _SEH2_END;
+ ok_eq_hex(Status, STATUS_ACCESS_VIOLATION);
+
+ /* these bugcheck
+ ExDeleteResourceLite(NULL);
+ Status = ExDeleteResourceLite(&Res);*/
+}
Propchange: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExResource.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeApc.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/n…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeApc.c (added)
+++ branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeApc.c [iso-8859-1] Sat Jul 9
22:02:54 2011
@@ -1,0 +1,153 @@
+/*
+ * PROJECT: ReactOS kernel-mode tests
+ * LICENSE: GPLv2+ - See COPYING in the top level directory
+ * PURPOSE: Kernel-Mode Test Suite Asynchronous Procedure Call test
+ * PROGRAMMER: Thomas Faber <thfabba(a)gmx.de>
+ */
+
+#undef NTDDI_VERSION
+#define NTDDI_VERSION NTDDI_WS03SP1
+#include <ntddk.h>
+#include <kmt_test.h>
+
+#define CheckApcs(KernelApcsDisabled, SpecialApcsDisabled, Irql) do \
+{ \
+ ok_eq_bool(KeAreApcsDisabled(), KernelApcsDisabled); \
+ ok_eq_bool(KeAreAllApcsDisabled(), SpecialApcsDisabled); \
+ ok_irql(Irql); \
+} while (0)
+
+START_TEST(KeApc)
+{
+ KIRQL Irql;
+
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ /* critical region */
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ /* guarded region */
+ KeEnterGuardedRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeEnterGuardedRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeEnterGuardedRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeLeaveGuardedRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeLeaveGuardedRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeLeaveGuardedRegion();
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ /* mix them */
+ KeEnterGuardedRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeLeaveGuardedRegion();
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeEnterGuardedRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeLeaveGuardedRegion();
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ /* raised irql - APC_LEVEL should disable APCs */
+ KeRaiseIrql(APC_LEVEL, &Irql);
+ CheckApcs(FALSE, TRUE, APC_LEVEL);
+ KeLowerIrql(Irql);
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ /* KeAre*ApcsDisabled are documented to work up to DISPATCH_LEVEL... */
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+ CheckApcs(FALSE, TRUE, DISPATCH_LEVEL);
+ KeLowerIrql(Irql);
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ /* ... but also work on higher levels! */
+ KeRaiseIrql(HIGH_LEVEL, &Irql);
+ CheckApcs(FALSE, TRUE, HIGH_LEVEL);
+ KeLowerIrql(Irql);
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ /* now comes the crazy stuff */
+ KeRaiseIrql(HIGH_LEVEL, &Irql);
+ CheckApcs(FALSE, TRUE, HIGH_LEVEL);
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(FALSE, TRUE, HIGH_LEVEL);
+
+ KeEnterGuardedRegion();
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeLeaveGuardedRegion();
+ CheckApcs(FALSE, TRUE, HIGH_LEVEL);
+ KeLowerIrql(Irql);
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ KeRaiseIrql(HIGH_LEVEL, &Irql);
+ CheckApcs(FALSE, TRUE, HIGH_LEVEL);
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeEnterGuardedRegion();
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeLowerIrql(Irql);
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeLeaveGuardedRegion();
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ KeEnterGuardedRegion();
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeRaiseIrql(HIGH_LEVEL, &Irql);
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeLeaveGuardedRegion();
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeLowerIrql(Irql);
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeRaiseIrql(HIGH_LEVEL, &Irql);
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeEnterGuardedRegion();
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeLowerIrql(Irql);
+ CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
+ KeLeaveGuardedRegion();
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+
+ KeEnterCriticalRegion();
+ CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
+ KeRaiseIrql(HIGH_LEVEL, &Irql);
+ CheckApcs(TRUE, TRUE, HIGH_LEVEL);
+ KeLeaveCriticalRegion();
+ CheckApcs(FALSE, TRUE, HIGH_LEVEL);
+ KeLowerIrql(Irql);
+ CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
+}
Propchange: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeApc.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeDpc.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/n…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeDpc.c [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeDpc.c [iso-8859-1] Sat Jul 9
22:02:54 2011
@@ -82,12 +82,12 @@
ok_eq_uint(Dpc.Type, DpcObject);
ok_eq_uint(Dpc.Importance, DpcImportance);
ok_eq_uint(Dpc.Number, 0);
- ok_eq_pointer(Dpc.DpcListEntry.Flink, (LIST_ENTRY *)0x5555555555555555);
- ok_eq_pointer(Dpc.DpcListEntry.Blink, (LIST_ENTRY *)0x5555555555555555);
+ ok_eq_pointer(Dpc.DpcListEntry.Flink, (LIST_ENTRY *)0x5555555555555555LL);
+ ok_eq_pointer(Dpc.DpcListEntry.Blink, (LIST_ENTRY *)0x5555555555555555LL);
ok_eq_pointer(Dpc.DeferredRoutine, DpcHandler);
ok_eq_pointer(Dpc.DeferredContext, &Dpc);
- ok_eq_pointer(Dpc.SystemArgument1, (PVOID)0x5555555555555555);
- ok_eq_pointer(Dpc.SystemArgument2, (PVOID)0x5555555555555555);
+ ok_eq_pointer(Dpc.SystemArgument1, (PVOID)0x5555555555555555LL);
+ ok_eq_pointer(Dpc.SystemArgument2, (PVOID)0x5555555555555555LL);
ok_eq_pointer(Dpc.DpcData, NULL);
/* simply run the Dpc a few times */
@@ -117,8 +117,6 @@
KeRaiseIrql(HIGH_LEVEL, &Irql3);
ok_dpccount();
KeLowerIrql(Irql3);
- ok_dpccount();
- DPRINT1("This is a debug print\n");
ok_dpccount();
KeLowerIrql(Irql2);
++ExpectedDpcCount;