27 _In_ PFLT_CONTEXT Context,
28 _In_ FLT_CONTEXT_TYPE ContextType
33 _In_ PFLT_CONTEXT Context,
34 _In_ FLT_CONTEXT_TYPE ContextType
39 _In_ PFLT_CONTEXT Context,
40 _In_ FLT_CONTEXT_TYPE ContextType
45 _In_ PFLT_CONTEXT Context,
46 _In_ FLT_CONTEXT_TYPE ContextType
50 #pragma alloc_text(PAGE, AvCreateStreamContext) 51 #pragma alloc_text(PAGE, AvCreateStreamHandleContext) 52 #pragma alloc_text(PAGE, AvFindOrCreateTransactionContext) 53 #pragma alloc_text(PAGE, AvCreateSectionContext) 54 #pragma alloc_text(PAGE, AvStreamContextCleanup) 55 #pragma alloc_text(PAGE, AvTransactionContextCleanup) 56 #pragma alloc_text(PAGE, AvSectionContextCleanup) 57 #pragma alloc_text(PAGE, AvInstanceContextCleanup) 58 #pragma alloc_text(PAGE, AvAllocateScanContext) 59 #pragma alloc_text(PAGE, AvReferenceScanContext) 60 #pragma alloc_text(PAGE, AvReleaseScanContext) 76 { FLT_STREAMHANDLE_CONTEXT,
82 { FLT_TRANSACTION_CONTEXT,
88 { FLT_SECTION_CONTEXT,
94 { FLT_INSTANCE_CONTEXT,
106 _In_ PFLT_CONTEXT Context,
107 _In_ FLT_CONTEXT_TYPE ContextType
135 FLT_ASSERTMSG(
"[AV]: Stream context is not supposed to be in the transaction context list at cleanup.!\n",
143 _In_ PFLT_CONTEXT Context,
144 _In_ FLT_CONTEXT_TYPE ContextType
176 (
"[Av]: AvTransactionContextCleanup context cleanup entered.\n") );
178 ExDeleteResourceLite( transactionContext->
Resource );
181 ObDereferenceObject( transactionContext->
Transaction );
187 _In_ PFLT_CONTEXT Context,
188 _In_ FLT_CONTEXT_TYPE ContextType
216 FLT_ASSERTMSG(
"[AV] AvSectionContextCleanup: Section handle should be NULL at cleanup.\n",
218 FLT_ASSERTMSG(
"[AV] AvSectionContextCleanup: Section object should be NULL at cleanup.\n",
225 _In_ PFLT_CONTEXT Context,
226 _In_ FLT_CONTEXT_TYPE ContextType
260 (
"[Av]: AvInstanceContextCleanup context cleanup entered\n") );
264 FLT_ASSERTMSG(
"[AV] AvInstanceContextCleanup: The generic table should be empty at cleanup.\n",
266 ExDeleteResourceLite( &instanceContext->
Resource );
272 _In_ PFLT_FILTER Filter,
300 status = FltAllocateContext( Filter,
301 FLT_STREAMHANDLE_CONTEXT,
304 &streamHandleContext );
306 if (!NT_SUCCESS( status )) {
309 (
"[Av]: Failed to allocate stream handle context with status 0x%x \n",
319 *StreamHandleContext = streamHandleContext;
321 return STATUS_SUCCESS;
326 _In_ PFLT_FILTER Filter,
346 PKEVENT
event =
NULL;
359 return STATUS_INSUFFICIENT_RESOURCES;
366 status = FltAllocateContext( Filter,
372 if (!NT_SUCCESS( status )) {
375 (
"[Av]: Failed to allocate stream context with status 0x%x \n",
390 *StreamContext = streamContext;
392 return STATUS_SUCCESS;
397 _In_ PCFLT_RELATED_OBJECTS FltObjects,
424 PERESOURCE pResource =
NULL;
429 (
"[Av]: AvFindOrCreateTransactionContext entered. \n") );
431 status = FltGetTransactionContext( FltObjects->Instance,
432 FltObjects->Transaction,
433 &transactionContext );
435 if (NT_SUCCESS( status )) {
437 *TransactionContext = transactionContext;
438 return STATUS_SUCCESS;
441 if (status != STATUS_NOT_FOUND) {
444 (
"[AV]: Failed to get transaction context with status 0x%x \n",
455 if (
NULL == pResource ) {
457 return STATUS_INSUFFICIENT_RESOURCES;
465 FLT_TRANSACTION_CONTEXT,
468 &transactionContext );
470 if (!NT_SUCCESS( status )) {
473 (
"[AV]: Failed to allocate transaction context with status 0x%x \n",
479 FLT_ASSERTMSG(
"[AV]: Transaction object pointer is not supposed to be NULL !\n", FltObjects->Transaction !=
NULL);
488 transactionContext->
Resource = pResource;
489 ObReferenceObject( FltObjects->Transaction );
490 transactionContext->
Transaction = FltObjects->Transaction;
491 InitializeListHead( &transactionContext->
ScListHead );
492 ExInitializeResourceLite( transactionContext->
Resource );
494 status = FltSetTransactionContext( FltObjects->Instance,
495 FltObjects->Transaction,
496 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
498 &oldTransactionContext );
500 if (NT_SUCCESS( status )) {
502 *TransactionContext = transactionContext;
503 return STATUS_SUCCESS;
506 FltReleaseContext( transactionContext );
508 if (status != STATUS_FLT_CONTEXT_ALREADY_DEFINED) {
511 (
"[Av]: Failed to set transaction context with status 0x%x \n",
517 if (
NULL == oldTransactionContext) {
520 (
"[Av]: Failed to set transaction context oldTransactionContext is NULL \n") );
525 *TransactionContext = oldTransactionContext;
528 return STATUS_SUCCESS;
568 if (!NT_SUCCESS( status )) {
571 (
"[Av]: Failed to allocate section context.\n, 0x%08x\n",
582 if (!NT_SUCCESS( status )) {
585 (
"[Av]: Failed to get file size with status 0x%x. (FileObject = %p, Instance = %p)\n",
591 sectionContext->
FileSize = fileSize;
594 *SectionContext = sectionContext;
596 return STATUS_SUCCESS;
601 _Outptr_result_buffer_(*NumberInstances) PFLT_INSTANCE **InstanceArray,
602 _Out_ PULONG NumberInstances
623 PFLT_INSTANCE *instArray =
NULL;
624 NTSTATUS status = STATUS_SUCCESS;
634 status = FltEnumerateInstances(
NULL,
640 if (!NT_SUCCESS(status) &&
641 (status != STATUS_BUFFER_TOO_SMALL)) {
658 if (instArray !=
NULL) {
671 instArray = ExAllocatePoolWithTag( PagedPool,
672 (instCnt *
sizeof(PFLT_INSTANCE)),
675 if (instArray ==
NULL) {
677 status = STATUS_INSUFFICIENT_RESOURCES;
685 status = FltEnumerateInstances(
NULL,
695 if (NT_SUCCESS(status)) {
706 if (status != STATUS_BUFFER_TOO_SMALL) {
719 *InstanceArray = instArray;
720 *NumberInstances = instCnt;
724 if ( !NT_SUCCESS(status) ) {
732 for (i = 0; i < instCnt; i++) {
734 FltObjectDereference( instArray[i] );
750 _In_reads_(InstanceCount) PFLT_INSTANCE *InstanceArray,
751 _In_ ULONG InstanceCount
777 for (i = 0; i < InstanceCount; i++) {
779 FltObjectDereference( InstanceArray[i] );
780 InstanceArray[i] =
NULL;
813 NTSTATUS status = STATUS_SUCCESS;
818 ASSERT(Instance !=
NULL);
819 ASSERT(FileObject !=
NULL);
821 scanCtx = ExAllocatePoolWithTag( NonPagedPoolNx,
825 if (
NULL == scanCtx) {
827 return STATUS_INSUFFICIENT_RESOURCES;
836 status = FltObjectReference( Instance );
837 if (!NT_SUCCESS(status)) {
847 ObReferenceObject( FileObject );
850 *ScanContext = scanCtx;
851 return STATUS_SUCCESS;
877 if (ScanContext ==
NULL) {
879 return STATUS_INVALID_PARAMETER;
882 ASSERT(ScanContext->RefCount != 0);
883 ASSERT(ScanContext->FilterInstance !=
NULL);
884 ASSERT(ScanContext->FileObject !=
NULL);
886 InterlockedIncrement(&ScanContext->RefCount);
888 return STATUS_SUCCESS;
913 ULONG newRefCount = 0;
917 if (ScanContext ==
NULL) {
919 return STATUS_INVALID_PARAMETER;
922 ASSERT(ScanContext->FilterInstance !=
NULL);
923 ASSERT(ScanContext->FileObject !=
NULL);
930 newRefCount = InterlockedDecrement(&ScanContext->RefCount);
931 if (newRefCount == 0) {
936 FltObjectDereference( ScanContext->FilterInstance );
937 ObDereferenceObject( ScanContext->FileObject );
940 return STATUS_SUCCESS;
PKEVENT ScanSynchronizationEvent
#define SET_FILE_TX_MODIFIED(_sCtx)
#define AV_INSTANCE_CONTEXT_SIZE
#define FS_SUPPORTS_FILE_STATE_CACHE(VolumeFilesystemType)
#define AV_SECTION_CONTEXT_SIZE
VOID AvTransactionContextCleanup(_In_ PFLT_CONTEXT Context, _In_ FLT_CONTEXT_TYPE ContextType)
PAV_TRANSACTION_CONTEXT TxContext
#define AV_STREAMHANDLE_CONTEXT_SIZE
FLT_FILESYSTEM_TYPE VolumeFSType
struct _AV_INSTANCE_CONTEXT * PAV_INSTANCE_CONTEXT
PFLT_INSTANCE FilterInstance
NTSTATUS AvCreateSectionContext(_In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _Outptr_ PAV_SECTION_CONTEXT *SectionContext)
VOID AvInstanceContextCleanup(_In_ PFLT_CONTEXT Context, _In_ FLT_CONTEXT_TYPE ContextType)
VOID AvFreeInstances(_In_reads_(InstanceCount) PFLT_INSTANCE *InstanceArray, _In_ ULONG InstanceCount)
_In_opt_ PFILE_OBJECT _In_opt_ PFLT_INSTANCE Instance
NTSTATUS AvReleaseScanContext(_In_ PAV_SCAN_CONTEXT ScanContext)
#define AV_STREAM_CONTEXT_TAG
FORCEINLINE VOID AvFreeResource(_In_ PERESOURCE Resource)
FLT_ASSERT(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
AV_SCANNER_GLOBAL_DATA Globals
FORCEINLINE PERESOURCE AvAllocateResource(VOID)
VOID AvStreamContextCleanup(_In_ PFLT_CONTEXT Context, _In_ FLT_CONTEXT_TYPE ContextType)
NTSTATUS AvFindOrCreateTransactionContext(_In_ PCFLT_RELATED_OBJECTS FltObjects, _Outptr_ PAV_TRANSACTION_CONTEXT *TransactionContext)
#define AV_SECTION_CONTEXT_TAG
FORCEINLINE VOID AvFreeKevent(_In_ PKEVENT Event)
NTSTATUS AvGetFileSize(_In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _Out_ PLONGLONG Size)
PKTRANSACTION Transaction
#define AV_STREAM_CONTEXT_SIZE
struct _AV_STREAM_CONTEXT * PAV_STREAM_CONTEXT
#define AV_TRANSACTION_CONTEXT_SIZE
RTL_GENERIC_TABLE FileStateCacheTable
#define SET_FILE_MODIFIED(_sCtx)
const FLT_CONTEXT_REGISTRATION ContextRegistration[]
VOID AvSectionContextCleanup(_In_ PFLT_CONTEXT Context, _In_ FLT_CONTEXT_TYPE ContextType)
NTSTATUS AvEnumerateInstances(_Outptr_result_buffer_(*NumberInstances) PFLT_INSTANCE **InstanceArray, _Out_ PULONG NumberInstances)
#define AV_STREAMHANDLE_CONTEXT_TAG
BOOLEAN IoWaitOnScanCompleteNotificationAborted
UNREFERENCED_PARAMETER(FileObject)
NcLoadRegistryStringRetry NULL
NTSTATUS AvCreateStreamContext(_In_ PFLT_FILTER Filter, _Outptr_ PAV_STREAM_CONTEXT *StreamContext)
#define AV_INSTANCES_ARRAY_TAG
NTSTATUS AvCreateStreamHandleContext(_In_ PFLT_FILTER Filter, _Outptr_ PAV_STREAMHANDLE_CONTEXT *StreamHandleContext)
#define AV_INSTANCE_CONTEXT_TAG
struct _AV_TRANSACTION_CONTEXT * PAV_TRANSACTION_CONTEXT
NTSTATUS AvAllocateScanContext(_In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _Outptr_ PAV_SCAN_CONTEXT *ScanContext)
#define AV_TRANSACTION_CONTEXT_TAG
NTSTATUS AvReferenceScanContext(_In_ PAV_SCAN_CONTEXT ScanContext)
_In_opt_ PFILE_OBJECT FileObject
FORCEINLINE PKEVENT AvAllocateKevent(VOID)
#define AV_DBG_PRINT(_dbgLevel, _string)