33 _In_ PDRIVER_OBJECT DriverObject,
34 _In_ PUNICODE_STRING RegistryPath
39 _In_ PUNICODE_STRING RegistryPath
44 _In_ PCFLT_RELATED_OBJECTS FltObjects,
45 _In_ FLT_INSTANCE_SETUP_FLAGS Flags,
46 _In_ DEVICE_TYPE VolumeDeviceType,
47 _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType
52 _In_ PCFLT_RELATED_OBJECTS FltObjects,
53 _Unreferenced_parameter_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
58 _In_ PCFLT_RELATED_OBJECTS FltObjects,
59 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
64 _Unreferenced_parameter_ FLT_FILTER_UNLOAD_FLAGS Flags
69 _In_ PCFLT_RELATED_OBJECTS FltObjects,
70 _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
73 FLT_PREOP_CALLBACK_STATUS
75 _Inout_ PFLT_CALLBACK_DATA Data,
76 _In_ PCFLT_RELATED_OBJECTS FltObjects,
77 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
80 FLT_PREOP_CALLBACK_STATUS
82 _Inout_ PFLT_CALLBACK_DATA Data,
83 _In_ PCFLT_RELATED_OBJECTS FltObjects,
84 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
87 FLT_POSTOP_CALLBACK_STATUS
89 _Inout_ PFLT_CALLBACK_DATA Data,
90 _In_ PCFLT_RELATED_OBJECTS FltObjects,
91 _In_opt_ PVOID CompletionContext,
92 _In_ FLT_POST_OPERATION_FLAGS Flags
95 FLT_PREOP_CALLBACK_STATUS
97 _Inout_ PFLT_CALLBACK_DATA Data,
98 _In_ PCFLT_RELATED_OBJECTS FltObjects,
99 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
102 FLT_PREOP_CALLBACK_STATUS
104 _Inout_ PFLT_CALLBACK_DATA Data,
105 _In_ PCFLT_RELATED_OBJECTS FltObjects,
106 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
111 _Unreferenced_parameter_ PCFLT_RELATED_OBJECTS FltObjects,
112 _In_ PFLT_CONTEXT TransactionContext,
113 _In_ ULONG TransactionNotification
118 _Unreferenced_parameter_ PFLT_INSTANCE
Instance,
119 _In_ PFLT_CONTEXT Context,
120 _Unreferenced_parameter_ PFLT_CALLBACK_DATA Data
129 _In_ PFLT_CALLBACK_DATA Data
134 _In_ PKTRANSACTION Transaction,
135 _Out_ PULONG TxOutcome
140 _In_ PCFLT_RELATED_OBJECTS FltObjects,
147 _In_ ULONG TransactionOutcome
154 _Out_ LONG
volatile* State,
155 _Out_ PLONGLONG VolumeRevision,
156 _Out_ PLONGLONG CacheRevision,
157 _Out_ PLONGLONG FileRevision
168 _In_ PFLT_FILTER Filter,
169 _In_ PFLT_CALLBACK_DATA Data
174 _Inout_ PFLT_CALLBACK_DATA Data
179 _Inout_ PFLT_CALLBACK_DATA Data,
180 _In_ PCFLT_RELATED_OBJECTS FltObjects,
182 _In_ UCHAR IOMajorFunctionAtScan,
183 _In_ BOOLEAN IsInTxWriter,
203 #pragma alloc_text(INIT, DriverEntry) 204 #pragma alloc_text(INIT, AvSetConfiguration) 205 #pragma alloc_text(PAGE, AvUnload) 206 #pragma alloc_text(PAGE, AvInstanceQueryTeardown) 207 #pragma alloc_text(PAGE, AvInstanceSetup) 208 #pragma alloc_text(PAGE, AvInstanceTeardownStart) 209 #pragma alloc_text(PAGE, AvInstanceTeardownComplete) 210 #pragma alloc_text(PAGE, AvPreCreate) 211 #pragma alloc_text(PAGE, AvPostCreate) 212 #pragma alloc_text(PAGE, AvPreFsControl) 213 #pragma alloc_text(PAGE, AvPreCleanup) 214 #pragma alloc_text(PAGE, AvKtmNotificationCallback) 215 #pragma alloc_text(PAGE, AvScanAbortCallbackAsync) 216 #pragma alloc_text(PAGE, AvOperationsModifyingFile) 217 #pragma alloc_text(PAGE, AvQueryTransactionOutcome) 218 #pragma alloc_text(PAGE, AvProcessPreviousTransaction) 219 #pragma alloc_text(PAGE, AvProcessTransactionOutcome) 220 #pragma alloc_text(PAGE, AvLoadFileStateFromCache) 221 #pragma alloc_text(PAGE, AvSyncCache) 222 #pragma alloc_text(PAGE, AvIsPrefetchEcpPresent) 223 #pragma alloc_text(PAGE, AvIsStreamAlternate) 224 #pragma alloc_text(PAGE, AvScan) 225 #pragma alloc_text(PAGE, AvDoCancelScanAndRelease) 226 #pragma alloc_text(PAGE, AvSendAbortToUser) 227 #pragma alloc_text(PAGE, AvSendUnloadingToUser) 260 { IRP_MJ_OPERATION_END }
275 sizeof( FLT_REGISTRATION ),
276 FLT_REGISTRATION_VERSION,
301 _In_ PCFLT_RELATED_OBJECTS FltObjects,
302 _In_ FLT_INSTANCE_SETUP_FLAGS Flags,
303 _In_ DEVICE_TYPE VolumeDeviceType,
304 _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType
332 BOOLEAN isOnCsv = FALSE;
339 (
"[AV] AvInstanceSetup: Entered\n") );
345 if (VolumeDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM) {
347 return STATUS_FLT_DO_NOT_ATTACH;
358 if (VolumeFilesystemType == FLT_FSTYPE_NTFS) {
362 return STATUS_FLT_DO_NOT_ATTACH;
367 FLT_INSTANCE_CONTEXT,
372 if (!NT_SUCCESS( status )) {
375 (
"[AV] AvInstanceSetup: allocate instance context failed. status = 0x%x\n", status) );
377 return STATUS_FLT_DO_NOT_ATTACH;
385 instanceContext->
Volume = FltObjects->Volume;
386 instanceContext->
Instance = FltObjects->Instance;
409 ExInitializeResourceLite( &instanceContext->
Resource );
418 status = FltSetInstanceContext( FltObjects->Instance,
419 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
428 FltReleaseContext( instanceContext );
430 if (!NT_SUCCESS( status )) {
433 (
"[AV] AvInstanceSetup: set instance context failed. status = 0x%x\n", status) );
434 return STATUS_FLT_DO_NOT_ATTACH;
444 status = FltRegisterForDataScan( FltObjects->Instance );
446 if (!NT_SUCCESS( status )) {
449 (
"[AV] AvInstanceSetup: FltRegisterForDataScan failed. status = 0x%x\n", status) );
450 return STATUS_FLT_DO_NOT_ATTACH;
454 return STATUS_SUCCESS;
459 _In_ PCFLT_RELATED_OBJECTS FltObjects,
460 _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
493 (
"[AV] AvInstanceQueryTeardown: Entered\n") );
495 return STATUS_SUCCESS;
500 _In_ PCFLT_RELATED_OBJECTS FltObjects,
501 _Unreferenced_parameter_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
534 (
"[AV] AvInstanceTeardownStart: Entered\n") );
536 status = FltGetInstanceContext( FltObjects->Instance,
539 if (!NT_SUCCESS( status )) {
542 (
"[AV] AvInstanceTeardownStart: FltGetInstanceContext failed. status = 0x%x\n", status) );
575 if (!NT_SUCCESS( status ) || status == STATUS_TIMEOUT) {
589 AvAcquireResourceExclusive( &instanceContext->
Resource );
594 (
"[AV] AvInstanceTeardownStart: %I64x,%I64x requesting deletion, state:%d\n",
601 AvReleaseResource( &instanceContext->
Resource );
604 FltReleaseContext( instanceContext );
606 FltDeleteInstanceContext( FltObjects->Instance,
NULL );
611 _In_ PCFLT_RELATED_OBJECTS FltObjects,
612 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
639 (
"[AV] AvInstanceTeardownComplete: Entered\n") );
649 _In_ PDRIVER_OBJECT DriverObject,
650 _In_ PUNICODE_STRING RegistryPath
673 NTSTATUS status = STATUS_SUCCESS;
674 PSECURITY_DESCRIPTOR sd =
NULL;
679 (
"[AV] DriverEntry: Entered\n") );
695 Globals.DebugLevel = 0xffffffff;
707 if (!NT_SUCCESS( status )) {
710 (
"[AV]: DriverEntry: SetConfiguration FAILED. status = 0x%x\n", status) );
719 status = FltRegisterFilter( DriverObject,
723 if (!NT_SUCCESS( status )) {
726 (
"[AV] DriverEntry: FltRegisterFilter FAILED. status = 0x%x\n", status) );
734 status = FltBuildDefaultSecurityDescriptor( &sd,
735 FLT_PORT_ALL_ACCESS );
738 if (!NT_SUCCESS( status )) {
741 (
"[AV] DriverEntry: FltBuildDefaultSecurityDescriptor FAILED. status = 0x%x\n", status) );
750 if (!NT_SUCCESS( status )) {
753 (
"[AV] DriverEntry: AvPrepareServerPort Scan Port FAILED. status = 0x%x\n", status) );
759 if (!NT_SUCCESS( status )) {
762 (
"[AV] DriverEntry: AvPrepareServerPort Abort Port FAILED. status = 0x%x\n", status) );
768 if (!NT_SUCCESS( status )) {
771 (
"[AV] DriverEntry: AvPrepareServerPort Query Port FAILED. status = 0x%x\n", status) );
781 if (!NT_SUCCESS( status )) {
784 (
"[AV] DriverEntry: FltStartFiltering FAILED. status = 0x%x\n", status) );
792 FltFreeSecurityDescriptor( sd );
795 if (!NT_SUCCESS( status ) ) {
824 _Unreferenced_parameter_ FLT_FILTER_UNLOAD_FLAGS Flags
850 (
"[AV] AvUnload: Entered\n") );
878 return STATUS_SUCCESS;
888 _In_ PFLT_CALLBACK_DATA Data
907 PFLT_IO_PARAMETER_BLOCK iopb = Data->Iopb;
911 switch(iopb->MajorFunction) {
917 switch ( iopb->Parameters.FileSystemControl.Common.FsControlCode ) {
918 case FSCTL_OFFLOAD_WRITE:
919 case FSCTL_WRITE_RAW_ENCRYPTED:
920 case FSCTL_SET_ZERO_DATA:
927 switch ( iopb->Parameters.SetFileInformation.FileInformationClass ) {
928 case FileEndOfFileInformation:
929 case FileValidDataLengthInformation:
942 _In_ PKTRANSACTION Transaction,
943 _Out_ PULONG TxOutcome
962 HANDLE transactionHandle;
964 TRANSACTION_BASIC_INFORMATION txBasicInfo = {0};
968 status = ObOpenObjectByPointer( Transaction,
972 *TmTransactionObjectType,
974 &transactionHandle );
976 if (!NT_SUCCESS(status)) {
979 (
"[AV] AvQueryTransactionOutcome: ObOpenObjectByPointer failed.\n") );
983 status = ZwQueryInformationTransaction( transactionHandle,
984 TransactionBasicInformation,
986 sizeof(TRANSACTION_BASIC_INFORMATION),
988 if (!NT_SUCCESS(status)) {
991 (
"[AV] AvQueryTransactionOutcome: ObOpenObjectByPointer failed.\n") );
995 *TxOutcome = txBasicInfo.Outcome;
999 ZwClose(transactionHandle);
1008 _In_ ULONG TransactionOutcome
1033 if (TransactionOutcome == TransactionOutcomeCommitted) {
1036 switch (oldTxState) {
1045 InterlockedExchange( &StreamContext->State, oldTxState );
1058 FLT_ASSERTMSG(
"AvPropagateFileState does not handle the state", FALSE);
1073 _In_ ULONG TransactionOutcome
1111 AvAcquireResourceExclusive( TransactionContext->Resource );
1115 streamContext = CONTAINING_RECORD( scan,
AV_STREAM_CONTEXT, ListInTransaction );
1116 oldTxCtx = InterlockedCompareExchangePointer( &streamContext->
TxContext,
NULL, TransactionContext );
1117 if (oldTxCtx == TransactionContext) {
1123 RemoveEntryList ( scan );
1126 (
"[AV] AvProcessTransactionOutcome: Requesting deletion of entry in transaction context: %I64x,%I64x, modified: %d\n",
1131 FltReleaseContext( oldTxCtx );
1132 FltReleaseContext( streamContext );
1136 AvReleaseResource( TransactionContext->Resource );
1138 return STATUS_SUCCESS;
1145 _Out_ LONG
volatile *State,
1146 _Out_ PLONGLONG VolumeRevision,
1147 _Out_ PLONGLONG CacheRevision,
1148 _Out_ PLONGLONG FileRevision
1170 NTSTATUS status = STATUS_SUCCESS;
1183 status = FltGetInstanceContext( Instance,
1186 if (!NT_SUCCESS( status )){
1188 (
"[AV] AvLoadFileStateFromCache: failed to get instance context.\n") );
1194 status = STATUS_NOT_FOUND;
1200 AvAcquireResourceShared( &instanceContext->
Resource );
1205 if (entry !=
NULL) {
1211 status = STATUS_NOT_FOUND;
1214 AvReleaseResource( &instanceContext->
Resource );
1218 FltReleaseContext( instanceContext );
1246 NTSTATUS status = STATUS_SUCCESS;
1247 BOOLEAN inserted = FALSE;
1254 if ((
NULL == Instance) ||
1255 (
NULL == StreamContext)) {
1257 return STATUS_INVALID_PARAMETER;
1260 status = FltGetInstanceContext( Instance, &instanceContext );
1262 if (!NT_SUCCESS( status )){
1264 (
"[AV] AvSyncCache: failed to get instance context.\n") );
1292 AvAcquireResourceExclusive( &instanceContext->
Resource );
1320 AvReleaseResource( &instanceContext->
Resource );
1324 (
"[AV] AvSyncCache: RtlInsertElementGenericTable failed.\n") );
1329 FltReleaseContext( instanceContext );
1335 _In_ PFLT_FILTER Filter,
1336 _In_ PFLT_CALLBACK_DATA Data
1363 status = FltGetEcpListFromCallbackData( Filter, Data, &ecpList );
1365 if (NT_SUCCESS(status) && (ecpList !=
NULL)) {
1367 status = FltFindExtraCreateParameter( Filter,
1369 &GUID_ECP_PREFETCH_OPEN,
1373 if (NT_SUCCESS(status)) {
1375 if (!FltIsEcpFromUserMode( Filter, ecpContext )) {
1386 _Inout_ PFLT_CALLBACK_DATA Data
1408 BOOLEAN alternate = FALSE;
1409 PFLT_FILE_NAME_INFORMATION nameInfo =
NULL;
1413 status = FltGetFileNameInformation( Data,
1414 FLT_FILE_NAME_OPENED | FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
1417 if (!NT_SUCCESS(status)) {
1422 status = FltParseFileNameInformation( nameInfo );
1424 if (!NT_SUCCESS(status)) {
1430 (
"[Av]: Dir: %wZ, FinalComponent: %wZ, Stream: %wZ, sLen: %d\n",
1431 nameInfo->ParentDir,
1432 nameInfo->FinalComponent,
1434 nameInfo->Stream.Length) );
1436 alternate = (nameInfo->Stream.Length > 0);
1439 if (nameInfo !=
NULL) {
1441 FltReleaseFileNameInformation( nameInfo );
1449 _Inout_ PFLT_CALLBACK_DATA Data,
1450 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1452 _In_ UCHAR IOMajorFunctionAtScan,
1453 _In_ BOOLEAN IsInTxWriter,
1484 NTSTATUS status = STATUS_SUCCESS;
1486 FLT_VOLUME_PROPERTIES volumeProperties;
1487 ULONG volumePropertiesLength;
1496 FltObjects->FileObject,
1499 if (NT_SUCCESS( status ) &&
1503 (
"[Av]: AvScan: Skip the EMPTY file.\n") );
1507 return STATUS_SUCCESS;
1515 FsRtlEnterFileSystem();
1522 status = FltCancellableWaitForSingleObject( StreamContext->ScanSynchronizationEvent,
1526 if (NT_SUCCESS(status)) {
1537 status = FltGetVolumeProperties( FltObjects->Volume,
1539 sizeof(volumeProperties),
1540 &volumePropertiesLength );
1541 if (!NT_SUCCESS(status)) {
1542 volumeProperties.DeviceType = FILE_DEVICE_NETWORK;
1555 IOMajorFunctionAtScan,
1557 volumeProperties.DeviceType );
1559 if (!NT_SUCCESS( status ) || status == STATUS_TIMEOUT) {
1562 (
"[AV] AvScan: failed to scan the file.\n") );
1568 IOMajorFunctionAtScan,
1572 if (!NT_SUCCESS( status )) {
1575 (
"[AV] AvScan: failed to scan the file.\n") );
1585 KeSetEvent( StreamContext->ScanSynchronizationEvent, 0, FALSE );
1596 FsRtlExitFileSystem();
1631 status = FltGetStreamContext( ScanContext->FilterInstance,
1632 ScanContext->FileObject,
1635 if (NT_SUCCESS( status )) {
1638 FltReleaseContext( streamContext );
1645 KeSetEvent( &ScanContext->ScanCompleteNotification, 0, FALSE );
1651 _In_ ULONG ScanThreadId,
1652 _In_ LONGLONG ScanId
1675 NTSTATUS status = STATUS_SUCCESS;
1676 ULONG replyLength = 0;
1677 LARGE_INTEGER timeout = {0};
1684 notification.
ScanId = ScanId;
1686 timeout.QuadPart = -((LONGLONG)10) * (LONGLONG)1000 * (LONGLONG)1000;
1701 if (!NT_SUCCESS( status ) ||
1702 (status == STATUS_TIMEOUT)) {
1704 if ((status != STATUS_PORT_DISCONNECTED) &&
1705 (status != STATUS_TIMEOUT)) {
1708 (
"[Av]: AvSendAbortToUser: Failed to FltSendMessage.\n, 0x%08x\n",
1736 ULONG abortThreadId;
1737 NTSTATUS status = STATUS_SUCCESS;
1738 ULONG replyLength =
sizeof(ULONG);
1751 (
"[Av]: AvSendUnloadingToUser: BEFORE...\n") );
1761 if (!NT_SUCCESS( status )) {
1764 (
"[Av]: AvSendUnloadingToUser: Failed to FltSendMessage.\n, 0x%08x\n",
1769 (
"[Av]: AvSendUnloadingToUser: After...\n") );
1778 FLT_PREOP_CALLBACK_STATUS
1780 _Inout_ PFLT_CALLBACK_DATA Data,
1781 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1782 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
1820 (
"[AV] AvPreOperationCallback: Entered\n") );
1824 return FLT_PREOP_SUCCESS_NO_CALLBACK;
1831 status = FltGetStreamHandleContext( FltObjects->Instance,
1832 FltObjects->FileObject,
1833 &streamHandleContext );
1834 if (NT_SUCCESS(status)) {
1836 flags = streamHandleContext->
Flags;
1838 FltReleaseContext( streamHandleContext );
1841 return FLT_PREOP_SUCCESS_NO_CALLBACK;
1845 status = FltGetStreamContext( FltObjects->Instance,
1846 FltObjects->FileObject,
1849 if (!NT_SUCCESS( status )) {
1852 (
"[AV] AvPreOperationCallback: get stream context failed. rq: %d\n",
1853 Data->Iopb->MajorFunction) );
1855 return FLT_PREOP_SUCCESS_NO_CALLBACK;
1863 (FltObjects->Transaction !=
NULL)) {
1868 NTSTATUS statusTx = FltGetTransactionContext( FltObjects->Instance,
1869 FltObjects->Transaction,
1870 &transactionContext );
1872 FLT_ASSERTMSG(
"Transaction context should not fail, because it is supposed to be created at post create.\n", NT_SUCCESS( statusTx ));
1873 FLT_ASSERTMSG(
"The file's TxCtx should be identical with the target TxCtx.\n",
1874 streamContext->
TxContext == transactionContext);
1876 if (NT_SUCCESS( statusTx )) {
1877 FltReleaseContext( transactionContext );
1899 FltReleaseContext( streamContext );
1901 return FLT_PREOP_SUCCESS_NO_CALLBACK;
1904 FLT_PREOP_CALLBACK_STATUS
1906 _Inout_ PFLT_CALLBACK_DATA Data,
1907 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1908 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
1938 if (Data->Iopb->Parameters.FileSystemControl.Common.FsControlCode == FSCTL_TXFS_SAVEPOINT_INFORMATION ) {
1946 Data->IoStatus.Status = STATUS_NOT_SUPPORTED;
1947 return FLT_PREOP_COMPLETE;
1952 FLT_PREOP_CALLBACK_STATUS
1954 _Inout_ PFLT_CALLBACK_DATA Data,
1955 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1956 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
1985 ULONG_PTR stackHigh;
1986 PFILE_OBJECT
FileObject = Data->Iopb->TargetFileObject;
1993 (
"[AV] AvPreCreate: Entered\n") );
1995 streamHandleContext.
Flags = 0;
2001 IoGetStackLimits( &stackLow, &stackHigh );
2003 if (((ULONG_PTR)FileObject > stackLow) &&
2004 ((ULONG_PTR)FileObject < stackHigh)) {
2006 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2013 if (
FlagOn( Data->Iopb->Parameters.Create.Options, FILE_DIRECTORY_FILE )) {
2015 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2022 if (
FlagOn( Data->Iopb->OperationFlags, SL_OPEN_TARGET_DIRECTORY )) {
2024 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2031 if (
FlagOn( Data->Iopb->OperationFlags, SL_OPEN_PAGING_FILE )) {
2033 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2040 if (
FlagOn( FltObjects->FileObject->Flags, FO_VOLUME_OPEN )) {
2042 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2052 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2066 *CompletionContext = (PVOID)streamHandleContext.
Flags;
2083 return FLT_PREOP_SYNCHRONIZE;
2089 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2114 NTSTATUS status = STATUS_SUCCESS;
2120 if (FltObjects->Transaction !=
NULL ) {
2127 &transactionContext );
2129 if (!NT_SUCCESS( status )) {
2132 (
"[AV] AvProcessPreviousTransaction: AvFindOrCreateTransactionContext FAILED\n") );
2133 transactionContext =
NULL;
2148 status = FltEnlistInTransaction( FltObjects->Instance,
2149 FltObjects->Transaction,
2151 TRANSACTION_NOTIFY_COMMIT_FINALIZE | TRANSACTION_NOTIFY_ROLLBACK );
2153 if (!NT_SUCCESS( status ) &&
2154 (status != STATUS_FLT_ALREADY_ENLISTED)) {
2157 (
"[AV] AvProcessPreviousTransaction: FltEnlistInTransaction FAILED!!!!\n") );
2160 status = STATUS_SUCCESS;
2189 oldTxCtx = InterlockedExchangePointer( &StreamContext->TxContext, transactionContext );
2191 if (oldTxCtx != transactionContext) {
2199 ULONG txOutcome = TransactionOutcomeCommitted;
2201 if ( oldTxCtx ==
NULL ) {
2208 FltReferenceContext ( transactionContext );
2214 AvAcquireResourceExclusive( transactionContext->
Resource );
2218 FltReferenceContext ( StreamContext );
2219 InsertTailList( &transactionContext->
ScListHead,
2220 &StreamContext->ListInTransaction );
2223 AvReleaseResource( transactionContext->
Resource );
2237 if (!NT_SUCCESS( status )) {
2240 (
"[AV] AvProcessPreviousTransaction: AvQueryTransactionOutcome FAILED!!!!\n") );
2248 AvAcquireResourceExclusive( oldTxCtx->
Resource );
2249 RemoveEntryList ( &StreamContext->ListInTransaction );
2250 AvReleaseResource( oldTxCtx->
Resource );
2254 if ( transactionContext ) {
2256 FltReferenceContext( transactionContext );
2258 AvAcquireResourceExclusive( transactionContext->
Resource );
2262 InsertTailList( &transactionContext->
ScListHead,
2263 &StreamContext->ListInTransaction );
2267 FltReleaseContext( StreamContext );
2270 AvReleaseResource( transactionContext->
Resource );
2274 FltReleaseContext ( StreamContext );
2279 FltReleaseContext( oldTxCtx );
2289 if (transactionContext) {
2291 FltReleaseContext( transactionContext );
2297 FLT_POSTOP_CALLBACK_STATUS
2299 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2300 _In_opt_ PVOID CompletionContext,
2301 _In_ FLT_POST_OPERATION_FLAGS Flags
2332 NTSTATUS status = Data->IoStatus.Status;
2333 BOOLEAN isDir = FALSE;
2334 BOOLEAN isTxWriter = FALSE;
2339 ACCESS_MASK desiredAccess = Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess;
2341 BOOLEAN updateRevisionNumbers;
2342 LONGLONG VolumeRevision, CacheRevision, FileRevision;
2349 if (!NT_SUCCESS( status ) ||
2350 (status == STATUS_REPARSE)) {
2357 (
"[AV] AvPostCreate: file creation failed\n") );
2359 return FLT_POSTOP_FINISHED_PROCESSING;
2366 status = FltIsDirectory( FltObjects->FileObject,
2367 FltObjects->Instance,
2376 if ( NT_SUCCESS( status ) && isDir ) {
2378 return FLT_POSTOP_FINISHED_PROCESSING;
2389 if (!(
FlagOn(desiredAccess, FILE_WRITE_DATA)) &&
2390 !(
FlagOn(desiredAccess, FILE_READ_DATA)) ) {
2392 BOOLEAN encrypted = FALSE;
2394 FltObjects->FileObject,
2396 if (!NT_SUCCESS( status )) {
2399 (
"[AV] AvPostCreate: AvGetFileEncrypted FAILED!! \n0x%x\n", status) );
2403 return FLT_POSTOP_FINISHED_PROCESSING;
2414 return FLT_POSTOP_FINISHED_PROCESSING;
2424 if (!FltSupportsStreamHandleContexts( FltObjects->FileObject )) {
2426 return FLT_POSTOP_FINISHED_PROCESSING;
2430 &streamHandleContext );
2432 if (!NT_SUCCESS(status)) {
2434 return FLT_POSTOP_FINISHED_PROCESSING;
2439 status = FltSetStreamHandleContext( FltObjects->Instance,
2440 FltObjects->FileObject,
2441 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
2442 streamHandleContext,
2445 FltReleaseContext( streamHandleContext );
2447 if (!NT_SUCCESS(status)) {
2453 ASSERT( status != STATUS_FLT_CONTEXT_ALREADY_DEFINED );
2456 return FLT_POSTOP_FINISHED_PROCESSING;
2463 status = FltGetStreamContext( FltObjects->Instance,
2464 FltObjects->FileObject,
2467 if (status == STATUS_NOT_FOUND) {
2475 if (!NT_SUCCESS( status )) {
2478 (
"[Av]: Failed to create stream context with status 0x%x. (FileObject = %p, Instance = %p)\n",
2480 FltObjects->FileObject,
2481 FltObjects->Instance) );
2483 return FLT_POSTOP_FINISHED_PROCESSING;
2490 status =
AvGetFileId( FltObjects->Instance, FltObjects->FileObject, &streamContext->
FileId );
2492 if (!NT_SUCCESS( status )) {
2495 (
"[Av]: Failed to get file id with status 0x%x. (FileObject = %p, Instance = %p)\n",
2497 FltObjects->FileObject,
2498 FltObjects->Instance) );
2516 &streamContext->
State,
2526 status = FltSetStreamContext( FltObjects->Instance,
2527 FltObjects->FileObject,
2528 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
2530 &oldStreamContext );
2532 if (!NT_SUCCESS(status)) {
2534 if (status == STATUS_FLT_CONTEXT_ALREADY_DEFINED) {
2542 (
"[Av]: Race: Stream context already defined. Retaining old stream context %p (FileObject = %p, Instance = %p)\n",
2544 FltObjects->FileObject,
2545 FltObjects->Instance) );
2547 FltReleaseContext( streamContext );
2549 streamContext = oldStreamContext;
2554 (
"[Av]: Failed to set stream context with status 0x%x. (FileObject = %p, Instance = %p)\n",
2556 FltObjects->FileObject,
2557 FltObjects->Instance) );
2562 }
else if (!NT_SUCCESS(status)) {
2569 (
"[Av]: Failed to get stream context with status 0x%x. (FileObject = %p, Instance = %p)\n",
2571 FltObjects->FileObject,
2572 FltObjects->Instance) );
2574 return FLT_POSTOP_FINISHED_PROCESSING;
2584 if (
FlagOn( Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess,
2585 FILE_WRITE_DATA | FILE_APPEND_DATA |
2586 DELETE | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA |
2587 WRITE_DAC | WRITE_OWNER | ACCESS_SYSTEM_SECURITY ) ) {
2597 if (!NT_SUCCESS( status )) {
2600 (
"[AV] AvPostCreate: AvProcessTransaction FAILED!! \n") );
2605 isTxWriter = (FltObjects->Transaction !=
NULL);
2614 &updateRevisionNumbers,
2629 Data->Iopb->MajorFunction,
2632 if (!NT_SUCCESS( status ) ||
2633 (STATUS_TIMEOUT == status)) {
2636 (
"[AV] AvPostCreate: AvScan FAILED!! \n") );
2647 if (updateRevisionNumbers) {
2653 (
"[Av]: AvPostCreate: RevisionNumbers updated to %I64x:%I64x:%I64x\n",
2681 FltReleaseContext( streamContext );
2683 return FLT_POSTOP_FINISHED_PROCESSING;
2686 FLT_PREOP_CALLBACK_STATUS
2688 _Inout_ PFLT_CALLBACK_DATA Data,
2689 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2690 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
2719 BOOLEAN encrypted = FALSE;
2723 ULONG_PTR stackHigh;
2725 BOOLEAN updateRevisionNumbers;
2726 LONGLONG VolumeRevision, CacheRevision, FileRevision;
2736 status = FltGetStreamHandleContext( FltObjects->Instance,
2737 FltObjects->FileObject,
2738 &streamHandleContext );
2739 if (NT_SUCCESS(status)) {
2751 RtlInterlockedClearBits( &streamHandleContext->
Flags,
2754 FltDeleteStreamHandleContext( FltObjects->Instance,
2755 FltObjects->FileObject,
2758 FltReleaseContext( streamHandleContext );
2760 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2763 FltReleaseContext( streamHandleContext );
2770 IoGetStackLimits( &stackLow, &stackHigh );
2772 if (((ULONG_PTR)FltObjects->FileObject > stackLow) &&
2773 ((ULONG_PTR)FltObjects->FileObject < stackHigh)) {
2775 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2778 status = FltGetStreamContext( FltObjects->Instance,
2779 FltObjects->FileObject,
2782 if (!NT_SUCCESS( status )) {
2785 (
"[AV] AvPreCleanup: find stream context failed.\n") );
2787 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2797 FltObjects->FileObject,
2799 if (!NT_SUCCESS( status )) {
2802 (
"[AV] AvPreCleanup: AvGetFileEncrypted FAILED!! \n") );
2815 &updateRevisionNumbers,
2835 Data->Iopb->MajorFunction,
2839 if (!NT_SUCCESS( status ) || STATUS_TIMEOUT == status) {
2842 (
"[AV] AvPreCleanup: AvScan FAILED!! \n") );
2852 if (updateRevisionNumbers) {
2858 (
"[Av]: AvPreCleanup: RevisionNumbers updated to %I64x:%I64x:%I64x\n",
2876 if (!NT_SUCCESS (
AvSyncCache( FltObjects->Instance, streamContext ))) {
2879 (
"[AV] AvPreCleanup: AvSyncCache FAILED!! \n") );
2883 FltReleaseContext( streamContext );
2885 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2890 _Unreferenced_parameter_ PCFLT_RELATED_OBJECTS FltObjects,
2891 _In_ PFLT_CONTEXT TransactionContext,
2892 _In_ ULONG TransactionNotification
2929 FLT_ASSERTMSG(
"[AV] AvKtmNotificationCallback: The expected type of notifications registered at FltEnlistInTransaction(...).\n",
2930 FlagOn( TransactionNotification,
2931 (TRANSACTION_NOTIFY_COMMIT_FINALIZE | TRANSACTION_NOTIFY_ROLLBACK) ) );
2934 (
"[AV] AvKtmNotificationCallback: Entered\n") );
2936 if (
NULL != transactionContext) {
2938 if (
FlagOn( TransactionNotification, TRANSACTION_NOTIFY_COMMIT_FINALIZE ) ) {
2948 return STATUS_SUCCESS;
2953 _Unreferenced_parameter_ PFLT_INSTANCE
Instance,
2954 _In_ PFLT_CONTEXT Context,
2955 _Unreferenced_parameter_ PFLT_CALLBACK_DATA Data
2993 if (
NULL == sectionCtx) {
2995 (
"[AV] AvScanAbortCallbackAsync: INVALID ARGUMENT.\n") );
2996 return STATUS_INVALID_PARAMETER_2;
3000 (
"[AV] AvScanAbortCallbackAsync: closesection handle=%p, object=%p, cancelable=%d\n",
3017 scanCtx = InterlockedExchangePointer( §ionCtx->
ScanContext,
NULL );
3019 if (scanCtx ==
NULL) {
3021 return STATUS_SUCCESS;
3029 return STATUS_SUCCESS;
3034 _In_ PUNICODE_STRING RegistryPath
3054 OBJECT_ATTRIBUTES attributes;
3055 HANDLE driverRegKey =
NULL;
3057 UCHAR buffer[
sizeof(KEY_VALUE_PARTIAL_INFORMATION) +
sizeof(ULONG)];
3058 PKEY_VALUE_PARTIAL_INFORMATION value = (PKEY_VALUE_PARTIAL_INFORMATION)buffer;
3059 ULONG valueLength =
sizeof(buffer);
3066 InitializeObjectAttributes( &attributes,
3068 OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
3072 status = ZwOpenKey( &driverRegKey,
3076 if (!NT_SUCCESS( status )) {
3088 RtlInitUnicodeString( &valueName, L
"DebugLevel" );
3090 status = ZwQueryValueKey( driverRegKey,
3097 if (NT_SUCCESS( status )) {
3099 Globals.DebugLevel = *(PULONG)value->Data;
3108 RtlInitUnicodeString( &valueName, L
"LocalScanTimeout" );
3110 status = ZwQueryValueKey( driverRegKey,
3117 if (NT_SUCCESS( status )) {
3126 RtlInitUnicodeString( &valueName, L
"NetworkScanTimeout" );
3128 status = ZwQueryValueKey( driverRegKey,
3135 if (NT_SUCCESS( status )) {
3140 status = STATUS_SUCCESS;
3144 if (driverRegKey !=
NULL) {
3146 ZwClose( driverRegKey );
FLT_PREOP_CALLBACK_STATUS AvPreFsControl(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
PKEVENT ScanSynchronizationEvent
#define SET_FILE_TX_MODIFIED(_sCtx)
FLT_PREOP_CALLBACK_STATUS AvPreOperationCallback(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
NTSTATUS AvScan(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ AV_SCAN_MODE ScanMode, _In_ UCHAR IOMajorFunctionAtScan, _In_ BOOLEAN IsInTxWriter, _Inout_ PAV_STREAM_CONTEXT StreamContext)
LONGLONG NetworkScanTimeout
#define AV_INSTANCE_CONTEXT_SIZE
NTSTATUS AvPrepareServerPort(_In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _In_ AVSCAN_CONNECTION_TYPE ConnectionType)
#define FS_SUPPORTS_FILE_STATE_CACHE(VolumeFilesystemType)
NTSTATUS AvLoadFileStateFromCache(_In_ PFLT_INSTANCE Instance, _In_ PAV_FILE_REFERENCE FileId, _Out_ LONG volatile *State, _Out_ PLONGLONG VolumeRevision, _Out_ PLONGLONG CacheRevision, _Out_ PLONGLONG FileRevision)
#define IS_FILE_MODIFIED(_sCtx)
RTL_GENERIC_COMPARE_ROUTINE AvCompareEntry
VOID AvDoCancelScanAndRelease(_In_ PAV_SCAN_CONTEXT ScanContext, _In_ PAV_SECTION_CONTEXT SectionContext)
PAV_TRANSACTION_CONTEXT TxContext
FLT_FILESYSTEM_TYPE VolumeFSType
PFLT_INSTANCE FilterInstance
NTSTATUS AvProcessPreviousTransaction(_In_ PCFLT_RELATED_OBJECTS FltObjects, _Inout_ PAV_STREAM_CONTEXT StreamContext)
struct _AV_SECTION_CONTEXT * PAV_SECTION_CONTEXT
RtlCopyMemory(OutputStringBuffer, TempMappingBuffer->Data, OutputString->MaximumLength)
BOOLEAN AvIsPrefetchEcpPresent(_In_ PFLT_FILTER Filter, _In_ PFLT_CALLBACK_DATA Data)
NTSTATUS AvUnload(_Unreferenced_parameter_ FLT_FILTER_UNLOAD_FLAGS Flags)
enum _AV_FILE_INFECTED_STATE AV_FILE_INFECTED_STATE
NTSTATUS AvQueryTransactionOutcome(_In_ PKTRANSACTION Transaction, _Out_ PULONG TxOutcome)
CONST FLT_REGISTRATION FilterRegistration
BOOLEAN AvOperationsModifyingFile(_In_ PFLT_CALLBACK_DATA Data)
NTSTATUS AvSyncCache(_In_ PFLT_INSTANCE Instance, _In_ PAV_STREAM_CONTEXT StreamContext)
NTSTATUS AvScanAbortCallbackAsync(_Unreferenced_parameter_ PFLT_INSTANCE Instance, _In_ PFLT_CONTEXT Context, _Unreferenced_parameter_ PFLT_CALLBACK_DATA Data)
_In_opt_ PFILE_OBJECT _In_opt_ PFLT_INSTANCE Instance
#define SET_FILE_NOT_INFECTED(_sCtx)
LONGLONG LocalScanTimeout
PFLT_PORT QueryServerPort
LIST_ENTRY ScanCtxListHead
NTSTATUS AvFinalizeScanAndSection(_Inout_ PAV_SCAN_CONTEXT ScanContext)
FORCEINLINE VOID AvPropagateFileState(_Inout_ PAV_STREAM_CONTEXT StreamContext, _In_ ULONG TransactionOutcome)
AV_SCANNER_GLOBAL_DATA Globals
RTL_GENERIC_ALLOCATE_ROUTINE AvAllocateGenericTableEntry
CONST FLT_OPERATION_REGISTRATION Callbacks[]
NTSTATUS AvFindOrCreateTransactionContext(_In_ PCFLT_RELATED_OBJECTS FltObjects, _Outptr_ PAV_TRANSACTION_CONTEXT *TransactionContext)
#define AV_TXCTX_ENLISTED
NTSTATUS AvPostCreateCsvfs(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Inout_ PAV_STREAM_CONTEXT StreamContext, _Out_ BOOLEAN *UpdateRevisionNumbers, _Out_ LONGLONG *VolumeRevisionPtr, _Out_ LONGLONG *CacheRevisionPtr, _Out_ LONGLONG *FileRevisionPtr)
NTSTATUS AvFinalizeSectionContext(_Inout_ PAV_SECTION_CONTEXT SectionContext)
#define AV_TXCTX_LISTDRAINED
NTSTATUS AvGetFileSize(_In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _Out_ PLONGLONG Size)
NcLoadRegistryStringRetry KeyValuePartialInformation
NTSTATUS AvGetFileId(_In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _Out_ PAV_FILE_REFERENCE FileId)
PKTRANSACTION Transaction
NTSTATUS AvSetConfiguration(_In_ PUNICODE_STRING RegistryPath)
RTL_GENERIC_FREE_ROUTINE AvFreeGenericTableEntry
NTSTATUS AvScanInKernel(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ UCHAR IOMajorFunctionAtScan, _In_ BOOLEAN IsInTxWriter, _In_ PAV_STREAM_CONTEXT StreamContext)
RTL_GENERIC_TABLE FileStateCacheTable
struct _AV_FILE_REFERENCE::@0 FileId64
NTSTATUS AvSendAbortToUser(_In_ ULONG ScanThreadId, _In_ LONGLONG ScanId)
#define SET_FILE_MODIFIED(_sCtx)
NTSTATUS AvSendUnloadingToUser(VOID)
VOID AvInstanceTeardownComplete(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags)
enum _AV_SCAN_MODE AV_SCAN_MODE
const FLT_CONTEXT_REGISTRATION ContextRegistration[]
#define IRP_MJ_SET_INFORMATION
#define IS_FILE_INFECTED(_sCtx)
#define LIST_FOR_EACH_SAFE(curr, n, head)
NTSTATUS AvProcessTransactionOutcome(_Inout_ PAV_TRANSACTION_CONTEXT TransactionContext, _In_ ULONG TransactionOutcome)
UNREFERENCED_PARAMETER(FileObject)
NcLoadRegistryStringRetry NULL
NTSTATUS AvCreateStreamContext(_In_ PFLT_FILTER Filter, _Outptr_ PAV_STREAM_CONTEXT *StreamContext)
NTSTATUS AvGetFileEncrypted(_In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _Out_ PBOOLEAN Encrypted)
BOOLEAN AvIsCsvDlEcpPresent(_In_ PFLT_FILTER Filter, _In_ PFLT_CALLBACK_DATA Data)
NTSTATUS AvCreateStreamHandleContext(_In_ PFLT_FILTER Filter, _Outptr_ PAV_STREAMHANDLE_CONTEXT *StreamHandleContext)
struct _AV_TRANSACTION_CONTEXT * PAV_TRANSACTION_CONTEXT
FLT_POSTOP_CALLBACK_STATUS AvPostCreate(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_opt_ PVOID CompletionContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
BOOLEAN AvIsVolumeOnCsvDisk(_In_ PFLT_VOLUME Volume)
#define IRP_MJ_FILE_SYSTEM_CONTROL
#define AV_GENERIC_TABLE_ENTRY_SIZE
NTSTATUS AvPreCreateCsvfs(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects)
DRIVER_INITIALIZE DriverEntry
ERESOURCE ScanCtxListLock
FLT_PREOP_CALLBACK_STATUS AvPreCleanup(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
VOID AvInstanceTeardownStart(_In_ PCFLT_RELATED_OBJECTS FltObjects, _Unreferenced_parameter_ FLT_INSTANCE_TEARDOWN_FLAGS Flags)
NTSTATUS AvPreCleanupCsvfs(_Unreferenced_parameter_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Inout_ PAV_STREAM_CONTEXT StreamContext, _Out_ BOOLEAN *UpdateRevisionNumbers, _Out_ LONGLONG *VolumeRevisionPtr, _Out_ LONGLONG *CacheRevisionPtr, _Out_ LONGLONG *FileRevisionPtr)
#define IS_FILE_NEED_SCAN(_sCtx)
BOOLEAN AvIsStreamAlternate(_Inout_ PFLT_CALLBACK_DATA Data)
BOOLEAN CancelableOnConflictingIo
NTSTATUS AvKtmNotificationCallback(_Unreferenced_parameter_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PFLT_CONTEXT TransactionContext, _In_ ULONG TransactionNotification)
NTSTATUS AvInstanceQueryTeardown(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags)
PFLT_PORT AbortClientPort
NTSTATUS AvInstanceSetup(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_SETUP_FLAGS Flags, _In_ DEVICE_TYPE VolumeDeviceType, _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType)
FORCEINLINE VOID AvCancelFileOpen(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ NTSTATUS Status)
FLT_PREOP_CALLBACK_STATUS AvPreCreate(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
PFLT_PORT AbortServerPort
#define AV_INVALID_FILE_REFERENCE(_fileid_)
NTSTATUS AvScanInUser(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ UCHAR IOMajorFunctionAtScan, _In_ BOOLEAN IsInTxWriter, _In_ DEVICE_TYPE DeviceType)
#define AV_SET_INVALID_FILE_REFERENCE(_fileid_)
_In_opt_ PFILE_OBJECT FileObject
#define AV_DBG_PRINT(_dbgLevel, _string)