19 #include <fltKernel.h> 28 #define CSQ_TRACE_ERROR 0x00000001 29 #define CSQ_TRACE_LOAD_UNLOAD 0x00000002 30 #define CSQ_TRACE_INSTANCE_CALLBACK 0x00000004 31 #define CSQ_TRACE_CONTEXT_CALLBACK 0x00000008 32 #define CSQ_TRACE_CBDQ_CALLBACK 0x00000010 33 #define CSQ_TRACE_PRE_READ 0x00000020 34 #define CSQ_TRACE_ALL 0xFFFFFFFF 36 #define DebugTrace(Level, Data) \ 37 if ((Level) & Globals.DebugLevel) { \ 45 #define INSTANCE_CONTEXT_TAG 'IqsC' 46 #define QUEUE_CONTEXT_TAG 'QqsC' 47 #define CSQ_REG_TAG 'RqsC' 48 #define CSQ_STRING_TAG 'SqsC' 54 #define CSQ_DEFAULT_TIME_DELAY 150000000 55 #define CSQ_DEFAULT_MAPPING_PATH L"\\" 56 #define CSQ_KEY_NAME_DELAY L"OperatingDelay" 57 #define CSQ_KEY_NAME_PATH L"OperatingPath" 58 #define CSQ_KEY_NAME_DEBUG_LEVEL L"DebugLevel" 59 #define CSQ_MAX_PATH_LENGTH 256 92 FLT_CALLBACK_DATA_QUEUE
Cbdq;
143 _In_ PDRIVER_OBJECT DriverObject,
144 _In_ PUNICODE_STRING RegistryPath
153 _In_ FLT_FILTER_UNLOAD_FLAGS Flags
158 _In_ PFLT_CONTEXT Context,
159 _In_ FLT_CONTEXT_TYPE ContextType
164 _In_ PCFLT_RELATED_OBJECTS FltObjects,
165 _In_ FLT_INSTANCE_SETUP_FLAGS Flags,
166 _In_ DEVICE_TYPE VolumeDeviceType,
167 _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType
172 _In_ PCFLT_RELATED_OBJECTS FltObjects,
173 _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
178 _In_ PCFLT_RELATED_OBJECTS FltObjects,
179 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
184 _In_ PCFLT_RELATED_OBJECTS FltObjects,
185 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
190 _In_ PUNICODE_STRING RegistryPath
195 _IRQL_raises_(APC_LEVEL)
196 _Requires_lock_not_held_((CONTAINING_RECORD( DataQueue,
INSTANCE_CONTEXT, Cbdq ))->Lock)
199 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
205 _IRQL_requires_min_(APC_LEVEL)
206 _IRQL_raises_(PASSIVE_LEVEL)
210 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
216 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
217 _In_ PFLT_CALLBACK_DATA Data,
218 _In_opt_ PVOID Context
222 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
223 _In_ PFLT_CALLBACK_DATA Data
227 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
228 _In_opt_ PFLT_CALLBACK_DATA Data,
229 _In_opt_ PVOID PeekContext
233 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
234 _Inout_ PFLT_CALLBACK_DATA Data
237 FLT_PREOP_CALLBACK_STATUS
239 _Inout_ PFLT_CALLBACK_DATA Data,
240 _In_ PCFLT_RELATED_OBJECTS FltObjects,
241 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
246 _In_ PFLT_GENERIC_WORKITEM WorkItem,
247 _In_ PFLT_FILTER Filter,
253 _In_ PINSTANCE_CONTEXT InstanceContext
258 _Inout_ PFLT_CALLBACK_DATA Data
263 _In_ PINSTANCE_CONTEXT InstanceContext
271 #pragma alloc_text(INIT, DriverEntry) 272 #pragma alloc_text(INIT, SetConfiguration) 273 #pragma alloc_text(PAGE, Unload) 274 #pragma alloc_text(PAGE, FreeGlobals) 275 #pragma alloc_text(PAGE, ContextCleanup) 276 #pragma alloc_text(PAGE, InstanceSetup) 277 #pragma alloc_text(PAGE, InstanceQueryTeardown) 278 #pragma alloc_text(PAGE, InstanceTeardownStart) 279 #pragma alloc_text(PAGE, InstanceTeardownComplete) 287 FLT_OPERATION_REGISTRATION
Callbacks[] = {
289 FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO,
293 { IRP_MJ_OPERATION_END }
302 { FLT_INSTANCE_CONTEXT,
317 sizeof( FLT_REGISTRATION ),
318 FLT_REGISTRATION_VERSION,
336 _In_ PDRIVER_OBJECT DriverObject,
337 _In_ PUNICODE_STRING RegistryPath
366 ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
399 if (!NT_SUCCESS( Status )) {
401 goto DriverEntryCleanup;
405 (
"[Csq]: CancelSafe!DriverEntry\n") );
413 Status = FltRegisterFilter( DriverObject,
417 if (!NT_SUCCESS( Status )) {
420 (
"[Csq]: Failed to register filter (Status = 0x%x)\n",
423 goto DriverEntryCleanup;
433 if (!NT_SUCCESS( Status )) {
436 (
"[Csq]: Failed to start filtering (Status = 0x%x)\n",
441 goto DriverEntryCleanup;
447 (
"[Csq]: Driver loaded complete\n") );
451 if (!NT_SUCCESS( Status )) {
462 _In_ PUNICODE_STRING RegistryPath
483 OBJECT_ATTRIBUTES Attributes;
484 HANDLE DriverRegKey =
NULL;
485 UNICODE_STRING ValueName;
486 BOOLEAN CloseHandle = FALSE;
488 PKEY_VALUE_PARTIAL_INFORMATION Value = (PKEY_VALUE_PARTIAL_INFORMATION)Buffer;
489 ULONG ValueLength =
sizeof(
Buffer);
497 InitializeObjectAttributes( &Attributes,
499 OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
503 Status = ZwOpenKey( &DriverRegKey,
507 if (!NT_SUCCESS( Status )) {
509 goto SetConfigurationCleanup;
520 Status = ZwQueryValueKey( DriverRegKey,
527 if (NT_SUCCESS( Status )) {
540 Status = ZwQueryValueKey( DriverRegKey,
547 if (NT_SUCCESS( Status )) {
549 if (Value->Type != REG_DWORD) {
551 Status = STATUS_INVALID_PARAMETER;
552 goto SetConfigurationCleanup;
555 Globals.
TimeDelay = (LONGLONG)(*(PULONG)(Value->Data));
572 Status = ZwQueryValueKey( DriverRegKey,
579 if (NT_SUCCESS( Status )) {
587 if (*(PWCHAR)(Value->Data) != L
'\\') {
589 Status = STATUS_INVALID_PARAMETER;
590 goto SetConfigurationCleanup;
598 Length = Value->DataLength +
sizeof(WCHAR),
604 Status = STATUS_INSUFFICIENT_RESOURCES;
605 goto SetConfigurationCleanup;
610 Globals.
PathBuffer[Length /
sizeof(WCHAR) - 1] = L
'\0';
616 if (Globals.
PathBuffer[Length/
sizeof(WCHAR) - 3] != L
'\\') {
618 Globals.
PathBuffer[Length/
sizeof(WCHAR) - 2] = L
'\\';
631 Status = STATUS_SUCCESS;
633 SetConfigurationCleanup:
637 ZwClose( DriverRegKey );
681 _In_ FLT_FILTER_UNLOAD_FLAGS Flags
707 (
"[Csq]: CancelSafe!Unload\n") );
713 return STATUS_SUCCESS;
723 _In_ PFLT_CONTEXT Context,
724 _In_ FLT_CONTEXT_TYPE ContextType
754 (
"[Csq]: CancelSafe!ContextCleanup\n") );
763 _In_ PCFLT_RELATED_OBJECTS FltObjects,
764 _In_ FLT_INSTANCE_SETUP_FLAGS Flags,
765 _In_ DEVICE_TYPE VolumeDeviceType,
766 _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType
795 PINSTANCE_CONTEXT InstCtx =
NULL;
796 NTSTATUS
Status = STATUS_SUCCESS;
805 (
"[Csq]: CancelSafe!InstanceSetup\n") );
811 Status = FltAllocateContext( FltObjects->Filter,
812 FLT_INSTANCE_CONTEXT,
817 if (!NT_SUCCESS( Status )) {
820 (
"[Csq]: Failed to allocate instance context (Volume = %p, Instance = %p, Status = 0x%x)\n",
822 FltObjects->Instance,
825 goto InstanceSetupCleanup;
828 Status = FltCbdqInitialize( FltObjects->Instance,
837 if (!NT_SUCCESS( Status )) {
840 (
"[Csq]: Failed to initialize callback data queue (Volume = %p, Instance = %p, Status = 0x%x)\n",
842 FltObjects->Instance,
845 goto InstanceSetupCleanup;
852 InitializeListHead( &InstCtx->
QueueHead );
854 ExInitializeFastMutex( &InstCtx->
Lock );
860 InstCtx->
Instance = FltObjects->Instance;
864 KeInitializeEvent( &InstCtx->
TeardownEvent, NotificationEvent, FALSE );
870 Status = FltSetInstanceContext( FltObjects->Instance,
871 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
875 if (!NT_SUCCESS( Status )) {
878 (
"[Csq]: Failed to set instance context (Volume = %p, Instance = %p, Status = 0x%x)\n",
880 FltObjects->Instance,
883 goto InstanceSetupCleanup;
887 InstanceSetupCleanup:
889 if (InstCtx !=
NULL) {
891 FltReleaseContext( InstCtx );
900 _In_ PCFLT_RELATED_OBJECTS FltObjects,
901 _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
930 (
"[Csq]: CancelSafe!InstanceQueryTeardown\n") );
932 return STATUS_SUCCESS;
938 _In_ PCFLT_RELATED_OBJECTS FltObjects,
939 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
960 PINSTANCE_CONTEXT InstCtx = 0;
969 (
"[Csq]: CancelSafe!InstanceTeardownStart\n") );
975 Status = FltGetInstanceContext( FltObjects->Instance,
978 if (!NT_SUCCESS( Status ))
988 FltCbdqDisable( &InstCtx->
Cbdq );
1006 FltReleaseContext( InstCtx );
1012 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1013 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
1038 (
"[Csq]: CancelSafe!InstanceTeardownComplete\n") );
1050 _IRQL_raises_(APC_LEVEL)
1051 _Requires_lock_not_held_((CONTAINING_RECORD( DataQueue,
INSTANCE_CONTEXT, Cbdq ))->Lock)
1054 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
1076 PINSTANCE_CONTEXT InstCtx;
1079 (
"[Csq]: CancelSafe!CsqAcquire\n") );
1091 ExAcquireFastMutex( &InstCtx->
Lock );
1099 _IRQL_requires_min_(APC_LEVEL)
1100 _IRQL_raises_(PASSIVE_LEVEL)
1104 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
1126 PINSTANCE_CONTEXT InstCtx;
1131 (
"[Csq]: CancelSafe!CsqRelease\n") );
1143 ExReleaseFastMutex( &InstCtx->
Lock );
1149 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
1150 _In_ PFLT_CALLBACK_DATA Data,
1151 _In_opt_ PVOID Context
1176 PINSTANCE_CONTEXT InstCtx;
1177 PFLT_GENERIC_WORKITEM WorkItem =
NULL;
1178 NTSTATUS
Status = STATUS_SUCCESS;
1179 BOOLEAN WasQueueEmpty;
1184 (
"[Csq]: CancelSafe!CsqInsertIo\n") );
1196 WasQueueEmpty = IsListEmpty( &InstCtx->
QueueHead );
1203 &Data->QueueLinks );
1209 if (WasQueueEmpty &&
1212 WorkItem = FltAllocateGenericWorkItem();
1216 Status = FltQueueGenericWorkItem( WorkItem,
1222 if (!NT_SUCCESS( Status )) {
1225 (
"[Csq]: Failed to queue the work item (Status = 0x%x)\n",
1228 FltFreeGenericWorkItem( WorkItem );
1233 Status = STATUS_INSUFFICIENT_RESOURCES;
1236 if (!NT_SUCCESS( Status )) {
1266 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
1267 _In_ PFLT_CALLBACK_DATA Data
1291 (
"[Csq]: CancelSafe!CsqRemoveIo\n") );
1297 RemoveEntryList( &Data->QueueLinks );
1303 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
1304 _In_opt_ PFLT_CALLBACK_DATA Data,
1305 _In_opt_ PVOID PeekContext
1329 PINSTANCE_CONTEXT InstCtx;
1330 PLIST_ENTRY NextEntry;
1331 PFLT_CALLBACK_DATA NextData;
1336 (
"[Csq]: CancelSafe!CsqPeekNextIo\n") );
1355 NextEntry = Data->QueueLinks.Flink;
1367 NextData = CONTAINING_RECORD( NextEntry, FLT_CALLBACK_DATA, QueueLinks );
1375 _In_ PFLT_CALLBACK_DATA_QUEUE DataQueue,
1376 _Inout_ PFLT_CALLBACK_DATA Data
1397 PQUEUE_CONTEXT QueueCtx;
1402 (
"[Csq]: CancelSafe!CsqCompleteCanceledIo\n") );
1410 Data->IoStatus.Status = STATUS_CANCELLED;
1411 Data->IoStatus.Information = 0;
1413 FltCompletePendedPreOperation( Data,
1426 FLT_PREOP_CALLBACK_STATUS
1428 _Inout_ PFLT_CALLBACK_DATA Data,
1429 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1430 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
1456 PINSTANCE_CONTEXT InstCtx =
NULL;
1457 PQUEUE_CONTEXT QueueCtx =
NULL;
1458 PFLT_FILE_NAME_INFORMATION NameInfo =
NULL;
1459 NTSTATUS CbStatus = FLT_PREOP_SUCCESS_NO_CALLBACK;
1465 (
"[Csq]: CancelSafe!PreRead\n") );
1474 IoGetTopLevelIrp()) {
1476 return FLT_PREOP_SUCCESS_NO_CALLBACK;
1483 Status = FltGetFileNameInformation( Data,
1484 FLT_FILE_NAME_NORMALIZED
1485 | FLT_FILE_NAME_QUERY_DEFAULT,
1488 if (!NT_SUCCESS( Status )) {
1491 (
"[Csq]: Failed to get filename (Status = 0x%x)\n",
1494 goto PreReadCleanup;
1497 Status = FltParseFileNameInformation( NameInfo );
1499 if (!NT_SUCCESS( Status )) {
1502 (
"[Csq]: Failed to parse filename (Name = %wZ, Status = 0x%x)\n",
1506 goto PreReadCleanup;
1513 if (!RtlPrefixUnicodeString( &Globals.
MappingPath, &NameInfo->ParentDir,
TRUE )) {
1515 goto PreReadCleanup;
1526 if (!FLT_IS_IRP_OPERATION( Data )) {
1528 CbStatus = FLT_PREOP_DISALLOW_FASTIO;
1529 goto PreReadCleanup;
1538 if (QueueCtx ==
NULL) {
1541 (
"[Csq]: Failed to allocate from NPagedLookasideList (Status = 0x%x)\n",
1544 goto PreReadCleanup;
1553 Status = FltGetInstanceContext( FltObjects->Instance,
1556 if (!NT_SUCCESS( Status )) {
1558 FLT_ASSERT( !
"Instance context is missing" );
1559 goto PreReadCleanup;
1566 Data->QueueContext[0] = (PVOID) QueueCtx;
1567 Data->QueueContext[1] =
NULL;
1573 Status = FltCbdqInsertIo( &InstCtx->
Cbdq,
1578 if (Status == STATUS_SUCCESS) {
1588 CbStatus = FLT_PREOP_PENDING;
1593 (
"[Csq]: Failed to insert into cbdq (Status = 0x%x)\n",
1603 if (QueueCtx && CbStatus != FLT_PREOP_PENDING) {
1610 FltReleaseFileNameInformation( NameInfo );
1615 FltReleaseContext( InstCtx );
1624 _In_ PFLT_GENERIC_WORKITEM WorkItem,
1625 _In_ PFLT_FILTER Filter,
1651 PINSTANCE_CONTEXT InstCtx =
NULL;
1652 PFLT_CALLBACK_DATA Data;
1653 PFLT_INSTANCE
Instance = (PFLT_INSTANCE)Context;
1654 PQUEUE_CONTEXT QueueCtx;
1656 FLT_PREOP_CALLBACK_STATUS callbackStatus;
1662 (
"[Csq]: CancelSafe!PreReadWorkItemRoutine\n") );
1668 Status = FltGetInstanceContext( Instance,
1671 if (!NT_SUCCESS( Status ))
1673 FLT_ASSERT( !
"Instance Context is missing" );
1683 callbackStatus = FLT_PREOP_SUCCESS_NO_CALLBACK;
1698 Data = FltCbdqRemoveNextIo( &InstCtx->
Cbdq,
1720 if (!
FlagOn(Data->Flags, FLTFL_CALLBACK_DATA_SYSTEM_BUFFER) &&
1721 Data->Iopb->Parameters.Read.MdlAddress ==
NULL &&
1722 Data->Iopb->Parameters.Read.Length > 0) {
1724 Status = FltLockUserBuffer( Data );
1726 if (!NT_SUCCESS( Status )) {
1737 (
"[Csq]: Failed to lock user buffer (Status = 0x%x)\n",
1740 callbackStatus = FLT_PREOP_COMPLETE;
1741 Data->IoStatus.Status =
Status;
1749 FltCompletePendedPreOperation( Data,
1793 FltReleaseContext(InstCtx);
1795 FltFreeGenericWorkItem(WorkItem);
1801 _In_ PINSTANCE_CONTEXT InstanceContext
1820 LARGE_INTEGER DueTime;
1827 DueTime.QuadPart = (LONGLONG) - Globals.
TimeDelay;
1829 Status = KeWaitForSingleObject( &InstanceContext->TeardownEvent,
1841 _Inout_ PFLT_CALLBACK_DATA Data
1861 return STATUS_SUCCESS;
1867 _In_ PINSTANCE_CONTEXT InstanceContext
1887 FLT_PREOP_CALLBACK_STATUS callbackStatus;
1888 PFLT_CALLBACK_DATA Data;
1889 PQUEUE_CONTEXT QueueCtx;
1893 callbackStatus = FLT_PREOP_SUCCESS_NO_CALLBACK;
1895 Data = FltCbdqRemoveNextIo( &InstanceContext->Cbdq,
1915 if (!
FlagOn(Data->Flags, FLTFL_CALLBACK_DATA_SYSTEM_BUFFER) &&
1916 Data->Iopb->Parameters.Read.MdlAddress ==
NULL &&
1917 Data->Iopb->Parameters.Read.Length > 0) {
1919 Status = FltLockUserBuffer( Data );
1921 if (!NT_SUCCESS( Status )) {
1931 callbackStatus = FLT_PREOP_COMPLETE;
1932 Data->IoStatus.Status =
Status;
1936 FltCompletePendedPreOperation( Data,
#define CSQ_KEY_NAME_DELAY
FLT_REGISTRATION FilterRegistration
NTSTATUS CsqInsertIo(_In_ PFLT_CALLBACK_DATA_QUEUE DataQueue, _In_ PFLT_CALLBACK_DATA Data, _In_opt_ PVOID Context)
_In_ PLARGE_INTEGER _In_ ULONG Length
struct _INSTANCE_CONTEXT INSTANCE_CONTEXT
#define INSTANCE_CONTEXT_TAG
DRIVER_INITIALIZE DriverEntry
VOID CsqRemoveIo(_In_ PFLT_CALLBACK_DATA_QUEUE DataQueue, _In_ PFLT_CALLBACK_DATA Data)
FORCEINLINE VOID _Acquires_lock_(_Global_critical_region_) AvAcquireResourceExclusive(_Inout_ _Acquires_exclusive_lock_(*Resource) PERESOURCE Resource)
#define CSQ_TRACE_PRE_READ
NTSTATUS PreReadPendIo(_In_ PINSTANCE_CONTEXT InstanceContext)
#define IRP_SYNCHRONOUS_PAGING_IO
#define CSQ_DEFAULT_MAPPING_PATH
RtlCopyMemory(OutputStringBuffer, TempMappingBuffer->Data, OutputString->MaximumLength)
#define DebugTrace(Level, Data)
UNICODE_STRING MappingPath
_In_opt_ PFILE_OBJECT _In_opt_ PFLT_INSTANCE Instance
VOID CsqCompleteCanceledIo(_In_ PFLT_CALLBACK_DATA_QUEUE DataQueue, _Inout_ PFLT_CALLBACK_DATA Data)
NTSTATUS PreReadProcessIo(_Inout_ PFLT_CALLBACK_DATA Data)
struct _CSQ_GLOBAL_DATA CSQ_GLOBAL_DATA
FLT_ASSERT(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
VOID InstanceTeardownStart(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags)
VOID PreReadWorkItemRoutine(_In_ PFLT_GENERIC_WORKITEM WorkItem, _In_ PFLT_FILTER Filter, _In_ PVOID Context)
CONST FLT_OPERATION_REGISTRATION Callbacks[]
#define CSQ_MAX_PATH_LENGTH
NcLoadRegistryStringRetry KeyValuePartialInformation
FLT_PREOP_CALLBACK_STATUS PreRead(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
PFLT_CALLBACK_DATA CsqPeekNextIo(_In_ PFLT_CALLBACK_DATA_QUEUE DataQueue, _In_opt_ PFLT_CALLBACK_DATA Data, _In_opt_ PVOID PeekContext)
#define CSQ_TRACE_CONTEXT_CALLBACK
volatile LONG WorkerThreadFlag
VOID PreReadEmptyQueueAndComplete(_In_ PINSTANCE_CONTEXT InstanceContext)
NTSTATUS Unload(_In_ FLT_FILTER_UNLOAD_FLAGS Flags)
_In_ BOOLEAN _Out_ PFILE_BASIC_INFORMATION Buffer
const FLT_CONTEXT_REGISTRATION ContextRegistration[]
UNREFERENCED_PARAMETER(FileObject)
#define CSQ_DEFAULT_TIME_DELAY
#define CSQ_TRACE_LOAD_UNLOAD
NcLoadRegistryStringRetry NULL
NTSTATUS SetConfiguration(_In_ PUNICODE_STRING RegistryPath)
struct _INSTANCE_CONTEXT * PINSTANCE_CONTEXT
FLT_CALLBACK_DATA_QUEUE Cbdq
NPAGED_LOOKASIDE_LIST QueueContextLookaside
FLT_CALLBACK_DATA_QUEUE_IO_CONTEXT CbdqIoContext
VOID InstanceTeardownComplete(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags)
struct _QUEUE_CONTEXT QUEUE_CONTEXT
if(Status !=STATUS_BUFFER_TOO_SMALL &&Status !=STATUS_BUFFER_OVERFLOW)
#define CSQ_TRACE_INSTANCE_CALLBACK
FORCEINLINE VOID _Releases_lock_(_Global_critical_region_) _Requires_lock_held_(_Global_critical_region_) AvReleaseResource(_Inout_ _Requires_lock_held_(*Resource) _Releases_lock_(*Resource) PERESOURCE Resource)
VOID _IRQL_requires_max_(VOID_IRQL_requires_max_(APC_LEVEL) _IRQL_requires_min_() _IRQL_raises_(PASSIVE_LEVEL) _Requires_lock_held_((CONTAINING_RECORD(DataQueue APC_LEVEL)
#define QUEUE_CONTEXT_TAG
_Requires_lock_held_(_Global_critical_region_)
#define CSQ_KEY_NAME_PATH
NTSTATUS InstanceSetup(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_SETUP_FLAGS Flags, _In_ DEVICE_TYPE VolumeDeviceType, _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType)
#define CSQ_TRACE_CBDQ_CALLBACK
#define CSQ_KEY_NAME_DEBUG_LEVEL
NTSTATUS InstanceQueryTeardown(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags)
VOID ContextCleanup(_In_ PFLT_CONTEXT Context, _In_ FLT_CONTEXT_TYPE ContextType)
struct _QUEUE_CONTEXT * PQUEUE_CONTEXT