22 #include <fltKernel.h> 26 #pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER, "Not valid for kernel mode drivers") 30 #define DFDBG_TRACE_ERRORS 0x00000001 31 #define DFDBG_TRACE_ROUTINES 0x00000002 32 #define DFDBG_TRACE_OPERATION_STATUS 0x00000004 34 #define DF_VOLUME_GUID_NAME_SIZE 48 36 #define DF_INSTANCE_CONTEXT_POOL_TAG 'nIfD' 37 #define DF_STREAM_CONTEXT_POOL_TAG 'xSfD' 38 #define DF_TRANSACTION_CONTEXT_POOL_TAG 'xTfD' 39 #define DF_ERESOURCE_POOL_TAG 'sRfD' 40 #define DF_DELETE_NOTIFY_POOL_TAG 'nDfD' 41 #define DF_STRING_POOL_TAG 'rSfD' 43 #define DF_CONTEXT_POOL_TYPE PagedPool 45 #define DF_NOTIFICATION_MASK (TRANSACTION_NOTIFY_COMMIT_FINALIZE | \ 46 TRANSACTION_NOTIFY_ROLLBACK) 53 #define DF_PRINT( ... ) \ 54 DbgPrintEx( DPFLTR_FLTMGR_ID, DPFLTR_ERROR_LEVEL, __VA_ARGS__ ) 56 #define DF_DBG_PRINT( _dbgLevel, ... ) \ 57 (FlagOn( gTraceFlags, (_dbgLevel) ) ? \ 58 DF_PRINT( __VA_ARGS__ ): \ 61 #define FlagOnAll( F, T ) \ 92 #define DfSizeofFileId(FID) ( \ 93 ((FID).FileId64.UpperZeroes == 0ll) ? \ 94 sizeof((FID).FileId64.Value) : \ 95 sizeof((FID).FileId128) \ 247 _In_ PDRIVER_OBJECT DriverObject,
248 _In_ PUNICODE_STRING RegistryPath
253 _In_ FLT_FILTER_UNLOAD_FLAGS Flags
258 _In_ PCFLT_RELATED_OBJECTS FltObjects,
259 _In_ FLT_INSTANCE_SETUP_FLAGS Flags,
260 _In_ DEVICE_TYPE VolumeDeviceType,
261 _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType
266 _In_ PCFLT_RELATED_OBJECTS FltObjects,
267 _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
272 _In_ PCFLT_RELATED_OBJECTS FltObjects,
273 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
278 _In_ PCFLT_RELATED_OBJECTS FltObjects,
279 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
284 _In_ PCFLT_RELATED_OBJECTS FltObjects
289 _In_ FLT_CONTEXT_TYPE ContextType,
290 _Outptr_ PFLT_CONTEXT *Context
295 _In_ PCFLT_RELATED_OBJECTS FltObjects,
296 _When_(ContextType==FLT_INSTANCE_CONTEXT, _In_opt_)
_When_(ContextType!=FLT_INSTANCE_CONTEXT, _In_) PVOID Target,
297 _In_ FLT_CONTEXT_TYPE ContextType,
298 _In_ PFLT_CONTEXT NewContext,
299 _Outptr_opt_result_maybenull_ PFLT_CONTEXT *OldContext
304 _In_ PCFLT_RELATED_OBJECTS FltObjects,
305 _When_(ContextType==FLT_INSTANCE_CONTEXT, _In_opt_)
_When_(ContextType!=FLT_INSTANCE_CONTEXT, _In_) PVOID Target,
306 _In_ FLT_CONTEXT_TYPE ContextType,
307 _Outptr_ PFLT_CONTEXT *Context
312 _In_ PCFLT_RELATED_OBJECTS FltObjects,
313 _When_(ContextType==FLT_INSTANCE_CONTEXT, _In_opt_)
_When_(ContextType!=FLT_INSTANCE_CONTEXT, _In_) PVOID Target,
314 _Outptr_ _Pre_valid_ PFLT_CONTEXT *Context,
315 _In_ FLT_CONTEXT_TYPE ContextType
320 _In_ PDF_STREAM_CONTEXT StreamContext,
321 _In_ FLT_CONTEXT_TYPE ContextType
326 _In_ PDF_TRANSACTION_CONTEXT TransactionContext,
327 _In_ FLT_CONTEXT_TYPE ContextType
332 _In_ PDF_INSTANCE_CONTEXT InstanceContext,
333 _In_ FLT_CONTEXT_TYPE ContextType
338 _In_ PFLT_CALLBACK_DATA Data,
339 _Inout_ PDF_STREAM_CONTEXT StreamContext
344 _Inout_ PUNICODE_STRING String
349 _Inout_ PUNICODE_STRING String
354 _In_ PFLT_CALLBACK_DATA Data,
355 _In_ PCFLT_RELATED_OBJECTS FltObjects,
356 _In_ PDF_STREAM_CONTEXT StreamContext,
357 _Out_ PUNICODE_STRING String
362 _In_ PFLT_CALLBACK_DATA Data,
363 _In_ PCFLT_RELATED_OBJECTS FltObjects,
364 _In_ PDF_STREAM_CONTEXT StreamContext
369 _In_ PFLT_CALLBACK_DATA Data,
370 _In_ PCFLT_RELATED_OBJECTS FltObjects,
371 _In_ PDF_STREAM_CONTEXT StreamContext,
372 _In_ BOOLEAN IsTransaction
377 _Inout_ PDF_STREAM_CONTEXT StreamContext,
378 _Inout_ PDF_TRANSACTION_CONTEXT TransactionContext,
379 _In_ BOOLEAN FileDelete
384 _In_ PDF_STREAM_CONTEXT StreamContext,
386 _Inout_opt_ PDF_TRANSACTION_CONTEXT TransactionContext
391 _In_ PDF_DELETE_NOTIFY DeleteNotify,
397 _Inout_ PFLT_CALLBACK_DATA Data,
398 _In_ PCFLT_RELATED_OBJECTS FltObjects,
399 _In_ PDF_STREAM_CONTEXT StreamContext
402 FLT_PREOP_CALLBACK_STATUS
404 _Inout_ PFLT_CALLBACK_DATA Data,
405 _In_ PCFLT_RELATED_OBJECTS FltObjects,
406 _Outptr_result_maybenull_ PVOID *CompletionContext
409 FLT_POSTOP_CALLBACK_STATUS
411 _Inout_ PFLT_CALLBACK_DATA Data,
412 _In_ PCFLT_RELATED_OBJECTS FltObjects,
413 _In_ PVOID CompletionContext,
414 _In_ FLT_POST_OPERATION_FLAGS Flags
417 FLT_PREOP_CALLBACK_STATUS
419 _Inout_ PFLT_CALLBACK_DATA Data,
420 _In_ PCFLT_RELATED_OBJECTS FltObjects,
421 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
424 FLT_POSTOP_CALLBACK_STATUS
426 _Inout_ PFLT_CALLBACK_DATA Data,
427 _In_ PCFLT_RELATED_OBJECTS FltObjects,
428 _In_ PVOID CompletionContext,
429 _In_ FLT_POST_OPERATION_FLAGS Flags
432 FLT_PREOP_CALLBACK_STATUS
434 _Inout_ PFLT_CALLBACK_DATA Data,
435 _In_ PCFLT_RELATED_OBJECTS FltObjects,
436 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
439 FLT_POSTOP_CALLBACK_STATUS
441 _Inout_ PFLT_CALLBACK_DATA Data,
442 _In_ PCFLT_RELATED_OBJECTS FltObjects,
443 _In_ PVOID CompletionContext,
444 _In_ FLT_POST_OPERATION_FLAGS Flags
449 _In_ PCFLT_RELATED_OBJECTS FltObjects,
450 _In_ PDF_TRANSACTION_CONTEXT TransactionContext,
451 _In_ ULONG NotificationMask
456 _In_ PCFLT_RELATED_OBJECTS FltObjects,
457 _Inout_ PUNICODE_STRING VolumeGuidName
462 _In_ PFLT_CALLBACK_DATA Data,
463 _Inout_ PDF_STREAM_CONTEXT StreamContext
472 #pragma alloc_text(INIT, DriverEntry) 473 #pragma alloc_text(PAGE, DfUnload) 474 #pragma alloc_text(PAGE, DfInstanceSetup) 475 #pragma alloc_text(PAGE, DfInstanceQueryTeardown) 476 #pragma alloc_text(PAGE, DfInstanceTeardownStart) 477 #pragma alloc_text(PAGE, DfInstanceTeardownComplete) 478 #pragma alloc_text(PAGE, DfSetupInstanceContext) 479 #pragma alloc_text(PAGE, DfAllocateContext) 480 #pragma alloc_text(PAGE, DfSetContext) 481 #pragma alloc_text(PAGE, DfGetContext) 482 #pragma alloc_text(PAGE, DfGetOrSetContext) 483 #pragma alloc_text(PAGE, DfStreamContextCleanupCallback) 484 #pragma alloc_text(PAGE, DfTransactionContextCleanupCallback) 485 #pragma alloc_text(PAGE, DfInstanceContextCleanupCallback) 486 #pragma alloc_text(PAGE, DfGetFileNameInformation) 487 #pragma alloc_text(PAGE, DfAllocateUnicodeString) 488 #pragma alloc_text(PAGE, DfFreeUnicodeString) 489 #pragma alloc_text(PAGE, DfBuildFileIdString) 490 #pragma alloc_text(PAGE, DfDetectDeleteByFileId) 491 #pragma alloc_text(PAGE, DfIsFileDeleted) 492 #pragma alloc_text(PAGE, DfAddTransDeleteNotify) 493 #pragma alloc_text(PAGE, DfNotifyDelete) 494 #pragma alloc_text(PAGE, DfNotifyDeleteOnTransactionEnd) 495 #pragma alloc_text(PAGE, DfProcessDelete) 496 #pragma alloc_text(PAGE, DfPreCreateCallback) 497 #pragma alloc_text(PAGE, DfPostCreateCallback) 498 #pragma alloc_text(PAGE, DfPreSetInfoCallback) 499 #pragma alloc_text(PAGE, DfPostSetInfoCallback) 500 #pragma alloc_text(PAGE, DfPreCleanupCallback) 501 #pragma alloc_text(PAGE, DfPostCleanupCallback) 502 #pragma alloc_text(PAGE, DfTransactionNotificationCallback) 503 #pragma alloc_text(PAGE, DfGetVolumeGuidName) 504 #pragma alloc_text(PAGE, DfGetFileId) 514 { FLT_INSTANCE_CONTEXT,
523 { FLT_STREAM_CONTEXT,
532 { FLT_TRANSACTION_CONTEXT,
558 FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO,
567 { IRP_MJ_OPERATION_END }
578 sizeof( FLT_REGISTRATION ),
579 FLT_REGISTRATION_VERSION,
606 _In_ PDRIVER_OBJECT DriverObject,
607 _In_ PUNICODE_STRING RegistryPath
635 "delete!DriverEntry: Entered\n" );
641 ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
647 status = FltRegisterFilter( DriverObject,
651 ASSERT( NT_SUCCESS( status ) );
653 if (NT_SUCCESS( status )) {
661 if (!NT_SUCCESS( status )) {
673 _In_ FLT_FILTER_UNLOAD_FLAGS Flags
697 "delete!DfUnload: Entered\n" );
701 return STATUS_SUCCESS;
711 _In_ PCFLT_RELATED_OBJECTS FltObjects,
712 _In_ FLT_INSTANCE_SETUP_FLAGS Flags,
713 _In_ DEVICE_TYPE VolumeDeviceType,
714 _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType
743 NTSTATUS status = STATUS_SUCCESS;
744 BOOLEAN isWritable = FALSE;
752 "delete!DfInstanceSetup: Entered\n" );
754 status = FltIsVolumeWritable( FltObjects->Volume,
757 if (!NT_SUCCESS( status )) {
759 return STATUS_FLT_DO_NOT_ATTACH;
769 switch (VolumeFilesystemType) {
771 case FLT_FSTYPE_NTFS:
772 case FLT_FSTYPE_REFS:
774 status = STATUS_SUCCESS;
779 return STATUS_FLT_DO_NOT_ATTACH;
784 return STATUS_FLT_DO_NOT_ATTACH;
793 _In_ PCFLT_RELATED_OBJECTS FltObjects,
794 _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
823 "delete!DfInstanceQueryTeardown: Entered\n" );
825 return STATUS_SUCCESS;
831 _In_ PCFLT_RELATED_OBJECTS FltObjects,
832 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
859 "delete!DfInstanceTeardownStart: Entered\n" );
865 _In_ PCFLT_RELATED_OBJECTS FltObjects,
866 _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags
893 "delete!DfInstanceTeardownComplete: Entered\n" );
903 _In_ FLT_CONTEXT_TYPE ContextType,
904 _Outptr_ PFLT_CONTEXT *Context
925 PDF_TRANSACTION_CONTEXT transactionContext;
929 switch (ContextType) {
931 case FLT_STREAM_CONTEXT:
939 if (NT_SUCCESS( status )) {
945 case FLT_TRANSACTION_CONTEXT:
948 FLT_TRANSACTION_CONTEXT,
953 if (NT_SUCCESS( status )) {
956 transactionContext = *Context;
960 transactionContext->
Resource = ExAllocatePoolWithTag( NonPagedPool,
965 FltReleaseContext( transactionContext );
966 return STATUS_INSUFFICIENT_RESOURCES;
969 ExInitializeResourceLite( transactionContext->
Resource );
974 case FLT_INSTANCE_CONTEXT:
977 FLT_INSTANCE_CONTEXT,
982 if (NT_SUCCESS( status )) {
990 return STATUS_INVALID_PARAMETER;
997 _In_ PCFLT_RELATED_OBJECTS FltObjects,
998 _When_(ContextType==FLT_INSTANCE_CONTEXT, _In_opt_)
_When_(ContextType!=FLT_INSTANCE_CONTEXT, _In_) PVOID Target,
999 _In_ FLT_CONTEXT_TYPE ContextType,
1000 _In_ PFLT_CONTEXT NewContext,
1001 _Outptr_opt_result_maybenull_ PFLT_CONTEXT *OldContext
1037 switch (ContextType) {
1039 case FLT_STREAM_CONTEXT:
1041 return FltSetStreamContext( FltObjects->Instance,
1042 (PFILE_OBJECT)Target,
1043 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
1047 case FLT_TRANSACTION_CONTEXT:
1049 return FltSetTransactionContext( FltObjects->Instance,
1050 (PKTRANSACTION)Target,
1051 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
1055 case FLT_INSTANCE_CONTEXT:
1057 return FltSetInstanceContext( FltObjects->Instance,
1058 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
1064 ASSERT( !
"Unexpected context type!\n" );
1066 return STATUS_INVALID_PARAMETER;
1073 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1074 _When_(ContextType==FLT_INSTANCE_CONTEXT, _In_opt_)
_When_(ContextType!=FLT_INSTANCE_CONTEXT, _In_) PVOID Target,
1075 _In_ FLT_CONTEXT_TYPE ContextType,
1076 _Outptr_ PFLT_CONTEXT *Context
1109 switch (ContextType) {
1111 case FLT_STREAM_CONTEXT:
1113 return FltGetStreamContext( FltObjects->Instance,
1114 (PFILE_OBJECT)Target,
1117 case FLT_TRANSACTION_CONTEXT:
1119 return FltGetTransactionContext( FltObjects->Instance,
1120 (PKTRANSACTION)Target,
1123 case FLT_INSTANCE_CONTEXT:
1125 return FltGetInstanceContext( FltObjects->Instance,
1130 return STATUS_INVALID_PARAMETER;
1137 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1138 _When_(ContextType==FLT_INSTANCE_CONTEXT, _In_opt_)
_When_(ContextType!=FLT_INSTANCE_CONTEXT, _In_) PVOID Target,
1139 _Outptr_ _Pre_valid_ PFLT_CONTEXT *Context,
1140 _In_ FLT_CONTEXT_TYPE ContextType
1192 PFLT_CONTEXT newContext;
1193 PFLT_CONTEXT oldContext;
1197 ASSERT(
NULL != Context );
1199 newContext = *Context;
1210 if (STATUS_NOT_FOUND == status) {
1217 if (
NULL == newContext) {
1225 if (!NT_SUCCESS( status )) {
1235 }
else if (!NT_SUCCESS( status )) {
1257 ASSERT( newContext != oldContext );
1259 if (
NULL != newContext) {
1261 FltReleaseContext( newContext );
1264 *Context = oldContext;
1278 if (!NT_SUCCESS( status )) {
1284 FltReleaseContext( newContext );
1286 if (STATUS_FLT_CONTEXT_ALREADY_DEFINED == status) {
1294 *Context = oldContext;
1295 return STATUS_SUCCESS;
1313 if (FLT_TRANSACTION_CONTEXT == ContextType) {
1315 status = FltEnlistInTransaction( FltObjects->Instance,
1316 (PKTRANSACTION)Target,
1326 *Context = newContext;
1337 _In_ PDF_STREAM_CONTEXT StreamContext,
1338 _In_ FLT_CONTEXT_TYPE ContextType
1359 ASSERT( ContextType == FLT_STREAM_CONTEXT );
1365 if (StreamContext->NameInfo !=
NULL) {
1367 FltReleaseFileNameInformation(StreamContext->NameInfo);
1368 StreamContext->NameInfo =
NULL;
1375 _In_ PDF_TRANSACTION_CONTEXT TransactionContext,
1376 _In_ FLT_CONTEXT_TYPE ContextType
1395 PDF_DELETE_NOTIFY deleteNotify =
NULL;
1401 ASSERT( ContextType == FLT_TRANSACTION_CONTEXT );
1403 if (
NULL != TransactionContext->Resource) {
1405 FltAcquireResourceExclusive( TransactionContext->Resource );
1407 while (!IsListEmpty( &TransactionContext->DeleteNotifyList )) {
1415 deleteNotify = CONTAINING_RECORD( RemoveHeadList( &TransactionContext->DeleteNotifyList ),
1420 ExFreePool( deleteNotify );
1424 FltReleaseResource( TransactionContext->Resource );
1430 ExDeleteResourceLite( TransactionContext->Resource );
1431 ExFreePool( TransactionContext->Resource );
1438 _In_ PDF_INSTANCE_CONTEXT InstanceContext,
1439 _In_ FLT_CONTEXT_TYPE ContextType
1460 ASSERT( ContextType == FLT_INSTANCE_CONTEXT );
1472 _In_ PFLT_CALLBACK_DATA Data,
1473 _Inout_ PDF_STREAM_CONTEXT StreamContext
1497 PFLT_FILE_NAME_INFORMATION oldNameInfo;
1498 PFLT_FILE_NAME_INFORMATION newNameInfo;
1506 status = FltGetFileNameInformation( Data,
1507 (FLT_FILE_NAME_OPENED |
1508 FLT_FILE_NAME_QUERY_DEFAULT),
1511 if (!NT_SUCCESS( status )) {
1520 status = FltParseFileNameInformation( newNameInfo );
1522 if (!NT_SUCCESS( status )) {
1531 oldNameInfo = InterlockedExchangePointer( &StreamContext->NameInfo,
1534 if (
NULL != oldNameInfo) {
1536 FltReleaseFileNameInformation( oldNameInfo );
1545 _In_ PFLT_CALLBACK_DATA Data,
1546 _Inout_ PDF_STREAM_CONTEXT StreamContext
1568 NTSTATUS status = STATUS_SUCCESS;
1569 FILE_INTERNAL_INFORMATION fileInternalInformation;
1579 if (!StreamContext->FileIdSet) {
1585 status = FltQueryInformationFile( Data->Iopb->TargetInstance,
1586 Data->Iopb->TargetFileObject,
1587 &fileInternalInformation,
1588 sizeof(FILE_INTERNAL_INFORMATION),
1589 FileInternalInformation,
1592 if (NT_SUCCESS( status )) {
1601 if (fileInternalInformation.IndexNumber.QuadPart == FILE_INVALID_FILE_ID) {
1603 FILE_ID_INFORMATION fileIdInformation;
1605 status = FltQueryInformationFile( Data->Iopb->TargetInstance,
1606 Data->Iopb->TargetFileObject,
1608 sizeof(FILE_ID_INFORMATION),
1612 if (NT_SUCCESS( status )) {
1621 &fileIdInformation.FileId,
1622 sizeof(StreamContext->FileId) );
1632 StreamContext->FileIdSet =
TRUE;
1637 StreamContext->FileId.FileId64.Value = fileInternalInformation.IndexNumber.QuadPart;
1638 StreamContext->FileId.FileId64.UpperZeroes = 0ll;
1648 StreamContext->FileIdSet =
TRUE;
1659 _Inout_ PUNICODE_STRING String
1686 ASSERT(
NULL != String );
1687 ASSERT( 0 != String->MaximumLength );
1692 String->MaximumLength,
1695 if (
NULL == String->Buffer) {
1697 return STATUS_INSUFFICIENT_RESOURCES;
1700 return STATUS_SUCCESS;
1706 _Inout_ PUNICODE_STRING String
1723 ASSERT(
NULL != String );
1724 ASSERT( 0 != String->MaximumLength );
1728 if (
NULL != String->Buffer ) {
1730 String->MaximumLength = 0;
1731 ExFreePool( String->Buffer );
1732 String->Buffer =
NULL;
1739 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1740 _Inout_ PUNICODE_STRING VolumeGuidName
1772 PUNICODE_STRING sourceGuidName;
1773 PDF_INSTANCE_CONTEXT instanceContext =
NULL;
1785 FLT_INSTANCE_CONTEXT );
1787 if (NT_SUCCESS( status )) {
1797 if (
NULL == sourceGuidName->Buffer) {
1806 UNICODE_STRING tempString;
1818 if (!NT_SUCCESS( status )) {
1821 "delete!%s: DfAllocateUnicodeString returned 0x%08x!\n",
1831 status = FltGetVolumeGuidName( FltObjects->Volume,
1835 if (!NT_SUCCESS( status )) {
1838 "delete!%s: FltGetVolumeGuidName returned 0x%08x!\n",
1851 RtlAppendUnicodeToString( &tempString, L
"\\" );
1860 sourceGuidName->Length = tempString.Length;
1861 sourceGuidName->MaximumLength = tempString.MaximumLength;
1872 InterlockedCompareExchangePointer( &sourceGuidName->Buffer,
1876 if (sourceGuidName->Buffer != tempString.Buffer) {
1892 RtlCopyUnicodeString( VolumeGuidName, sourceGuidName );
1898 FltReleaseContext( instanceContext );
1907 _In_ PFLT_CALLBACK_DATA Data,
1908 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1909 _In_ PDF_STREAM_CONTEXT StreamContext,
1910 _Out_ PUNICODE_STRING String
1944 ASSERT(
NULL != String );
1965 if (!NT_SUCCESS( status )) {
1982 if (!NT_SUCCESS( status )) {
1995 if (!NT_SUCCESS( status )) {
2007 &StreamContext->FileId,
2012 ASSERT( String->Length == String->MaximumLength );
2020 _In_ PFLT_CALLBACK_DATA Data,
2021 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2022 _In_ PDF_STREAM_CONTEXT StreamContext
2060 UNICODE_STRING fileIdString;
2062 OBJECT_ATTRIBUTES objectAttributes;
2063 IO_STATUS_BLOCK ioStatus;
2064 IO_DRIVER_CREATE_CONTEXT driverCreateContext;
2079 if (!NT_SUCCESS( status )) {
2084 InitializeObjectAttributes( &objectAttributes,
2097 IoInitializeDriverCreateContext( &driverCreateContext );
2098 driverCreateContext.TxnParameters =
2099 IoGetTransactionParameterBlock( Data->Iopb->TargetFileObject );
2102 Data->Iopb->TargetInstance,
2105 FILE_READ_ATTRIBUTES,
2108 (PLARGE_INTEGER)
NULL,
2110 FILE_SHARE_VALID_FLAGS,
2112 FILE_OPEN_REPARSE_POINT | FILE_OPEN_BY_FILE_ID,
2115 IO_IGNORE_SHARE_ACCESS_CHECK,
2116 &driverCreateContext );
2118 if (NT_SUCCESS( status )) {
2120 status = FltClose( handle );
2121 ASSERT( NT_SUCCESS( status ) );
2136 _In_ PFLT_CALLBACK_DATA Data,
2137 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2138 _In_ PDF_STREAM_CONTEXT StreamContext,
2139 _In_ BOOLEAN IsTransaction
2173 NTSTATUS status = STATUS_SUCCESS;
2174 FILE_OBJECTID_BUFFER fileObjectIdBuf;
2176 FLT_FILESYSTEM_TYPE fileSystemType;
2184 status = FltGetFileSystemType( FltObjects->Instance,
2187 if (status != STATUS_SUCCESS) {
2201 if (IsTransaction ||
2202 (fileSystemType == FLT_FSTYPE_REFS)) {
2210 case STATUS_INVALID_PARAMETER:
2217 return STATUS_FILE_DELETED;
2219 case STATUS_DELETE_PENDING:
2228 return STATUS_SUCCESS;
2242 status = FltFsControlFile( Data->Iopb->TargetInstance,
2243 Data->Iopb->TargetFileObject,
2244 FSCTL_GET_OBJECT_ID,
2248 sizeof(FILE_OBJECTID_BUFFER),
2253 case STATUS_OBJECTID_NOT_FOUND:
2259 return STATUS_SUCCESS;
2279 _Inout_ PDF_STREAM_CONTEXT StreamContext,
2280 _Inout_ PDF_TRANSACTION_CONTEXT TransactionContext,
2281 _In_ BOOLEAN FileDelete
2306 PDF_DELETE_NOTIFY deleteNotify;
2310 ASSERT(
NULL != TransactionContext->Resource );
2312 ASSERT(
NULL != StreamContext );
2318 if (
NULL == deleteNotify) {
2320 return STATUS_INSUFFICIENT_RESOURCES;
2325 FltReferenceContext( StreamContext );
2329 FltAcquireResourceExclusive( TransactionContext->Resource );
2331 InsertTailList( &TransactionContext->DeleteNotifyList,
2332 &deleteNotify->
Links );
2334 FltReleaseResource( TransactionContext->Resource );
2336 return STATUS_SUCCESS;
2342 _In_ PDF_STREAM_CONTEXT StreamContext,
2343 _In_ BOOLEAN IsFile,
2344 _Inout_opt_ PDF_TRANSACTION_CONTEXT TransactionContext
2368 if (InterlockedIncrement( &StreamContext->IsNotified ) <= 1) {
2373 "delete!DfPostCleanupCallback: " 2374 "A file \"%wZ\" (%p) has been",
2375 &StreamContext->NameInfo->Name,
2381 "delete!DfPostCleanupCallback: " 2382 "An alternate data stream \"%wZ\" (%p) has been",
2383 &StreamContext->NameInfo->Name,
2391 if (
NULL == TransactionContext) {
2399 " deleted in a transaction!\n" );
2411 _In_ PDF_DELETE_NOTIFY DeleteNotify,
2436 if (DeleteNotify->FileDelete) {
2439 "delete!DfTransactionNotificationCallback: " 2440 "A file \"%wZ\" (%p) has been",
2441 &DeleteNotify->StreamContext->NameInfo->Name,
2442 DeleteNotify->StreamContext );
2447 "delete!DfTransactionNotificationCallback: " 2448 "An alternate data stream \"%wZ\" (%p) has been",
2449 &DeleteNotify->StreamContext->NameInfo->Name,
2450 DeleteNotify->StreamContext );
2456 " deleted due to a transaction commit!\n" );
2461 " saved due to a transaction rollback!\n" );
2468 _Inout_ PFLT_CALLBACK_DATA Data,
2469 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2470 _In_ PDF_STREAM_CONTEXT StreamContext
2497 BOOLEAN isTransaction;
2498 BOOLEAN isFileDeleted = FALSE;
2500 PDF_TRANSACTION_CONTEXT transactionContext =
NULL;
2505 isTransaction = (
NULL != FltObjects->Transaction);
2507 if (isTransaction) {
2509 "delete!DfProcessDelete: In a transaction!\n" );
2512 FltObjects->Transaction,
2513 &transactionContext,
2514 FLT_TRANSACTION_CONTEXT );
2516 if (!NT_SUCCESS( status )) {
2533 if (STATUS_FILE_DELETED == status) {
2535 isFileDeleted =
TRUE;
2536 status = STATUS_SUCCESS;
2538 }
else if (!NT_SUCCESS( status )) {
2541 "delete!%s: DfIsFileDeleted returned 0x%08x!\n",
2550 transactionContext );
2554 if (
NULL != transactionContext) {
2556 FltReleaseContext( transactionContext );
2567 FLT_PREOP_CALLBACK_STATUS
2569 _Inout_ PFLT_CALLBACK_DATA Data,
2570 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2571 _Outptr_result_maybenull_ PVOID *CompletionContext
2605 PDF_STREAM_CONTEXT streamContext;
2613 "delete!DfPreCreateCallback: Entered\n" );
2627 if (
FlagOn( Data->Iopb->Parameters.Create.Options, FILE_DELETE_ON_CLOSE )) {
2632 if (NT_SUCCESS( status )) {
2634 *CompletionContext = (PVOID)streamContext;
2636 return FLT_PREOP_SYNCHRONIZE;
2641 "delete!DfPreCreateCallback: An error occurred with DfAllocateStreamContext!\n" );
2645 *CompletionContext =
NULL;
2647 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2651 FLT_POSTOP_CALLBACK_STATUS
2653 _Inout_ PFLT_CALLBACK_DATA Data,
2654 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2655 _In_ PVOID CompletionContext,
2656 _In_ FLT_POST_OPERATION_FLAGS Flags
2688 NTSTATUS status = STATUS_SUCCESS;
2689 PDF_STREAM_CONTEXT streamContext =
NULL;
2696 ASSERT(
NULL != CompletionContext );
2701 "delete!DfPostCreateCallback: Entered\n" );
2704 if (NT_SUCCESS( Data->IoStatus.Status ) &&
2705 (STATUS_REPARSE != Data->IoStatus.Status)) {
2708 ASSERT( !
FlagOn( Flags, FLTFL_POST_OPERATION_DRAINING ) );
2719 Data->Iopb->TargetFileObject,
2721 FLT_STREAM_CONTEXT );
2723 if (NT_SUCCESS( status )) {
2730 streamContext->
DeleteOnClose = BooleanFlagOn( Data->Iopb->Parameters.Create.Options,
2731 FILE_DELETE_ON_CLOSE );
2744 if (NT_SUCCESS( status )) {
2746 FltReleaseContext( streamContext );
2749 return FLT_POSTOP_FINISHED_PROCESSING;
2753 FLT_PREOP_CALLBACK_STATUS
2755 _Inout_ PFLT_CALLBACK_DATA Data,
2756 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2757 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
2799 PDF_STREAM_CONTEXT streamContext =
NULL;
2806 switch (Data->Iopb->Parameters.SetFileInformation.FileInformationClass) {
2808 case FileDispositionInformation:
2809 case FileDispositionInformationEx:
2816 Data->Iopb->TargetFileObject,
2818 FLT_STREAM_CONTEXT );
2820 if (!NT_SUCCESS( status )) {
2822 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2836 race = (InterlockedIncrement( &streamContext->
NumOps ) > 1);
2846 *CompletionContext = (PVOID)streamContext;
2848 return FLT_PREOP_SYNCHRONIZE;
2852 FltReleaseContext( streamContext );
2859 return FLT_PREOP_SUCCESS_NO_CALLBACK;
2866 FLT_POSTOP_CALLBACK_STATUS
2868 _Inout_ PFLT_CALLBACK_DATA Data,
2869 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2870 _In_ PVOID CompletionContext,
2871 _In_ FLT_POST_OPERATION_FLAGS Flags
2909 PDF_STREAM_CONTEXT streamContext;
2917 ASSERT( (Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileDispositionInformation) ||
2918 (Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileDispositionInformationEx) );
2921 ASSERT(
NULL != CompletionContext );
2929 if (NT_SUCCESS( Data->IoStatus.Status )) {
2953 if (Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileDispositionInformationEx) {
2955 ULONG flags = ((PFILE_DISPOSITION_INFORMATION_EX) Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->Flags;
2957 if (
FlagOn( flags, FILE_DISPOSITION_ON_CLOSE )) {
2959 streamContext->
DeleteOnClose = BooleanFlagOn( flags, FILE_DISPOSITION_DELETE );
2963 streamContext->
SetDisp = BooleanFlagOn( flags, FILE_DISPOSITION_DELETE );
2968 streamContext->
SetDisp = ((PFILE_DISPOSITION_INFORMATION) Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->DeleteFile;
2976 InterlockedDecrement( &streamContext->
NumOps );
2978 FltReleaseContext( streamContext );
2980 return FLT_POSTOP_FINISHED_PROCESSING;
2984 FLT_PREOP_CALLBACK_STATUS
2986 _Inout_ PFLT_CALLBACK_DATA Data,
2987 _In_ PCFLT_RELATED_OBJECTS FltObjects,
2988 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
3025 PDF_STREAM_CONTEXT streamContext;
3033 "delete!DfPreCleanupCallback: Entered\n" );
3035 status = FltGetStreamContext( Data->Iopb->TargetInstance,
3036 Data->Iopb->TargetFileObject,
3039 if (NT_SUCCESS( status )) {
3055 if (NT_SUCCESS( status )) {
3058 *CompletionContext = (PVOID)streamContext;
3060 return FLT_PREOP_SYNCHRONIZE;
3064 FltReleaseContext( streamContext );
3068 return FLT_PREOP_SUCCESS_NO_CALLBACK;
3072 FLT_POSTOP_CALLBACK_STATUS
3074 _Inout_ PFLT_CALLBACK_DATA Data,
3075 _In_ PCFLT_RELATED_OBJECTS FltObjects,
3076 _In_ PVOID CompletionContext,
3077 _In_ FLT_POST_OPERATION_FLAGS Flags
3108 FILE_STANDARD_INFORMATION fileInfo;
3109 PDF_STREAM_CONTEXT streamContext =
NULL;
3119 "delete!DfPostCleanupCallback: Entered\n" );
3122 ASSERT( !
FlagOn( Flags, FLTFL_POST_OPERATION_DRAINING ) );
3125 ASSERT(
NULL != CompletionContext );
3128 if (NT_SUCCESS( Data->IoStatus.Status )) {
3151 if (((streamContext->
NumOps > 0) ||
3162 status = FltQueryInformationFile( Data->Iopb->TargetInstance,
3163 Data->Iopb->TargetFileObject,
3166 FileStandardInformation,
3169 if (STATUS_FILE_DELETED == status) {
3175 if (!NT_SUCCESS( status )) {
3178 "delete!%s: It was not possible to verify " 3179 "deletion due to an error in DfProcessDelete (0x%08x)!\n",
3187 FltReleaseContext( streamContext );
3189 return FLT_POSTOP_FINISHED_PROCESSING;
3195 _In_ PCFLT_RELATED_OBJECTS FltObjects,
3196 _In_ PDF_TRANSACTION_CONTEXT TransactionContext,
3197 _In_ ULONG NotificationMask
3227 BOOLEAN commit = BooleanFlagOn( NotificationMask, TRANSACTION_NOTIFY_COMMIT_FINALIZE );
3228 PDF_DELETE_NOTIFY deleteNotify =
NULL;
3246 "delete!DfTransactionNotificationCallback: COMMIT!\n" );
3251 "delete!DfTransactionNotificationCallback: ROLLBACK!\n" );
3254 ASSERT(
NULL != TransactionContext->Resource );
3256 FltAcquireResourceExclusive( TransactionContext->Resource );
3258 while (!IsListEmpty( &TransactionContext->DeleteNotifyList )) {
3260 deleteNotify = CONTAINING_RECORD( RemoveHeadList( &TransactionContext->DeleteNotifyList ),
3275 ExFreePool( deleteNotify );
3278 FltReleaseResource( TransactionContext->Resource );
3280 return STATUS_SUCCESS;
FLT_POSTOP_CALLBACK_STATUS DfPostCleanupCallback(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PVOID CompletionContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
CONST FLT_OPERATION_REGISTRATION Callbacks[]
NTSTATUS DfBuildFileIdString(_In_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PDF_STREAM_CONTEXT StreamContext, _Out_ PUNICODE_STRING String)
FLT_POSTOP_CALLBACK_STATUS DfPostSetInfoCallback(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PVOID CompletionContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
struct _DF_STREAM_CONTEXT DF_STREAM_CONTEXT
NTSTATUS DfGetFileId(_In_ PFLT_CALLBACK_DATA Data, _Inout_ PDF_STREAM_CONTEXT StreamContext)
NTSTATUS DfGetVolumeGuidName(_In_ PCFLT_RELATED_OBJECTS FltObjects, _Inout_ PUNICODE_STRING VolumeGuidName)
#define DFDBG_TRACE_ROUTINES
VOID DfFreeUnicodeString(_Inout_ PUNICODE_STRING String)
NTSTATUS DfAddTransDeleteNotify(_Inout_ PDF_STREAM_CONTEXT StreamContext, _Inout_ PDF_TRANSACTION_CONTEXT TransactionContext, _In_ BOOLEAN FileDelete)
NTSTATUS DfAllocateContext(_In_ FLT_CONTEXT_TYPE ContextType, _Outptr_ PFLT_CONTEXT *Context)
NTSTATUS DfSetupInstanceContext(_In_ PCFLT_RELATED_OBJECTS FltObjects)
CONST FLT_REGISTRATION FilterRegistration
#define DfSizeofFileId(FID)
#define DF_DELETE_NOTIFY_POOL_TAG
RtlCopyMemory(OutputStringBuffer, TempMappingBuffer->Data, OutputString->MaximumLength)
NTSTATUS DfProcessDelete(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PDF_STREAM_CONTEXT StreamContext)
#define DFDBG_TRACE_ERRORS
VOID DfTransactionContextCleanupCallback(_In_ PDF_TRANSACTION_CONTEXT TransactionContext, _In_ FLT_CONTEXT_TYPE ContextType)
struct _DF_TRANSACTION_CONTEXT DF_TRANSACTION_CONTEXT
UNICODE_STRING VolumeGuidName
_When_(Data==NULL, _Pre_satisfies_(FileObject !=NULL &&Instance !=NULL)) _When_(FileObject
#define DF_CONTEXT_POOL_TYPE
union _DF_FILE_REFERENCE DF_FILE_REFERENCE
FLT_PREOP_CALLBACK_STATUS DfPreCleanupCallback(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
#define DF_TRANSACTION_CONTEXT_POOL_TAG
#define DF_NOTIFICATION_MASK
#define DF_ERESOURCE_POOL_TAG
FLT_PREOP_CALLBACK_STATUS DfPreCreateCallback(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Outptr_result_maybenull_ PVOID *CompletionContext)
NTSTATUS DfTransactionNotificationCallback(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PDF_TRANSACTION_CONTEXT TransactionContext, _In_ ULONG NotificationMask)
LIST_ENTRY DeleteNotifyList
struct _DF_INSTANCE_CONTEXT * PDF_INSTANCE_CONTEXT
PFLT_FILE_NAME_INFORMATION NameInfo
struct _DF_DELETE_NOTIFY DF_DELETE_NOTIFY
VOID DfInstanceContextCleanupCallback(_In_ PDF_INSTANCE_CONTEXT InstanceContext, _In_ FLT_CONTEXT_TYPE ContextType)
struct _DF_TRANSACTION_CONTEXT * PDF_TRANSACTION_CONTEXT
NTSTATUS DfInstanceSetup(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_SETUP_FLAGS Flags, _In_ DEVICE_TYPE VolumeDeviceType, _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType)
VOID DfInstanceTeardownStart(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags)
struct _DF_DELETE_NOTIFY * PDF_DELETE_NOTIFY
union _DF_FILE_REFERENCE * PDF_FILE_REFERENCE
NTSTATUS DfGetOrSetContext(_In_ PCFLT_RELATED_OBJECTS FltObjects, _When_(ContextType==FLT_INSTANCE_CONTEXT, _In_opt_) _When_(ContextType!=FLT_INSTANCE_CONTEXT, _In_) PVOID Target, _Outptr_ _Pre_valid_ PFLT_CONTEXT *Context, _In_ FLT_CONTEXT_TYPE ContextType)
struct _DF_FILE_REFERENCE::@4 FileId64
#define IRP_MJ_SET_INFORMATION
#define DF_DBG_PRINT(_dbgLevel,...)
NTSTATUS DfGetContext(_In_ PCFLT_RELATED_OBJECTS FltObjects, _When_(ContextType==FLT_INSTANCE_CONTEXT, _In_opt_) _When_(ContextType!=FLT_INSTANCE_CONTEXT, _In_) PVOID Target, _In_ FLT_CONTEXT_TYPE ContextType, _Outptr_ PFLT_CONTEXT *Context)
#define DF_VOLUME_GUID_NAME_SIZE
UNREFERENCED_PARAMETER(FileObject)
PFLT_FILTER gFilterHandle
#define DF_STRING_POOL_TAG
NcLoadRegistryStringRetry NULL
NTSTATUS DfUnload(_In_ FLT_FILTER_UNLOAD_FLAGS Flags)
DRIVER_INITIALIZE DriverEntry
VOID DfStreamContextCleanupCallback(_In_ PDF_STREAM_CONTEXT StreamContext, _In_ FLT_CONTEXT_TYPE ContextType)
#define DF_STREAM_CONTEXT_POOL_TAG
NTSTATUS DfIsFileDeleted(_In_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PDF_STREAM_CONTEXT StreamContext, _In_ BOOLEAN IsTransaction)
FLT_PREOP_CALLBACK_STATUS DfPreSetInfoCallback(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
NTSTATUS DfSetContext(_In_ PCFLT_RELATED_OBJECTS FltObjects, _When_(ContextType==FLT_INSTANCE_CONTEXT, _In_opt_) _When_(ContextType!=FLT_INSTANCE_CONTEXT, _In_) PVOID Target, _In_ FLT_CONTEXT_TYPE ContextType, _In_ PFLT_CONTEXT NewContext, _Outptr_opt_result_maybenull_ PFLT_CONTEXT *OldContext)
struct _DF_STREAM_CONTEXT * PDF_STREAM_CONTEXT
NTSTATUS DfDetectDeleteByFileId(_In_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PDF_STREAM_CONTEXT StreamContext)
VOID DfInstanceTeardownComplete(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags)
VOID DfNotifyDeleteOnTransactionEnd(_In_ PDF_DELETE_NOTIFY DeleteNotify, _In_ BOOLEAN Commit)
NTSTATUS DfInstanceQueryTeardown(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags)
PDF_STREAM_CONTEXT StreamContext
NTSTATUS DfAllocateUnicodeString(_Inout_ PUNICODE_STRING String)
VOID DfNotifyDelete(_In_ PDF_STREAM_CONTEXT StreamContext, _In_ BOOLEAN IsFile, _Inout_opt_ PDF_TRANSACTION_CONTEXT TransactionContext)
CONST FLT_CONTEXT_REGISTRATION Contexts[]
struct _DF_INSTANCE_CONTEXT DF_INSTANCE_CONTEXT
FLT_POSTOP_CALLBACK_STATUS DfPostCreateCallback(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ PVOID CompletionContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
NTSTATUS DfGetFileNameInformation(_In_ PFLT_CALLBACK_DATA Data, _Inout_ PDF_STREAM_CONTEXT StreamContext)
#define DF_INSTANCE_CONTEXT_POOL_TAG