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