ReactOS 0.4.16-dev-1405-gc14a14e
kmtest_drv.c File Reference
#include <ntddk.h>
#include <ntifs.h>
#include <ndk/ketypes.h>
#include <ntstrsafe.h>
#include <limits.h>
#include <pseh/pseh2.h>
#include <debug.h>
#include <kmt_public.h>
#include <kmt_test.h>
Include dependency graph for kmtest_drv.c:

Go to the source code of this file.

Classes

struct  _KMT_USER_WORK_ENTRY
 
struct  _KMT_USER_WORK_LIST
 

Macros

#define NDEBUG
 
#define KMT_DEFINE_TEST_FUNCTIONS
 

Typedefs

typedef struct _KMT_USER_WORK_ENTRY KMT_USER_WORK_ENTRY
 
typedef struct _KMT_USER_WORK_ENTRYPKMT_USER_WORK_ENTRY
 
typedef struct _KMT_USER_WORK_LIST KMT_USER_WORK_LIST
 
typedef struct _KMT_USER_WORK_LISTPKMT_USER_WORK_LIST
 

Functions

BOOLEAN KmtDetectVirtualMachine (VOID)
 
DriverUnload

Driver cleanup funtion.

Parameters
DriverObjectDriver Object
static VOID NTAPI DriverUnload (IN PDRIVER_OBJECT DriverObject)
 
DriverCreate

Driver Dispatch function for IRP_MJ_CREATE

