2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Singly-linked list test
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
8 struct _SINGLE_LIST_ENTRY
;
10 struct _SINGLE_LIST_ENTRY
*__stdcall
ExInterlockedPushEntryList(struct _SINGLE_LIST_ENTRY
*, struct _SINGLE_LIST_ENTRY
*, unsigned long *);
11 struct _SINGLE_LIST_ENTRY
*__stdcall
ExInterlockedPopEntryList(struct _SINGLE_LIST_ENTRY
*, unsigned long *);
16 #define ok_eq_free2(Value, Expected) do \
18 if (KmtIsCheckedBuild) \
19 ok_eq_pointer(Value, (PVOID)0xBADDD0FF); \
21 ok_eq_pointer(Value, Expected); \
24 PSINGLE_LIST_ENTRY
FlushList(PSINGLE_LIST_ENTRY ListHead
)
26 PSINGLE_LIST_ENTRY Ret
= ListHead
->Next
;
27 ListHead
->Next
= NULL
;
31 USHORT
QueryDepthList(PSINGLE_LIST_ENTRY ListHead
)
34 while (ListHead
->Next
)
37 ListHead
= ListHead
->Next
;
42 PSINGLE_LIST_ENTRY
PushEntryListWrapper(PSINGLE_LIST_ENTRY ListHead
, PSINGLE_LIST_ENTRY Entry
, PKSPIN_LOCK Lock
)
44 PSINGLE_LIST_ENTRY Ret
;
45 UNREFERENCED_PARAMETER(Lock
);
47 PushEntryList(ListHead
, Entry
);
51 #define CheckListHeader(ListHead, ExpectedPointer, ExpectedDepth) do \
53 ok_eq_pointer((ListHead)->Next, ExpectedPointer); \
54 ok_eq_uint(QueryDepthList(ListHead), ExpectedDepth); \
55 ok_irql(HIGH_LEVEL); \
56 ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:"); \
59 #define PXLIST_HEADER PSINGLE_LIST_ENTRY
60 #define PXLIST_ENTRY PSINGLE_LIST_ENTRY
61 #define PushXList ExInterlockedPushEntryList
62 #define PopXList ExInterlockedPopEntryList
63 #define FlushXList FlushList
64 #define ok_free_xlist ok_eq_free2
65 #define CheckXListHeader CheckListHeader
66 #define TestXListFunctional TestListFunctional
69 #undef ExInterlockedPushEntryList
70 #undef ExInterlockedPopEntryList
71 #define TestXListFunctional TestListFunctionalExports
75 #define PushXList PushEntryListWrapper
77 #define PopXList(h, s) PopEntryList(h)
79 #define ok_free_xlist ok_eq_pointer
80 #define TestXListFunctional TestListFunctionalNoInterlocked
83 START_TEST(ExSingleList
)
86 PSINGLE_LIST_ENTRY ListHead
;
87 PSINGLE_LIST_ENTRY Entries
;
88 SIZE_T EntriesSize
= 5 * sizeof *Entries
;
92 KeInitializeSpinLock(&SpinLock
);
94 /* make sure stuff is as un-aligned as possible ;) */
95 Buffer
= ExAllocatePoolWithTag(NonPagedPool
, sizeof *ListHead
+ EntriesSize
+ 1, 'TLiS');
96 ListHead
= (PVOID
)&Buffer
[1];
97 Entries
= (PVOID
)&ListHead
[1];
98 KeRaiseIrql(HIGH_LEVEL
, &Irql
);
100 RtlFillMemory(Entries
, sizeof(*Entries
), 0x55);
101 ListHead
->Next
= NULL
;
102 TestListFunctional(ListHead
, Entries
, &SpinLock
);
104 RtlFillMemory(Entries
, sizeof(*Entries
), 0x55);
105 ListHead
->Next
= NULL
;
106 TestListFunctionalExports(ListHead
, Entries
, &SpinLock
);
108 RtlFillMemory(Entries
, sizeof(*Entries
), 0x55);
109 ListHead
->Next
= NULL
;
110 TestListFunctionalNoInterlocked(ListHead
, Entries
, &SpinLock
);
113 ExFreePoolWithTag(Buffer
, 'TLiS');