ReactOS 0.4.17-dev-573-g8315b8c
kmt_test.h
Go to the documentation of this file.
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 declarations
5 * COPYRIGHT: Copyright 2011-2018 Thomas Faber <thomas.faber@reactos.org>
6 * Copyright 2013 Nikolay Borisov <nib9@aber.ac.uk>
7 * Copyright 2014-2016 Pierre Schweitzer <pierre@reactos.org>
8 * Copyright 2017 Ged Murphy <gedmurphy@reactos.org>
9 */
10
11/* Inspired by Wine C unit tests, Copyright (C) 2002 Alexandre Julliard
12 * Inspired by ReactOS kernel-mode regression tests,
13 * Copyright (C) Aleksey Bragin, Filip Navara
14 */
15
16#ifndef _KMTEST_TEST_H_
17#define _KMTEST_TEST_H_
18
19#include <kmt_platform.h>
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
25#define GetNTVersion() ((SharedUserData->NtMajorVersion << 8) | SharedUserData->NtMinorVersion)
26
29
30typedef struct
31{
32 const char *TestName;
35
37
38extern const KMT_TEST TestList[];
39
40typedef struct
41{
42 volatile LONG Successes;
43 volatile LONG Failures;
44 volatile LONG Skipped;
47 CHAR LogBuffer[ANYSIZE_ARRAY];
49
50#ifndef KMT_STANDALONE_DRIVER
51
52/* usermode call-back mechanism */
53
54/* list of supported operations */
56{
59
60/* TODO: "response" is a little generic */
61typedef union _KMT_RESPONSE
62{
65
66/* this struct is sent from driver to usermode */
68{
73
76
77//macro to simplify using the mechanism
78#define Test_NtQueryVirtualMemory(BaseAddress, Size, AllocationType, ProtectionType) \
79 do { \
80 PKMT_RESPONSE NtQueryTest = KmtUserModeCallback(QueryVirtualMemory, BaseAddress); \
81 if (NtQueryTest != NULL) \
82 { \
83 ok_eq_hex(NtQueryTest->MemInfo.Protect, ProtectionType); \
84 ok_eq_hex(NtQueryTest->MemInfo.State, AllocationType); \
85 ok_eq_size(NtQueryTest->MemInfo.RegionSize, Size); \
86 KmtFreeCallbackResponse(NtQueryTest); \
87 } \
88 } while (0) \
89
90#endif
91
92#ifdef KMT_STANDALONE_DRIVER
93#define KMT_KERNEL_MODE
94
95typedef NTSTATUS (KMT_IRP_HANDLER)(
97 IN PIRP Irp,
99typedef KMT_IRP_HANDLER *PKMT_IRP_HANDLER;
100
103
104typedef NTSTATUS (KMT_MESSAGE_HANDLER)(
108 IN SIZE_T InLength,
109 IN OUT PSIZE_T OutLength);
110typedef KMT_MESSAGE_HANDLER *PKMT_MESSAGE_HANDLER;
111
114
115typedef enum
116{
117 TESTENTRY_NO_CREATE_DEVICE = 1,
118 TESTENTRY_NO_REGISTER_DISPATCH = 2,
119 TESTENTRY_NO_REGISTER_UNLOAD = 4,
120 TESTENTRY_NO_EXCLUSIVE_DEVICE = 8,
121 TESTENTRY_NO_READONLY_DEVICE = 16,
122 TESTENTRY_BUFFERED_IO_DEVICE = 32,
123} KMT_TESTENTRY_FLAGS;
124
127#endif /* defined KMT_STANDALONE_DRIVER */
128
129#ifdef KMT_FILTER_DRIVER
130#ifndef KMT_KERNEL_MODE
131#define KMT_KERNEL_MODE
132#endif
133
135
136typedef enum
137{
138 TESTENTRY_NO_REGISTER_FILTER = 0x01,
139 TESTENTRY_NO_CREATE_COMMS_PORT = 0x02,
140 TESTENTRY_NO_START_FILTERING = 0x04,
141 TESTENTRY_NO_INSTANCE_SETUP = 0x08,
142 TESTENTRY_NO_QUERY_TEARDOWN = 0x10,
143 TESTENTRY_NO_ALL = 0xFF
144} KMT_MINIFILTER_FLAGS;
145
147NTSTATUS TestInstanceSetup(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_SETUP_FLAGS Flags, _In_ DEVICE_TYPE VolumeDeviceType, _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType, _In_ PUNICODE_STRING VolumeName, _In_ ULONG RealSectorSize, _In_ ULONG SectorSize);
149
151
152#endif/* defined KMT_FILTER_DRIVER */
153
154
155#ifdef KMT_KERNEL_MODE
156/* Device Extension layout */
157typedef struct
158{
160 PMDL Mdl;
161} KMT_DEVICE_EXTENSION, *PKMT_DEVICE_EXTENSION;
162
167extern PDRIVER_OBJECT KmtDriverObject;
168
176#elif defined KMT_USER_MODE
178
185
191
192
193DWORD KmtFltCreateService(_In_z_ PCWSTR ServiceName, _In_z_ PCWSTR DisplayName, _Out_ SC_HANDLE *ServiceHandle);
196DWORD KmtFltLoadDriver(_In_ BOOLEAN EnableDriverLoadPrivilege, _In_ BOOLEAN RestartIfRunning, _In_ BOOLEAN ConnectComms, _Out_ HANDLE *hPort);
197DWORD KmtFltUnloadDriver(_In_ HANDLE *hPort, _In_ BOOLEAN DisonnectComms);
206
207#else /* if !defined KMT_KERNEL_MODE && !defined KMT_USER_MODE */
208#error either KMT_KERNEL_MODE or KMT_USER_MODE must be defined
209#endif /* !defined KMT_KERNEL_MODE && !defined KMT_USER_MODE */
210
212
213#ifdef __GNUC__
214/* TODO: GCC doesn't understand %wZ :( */
215#define KMT_FORMAT(type, fmt, first) /*__attribute__((__format__(type, fmt, first)))*/
216#elif !defined __GNUC__
217#define KMT_FORMAT(type, fmt, first)
218#endif /* !defined __GNUC__ */
219
220#define START_TEST(name) EXTERN_C VOID Test_##name(VOID)
221
222#ifndef KMT_STRINGIZE
223#define KMT_STRINGIZE(x) #x
224#endif /* !defined KMT_STRINGIZE */
225#define ok(test, ...) ok_(test, __FILE__, __LINE__, __VA_ARGS__)
226#define trace(...) trace_( __FILE__, __LINE__, __VA_ARGS__)
227#define skip(test, ...) skip_(test, __FILE__, __LINE__, __VA_ARGS__)
228
229#define ok_(test, file, line, ...) KmtOk(test, file ":" KMT_STRINGIZE(line), __VA_ARGS__)
230#define trace_(file, line, ...) KmtTrace( file ":" KMT_STRINGIZE(line), __VA_ARGS__)
231#define skip_(test, file, line, ...) KmtSkip(test, file ":" KMT_STRINGIZE(line), __VA_ARGS__)
232
233BOOLEAN KmtVOk(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0);
234BOOLEAN KmtOk(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) KMT_FORMAT(ms_printf, 3, 4);
235VOID KmtVTrace(PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 2, 0);
236VOID KmtTrace(PCSTR FileAndLine, PCSTR Format, ...) KMT_FORMAT(ms_printf, 2, 3);
237BOOLEAN KmtVSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0);
238BOOLEAN KmtSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) KMT_FORMAT(ms_printf, 3, 4);
241
242#ifdef KMT_KERNEL_MODE
243#define ok_irql(irql) ok(KeGetCurrentIrql() == irql, "IRQL is %d, expected %d\n", KeGetCurrentIrql(), irql)
244#endif /* defined KMT_KERNEL_MODE */
245#define ok_eq_print(value, expected, spec) ok((value) == (expected), #value " = " spec ", expected " spec "\n", value, expected)
246#define ok_eq_pointer(value, expected) ok_eq_print(value, expected, "%p")
247#define ok_eq_int(value, expected) ok_eq_print(value, expected, "%d")
248#define ok_eq_uint(value, expected) ok_eq_print(value, expected, "%u")
249#define ok_eq_long(value, expected) ok_eq_print(value, expected, "%ld")
250#define ok_eq_ulong(value, expected) ok_eq_print(value, expected, "%lu")
251#define ok_eq_longlong(value, expected) ok_eq_print(value, expected, "%I64d")
252#define ok_eq_ulonglong(value, expected) ok_eq_print(value, expected, "%I64u")
253#define ok_eq_char(value, expected) ok_eq_print(value, expected, "%c")
254#define ok_eq_wchar(value, expected) ok_eq_print(value, expected, "%C")
255#ifndef _WIN64
256#define ok_eq_size(value, expected) ok_eq_print(value, (SIZE_T)(expected), "%lu")
257#define ok_eq_longptr(value, expected) ok_eq_print(value, (LONG_PTR)(expected), "%ld")
258#define ok_eq_ulongptr(value, expected) ok_eq_print(value, (ULONG_PTR)(expected), "%lu")
259#elif defined _WIN64
260#define ok_eq_size(value, expected) ok_eq_print(value, (SIZE_T)(expected), "%I64u")
261#define ok_eq_longptr(value, expected) ok_eq_print(value, (LONG_PTR)(expected), "%I64d")
262#define ok_eq_ulongptr(value, expected) ok_eq_print(value, (ULONG_PTR)(expected), "%I64u")
263#endif /* defined _WIN64 */
264#define ok_eq_hex(value, expected) ok_eq_print(value, expected, "0x%08lx")
265#define ok_bool_true(value, desc) ok((value) == TRUE, desc " FALSE, expected TRUE\n")
266#define ok_bool_false(value, desc) ok((value) == FALSE, desc " TRUE, expected FALSE\n")
267#define ok_eq_bool(value, expected) ok((value) == (expected), #value " = %s, expected %s\n", \
268 (value) ? "TRUE" : "FALSE", \
269 (expected) ? "TRUE" : "FALSE")
270#define ok_eq_str(value, expected) ok(!strcmp(value, expected), #value " = \"%s\", expected \"%s\"\n", value, expected)
271#define ok_eq_wstr(value, expected) ok(!wcscmp(value, expected), #value " = \"%ls\", expected \"%ls\"\n", value, expected)
272#define ok_eq_tag(value, expected) ok_eq_print(value, expected, "0x%08lx")
273
274#define ok_eq_hex64(value, expected) ok_eq_print(value, expected, "%I64x")
275#define ok_eq_xmm(value, expected) ok((value).Low == (expected).Low, #value " = %I64x'%08I64x, expected %I64x'%08I64x\n", (value).Low, (value).High, (expected).Low, (expected).High)
276
277#define KMT_MAKE_CODE(ControlCode) CTL_CODE(FILE_DEVICE_UNKNOWN, \
278 0xC00 + (ControlCode), \
279 METHOD_BUFFERED, \
280 FILE_ANY_ACCESS)
281
282#define MICROSECOND 10
283#define MILLISECOND (1000 * MICROSECOND)
284#define SECOND (1000 * MILLISECOND)
285
286/* See apitests/include/apitest.h */
287#define KmtInvalidPointer ((PVOID)0x5555555555555555ULL)
288
289#define KmtStartSeh() \
290{ \
291 NTSTATUS ExceptionStatus = STATUS_SUCCESS; \
292 _SEH2_TRY \
293 {
294
295#define KmtEndSeh(ExpectedStatus) \
296 } \
297 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \
298 { \
299 ExceptionStatus = _SEH2_GetExceptionCode(); \
300 } \
301 _SEH2_END; \
302 ok_eq_hex(ExceptionStatus, (ExpectedStatus)); \
303}
304
305#define KmtGetSystemOrEmbeddedRoutineAddress(RoutineName) \
306 p##RoutineName = KmtGetSystemRoutineAddress(L ## #RoutineName); \
307 if (!p##RoutineName) \
308 { \
309 p##RoutineName = RoutineName; \
310 trace("Using embedded routine for " #RoutineName "\n"); \
311 } \
312 else \
313 trace("Using system routine for " #RoutineName "\n");
314
315#if defined KMT_DEFINE_TEST_FUNCTIONS
316
317#if defined KMT_KERNEL_MODE
318#include "kmt_test_kernel.h"
319#elif defined KMT_USER_MODE
320#include "kmt_test_user.h"
321#endif /* defined KMT_USER_MODE */
322
324
325static VOID KmtAddToLogBuffer(PKMT_RESULTBUFFER Buffer, PCSTR String, SIZE_T Length)
326{
327 LONG OldLength;
329
330 if (!Buffer)
331 return;
332
333 do
334 {
335 OldLength = Buffer->LogBufferLength;
336 NewLength = OldLength + (ULONG)Length;
337 if (NewLength > Buffer->LogBufferMaxLength)
338 return;
339 } while (InterlockedCompareExchange(&Buffer->LogBufferLength, NewLength, OldLength) != OldLength);
340
341 memcpy(&Buffer->LogBuffer[OldLength], String, Length);
342}
343
344KMT_FORMAT(ms_printf, 5, 0)
345static SIZE_T KmtXVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR FileAndLine, PCSTR Prepend, PCSTR Format, va_list Arguments)
346{
349
350 if (FileAndLine)
351 {
352 PCSTR Slash;
353 Slash = strrchr(FileAndLine, '\\');
354 if (Slash)
355 FileAndLine = Slash + 1;
356 Slash = strrchr(FileAndLine, '/');
357 if (Slash)
358 FileAndLine = Slash + 1;
359
360 Length = min(BufferMaxLength, strlen(FileAndLine));
361 memcpy(Buffer, FileAndLine, Length);
362 Buffer += Length;
364 BufferMaxLength -= Length;
365 }
366 if (Prepend)
367 {
368 Length = min(BufferMaxLength, strlen(Prepend));
369 memcpy(Buffer, Prepend, Length);
370 Buffer += Length;
372 BufferMaxLength -= Length;
373 }
374 if (Format)
375 {
376 Length = KmtVSNPrintF(Buffer, BufferMaxLength, Format, Arguments);
377 /* vsnprintf can return more than maxLength, we don't want to do that */
378 BufferLength += min(Length, BufferMaxLength);
379 }
380 return BufferLength;
381}
382
383KMT_FORMAT(ms_printf, 5, 6)
384static SIZE_T KmtXSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR FileAndLine, PCSTR Prepend, PCSTR Format, ...)
385{
387 va_list Arguments;
388 va_start(Arguments, Format);
389 BufferLength = KmtXVSNPrintF(Buffer, BufferMaxLength, FileAndLine, Prepend, Format, Arguments);
390 va_end(Arguments);
391 return BufferLength;
392}
393
394VOID KmtFinishTest(PCSTR TestName)
395{
396 CHAR MessageBuffer[512];
397 SIZE_T MessageLength;
398
399 if (!ResultBuffer)
400 return;
401
402 MessageLength = KmtXSNPrintF(MessageBuffer, sizeof MessageBuffer, NULL, NULL,
403 "%s: %ld tests executed (0 marked as todo, %ld failures), %ld skipped.\n",
404 TestName,
408 KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength);
409}
410
411BOOLEAN KmtVOk(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments)
412{
413 CHAR MessageBuffer[512];
414 SIZE_T MessageLength;
415
416 if (!ResultBuffer)
417 return Condition != 0;
418
419 if (Condition)
420 {
422
423 if (0/*KmtReportSuccess*/)
424 {
425 MessageLength = KmtXSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": Test succeeded\n", NULL);
426 KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength);
427 }
428 }
429 else
430 {
432 MessageLength = KmtXVSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": Test failed: ", Format, Arguments);
433 KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength);
434 }
435
436 return Condition != 0;
437}
438
439BOOLEAN KmtOk(INT Condition, PCSTR FileAndLine, PCSTR Format, ...)
440{
441 BOOLEAN Ret;
442 va_list Arguments;
443 va_start(Arguments, Format);
444 Ret = KmtVOk(Condition, FileAndLine, Format, Arguments);
445 va_end(Arguments);
446 return Ret;
447}
448
449VOID KmtVTrace(PCSTR FileAndLine, PCSTR Format, va_list Arguments)
450{
451 CHAR MessageBuffer[512];
452 SIZE_T MessageLength;
453
454 MessageLength = KmtXVSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": ", Format, Arguments);
455 KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength);
456}
457
458VOID KmtTrace(PCSTR FileAndLine, PCSTR Format, ...)
459{
460 va_list Arguments;
461 va_start(Arguments, Format);
462 KmtVTrace(FileAndLine, Format, Arguments);
463 va_end(Arguments);
464}
465
466BOOLEAN KmtVSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments)
467{
468 CHAR MessageBuffer[512];
469 SIZE_T MessageLength;
470
471 if (!ResultBuffer)
472 return !Condition;
473
474 if (!Condition)
475 {
477 MessageLength = KmtXVSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": Tests skipped: ", Format, Arguments);
478 KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength);
479 }
480
481 return !Condition;
482}
483
484BOOLEAN KmtSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, ...)
485{
486 BOOLEAN Ret;
487 va_list Arguments;
488 va_start(Arguments, Format);
489 Ret = KmtVSkip(Condition, FileAndLine, Format, Arguments);
490 va_end(Arguments);
491 return Ret;
492}
493
494PVOID KmtAllocateGuarded(SIZE_T SizeRequested)
495{
497 SIZE_T Size = PAGE_ROUND_UP(SizeRequested + PAGE_SIZE);
498 PVOID VirtualMemory = NULL;
499 PCHAR StartOfBuffer;
500
501 Status = ZwAllocateVirtualMemory(ZwCurrentProcess(), &VirtualMemory, 0, &Size, MEM_RESERVE, PAGE_NOACCESS);
502
503 if (!NT_SUCCESS(Status))
504 return NULL;
505
506 Size -= PAGE_SIZE;
507 Status = ZwAllocateVirtualMemory(ZwCurrentProcess(), &VirtualMemory, 0, &Size, MEM_COMMIT, PAGE_READWRITE);
508 if (!NT_SUCCESS(Status))
509 {
510 Size = 0;
511 Status = ZwFreeVirtualMemory(ZwCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE);
513 return NULL;
514 }
515
516 StartOfBuffer = VirtualMemory;
517 StartOfBuffer += Size - SizeRequested;
518
519 return StartOfBuffer;
520}
521
523{
525 PVOID VirtualMemory = (PVOID)PAGE_ROUND_DOWN((SIZE_T)Pointer);
526 SIZE_T Size = 0;
527
528 Status = ZwFreeVirtualMemory(ZwCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE);
530}
531
532#endif /* defined KMT_DEFINE_TEST_FUNCTIONS */
533
534#define is_reactos() \
535 (*(unsigned*)((size_t)0x7FFE0FFC) == 0x8EAC705)
536
538{
539 RTL_OSVERSIONINFOW OSVersion;
540 OSVersion.dwOSVersionInfoSize = sizeof(OSVersion);
541 RtlGetVersion(&OSVersion);
542 switch (OSVersion.dwBuildNumber)
543 {
544 case 3790: return NTDDI_WS03;
545 case 6000: return NTDDI_VISTA;
546 case 6001: return NTDDI_VISTASP1;
547 case 6002: return NTDDI_VISTASP2;
548 case 6003: return NTDDI_VISTASP3;
549 case 7600: return NTDDI_WIN7;
550 case 7601: return NTDDI_WIN7SP1;
551 case 9200: return NTDDI_WIN8;
552
553 default:
554 trace("Unknown build number: %lu\n", OSVersion.dwBuildNumber);
555 return NTDDI_WS03;
556 }
557}
558
559#ifdef __cplusplus
560}
561#endif
562
563#endif /* !defined _KMTEST_TEST_H_ */
VOID TestUnload(IN PDRIVER_OBJECT DriverObject)
Definition: Example_drv.c:93
static USHORT USHORT * NewLength
unsigned char BOOLEAN
Definition: actypes.h:127
#define InterlockedIncrement
Definition: armddk.h:53
LONG NTSTATUS
Definition: precomp.h:26
static WCHAR ServiceName[]
Definition: browser.c:20
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:182
#define NTSTATUS
Definition: precomp.h:19
#define DEVICE_TYPE
Definition: guid.c:10
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
_ACRTIMP char *__cdecl strrchr(const char *, int)
Definition: string.c:3303
char * va_list
Definition: vadefs.h:50
static const WCHAR Message[]
Definition: register.c:74
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define PAGE_SIZE
Definition: env_spec_w32.h:49
unsigned long DWORD
Definition: ntddk_ex.h:95
_Must_inspect_result_ _Inout_opt_ PUNICODE_STRING VolumeName
Definition: fltkernel.h:1117
ULONG FLT_INSTANCE_SETUP_FLAGS
Definition: fltkernel.h:527
VOID(FLTAPI * PFLT_DISCONNECT_NOTIFY)(_In_opt_ PVOID ConnectionCookie)
Definition: fltkernel.h:856
NTSTATUS(FLTAPI * PFLT_MESSAGE_NOTIFY)(_In_opt_ PVOID PortCookie, _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_writes_bytes_to_opt_(OutputBufferLength, *ReturnOutputBufferLength) PVOID OutputBuffer, _In_ ULONG OutputBufferLength, _Out_ PULONG ReturnOutputBufferLength)
Definition: fltkernel.h:839
_Must_inspect_result_ _Outptr_ PFLT_PORT _In_ POBJECT_ATTRIBUTES _In_opt_ PVOID _In_ PFLT_CONNECT_NOTIFY _In_ PFLT_DISCONNECT_NOTIFY _In_opt_ PFLT_MESSAGE_NOTIFY MessageNotifyCallback
Definition: fltkernel.h:1877
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
NTSTATUS(FLTAPI * PFLT_CONNECT_NOTIFY)(_In_ PFLT_PORT ClientPort, _In_opt_ PVOID ServerPortCookie, _In_reads_bytes_opt_(SizeOfContext) PVOID ConnectionContext, _In_ ULONG SizeOfContext, _Outptr_result_maybenull_ PVOID *ConnectionPortCookie)
Definition: fltkernel.h:848
ULONG FLT_INSTANCE_QUERY_TEARDOWN_FLAGS
Definition: fltkernel.h:552
_Must_inspect_result_ _Inout_ PFLT_VOLUME _In_ PCUNICODE_STRING Altitude
Definition: fltkernel.h:1173
_Must_inspect_result_ _Outptr_ PFLT_PORT _In_ POBJECT_ATTRIBUTES _In_opt_ PVOID _In_ PFLT_CONNECT_NOTIFY ConnectNotifyCallback
Definition: fltkernel.h:1875
_Must_inspect_result_ _Outptr_ PFLT_PORT _In_ POBJECT_ATTRIBUTES _In_opt_ PVOID _In_ PFLT_CONNECT_NOTIFY _In_ PFLT_DISCONNECT_NOTIFY DisconnectNotifyCallback
Definition: fltkernel.h:1876
VOID TestQueryTeardown(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags)
Definition: fltmgr_create.c:92
NTSTATUS TestInstanceSetup(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_SETUP_FLAGS Flags, _In_ DEVICE_TYPE VolumeDeviceType, _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType, _In_ PUNICODE_STRING VolumeName, _In_ ULONG SectorSize, _In_ ULONG ReportedSectorSize)
VOID TestFilterUnload(IN ULONG Flags)
Definition: fltmgr_create.c:79
DWORD KmtFltSendToDriver(_In_ HANDLE hPort, _In_ DWORD Message)
Definition: fltsupport.c:277
DWORD KmtFltCreateService(_In_z_ PCWSTR ServiceName, _In_z_ PCWSTR DisplayName, _Out_ SC_HANDLE *ServiceHandle)
Definition: fltsupport.c:60
DWORD KmtFltRunKernelTest(_In_ HANDLE hPort, _In_z_ PCSTR TestName)
Definition: fltsupport.c:257
DWORD KmtFltSendUlongToDriver(_In_ HANDLE hPort, _In_ DWORD Message, _In_ DWORD Value)
Definition: fltsupport.c:349
DWORD KmtFltDisconnectComms(_In_ HANDLE hPort)
Definition: fltsupport.c:220
DWORD KmtFltSendBufferToDriver(_In_ HANDLE hPort, _In_ DWORD Message, _In_reads_bytes_(BufferSize) LPVOID InBuffer, _In_ DWORD BufferSize, _Out_writes_bytes_to_opt_(OutBufferSize, *BytesReturned) LPVOID OutBuffer, _In_ DWORD OutBufferSize, _Out_opt_ LPDWORD BytesReturned)
Definition: fltsupport.c:380
DWORD KmtFltSendStringToDriver(_In_ HANDLE hPort, _In_ DWORD Message, _In_ PCSTR String)
Definition: fltsupport.c:301
DWORD KmtFltLoadDriver(_In_ BOOLEAN EnableDriverLoadPrivilege, _In_ BOOLEAN RestartIfRunning, _In_ BOOLEAN ConnectComms, _Out_ HANDLE *hPort)
Definition: fltsupport.c:109
DWORD KmtFltAddAltitude(_In_z_ LPWSTR Altitude)
Definition: fltsupport.c:444
DWORD KmtFltUnloadDriver(_In_ HANDLE *hPort, _In_ BOOLEAN DisonnectComms)
Definition: fltsupport.c:165
DWORD KmtFltSendWStringToDriver(_In_ HANDLE hPort, _In_ DWORD Message, _In_ PCWSTR String)
Definition: fltsupport.c:326
DWORD KmtFltConnectComms(_Out_ HANDLE *hPort)
Definition: fltsupport.c:203
DWORD KmtFltDeleteService(_In_opt_z_ PCWSTR ServiceName, _Inout_ SC_HANDLE *ServiceHandle)
Definition: fltsupport.c:94
FP_OP Operation
Definition: fpcontrol.c:150
Status
Definition: gdiplustypes.h:24
#define InterlockedCompareExchange
Definition: interlocked.h:119
#define trace(...)
Definition: kmt_test.h:226
union _KMT_RESPONSE KMT_RESPONSE
PKMT_RESPONSE KmtUserModeCallback(KMT_CALLBACK_INFORMATION_CLASS Operation, PVOID Parameters)
#define ok_eq_hex(value, expected)
Definition: kmt_test.h:264
BOOLEAN BOOLEAN VOID VOID KmtTrace(PCSTR FileAndLine, PCSTR Format,...) KMT_FORMAT(ms_printf
const KMT_TEST * PCKMT_TEST
Definition: kmt_test.h:36
VOID KmtFreeGuarded(PVOID Pointer)
BOOLEAN BOOLEAN VOID VOID BOOLEAN KmtVSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf
union _KMT_RESPONSE * PKMT_RESPONSE
BOOLEAN BOOLEAN KmtOk(INT Condition, PCSTR FileAndLine, PCSTR Format,...) KMT_FORMAT(ms_printf
BOOLEAN BOOLEAN VOID KmtVTrace(PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf
VOID KMT_TESTFUNC(VOID)
Definition: kmt_test.h:27
BOOLEAN KmtVOk(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf
struct KMT_RESULTBUFFER * PKMT_RESULTBUFFER
struct _KMT_CALLBACK_REQUEST_PACKET * PKMT_CALLBACK_REQUEST_PACKET
struct _KMT_CALLBACK_REQUEST_PACKET KMT_CALLBACK_REQUEST_PACKET
BOOLEAN BOOLEAN VOID VOID BOOLEAN BOOLEAN KmtSkip(INT Condition, PCSTR FileAndLine, PCSTR Format,...) KMT_FORMAT(ms_printf
_KMT_CALLBACK_INFORMATION_CLASS
Definition: kmt_test.h:56
@ QueryVirtualMemory
Definition: kmt_test.h:57
VOID KmtFreeCallbackResponse(PKMT_RESPONSE Response)
Definition: kmtest_drv.c:618
enum _KMT_CALLBACK_INFORMATION_CLASS KMT_CALLBACK_INFORMATION_CLASS
const KMT_TEST CKMT_TEST
Definition: kmt_test.h:36
KMT_TESTFUNC * PKMT_TESTFUNC
Definition: kmt_test.h:28
PKMT_RESULTBUFFER ResultBuffer
#define KMT_FORMAT(type, fmt, first)
Definition: kmt_test.h:217
enum _KMT_CALLBACK_INFORMATION_CLASS * PKMT_CALLBACK_INFORMATION_CLASS
BOOLEAN BOOLEAN VOID VOID BOOLEAN BOOLEAN PVOID KmtAllocateGuarded(SIZE_T SizeRequested)
static ULONG GetNTDDIVersion(VOID)
Definition: kmt_test.h:537
struct KMT_TEST * PKMT_TEST
PKTHREAD KmtStartThread(IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext OPTIONAL)
PCSTR KmtMajorFunctionNames[]
PVOID KmtGetSystemRoutineAddress(IN PCWSTR RoutineName)
USHORT KmtGetPoolType(PVOID Memory)
BOOLEAN KmtIsVirtualMachine
ULONG KmtGetPoolTag(PVOID Memory)
VOID KmtSetIrql(IN KIRQL NewIrql)
BOOLEAN KmtAreInterruptsEnabled(VOID)
BOOLEAN KmtIsCheckedBuild
BOOLEAN KmtIsMultiProcessorBuild
VOID KmtFinishThread(IN PKTHREAD Thread OPTIONAL, IN PKEVENT Event OPTIONAL)
#define KmtVSNPrintF
Definition: kmt_test_user.h:35
NTSTATUS KmtFilterRegisterCallbacks(_In_ CONST FLT_OPERATION_REGISTRATION *OperationRegistration)
NTSTATUS KmtFilterRegisterComms(_In_ PFLT_CONNECT_NOTIFY ConnectNotifyCallback, _In_ PFLT_DISCONNECT_NOTIFY DisconnectNotifyCallback, _In_opt_ PFLT_MESSAGE_NOTIFY MessageNotifyCallback, _In_ LONG MaxClientConnections)
NTSTATUS KmtRegisterMessageHandler(IN ULONG ControlCode OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_MESSAGE_HANDLER MessageHandler)
NTSTATUS KmtUnregisterMessageHandler(IN ULONG ControlCode OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_MESSAGE_HANDLER MessageHandler)
NTSTATUS KmtUnregisterIrpHandler(IN UCHAR MajorFunction, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_IRP_HANDLER IrpHandler)
NTSTATUS KmtRegisterIrpHandler(IN UCHAR MajorFunction, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_IRP_HANDLER IrpHandler)
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static void TestEntry(const ENTRY *pEntry)
WCHAR TestName[MAX_PATH]
Definition: main.cpp:13
#define min(a, b)
Definition: monoChain.cc:55
#define PAGE_ROUND_UP(x)
Definition: mmtypes.h:38
#define PAGE_ROUND_DOWN(x)
Definition: mmtypes.h:36
#define _In_reads_bytes_(s)
Definition: no_sal2.h:170
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_
Definition: no_sal2.h:162
#define _In_z_
Definition: no_sal2.h:164
#define _In_opt_z_
Definition: no_sal2.h:218
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define _Out_writes_bytes_to_opt_(s, c)
Definition: no_sal2.h:240
#define PAGE_READWRITE
Definition: nt_native.h:1307
#define MEM_RESERVE
Definition: nt_native.h:1317
#define MEM_RELEASE
Definition: nt_native.h:1319
#define MEM_COMMIT
Definition: nt_native.h:1316
#define PAGE_NOACCESS
Definition: nt_native.h:1305
IN ULONG IN UCHAR Condition
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define CONST
Definition: pedump.c:81
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
char CHAR
Definition: pedump.c:57
_Requires_lock_held_ SpinLock _Releases_lock_ SpinLock _In_ _IRQL_restores_ KIRQL NewIrql
Definition: ke.h:114
#define NTDDI_WIN8
Definition: sdkddkver.h:114
#define NTDDI_VISTA
Definition: sdkddkver.h:103
#define NTDDI_WS03
Definition: sdkddkver.h:92
#define NTDDI_WIN7
Definition: sdkddkver.h:112
#define NTDDI_WIN7SP1
Definition: sdkddkver.h:113
#define NTDDI_VISTASP2
Definition: sdkddkver.h:105
#define NTDDI_VISTASP3
Definition: sdkddkver.h:106
#define NTDDI_VISTASP1
Definition: sdkddkver.h:104
#define STATUS_SUCCESS
Definition: shellext.h:65
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
volatile LONG Failures
Definition: kmt_test.h:43
volatile LONG Skipped
Definition: kmt_test.h:44
volatile LONG LogBufferLength
Definition: kmt_test.h:45
LONG LogBufferMaxLength
Definition: kmt_test.h:46
volatile LONG Successes
Definition: kmt_test.h:42
const char * TestName
Definition: kmt_test.h:32
KMT_TESTFUNC * TestFunction
Definition: kmt_test.h:33
Definition: ncftp.h:89
KMT_CALLBACK_INFORMATION_CLASS OperationClass
Definition: kmt_test.h:70
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:246
ULONG dwBuildNumber
Definition: rtltypes.h:249
DWORD KmtRunKernelTest(IN PCSTR TestName)
Definition: support.c:95
DWORD KmtLoadAndOpenDriver(IN PCWSTR ServiceName, IN BOOLEAN RestartIfRunning)
Definition: support.c:213
DWORD KmtOpenDriver(VOID)
Definition: support.c:192
VOID KmtCloseDriver(VOID)
Definition: support.c:236
DWORD KmtSendBufferToDriver(IN DWORD ControlCode, IN OUT PVOID Buffer OPTIONAL, IN DWORD InLength, IN OUT PDWORD OutLength)
Definition: support.c:360
DWORD KmtSendUlongToDriver(IN DWORD ControlCode, IN DWORD Value)
Definition: support.c:333
DWORD KmtSendStringToDriver(IN DWORD ControlCode, IN PCSTR String)
Definition: support.c:283
DWORD KmtSendToDriver(IN DWORD ControlCode)
Definition: support.c:259
DWORD KmtLoadDriver(IN PCWSTR ServiceName, IN BOOLEAN RestartIfRunning)
Definition: support.c:128
VOID KmtUnloadDriverKeepService(VOID)
Definition: support.c:149
DWORD KmtSendWStringToDriver(IN DWORD ControlCode, IN PCWSTR String)
Definition: support.c:308
VOID KmtUnloadDriver(VOID)
Definition: support.c:167
EH_STD::__list__< TestClass, eh_allocator(TestClass) > TestList
Definition: test_list.cpp:31
ULONG_PTR * PSIZE_T
Definition: typedefs.h:80
#define OPTIONAL
Definition: typedefs.h:41
char * PSTR
Definition: typedefs.h:51
const uint16_t * PCWSTR
Definition: typedefs.h:57
unsigned char UCHAR
Definition: typedefs.h:53
#define ANYSIZE_ARRAY
Definition: typedefs.h:46
uint16_t * LPWSTR
Definition: typedefs.h:56
void * PVOID
Definition: typedefs.h:50
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
const char * PCSTR
Definition: typedefs.h:52
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
MEMORY_BASIC_INFORMATION MemInfo
Definition: kmt_test.h:63
_In_ PIO_STACK_LOCATION IoStackLocation
Definition: usbdlib.h:265
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_In_ UCHAR MajorFunction
Definition: wdfdevice.h:1703
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3777
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2439
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
Definition: wdfio.h:869
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG _In_ _Out_ WDFMEMORY * Memory
Definition: wdfmemory.h:169
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ DWORD _In_ DWORD _In_ DWORD _Out_ LPDWORD lpBytesReturned
Definition: winddi.h:1705
_IRQL_requires_same_ typedef _In_ ULONG ControlCode
Definition: wmitypes.h:55
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
_In_ ULONG SectorSize
Definition: halfuncs.h:291
KSTART_ROUTINE * PKSTART_ROUTINE
Definition: ketypes.h:567
_In_ ULONG _In_opt_ POBJECT_ATTRIBUTES _In_opt_ HANDLE _Out_opt_ PCLIENT_ID _In_ PKSTART_ROUTINE StartRoutine
Definition: psfuncs.h:92
#define ZwCurrentProcess()