Parameters
DeviceObjectDevice Object
IrpI/O request packet
Returns
Status
static NTSTATUS NTAPI DriverCreate (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
DriverCleanup

Driver Dispatch function for IRP_MJ_CLEANUP

Parameters
DeviceObjectDevice Object
IrpI/O request packet
Returns
Status
static NTSTATUS NTAPI DriverCleanup (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
DriverClose

Driver Dispatch function for IRP_MJ_CLOSE

Parameters
DeviceObjectDevice Object
IrpI/O request packet
Returns
Status
static NTSTATUS NTAPI DriverClose (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
DriverIoControl

Driver Dispatch function for IRP_MJ_DEVICE_CONTROL

Parameters
DeviceObjectDevice Object
IrpI/O request packet
Returns
Status
static NTSTATUS NTAPI DriverIoControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
KmtUserModeCallback

Enqueue a request to the usermode callback queue and blocks until the work is finished.

Parameters
OperationTODO
ParametersTODO TODO: why is this PVOID?
Returns
Response from user mode
PKMT_RESPONSE KmtUserModeCallback (IN KMT_CALLBACK_INFORMATION_CLASS Operation, IN PVOID Parameters)
 
KmtFreeCallbackResponse

TODO

Parameters
ResponseTODO
VOID KmtFreeCallbackResponse (PKMT_RESPONSE Response)
 
KmtCleanUsermodeCallbacks

TODO

static VOID KmtCleanUsermodeCallbacks (VOID)
 

Variables

DRIVER_INITIALIZE DriverEntry
 
static DRIVER_UNLOAD DriverUnload
 

Macro Definition Documentation

◆ KMT_DEFINE_TEST_FUNCTIONS

#define KMT_DEFINE_TEST_FUNCTIONS

Definition at line 20 of file kmtest_drv.c.

◆ NDEBUG

#define NDEBUG

Definition at line 16 of file kmtest_drv.c.

Typedef Documentation

◆ KMT_USER_WORK_ENTRY

◆ KMT_USER_WORK_LIST

◆ PKMT_USER_WORK_ENTRY

◆ PKMT_USER_WORK_LIST

Function Documentation

◆ DriverCleanup()

static NTSTATUS NTAPI DriverCleanup ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 222 of file kmtest_drv.c.

225{
227 PIO_STACK_LOCATION IoStackLocation;
228 PKMT_DEVICE_EXTENSION DeviceExtension;
229
230 PAGED_CODE();
231
232 IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
233
234 DPRINT("DriverCleanup. DeviceObject=%p, RequestorMode=%d, FileObject=%p, FsContext=%p, FsContext2=%p\n",
235 DeviceObject, Irp->RequestorMode, IoStackLocation->FileObject,
236 IoStackLocation->FileObject->FsContext, IoStackLocation->FileObject->FsContext2);
237
238 ASSERT(IoStackLocation->FileObject->FsContext2 == NULL);
239 DeviceExtension = DeviceObject->DeviceExtension;
240 if (DeviceExtension->Mdl && IoStackLocation->FileObject->FsContext == DeviceExtension->Mdl)
241 {
242 MmUnlockPages(DeviceExtension->Mdl);
243 IoFreeMdl(DeviceExtension->Mdl);
244 DeviceExtension->Mdl = NULL;
245 ResultBuffer = DeviceExtension->ResultBuffer = NULL;
246 }
247 else
248 {
249 ASSERT(IoStackLocation->FileObject->FsContext == NULL);
250 }
251
252 Irp->IoStatus.Status = Status;
253 Irp->IoStatus.Information = 0;
254
256
257 return Status;
258}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PAGED_CODE()
LONG NTSTATUS
Definition: precomp.h:26
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define IoFreeMdl
Definition: fxmdl.h:89
Status
Definition: gdiplustypes.h:25
PKMT_RESULTBUFFER ResultBuffer
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
Definition: mdlsup.c:1435
#define ASSERT(a)
Definition: mode.c:44
#define IoCompleteRequest
Definition: irp.c:1240
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PFILE_OBJECT FileObject
Definition: iotypes.h:3169
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define IO_NO_INCREMENT
Definition: iotypes.h:598

◆ DriverClose()

static NTSTATUS NTAPI DriverClose ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 275 of file kmtest_drv.c.

278{
280
281 PAGED_CODE();
282
283 DPRINT("DriverClose. DeviceObject=%p, RequestorMode=%d\n",
284 DeviceObject, Irp->RequestorMode);
285
286 Irp->IoStatus.Status = Status;
287 Irp->IoStatus.Information = 0;
288
290
291 return Status;
292}

◆ DriverCreate()

static NTSTATUS NTAPI DriverCreate ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 184 of file kmtest_drv.c.

187{
189 PIO_STACK_LOCATION IoStackLocation;
190
191 PAGED_CODE();
192
193 IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
194
195 DPRINT("DriverCreate. DeviceObject=%p, RequestorMode=%d, FileObject=%p, FsContext=%p, FsContext2=%p\n",
196 DeviceObject, Irp->RequestorMode, IoStackLocation->FileObject,
197 IoStackLocation->FileObject->FsContext, IoStackLocation->FileObject->FsContext2);
198
199 Irp->IoStatus.Status = Status;
200 Irp->IoStatus.Information = 0;
201
203
204 return Status;
205}

◆ DriverIoControl()

static NTSTATUS NTAPI DriverIoControl ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 309 of file kmtest_drv.c.

312{
314 PIO_STACK_LOCATION IoStackLocation;
315 SIZE_T Length = 0;
316
317 PAGED_CODE();
318
319 IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
320
321 DPRINT("DriverIoControl. Code=0x%08X, DeviceObject=%p, FileObject=%p, FsContext=%p, FsContext2=%p\n",
322 IoStackLocation->Parameters.DeviceIoControl.IoControlCode,
323 DeviceObject, IoStackLocation->FileObject,
324 IoStackLocation->FileObject->FsContext, IoStackLocation->FileObject->FsContext2);
325
326 switch (IoStackLocation->Parameters.DeviceIoControl.IoControlCode)
327 {
329 {
331 LPSTR OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
332 size_t Remaining = IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength;
333
334 DPRINT("DriverIoControl. IOCTL_KMTEST_GET_TESTS, outlen=%lu\n",
335 IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength);
336
337 for (TestEntry = TestList; TestEntry->TestName; ++TestEntry)
338 {
339 RtlStringCbCopyExA(OutputBuffer, Remaining, TestEntry->TestName, &OutputBuffer, &Remaining, 0);
340 if (Remaining)
341 {
342 *OutputBuffer++ = '\0';
343 --Remaining;
344 }
345 }
346 if (Remaining)
347 {
348 *OutputBuffer++ = '\0';
349 --Remaining;
350 }
351 Length = IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength - Remaining;
352 break;
353 }
355 {
358
359 DPRINT("DriverIoControl. IOCTL_KMTEST_RUN_TEST, inlen=%lu, outlen=%lu\n",
360 IoStackLocation->Parameters.DeviceIoControl.InputBufferLength,
361 IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength);
362 TestName.Length = TestName.MaximumLength = (USHORT)min(IoStackLocation->Parameters.DeviceIoControl.InputBufferLength, USHRT_MAX);
363 TestName.Buffer = Irp->AssociatedIrp.SystemBuffer;
364 DPRINT("DriverIoControl. Run test: %Z\n", &TestName);
365
366 for (TestEntry = TestList; TestEntry->TestName; ++TestEntry)
367 {
368 ANSI_STRING EntryName;
369 if (TestEntry->TestName[0] == '-')
370 RtlInitAnsiString(&EntryName, TestEntry->TestName + 1);
371 else
372 RtlInitAnsiString(&EntryName, TestEntry->TestName);
373
374 if (!RtlCompareString(&TestName, &EntryName, FALSE))
375 {
376 DPRINT1("DriverIoControl. Starting test %Z\n", &EntryName);
377 TestEntry->TestFunction();
378 DPRINT1("DriverIoControl. Finished test %Z\n", &EntryName);
379 break;
380 }
381 }
382
383 if (!TestEntry->TestName)
385
386 break;
387 }
389 {
390 PKMT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
391
392 DPRINT("DriverIoControl. IOCTL_KMTEST_SET_RESULTBUFFER, buffer=%p, inlen=%lu, outlen=%lu\n",
393 IoStackLocation->Parameters.DeviceIoControl.Type3InputBuffer,
394 IoStackLocation->Parameters.DeviceIoControl.InputBufferLength,
395 IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength);
396
397 if (DeviceExtension->Mdl)
398 {
399 if (IoStackLocation->FileObject->FsContext != DeviceExtension->Mdl)
400 {
402 break;
403 }
404 MmUnlockPages(DeviceExtension->Mdl);
405 IoFreeMdl(DeviceExtension->Mdl);
406 IoStackLocation->FileObject->FsContext = NULL;
407 ResultBuffer = DeviceExtension->ResultBuffer = NULL;
408 }
409
410 DeviceExtension->Mdl = IoAllocateMdl(IoStackLocation->Parameters.DeviceIoControl.Type3InputBuffer,
411 IoStackLocation->Parameters.DeviceIoControl.InputBufferLength,
412 FALSE, FALSE, NULL);
413 if (!DeviceExtension->Mdl)
414 {
416 break;
417 }
418
420 {
421 MmProbeAndLockPages(DeviceExtension->Mdl, UserMode, IoModifyAccess);
422 }
424 {
426 IoFreeMdl(DeviceExtension->Mdl);
427 DeviceExtension->Mdl = NULL;
428 break;
429 } _SEH2_END;
430
431 ResultBuffer = DeviceExtension->ResultBuffer = MmGetSystemAddressForMdlSafe(DeviceExtension->Mdl, NormalPagePriority);
432 IoStackLocation->FileObject->FsContext = DeviceExtension->Mdl;
433
434 DPRINT("DriverIoControl. ResultBuffer: %ld %ld %ld %ld\n",
437 break;
438 }
440 {
443
444 DPRINT("DriverIoControl. IOCTL_KMTEST_USERMODE_AWAIT_REQ, len=%lu\n",
445 IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength);
446
447 /* TODO: prevent multiple concurrent invocations */
448 Status = KeWaitForSingleObject(&WorkList.NewWorkEvent, UserRequest, UserMode, FALSE, NULL);
450 break;
451
452 if (IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KMT_CALLBACK_REQUEST_PACKET))
453 {
455 break;
456 }
457
458 ASSERT(!IsListEmpty(&WorkList.ListHead));
459
460 Entry = WorkList.ListHead.Flink;
462
463 Length = sizeof(WorkItem->Request);
464 RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &WorkItem->Request, Length);
466
467 KeClearEvent(&WorkList.NewWorkEvent);
468 break;
469
470 }
472 {
474 PKMT_USER_WORK_ENTRY WorkEntry;
476 ULONG ResponseSize = IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength;
477
478 DPRINT("DriverIoControl. IOCTL_KMTEST_USERMODE_SEND_RESPONSE, inlen=%lu, outlen=%lu\n",
479 IoStackLocation->Parameters.DeviceIoControl.InputBufferLength,
480 IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength);
481
482 if (IoStackLocation->Parameters.DeviceIoControl.InputBufferLength != sizeof(ULONG) || ResponseSize != sizeof(KMT_RESPONSE))
483 {
485 break;
486 }
487
488 /* FIXME: don't misuse the output buffer as an input! */
490 if (Response == NULL)
491 {
493 break;
494 }
495
496 ExAcquireFastMutex(&WorkList.Lock);
497
499
500 Entry = WorkList.ListHead.Flink;
501 while (Entry != &WorkList.ListHead)
502 {
503 WorkEntry = CONTAINING_RECORD(Entry, KMT_USER_WORK_ENTRY, ListEntry);
504 if (WorkEntry->Request.RequestId == *(PULONG)Irp->AssociatedIrp.SystemBuffer)
505 {
506 WorkEntry->Response = ExAllocatePoolWithTag(PagedPool, sizeof(KMT_RESPONSE), 'pseR');
507 if (WorkEntry->Response == NULL)
508 {
510 break;
511 }
512
513 RtlCopyMemory(WorkEntry->Response, Response, ResponseSize);
516 break;
517 }
518
519 Entry = Entry->Flink;
520 }
521
522 ExReleaseFastMutex(&WorkList.Lock);
523
524 break;
525 }
526 default:
527 DPRINT1("DriverIoControl. Invalid IoCtl code 0x%08X\n",
528 IoStackLocation->Parameters.DeviceIoControl.IoControlCode);
530 break;
531 }
532
533 Irp->IoStatus.Status = Status;
534 Irp->IoStatus.Information = Length;
535
537
538 return Status;
539}
#define DPRINT1
Definition: precomp.h:8
#define FALSE
Definition: types.h:117
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define PagedPool
Definition: env_spec_w32.h:308
VOID NTAPI KeClearEvent(IN PKEVENT Event)
Definition: eventobj.c:22
#define IoAllocateMdl
Definition: fxmdl.h:88
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
Definition: fmutex.c:23
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
Definition: fmutex.c:31
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define USHRT_MAX
Definition: limits.h:38
#define IOCTL_KMTEST_GET_TESTS
Definition: kmt_public.h:13
#define IOCTL_KMTEST_USERMODE_AWAIT_REQ
Definition: kmt_public.h:25
#define IOCTL_KMTEST_USERMODE_SEND_RESPONSE
Definition: kmt_public.h:22
#define IOCTL_KMTEST_RUN_TEST
Definition: kmt_public.h:16
#define IOCTL_KMTEST_SET_RESULTBUFFER
Definition: kmt_public.h:19
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:931
@ NormalPagePriority
Definition: imports.h:54
static void TestEntry(const ENTRY *pEntry)
WCHAR TestName[MAX_PATH]
Definition: main.cpp:13
#define min(a, b)
Definition: monoChain.cc:55
#define UserMode
Definition: asm.h:39
NTSYSAPI LONG NTAPI RtlCompareString(PSTRING String1, PSTRING String2, BOOLEAN CaseInSensitive)
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define STATUS_OBJECTID_NOT_FOUND
Definition: ntstatus.h:860
#define STATUS_USER_APC
Definition: ntstatus.h:78
#define STATUS_INVALID_BUFFER_SIZE
Definition: ntstatus.h:650
#define STATUS_KERNEL_APC
Definition: ntstatus.h:79
NTSTRSAFEAPI RtlStringCbCopyExA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCSTR pszSrc, _Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd, _Out_opt_ size_t *pcbRemaining, _In_ STRSAFE_DWORD dwFlags)
Definition: ntstrsafe.h:270
unsigned short USHORT
Definition: pedump.c:61
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:181
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:82
#define _SEH2_END
Definition: pseh2_64.h:171
#define _SEH2_TRY
Definition: pseh2_64.h:71
base of all file and directory entries
Definition: entries.h:83
volatile LONG Failures
Definition: kmt_test.h:37
volatile LONG LogBufferLength
Definition: kmt_test.h:39
LONG LogBufferMaxLength
Definition: kmt_test.h:40
volatile LONG Successes
Definition: kmt_test.h:36
Definition: ncftp.h:89
struct _IO_STACK_LOCATION::@1701::@1702 DeviceIoControl
union _IO_STACK_LOCATION::@1701 Parameters
Definition: kmtest_drv.c:25
PKMT_RESPONSE Response
Definition: kmtest_drv.c:29
KMT_CALLBACK_REQUEST_PACKET Request
Definition: kmtest_drv.c:28
KEVENT WorkDoneEvent
Definition: kmtest_drv.c:27
Definition: typedefs.h:120
EH_STD::__list__< TestClass, eh_allocator(TestClass) > TestList
Definition: test_list.cpp:31
uint32_t * PULONG
Definition: typedefs.h:59
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
#define STATUS_OBJECT_NAME_INVALID
Definition: udferr_usr.h:148
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
Definition: wdfworkitem.h:115
@ UserRequest
Definition: ketypes.h:421
@ IoModifyAccess
Definition: ketypes.h:865
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
char * LPSTR
Definition: xmlstorage.h:182

◆ DriverUnload()

static VOID NTAPI DriverUnload ( IN PDRIVER_OBJECT  DriverObject)
static

Definition at line 146 of file kmtest_drv.c.

148{
149 PAGED_CODE();
150
152
153 DPRINT("DriverUnload\n");
154
156
158 {
159#if DBG
160 PKMT_DEVICE_EXTENSION DeviceExtension = MainDeviceObject->DeviceExtension;
161 ASSERT(!DeviceExtension->Mdl);
162 ASSERT(!DeviceExtension->ResultBuffer);
163#endif
166 }
167}
static PDEVICE_OBJECT MainDeviceObject
static VOID KmtCleanUsermodeCallbacks(VOID)
Definition: kmtest_drv.c:626
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
PVOID DeviceExtension
Definition: env_spec_w32.h:418
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213

◆ KmtCleanUsermodeCallbacks()

static VOID KmtCleanUsermodeCallbacks ( VOID  )
static

Definition at line 626 of file kmtest_drv.c.

627{
629
630 PAGED_CODE();
631
632 ExAcquireFastMutex(&WorkList.Lock);
633
634 Entry = WorkList.ListHead.Flink;
635 while (Entry != &WorkList.ListHead)
636 {
638 if (WorkEntry->Response != NULL)
639 {
641 }
642
643 Entry = Entry->Flink;
644
645 ExFreePoolWithTag(WorkEntry, 'ekrW');
646 }
647
648 ExReleaseFastMutex(&WorkList.Lock);
649}
VOID KmtFreeCallbackResponse(PKMT_RESPONSE Response)
Definition: kmtest_drv.c:611
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109

Referenced by DriverUnload().

◆ KmtDetectVirtualMachine()

BOOLEAN KmtDetectVirtualMachine ( VOID  )

Definition at line 54 of file vm_detect.c.

55{
56#if defined(_M_IX86) || defined(_M_AMD64)
57 return VmIsHypervisorPresent() || VmIsVbox() || VmIsVMware();
58#else
59 return FALSE;
60#endif
61}

◆ KmtFreeCallbackResponse()

VOID KmtFreeCallbackResponse ( PKMT_RESPONSE  Response)

Definition at line 611 of file kmtest_drv.c.

613{
614 PAGED_CODE();
615
617}

Referenced by KmtCleanUsermodeCallbacks().

◆ KmtUserModeCallback()

PKMT_RESPONSE KmtUserModeCallback ( IN KMT_CALLBACK_INFORMATION_CLASS  Operation,
IN PVOID  Parameters 
)

Definition at line 556 of file kmtest_drv.c.

559{
562 PKMT_USER_WORK_ENTRY WorkEntry;
564
565 PAGED_CODE();
566
567 WorkEntry = ExAllocatePoolWithTag(PagedPool, sizeof(KMT_USER_WORK_ENTRY), 'ekrW');
568 if (WorkEntry == NULL)
569 return NULL;
570
572 WorkEntry->Request.RequestId = RequestId++;
573 WorkEntry->Request.OperationClass = Operation;
574 WorkEntry->Request.Parameters = Parameters;
575 WorkEntry->Response = NULL;
576
577 ExAcquireFastMutex(&WorkList.Lock);
578 InsertTailList(&WorkList.ListHead, &WorkEntry->ListEntry);
579 ExReleaseFastMutex(&WorkList.Lock);
580
581 KeSetEvent(&WorkList.NewWorkEvent, IO_NO_INCREMENT, FALSE);
582
583 Timeout.QuadPart = -10 * 1000 * 1000 * 10; //wait for 10 seconds
585
587 {
588 DPRINT1("Unexpected callback abortion! Reason: %lx\n", Status);
589 }
590
591 ExAcquireFastMutex(&WorkList.Lock);
592 RemoveEntryList(&WorkEntry->ListEntry);
593 ExReleaseFastMutex(&WorkList.Lock);
594
595 Result = WorkEntry->Response;
596
597 ExFreePoolWithTag(WorkEntry, 'ekrW');
598
599 return Result;
600}
#define STATUS_TIMEOUT
Definition: d3dkmdt.h:49
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define InsertTailList(ListHead, Entry)
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
FP_OP Operation
Definition: fpcontrol.c:150
@ NotificationEvent
static ULONG Timeout
Definition: ping.c:61
KMT_CALLBACK_INFORMATION_CLASS OperationClass
Definition: kmt_test.h:64
LIST_ENTRY ListEntry
Definition: kmtest_drv.c:26
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
Definition: wdfio.h:869
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
@ Executive
Definition: ketypes.h:415

Variable Documentation

◆ DriverEntry

DRIVER_INITIALIZE DriverEntry

Definition at line 44 of file kmtest_drv.c.

◆ DriverUnload

DRIVER_UNLOAD DriverUnload
static

Definition at line 45 of file kmtest_drv.c.