15 #define KdPrint(x) DbgPrint x 19 #define NT_DEVICE_NAME L"\\Device\\csqtest" 22 #define DOS_DEVICE_NAME L"\\??\\csqtest" 39 KdPrint((
"Inserting IRP 0x%x into CSQ\n",
Irp));
45 KdPrint((
"Removing IRP 0x%x from CSQ\n",
Irp));
51 KdPrint((
"Peeking for next IRP\n"));
64 KdPrint((
"Acquiring spin lock\n"));
70 KdPrint((
"Releasing spin lock\n"));
78 Irp->IoStatus.Information = 0;
106 KdPrint((
"csqtest: Cleanup received; flushing the IRP queue with cancel\n"));
118 Irp->IoStatus.Information = 0;
142 KdPrint((
"csqtest: Ioctl received; flushing the IRP queue with success\n"));
153 Irp->IoStatus.Information = 0;
197 KdPrint((
"csqtest: IoCsqInitialize failed: 0x%x\n",
Status));
199 KdPrint((
"csqtest: IoCsqInitialize succeeded\n"));
210 KdPrint((
"csqtest: Unable to create device: 0x%x\n",
Status));
VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, PKIRQL Irql)
PDEVICE_OBJECT DeviceObject
NTKERNELAPI PIRP NTAPI IoCsqRemoveNextIrp(_Inout_ PIO_CSQ Csq, _In_opt_ PVOID PeekContext)
IoCsqRemoveNextIrp - Removes the next IRP from the queue.
NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
VOID NTAPI Unload(PDRIVER_OBJECT DriverObject)
NTKERNELAPI VOID NTAPI IoCsqInsertIrp(_Inout_ PIO_CSQ Csq, _Inout_ PIRP Irp, _Out_opt_ PIO_CSQ_IRP_CONTEXT Context)
Insert an IRP into the CSQ.
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
NTSTATUS NTAPI IoDeleteSymbolicLink(IN PUNICODE_STRING SymbolicLinkName)
VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, PIRP Irp)
#define InsertTailList(ListHead, Entry)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
_In_ PDEVICE_OBJECT DeviceObject
VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, PIRP Irp)
NTSTATUS NTAPI DispatchIoctl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
VOID NTAPI CsqCompleteCancelledIrp(PIO_CSQ Csq, PIRP Irp)
#define IoCompleteRequest
NTSTATUS NTAPI CsqInsertIrpEx(PIO_CSQ Csq, PIRP Irp, PVOID InsertContext)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_In_ PIRP _In_ PVOID InsertContext
struct _LIST_ENTRY * Flink
NTSTATUS NTAPI DispatchCreateCloseCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NTSTATUS NTAPI IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName)
NTSTATUS NTAPI DispatchReadWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define NT_SUCCESS(StatCode)
VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, KIRQL Irql)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
#define InitializeListHead(ListHead)
_Out_ PUNICODE_STRING DosName
#define FILE_DEVICE_UNKNOWN
#define KeReleaseSpinLock(sl, irql)
_In_opt_ PIRP _In_opt_ PVOID PeekContext
PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, PIRP Irp, PVOID PeekContext)
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTKERNELAPI NTSTATUS NTAPI IoCsqInitialize(_Out_ PIO_CSQ Csq, _In_ PIO_CSQ_INSERT_IRP CsqInsertIrp, _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp, _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock, _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp)
Set up a CSQ struct to initialize the queue.
#define IRP_MJ_DEVICE_CONTROL