38 _In_ PDRIVER_OBJECT DriverObject,
39 _In_ PUNICODE_STRING RegistryPath
44 _In_ FLT_FILTER_UNLOAD_FLAGS Flags
49 _In_ PFLT_CONTEXT Context,
50 _In_ FLT_CONTEXT_TYPE ContextType
55 _In_ PCFLT_RELATED_OBJECTS FltObjects,
56 _In_ FLT_INSTANCE_SETUP_FLAGS Flags,
57 _In_ DEVICE_TYPE VolumeDeviceType,
58 _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType
63 _In_ PCFLT_RELATED_OBJECTS FltObjects,
64 _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
69 _In_ PCFLT_RELATED_OBJECTS FltObjects,
70 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
75 _In_ PCFLT_RELATED_OBJECTS FltObjects,
76 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
82 CtxInitializeDebugLevel (
83 _In_ PUNICODE_STRING RegistryPath
93 #pragma alloc_text(INIT, DriverEntry) 96 #pragma alloc_text(INIT, CtxInitializeDebugLevel) 99 #pragma alloc_text(PAGE, CtxUnload) 100 #pragma alloc_text(PAGE, CtxContextCleanup) 101 #pragma alloc_text(PAGE, CtxInstanceSetup) 102 #pragma alloc_text(PAGE, CtxInstanceQueryTeardown) 103 #pragma alloc_text(PAGE, CtxInstanceTeardownStart) 104 #pragma alloc_text(PAGE, CtxInstanceTeardownComplete) 115 FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO,
120 FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO,
125 FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO,
130 FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO,
134 { IRP_MJ_OPERATION_END }
139 { FLT_INSTANCE_CONTEXT,
151 { FLT_STREAM_CONTEXT,
157 { FLT_STREAMHANDLE_CONTEXT,
172 sizeof( FLT_REGISTRATION ),
173 FLT_REGISTRATION_VERSION,
191 _In_ PDRIVER_OBJECT DriverObject,
192 _In_ PUNICODE_STRING RegistryPath
221 ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
223 RtlZeroMemory( &Globals,
sizeof( Globals ) );
231 CtxInitializeDebugLevel( RegistryPath );
240 (
"[Ctx]: Driver being loaded\n") );
248 status = FltRegisterFilter( DriverObject,
252 if (!NT_SUCCESS( status )) {
261 status = FltStartFiltering( Globals.
Filter );
263 if (!NT_SUCCESS( status )) {
265 FltUnregisterFilter( Globals.
Filter );
269 (
"[Ctx]: Driver loaded complete (Status = 0x%08X)\n",
278 CtxInitializeDebugLevel (
279 _In_ PUNICODE_STRING RegistryPath
299 OBJECT_ATTRIBUTES attributes;
304 UCHAR buffer[
sizeof( KEY_VALUE_PARTIAL_INFORMATION ) +
sizeof( LONG )];
306 Globals.DebugLevel = DEBUG_TRACE_ERROR;
312 InitializeObjectAttributes( &attributes,
314 OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
318 status = ZwOpenKey( &driverRegKey,
322 if (NT_SUCCESS( status )) {
328 RtlInitUnicodeString( &valueName, L
"DebugLevel" );
330 status = ZwQueryValueKey( driverRegKey,
337 if (NT_SUCCESS( status )) {
339 Globals.DebugLevel = *((PULONG) &(((PKEY_VALUE_PARTIAL_INFORMATION) buffer)->Data));
346 ZwClose( driverRegKey );
356 _In_ FLT_FILTER_UNLOAD_FLAGS Flags
382 (
"[Ctx]: Unloading driver\n") );
385 FltUnregisterFilter( Globals.
Filter );
388 return STATUS_SUCCESS;
393 _In_ PFLT_CONTEXT Context,
394 _In_ FLT_CONTEXT_TYPE ContextType
404 switch(ContextType) {
406 case FLT_INSTANCE_CONTEXT:
410 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS,
411 (
"[Ctx]: Cleaning up instance context for volume %wZ (Context = %p)\n",
422 CtxFreeUnicodeString( &instanceContext->
VolumeName );
424 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS,
425 (
"[Ctx]: Instance context cleanup complete.\n") );
430 case FLT_FILE_CONTEXT:
434 DebugTrace( DEBUG_TRACE_FILE_CONTEXT_OPERATIONS,
435 (
"[Ctx]: Cleaning up file context for file %wZ (FileContext = %p)\n",
446 CtxFreeUnicodeString(&fileContext->
FileName);
449 DebugTrace( DEBUG_TRACE_FILE_CONTEXT_OPERATIONS,
450 (
"[Ctx]: File context cleanup complete.\n") );
454 case FLT_STREAM_CONTEXT:
458 DebugTrace( DEBUG_TRACE_STREAM_CONTEXT_OPERATIONS,
459 (
"[Ctx]: Cleaning up stream context for file %wZ (StreamContext = %p) \n\tCreateCount = %x \n\tCleanupCount = %x, \n\tCloseCount = %x\n",
472 ExDeleteResourceLite( streamContext->
Resource );
482 CtxFreeUnicodeString(&streamContext->
FileName);
485 DebugTrace( DEBUG_TRACE_STREAM_CONTEXT_OPERATIONS,
486 (
"[Ctx]: Stream context cleanup complete.\n") );
490 case FLT_STREAMHANDLE_CONTEXT:
494 DebugTrace( DEBUG_TRACE_STREAMHANDLE_CONTEXT_OPERATIONS,
495 (
"[Ctx]: Cleaning up stream handle context for file %wZ (StreamContext = %p)\n",
497 streamHandleContext) );
505 ExDeleteResourceLite( streamHandleContext->
Resource );
515 CtxFreeUnicodeString(&streamHandleContext->
FileName);
518 DebugTrace( DEBUG_TRACE_STREAMHANDLE_CONTEXT_OPERATIONS,
519 (
"[Ctx]: Stream handle context cleanup complete.\n") );
533 _In_ PCFLT_RELATED_OBJECTS FltObjects,
534 _In_ FLT_INSTANCE_SETUP_FLAGS Flags,
535 _In_ DEVICE_TYPE VolumeDeviceType,
536 _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType
560 NTSTATUS status = STATUS_SUCCESS;
561 ULONG volumeNameLength;
570 (
"[Ctx]: Instance setup started (Volume = %p, Instance = %p)\n",
572 FltObjects->Instance) );
584 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS,
585 (
"[Ctx]: Allocating instance context (Volume = %p, Instance = %p)\n",
587 FltObjects->Instance) );
589 status = FltAllocateContext( FltObjects->Filter,
590 FLT_INSTANCE_CONTEXT,
595 if (!NT_SUCCESS( status )) {
597 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS | DEBUG_TRACE_ERROR,
598 (
"[Ctx]: Failed to allocate instance context (Volume = %p, Instance = %p, Status = 0x%x)\n",
600 FltObjects->Instance,
603 goto CtxInstanceSetupCleanup;
610 status = FltGetVolumeName( FltObjects->Volume,
NULL, &volumeNameLength );
612 if( !NT_SUCCESS( status ) &&
613 (status != STATUS_BUFFER_TOO_SMALL) ) {
615 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS | DEBUG_TRACE_ERROR,
616 (
"[Ctx]: Unexpected failure in FltGetVolumeName. (Volume = %p, Instance = %p, Status = 0x%x)\n",
618 FltObjects->Instance,
621 goto CtxInstanceSetupCleanup;
628 instanceContext->
VolumeName.MaximumLength = (USHORT) volumeNameLength;
629 status = CtxAllocateUnicodeString( &instanceContext->
VolumeName );
631 if( !NT_SUCCESS( status )) {
633 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS | DEBUG_TRACE_ERROR,
634 (
"[Ctx]: Failed to allocate volume name string. (Volume = %p, Instance = %p, Status = 0x%x)\n",
636 FltObjects->Instance,
639 goto CtxInstanceSetupCleanup;
646 status = FltGetVolumeName( FltObjects->Volume, &instanceContext->
VolumeName, &volumeNameLength );
648 if( !NT_SUCCESS( status ) ) {
650 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS | DEBUG_TRACE_ERROR,
651 (
"[Ctx]: Unexpected failure in FltGetVolumeName. (Volume = %p, Instance = %p, Status = 0x%x)\n",
653 FltObjects->Instance,
656 goto CtxInstanceSetupCleanup;
660 instanceContext->
Instance = FltObjects->Instance;
661 instanceContext->
Volume = FltObjects->Volume;
667 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS,
668 (
"[Ctx]: Setting instance context %p for volume %wZ (Volume = %p, Instance = %p)\n",
672 FltObjects->Instance) );
674 status = FltSetInstanceContext( FltObjects->Instance,
675 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
679 if( !NT_SUCCESS( status )) {
681 DebugTrace( DEBUG_TRACE_INSTANCES | DEBUG_TRACE_ERROR,
682 (
"[Ctx]: Failed to set instance context for volume %wZ (Volume = %p, Instance = %p, Status = 0x%08X)\n",
685 FltObjects->Instance,
687 goto CtxInstanceSetupCleanup;
691 CtxInstanceSetupCleanup:
712 if ( instanceContext !=
NULL ) {
714 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS,
715 (
"[Ctx]: Releasing instance context %p (Volume = %p, Instance = %p)\n",
718 FltObjects->Instance) );
720 FltReleaseContext( instanceContext );
724 if (NT_SUCCESS( status )) {
727 (
"[Ctx]: Instance setup complete (Volume = %p, Instance = %p). Filter will attach to the volume.\n",
729 FltObjects->Instance) );
733 (
"[Ctx]: Instance setup complete (Volume = %p, Instance = %p). Filter will not attach to the volume.\n",
735 FltObjects->Instance) );
744 _In_ PCFLT_RELATED_OBJECTS FltObjects,
745 _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
774 (
"[Ctx]: Instance query teardown started (Instance = %p)\n",
775 FltObjects->Instance) );
779 (
"[Ctx]: Instance query teadown ended (Instance = %p)\n",
780 FltObjects->Instance) );
781 return STATUS_SUCCESS;
787 _In_ PCFLT_RELATED_OBJECTS FltObjects,
788 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
815 (
"[Ctx]: Instance teardown start started (Instance = %p)\n",
816 FltObjects->Instance) );
820 (
"[Ctx]: Instance teardown start ended (Instance = %p)\n",
821 FltObjects->Instance) );
827 _In_ PCFLT_RELATED_OBJECTS FltObjects,
828 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
857 (
"[Ctx]: Instance teardown complete started (Instance = %p)\n",
858 FltObjects->Instance) );
860 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS,
861 (
"[Ctx]: Getting instance context (Volume = %p, Instance = %p)\n",
863 FltObjects->Instance) );
865 status = FltGetInstanceContext( FltObjects->Instance,
868 if (NT_SUCCESS( status )) {
870 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS,
871 (
"[Ctx]: Instance teardown for volume %wZ (Volume = %p, Instance = %p, InstanceContext = %p)\n",
874 FltObjects->Instance,
887 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS,
888 (
"[Ctx]: Releasing instance context %p for volume %wZ (Volume = %p, Instance = %p)\n",
892 FltObjects->Instance) );
894 FltReleaseContext( instanceContext );
897 DebugTrace( DEBUG_TRACE_INSTANCE_CONTEXT_OPERATIONS | DEBUG_TRACE_ERROR,
898 (
"[Ctx]: Failed to get instance context (Volume = %p, Instance = %p Status = 0x%x)\n",
900 FltObjects->Instance,
905 (
"[Ctx]: Instance teardown complete ended (Instance = %p)\n",
906 FltObjects->Instance) );
#define CTX_STREAMHANDLE_CONTEXT_SIZE
#define CTX_FILE_CONTEXT_TAG
struct _CTX_STREAMHANDLE_CONTEXT * PCTX_STREAMHANDLE_CONTEXT
struct _CTX_STREAM_CONTEXT * PCTX_STREAM_CONTEXT
NTSTATUS CtxInstanceSetup(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_SETUP_FLAGS Flags, _In_ DEVICE_TYPE VolumeDeviceType, _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType)
VOID CtxContextCleanup(_In_ PFLT_CONTEXT Context, _In_ FLT_CONTEXT_TYPE ContextType)
VOID CtxInstanceTeardownStart(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags)
#define DebugTrace(Level, Data)
NTSTATUS CtxUnload(_In_ FLT_FILTER_UNLOAD_FLAGS Flags)
#define CTX_INSTANCE_CONTEXT_SIZE
#define CTX_STREAM_CONTEXT_TAG
#define CTX_STREAMHANDLE_CONTEXT_TAG
FLT_POSTOP_CALLBACK_STATUS CtxPostCreate(_Inout_ PFLT_CALLBACK_DATA Cbd, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Inout_opt_ PVOID CbdContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
FLT_OPERATION_REGISTRATION Callbacks[]
NcLoadRegistryStringRetry KeyValuePartialInformation
#define CTX_INSTANCE_CONTEXT_TAG
#define IRP_MJ_SET_INFORMATION
FLT_REGISTRATION FilterRegistration
UNREFERENCED_PARAMETER(FileObject)
NcLoadRegistryStringRetry NULL
#define CTX_STREAM_CONTEXT_SIZE
FLT_PREOP_CALLBACK_STATUS CtxPreClose(_Inout_ PFLT_CALLBACK_DATA Cbd, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
UNICODE_STRING VolumeName
FLT_POSTOP_CALLBACK_STATUS CtxPostSetInfo(_Inout_ PFLT_CALLBACK_DATA Cbd, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Inout_opt_ PVOID CbdContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
struct _CTX_INSTANCE_CONTEXT * PCTX_INSTANCE_CONTEXT
DRIVER_INITIALIZE DriverEntry
FLT_PREOP_CALLBACK_STATUS CtxPreSetInfo(_Inout_ PFLT_CALLBACK_DATA Cbd, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
const FLT_CONTEXT_REGISTRATION ContextRegistration[]
#define CTX_FILE_CONTEXT_SIZE
FLT_PREOP_CALLBACK_STATUS CtxPreCreate(_Inout_ PFLT_CALLBACK_DATA Cbd, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
VOID CtxInstanceTeardownComplete(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags)
NTSTATUS CtxInstanceQueryTeardown(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags)
struct _CTX_FILE_CONTEXT * PCTX_FILE_CONTEXT
FORCEINLINE VOID CtxFreeResource(_In_ PERESOURCE Resource)
FLT_PREOP_CALLBACK_STATUS CtxPreCleanup(_Inout_ PFLT_CALLBACK_DATA Cbd, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)