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 <thfabba@gmx.de>
8 struct _SINGLE_LIST_ENTRY
;
9 struct _SINGLE_LIST_ENTRY
*__stdcall
ExInterlockedPushEntryList(struct _SINGLE_LIST_ENTRY
*, struct _SINGLE_LIST_ENTRY
*, unsigned long *);
10 struct _SINGLE_LIST_ENTRY
*__stdcall
ExInterlockedPopEntryList(struct _SINGLE_LIST_ENTRY
*, unsigned long *);
14 #define ok_eq_free2(Value, Expected) do \
16 if (KmtIsCheckedBuild) \
17 ok_eq_pointer(Value, (PVOID)0xBADDD0FF); \
19 ok_eq_pointer(Value, Expected); \
22 PSINGLE_LIST_ENTRY
FlushList(PSINGLE_LIST_ENTRY ListHead
)
24 PSINGLE_LIST_ENTRY Ret
= ListHead
->Next
;
25 ListHead
->Next
= NULL
;
29 USHORT
QueryDepthList(PSINGLE_LIST_ENTRY ListHead
)
32 while (ListHead
->Next
)
35 ListHead
= ListHead
->Next
;
40 PSINGLE_LIST_ENTRY
PushEntryListWrapper(PSINGLE_LIST_ENTRY ListHead
, PSINGLE_LIST_ENTRY Entry
, PKSPIN_LOCK Lock
)
42 PSINGLE_LIST_ENTRY Ret
;
43 UNREFERENCED_PARAMETER(Lock
);
45 PushEntryList(ListHead
, Entry
);
49 #define CheckListHeader(ListHead, ExpectedPointer, ExpectedDepth) do \
51 ok_eq_pointer((ListHead)->Next, ExpectedPointer); \
52 ok_eq_uint(QueryDepthList(ListHead), ExpectedDepth); \
53 ok_irql(HIGH_LEVEL); \
54 ok_bool_true(KmtAreInterruptsEnabled(), "Interrupts enabled:"); \
57 #define PXLIST_HEADER PSINGLE_LIST_ENTRY
58 #define PXLIST_ENTRY PSINGLE_LIST_ENTRY
59 #define PushXList ExInterlockedPushEntryList
60 #define PopXList ExInterlockedPopEntryList
61 #define FlushXList FlushList
62 #define ok_free_xlist ok_eq_free2
63 #define CheckXListHeader CheckListHeader
64 #define TestXListFunctional TestListFunctional
67 #undef ExInterlockedPushEntryList
68 #undef ExInterlockedPopEntryList
69 #define TestXListFunctional TestListFunctionalExports
73 #define PushXList PushEntryListWrapper
75 #define PopXList(h, s) PopEntryList(h)
77 #define ok_free_xlist ok_eq_pointer
78 #define TestXListFunctional TestListFunctionalNoInterlocked
81 START_TEST(ExSingleList
)
84 PSINGLE_LIST_ENTRY ListHead
;
85 PSINGLE_LIST_ENTRY Entries
;
86 SIZE_T EntriesSize
= 5 * sizeof *Entries
;
90 KeInitializeSpinLock(&SpinLock
);
92 /* make sure stuff is as un-aligned as possible ;) */
93 Buffer
= ExAllocatePoolWithTag(NonPagedPool
, sizeof *ListHead
+ EntriesSize
+ 1, 'TLiS');
94 ListHead
= (PVOID
)&Buffer
[1];
95 Entries
= (PVOID
)&ListHead
[1];
96 KeRaiseIrql(HIGH_LEVEL
, &Irql
);
98 RtlFillMemory(Entries
, sizeof Entries
, 0x55);
99 ListHead
->Next
= NULL
;
100 TestListFunctional(ListHead
, Entries
, &SpinLock
);
102 RtlFillMemory(Entries
, sizeof Entries
, 0x55);
103 ListHead
->Next
= NULL
;
104 TestListFunctionalExports(ListHead
, Entries
, &SpinLock
);
106 RtlFillMemory(Entries
, sizeof Entries
, 0x55);
107 ListHead
->Next
= NULL
;
108 TestListFunctionalNoInterlocked(ListHead
, Entries
, &SpinLock
);
111 ExFreePoolWithTag(Buffer
, 'TLiS');