Reactos
at master 198 lines 5.2 kB view raw
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_ */