From: Rafal Harabien Date: Fri, 7 Oct 2011 16:13:03 +0000 (+0000) Subject: [KMTESTS\NTOS_KE] - Add KeTimer test stub which tests only KeInitializeTimerEx (Note... X-Git-Tag: backups/iut-netsh@54410~340 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=b2b0280779b41806295fd2ae8391731ad89ece71 [KMTESTS\NTOS_KE] - Add KeTimer test stub which tests only KeInitializeTimerEx (Note: this function initializes more fields of dispatch header than KeInitializeEvent). svn path=/trunk/; revision=54047 --- diff --git a/rostests/kmtests/CMakeLists.txt b/rostests/kmtests/CMakeLists.txt index 310d3425b60..8011065e025 100644 --- a/rostests/kmtests/CMakeLists.txt +++ b/rostests/kmtests/CMakeLists.txt @@ -43,6 +43,7 @@ list(APPEND KMTEST_DRV_SOURCE ntos_ke/KeIrql.c ntos_ke/KeProcessor.c ntos_ke/KeSpinLock.c + ntos_ke/KeTimer.c ntos_mm/MmSection.c ntos_ob/ObReference.c ntos_ob/ObType.c diff --git a/rostests/kmtests/kmtest_drv.rbuild b/rostests/kmtests/kmtest_drv.rbuild index d9789a23c64..624b1b5e816 100644 --- a/rostests/kmtests/kmtest_drv.rbuild +++ b/rostests/kmtests/kmtest_drv.rbuild @@ -43,6 +43,7 @@ KeIrql.c KeProcessor.c KeSpinLock.c + KeTimer.c MmSection.c diff --git a/rostests/kmtests/kmtest_drv/testlist.c b/rostests/kmtests/kmtest_drv/testlist.c index 4fffe48ec55..2cf37277e4d 100644 --- a/rostests/kmtests/kmtest_drv/testlist.c +++ b/rostests/kmtests/kmtest_drv/testlist.c @@ -29,6 +29,7 @@ KMT_TESTFUNC Test_KeEvent; KMT_TESTFUNC Test_KeGuardedMutex; KMT_TESTFUNC Test_KeIrql; KMT_TESTFUNC Test_KeProcessor; +KMT_TESTFUNC Test_KeTimer; KMT_TESTFUNC Test_KernelType; KMT_TESTFUNC Test_MmSection; KMT_TESTFUNC Test_ObReference; @@ -63,6 +64,7 @@ const KMT_TEST TestList[] = { "KeGuardedMutex", Test_KeGuardedMutex }, { "KeIrql", Test_KeIrql }, { "-KeProcessor", Test_KeProcessor }, + { "KeTimer", Test_KeTimer }, { "-KernelType", Test_KernelType }, { "MmSection", Test_MmSection }, { "ObReference", Test_ObReference }, diff --git a/rostests/kmtests/ntos_ke/KeTimer.c b/rostests/kmtests/ntos_ke/KeTimer.c new file mode 100644 index 00000000000..69cb48f86f8 --- /dev/null +++ b/rostests/kmtests/ntos_ke/KeTimer.c @@ -0,0 +1,70 @@ +/* + * PROJECT: ReactOS kernel-mode tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Kernel-Mode Test Suite Timer test + * PROGRAMMER: Rafal Harabien + */ + +#include + +#define CheckTimer(Timer, ExpectedType, State, ExpectedWaitNext, \ + Irql, ThreadList, ThreadCount) do \ +{ \ + INT TheIndex; \ + PLIST_ENTRY TheEntry; \ + PKTHREAD TheThread; \ + ok_eq_uint((Timer)->Header.Type, ExpectedType); \ + ok_eq_uint((Timer)->Header.Hand, sizeof *(Timer) / sizeof(ULONG)); \ + ok_eq_hex((Timer)->Header.Lock & 0xFF00FF00L, 0x00005500L); \ + ok_eq_long((Timer)->Header.SignalState, State); \ + TheEntry = (Timer)->Header.WaitListHead.Flink; \ + for (TheIndex = 0; TheIndex < (ThreadCount); ++TheIndex) \ + { \ + TheThread = CONTAINING_RECORD(TheEntry, KTHREAD, \ + WaitBlock[0].WaitListEntry); \ + ok_eq_pointer(TheThread, (ThreadList)[TheIndex]); \ + ok_eq_pointer(TheEntry->Flink->Blink, TheEntry); \ + TheEntry = TheEntry->Flink; \ + } \ + ok_eq_pointer(TheEntry, &(Timer)->Header.WaitListHead); \ + ok_eq_pointer(TheEntry->Flink->Blink, TheEntry); \ + ok_eq_long(KeReadStateTimer(Timer), State); \ + ok_eq_bool(Thread->WaitNext, ExpectedWaitNext); \ + ok_irql(Irql); \ +} while (0) + +static +VOID +TestTimerFunctional( + IN PKTIMER Timer, + IN TIMER_TYPE Type, + IN KIRQL OriginalIrql) +{ + PKTHREAD Thread = KeGetCurrentThread(); + + memset(Timer, 0x55, sizeof *Timer); + KeInitializeTimerEx(Timer, Type); + CheckTimer(Timer, TimerNotificationObject + Type, 0L, FALSE, OriginalIrql, (PVOID *)NULL, 0); +} + +START_TEST(KeTimer) +{ + KTIMER Timer; + KIRQL Irql; + KIRQL Irqls[] = { PASSIVE_LEVEL, APC_LEVEL, DISPATCH_LEVEL, HIGH_LEVEL }; + INT i; + + for (i = 0; i < sizeof Irqls / sizeof Irqls[0]; ++i) + { + /* DRIVER_IRQL_NOT_LESS_OR_EQUAL (TODO: on MP only?) */ + if (Irqls[i] > DISPATCH_LEVEL && KmtIsCheckedBuild) + return; + KeRaiseIrql(Irqls[i], &Irql); + TestTimerFunctional(&Timer, NotificationTimer, Irqls[i]); + TestTimerFunctional(&Timer, SynchronizationTimer, Irqls[i]); + KeLowerIrql(Irql); + } + + ok_irql(PASSIVE_LEVEL); + KmtSetIrql(PASSIVE_LEVEL); +}