2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Timer test
5 * PROGRAMMER: Rafal Harabien <rafalh@reactos.org>
10 #define CheckTimer(Timer, ExpectedType, State, ExpectedWaitNext, \
11 Irql, ThreadList, ThreadCount) do \
14 PLIST_ENTRY TheEntry; \
16 ok_eq_uint((Timer)->Header.Type, ExpectedType); \
17 ok_eq_uint((Timer)->Header.Hand, sizeof *(Timer) / sizeof(ULONG)); \
18 ok_eq_hex((Timer)->Header.Lock & 0xFF00FF00L, 0x00005500L); \
19 ok_eq_long((Timer)->Header.SignalState, State); \
20 TheEntry = (Timer)->Header.WaitListHead.Flink; \
21 for (TheIndex = 0; TheIndex < (ThreadCount); ++TheIndex) \
23 TheThread = CONTAINING_RECORD(TheEntry, KTHREAD, \
24 WaitBlock[0].WaitListEntry); \
25 ok_eq_pointer(TheThread, (ThreadList)[TheIndex]); \
26 ok_eq_pointer(TheEntry->Flink->Blink, TheEntry); \
27 TheEntry = TheEntry->Flink; \
29 ok_eq_pointer(TheEntry, &(Timer)->Header.WaitListHead); \
30 ok_eq_pointer(TheEntry->Flink->Blink, TheEntry); \
31 ok_eq_long(KeReadStateTimer(Timer), State); \
32 ok_eq_bool(Thread->WaitNext, ExpectedWaitNext); \
41 IN KIRQL OriginalIrql
)
43 PKTHREAD Thread
= KeGetCurrentThread();
45 memset(Timer
, 0x55, sizeof *Timer
);
46 KeInitializeTimerEx(Timer
, Type
);
47 CheckTimer(Timer
, TimerNotificationObject
+ Type
, 0L, FALSE
, OriginalIrql
, (PVOID
*)NULL
, 0);
54 KIRQL Irqls
[] = { PASSIVE_LEVEL
, APC_LEVEL
, DISPATCH_LEVEL
, HIGH_LEVEL
};
57 for (i
= 0; i
< sizeof Irqls
/ sizeof Irqls
[0]; ++i
)
59 /* DRIVER_IRQL_NOT_LESS_OR_EQUAL (TODO: on MP only?) */
60 if (Irqls
[i
] > DISPATCH_LEVEL
&& KmtIsCheckedBuild
)
62 KeRaiseIrql(Irqls
[i
], &Irql
);
63 TestTimerFunctional(&Timer
, NotificationTimer
, Irqls
[i
]);
64 TestTimerFunctional(&Timer
, SynchronizationTimer
, Irqls
[i
]);
68 ok_irql(PASSIVE_LEVEL
);
69 KmtSetIrql(PASSIVE_LEVEL
);