mirror of
https://github.com/reactos/reactos.git
synced 2024-10-21 00:18:26 +00:00
4230863f75
- add kmt_platform.h that includes user or kernel headers as appropriate and allows Rtl tests to run in user mode without modification - include kmt_platform.h from kmt_test.h, so that tests don't have to include separate headers. This also allows for a PCH svn path=/branches/GSoC_2011/KMTestSuite/; revision=53021
128 lines
4.8 KiB
C
128 lines
4.8 KiB
C
/*
|
|
* PROJECT: ReactOS kernel-mode tests
|
|
* LICENSE: GPLv2+ - See COPYING in the top level directory
|
|
* PURPOSE: Kernel-Mode Test Suite Singly-linked list test
|
|
* PROGRAMMER: Thomas Faber <thfabba@gmx.de>
|
|
*/
|
|
|
|
struct _SINGLE_LIST_ENTRY;
|
|
struct _SINGLE_LIST_ENTRY *__stdcall ExInterlockedPushEntryList(struct _SINGLE_LIST_ENTRY *, struct _SINGLE_LIST_ENTRY *, unsigned long *);
|
|
struct _SINGLE_LIST_ENTRY *__stdcall ExInterlockedPopEntryList(struct _SINGLE_LIST_ENTRY *, unsigned long *);
|
|
|
|
#include <kmt_test.h>
|
|
|
|
SINGLE_LIST_ENTRY Entries[5];
|
|
|
|
#define ok_eq_free2(Value, Expected) do \
|
|
{ \
|
|
if (KmtIsCheckedBuild) \
|
|
ok_eq_pointer(Value, (PVOID)0xBADDD0FF); \
|
|
else \
|
|
ok_eq_pointer(Value, Expected); \
|
|
} while (0)
|
|
|
|
START_TEST(ExSingleList)
|
|
{
|
|
KSPIN_LOCK SpinLock;
|
|
SINGLE_LIST_ENTRY ListHead;
|
|
PSINGLE_LIST_ENTRY Ret;
|
|
|
|
KeInitializeSpinLock(&SpinLock);
|
|
|
|
memset(Entries, 0x55, sizeof Entries);
|
|
ListHead.Next = NULL;
|
|
Ret = ExInterlockedPushEntryList(&ListHead, &Entries[0], &SpinLock);
|
|
ok_eq_pointer(Ret, NULL);
|
|
ok_eq_pointer(ListHead.Next, &Entries[0]);
|
|
ok_eq_pointer(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPopEntryList(&ListHead, &SpinLock);
|
|
ok_eq_pointer(Ret, &Entries[0]);
|
|
ok_eq_pointer(ListHead.Next, NULL);
|
|
ok_eq_free2(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPopEntryList(&ListHead, &SpinLock);
|
|
ok_eq_pointer(Ret, NULL);
|
|
ok_eq_pointer(ListHead.Next, NULL);
|
|
ok_eq_free2(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPushEntryList(&ListHead, &Entries[0], &SpinLock);
|
|
ok_eq_pointer(Ret, NULL);
|
|
ok_eq_pointer(ListHead.Next, &Entries[0]);
|
|
ok_eq_pointer(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPushEntryList(&ListHead, &Entries[1], &SpinLock);
|
|
ok_eq_pointer(Ret, &Entries[0]);
|
|
ok_eq_pointer(ListHead.Next, &Entries[1]);
|
|
ok_eq_pointer(Entries[1].Next, &Entries[0]);
|
|
ok_eq_pointer(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPopEntryList(&ListHead, &SpinLock);
|
|
ok_eq_pointer(Ret, &Entries[1]);
|
|
ok_eq_pointer(ListHead.Next, &Entries[0]);
|
|
ok_eq_free2(Entries[1].Next, &Entries[0]);
|
|
ok_eq_pointer(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
#undef ExInterlockedPushEntryList
|
|
#undef ExInterlockedPopEntryList
|
|
memset(Entries, 0x55, sizeof Entries);
|
|
ListHead.Next = NULL;
|
|
Ret = ExInterlockedPushEntryList(&ListHead, &Entries[0], &SpinLock);
|
|
ok_eq_pointer(Ret, NULL);
|
|
ok_eq_pointer(ListHead.Next, &Entries[0]);
|
|
ok_eq_pointer(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPopEntryList(&ListHead, &SpinLock);
|
|
ok_eq_pointer(Ret, &Entries[0]);
|
|
ok_eq_pointer(ListHead.Next, NULL);
|
|
ok_eq_free2(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPopEntryList(&ListHead, &SpinLock);
|
|
ok_eq_pointer(Ret, NULL);
|
|
ok_eq_pointer(ListHead.Next, NULL);
|
|
ok_eq_free2(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPushEntryList(&ListHead, &Entries[0], &SpinLock);
|
|
ok_eq_pointer(Ret, NULL);
|
|
ok_eq_pointer(ListHead.Next, &Entries[0]);
|
|
ok_eq_pointer(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPushEntryList(&ListHead, &Entries[1], &SpinLock);
|
|
ok_eq_pointer(Ret, &Entries[0]);
|
|
ok_eq_pointer(ListHead.Next, &Entries[1]);
|
|
ok_eq_pointer(Entries[1].Next, &Entries[0]);
|
|
ok_eq_pointer(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
Ret = ExInterlockedPopEntryList(&ListHead, &SpinLock);
|
|
ok_eq_pointer(Ret, &Entries[1]);
|
|
ok_eq_pointer(ListHead.Next, &Entries[0]);
|
|
ok_eq_free2(Entries[1].Next, &Entries[0]);
|
|
ok_eq_pointer(Entries[0].Next, NULL);
|
|
ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:");
|
|
ok_irql(PASSIVE_LEVEL);
|
|
|
|
KmtSetIrql(PASSIVE_LEVEL);
|
|
}
|