1 /*
2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: Kernel-Mode Test Suite test framework kernel declarations
5 * COPYRIGHT: Copyright 2011-2018 Thomas Faber <thomas.faber@reactos.org>
6 */
7
8 #ifndef _KMTEST_TEST_KERNEL_H_
9 #define _KMTEST_TEST_KERNEL_H_
10
11 #if !defined _KMTEST_TEST_H_
12 #error include kmt_test.h instead of including kmt_test_kernel.h
13 #endif /* !defined _KMTEST_TEST_H_ */
14
15 BOOLEAN KmtIsCheckedBuild;
16 BOOLEAN KmtIsMultiProcessorBuild;
17 PCSTR KmtMajorFunctionNames[] =
18 {
19 "Create",
20 "CreateNamedPipe",
21 "Close",
22 "Read",
23 "Write",
24 "QueryInformation",
25 "SetInformation",
26 "QueryEa",
27 "SetEa",
28 "FlushBuffers",
29 "QueryVolumeInformation",
30 "SetVolumeInformation",
31 "DirectoryControl",
32 "FileSystemControl",
33 "DeviceControl",
34 "InternalDeviceControl/Scsi",
35 "Shutdown",
36 "LockControl",
37 "Cleanup",
38 "CreateMailslot",
39 "QuerySecurity",
40 "SetSecurity",
41 "Power",
42 "SystemControl",
43 "DeviceChange",
44 "QueryQuota",
45 "SetQuota",
46 "Pnp/PnpPower"
47 };
48
KmtSetIrql(IN KIRQL NewIrql)49 VOID KmtSetIrql(IN KIRQL NewIrql)
50 {
51 KIRQL Irql = KeGetCurrentIrql();
52 if (Irql > NewIrql)
53 KeLowerIrql(NewIrql);
54 else if (Irql < NewIrql)
55 KeRaiseIrql(NewIrql, &Irql);
56 }
57
KmtAreInterruptsEnabled(VOID)58 BOOLEAN KmtAreInterruptsEnabled(VOID)
59 {
60 return (__readeflags() & (1 << 9)) != 0;
61 }
62
63 typedef struct _POOL_HEADER
64 {
65 union
66 {
67 struct
68 {
69 #ifdef _M_AMD64
70 USHORT PreviousSize:8;
71 USHORT PoolIndex:8;
72 USHORT BlockSize:8;
73 USHORT PoolType:8;
74 #else
75 USHORT PreviousSize:9;
76 USHORT PoolIndex:7;
77 USHORT BlockSize:9;
78 USHORT PoolType:7;
79 #endif
80 };
81 ULONG Ulong1;
82 };
83 #ifdef _M_AMD64
84 ULONG PoolTag;
85 #endif
86 union
87 {
88 #ifdef _M_AMD64
89 PEPROCESS ProcessBilled;
90 #else
91 ULONG PoolTag;
92 #endif
93 struct
94 {
95 USHORT AllocatorBackTraceIndex;
96 USHORT PoolTagHash;
97 };
98 };
99 } POOL_HEADER, *PPOOL_HEADER;
100
KmtGetPoolTag(PVOID Memory)101 ULONG KmtGetPoolTag(PVOID Memory)
102 {
103 PPOOL_HEADER Header;
104
105 /* it's not so easy for allocations of PAGE_SIZE */
106 if (((ULONG_PTR)Memory & (PAGE_SIZE - 1)) == 0)
107 return 'TooL';
108
109 Header = Memory;
110 Header--;
111
112 return Header->PoolTag;
113 }
114
KmtGetPoolType(PVOID Memory)115 USHORT KmtGetPoolType(PVOID Memory)
116 {
117 PPOOL_HEADER Header;
118
119 /* it's not so easy for allocations of PAGE_SIZE */
120 if (((ULONG_PTR)Memory & (PAGE_SIZE - 1)) == 0)
121 return 0;
122
123 Header = Memory;
124 Header--;
125
126 return Header->PoolType;
127 }
128
KmtGetSystemRoutineAddress(IN PCWSTR RoutineName)129 PVOID KmtGetSystemRoutineAddress(IN PCWSTR RoutineName)
130 {
131 UNICODE_STRING RoutineNameString;
132 RtlInitUnicodeString(&RoutineNameString, (PWSTR)RoutineName);
133 return MmGetSystemRoutineAddress(&RoutineNameString);
134 }
135
KmtStartThread(IN PKSTART_ROUTINE StartRoutine,IN PVOID StartContext OPTIONAL)136 PKTHREAD KmtStartThread(IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext OPTIONAL)
137 {
138 NTSTATUS Status;
139 OBJECT_ATTRIBUTES ObjectAttributes;
140 HANDLE ThreadHandle;
141 PVOID ThreadObject = NULL;
142
143 InitializeObjectAttributes(&ObjectAttributes,
144 NULL,
145 OBJ_KERNEL_HANDLE,
146 NULL,
147 NULL);
148 ThreadHandle = INVALID_HANDLE_VALUE;
149 Status = PsCreateSystemThread(&ThreadHandle,
150 SYNCHRONIZE,
151 &ObjectAttributes,
152 NULL,
153 NULL,
154 StartRoutine,
155 StartContext);
156 ok_eq_hex(Status, STATUS_SUCCESS);
157 if (!skip(NT_SUCCESS(Status) && ThreadHandle != NULL && ThreadHandle != INVALID_HANDLE_VALUE, "No thread\n"))
158 {
159 Status = ObReferenceObjectByHandle(ThreadHandle,
160 SYNCHRONIZE,
161 *PsThreadType,
162 KernelMode,
163 &ThreadObject,
164 NULL);
165 ok_eq_hex(Status, STATUS_SUCCESS);
166 ObCloseHandle(ThreadHandle, KernelMode);
167 }
168 return ThreadObject;
169 }
170
KmtFinishThread(IN PKTHREAD Thread OPTIONAL,IN PKEVENT Event OPTIONAL)171 VOID KmtFinishThread(IN PKTHREAD Thread OPTIONAL, IN PKEVENT Event OPTIONAL)
172 {
173 NTSTATUS Status;
174
175 if (skip(Thread != NULL, "No thread\n"))
176 return;
177
178 if (Event)
179 KeSetEvent(Event, IO_NO_INCREMENT, TRUE);
180 Status = KeWaitForSingleObject(Thread,
181 Executive,
182 KernelMode,
183 FALSE,
184 NULL);
185 ok_eq_hex(Status, STATUS_SUCCESS);
186 ObDereferenceObject(Thread);
187 }
188
189 INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0);
190
191 #endif /* !defined _KMTEST_TEST_KERNEL_H_ */
192