From bff2b8792c669649a81e86633de878f449b6bf01 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 26 Jun 2013 11:00:00 -0400 Subject: [PATCH] Windows: Protect all Mm and Cc calls with try..except Wrap all Memory Manager and Cache Manager operations in a try..except block to protect against leaking the SectionObjectResource if an exception is thrown. Failure to release the SectionObjectResource will result in subsequent deadlocks. Change-Id: I92096c1d4bfd5a23069bcc364b68b07327d662ae Reviewed-on: http://gerrit.openafs.org/10039 Tested-by: BuildBot Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp | 29 ++-- src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp | 58 ++++++- src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp | 158 +++++++++++++----- src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp | 60 +++++-- .../afsrdr/kernel/lib/AFSLockControl.cpp | 53 +++++- src/WINNT/afsrdr/kernel/lib/AFSRead.cpp | 40 +++-- src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp | 36 +++- 7 files changed, 332 insertions(+), 102 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp index f0b26ed79..5d6175485 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp @@ -303,6 +303,20 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject, } } } + + // + // Uninitialize the cache map. This call is unconditional. + // + + AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSCleanup Tearing down cache map for Fcb %p FileObject %p\n", + pFcb, + pFileObject)); + + CcUninitializeCacheMap( pFileObject, + NULL, + NULL); } __except( EXCEPTION_EXECUTE_HANDLER) { @@ -321,21 +335,6 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject, SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); } - // - // Uninitialize the cache map. This call is unconditional. - // - - AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSCleanup Tearing down cache map for Fcb %p FileObject %p\n", - pFcb, - pFileObject)); - - CcUninitializeCacheMap( pFileObject, - NULL, - NULL); - - AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "AFSCleanup Releasing Fcb SectionObject lock %p EXCL %08lX\n", diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp index ea10538f6..e661ce8f2 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp @@ -3025,8 +3025,28 @@ AFSProcessOpen( IN PIRP Irp, AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource, TRUE); - bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers, - MmFlushForWrite); + __try + { + + bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers, + MmFlushForWrite); + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + bMmFlushed = FALSE; + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSProcessOpen MmFlushImageSection failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pObjectInfo->FileId.Cell, + pObjectInfo->FileId.Volume, + pObjectInfo->FileId.Vnode, + pObjectInfo->FileId.Unique, + ntStatus)); + } AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, @@ -3504,13 +3524,33 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject, AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource, TRUE); - // - // Before we actually truncate, check to see if the purge - // is going to fail. - // - - bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers, - &liZero); + __try + { + + // + // Before we actually truncate, check to see if the purge + // is going to fail. + // + + bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers, + &liZero); + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + bUserMapped = FALSE; + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSProcessOverwriteSupercede MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pObjectInfo->FileId.Cell, + pObjectInfo->FileId.Volume, + pObjectInfo->FileId.Vnode, + pObjectInfo->FileId.Unique, + ntStatus)); + } AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index d739860db..363e8181c 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -2209,47 +2209,67 @@ AFSSetDispositionInfo( IN PIRP Irp, AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource, TRUE); - // - // Attempt to flush any outstanding data - // - - bMmFlushed = MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers, - MmFlushForDelete); - - if ( bMmFlushed) + __try { // - // Set PENDING_DELETE before CcPurgeCacheSection to avoid a - // deadlock with Trend Micro's Enterprise anti-virus product - // which attempts to open the file which is being deleted. + // Attempt to flush any outstanding data // - AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n", - DirectoryCB, - &DirectoryCB->NameInformation.FileName)); + bMmFlushed = MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers, + MmFlushForDelete); - SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE); + if ( bMmFlushed) + { - // - // Purge the cache as well - // + // + // Set PENDING_DELETE before CcPurgeCacheSection to avoid a + // deadlock with Trend Micro's Enterprise anti-virus product + // which attempts to open the file which is being deleted. + // - if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL) - { + AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n", + DirectoryCB, + &DirectoryCB->NameInformation.FileName)); + + SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE); - if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers, - NULL, - 0, - TRUE)) + // + // Purge the cache as well + // + + if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL) { - SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); + if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers, + NULL, + 0, + TRUE)) + { + + SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); + } } } } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + bMmFlushed = FALSE; + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSSetDispositionInfo MmFlushImageSection failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pFcb->ObjectInformation->FileId.Cell, + pFcb->ObjectInformation->FileId.Volume, + pFcb->ObjectInformation->FileId.Vnode, + pFcb->ObjectInformation->FileId.Unique, + ntStatus)); + } AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, @@ -3450,18 +3470,36 @@ AFSSetRenameInfo( IN PIRP Irp) AFSAcquireExcl( &pTargetFcb->NPFcb->SectionObjectResource, TRUE); - // - // Close the section in the event it was mapped - // + __try + { + + // + // Close the section in the event it was mapped + // + + if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers, + TRUE)) + { - if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers, - TRUE)) + AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_ERROR, + "AFSSetRenameInfo Failed to delete section for target file %wZ\n", + &uniTargetName)); + } + } + __except( EXCEPTION_EXECUTE_HANDLER) { - AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, - AFS_TRACE_LEVEL_ERROR, - "AFSSetRenameInfo Failed to delete section for target file %wZ\n", - &uniTargetName)); + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSSetRenameInfo MmForceSectionClosed failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pTargetFcb->ObjectInformation->FileId.Cell, + pTargetFcb->ObjectInformation->FileId.Volume, + pTargetFcb->ObjectInformation->FileId.Vnode, + pTargetFcb->ObjectInformation->FileId.Unique, + ntStatus)); } AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, @@ -3615,8 +3653,28 @@ AFSSetAllocationInfo( IN PIRP Irp, AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource, TRUE); - bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer, - &pBuffer->AllocationSize); + __try + { + + bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer, + &pBuffer->AllocationSize); + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + bUserMapped = FALSE; + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSSetAllocationInfo MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pFcb->ObjectInformation->FileId.Cell, + pFcb->ObjectInformation->FileId.Volume, + pFcb->ObjectInformation->FileId.Vnode, + pFcb->ObjectInformation->FileId.Unique, + ntStatus)); + } AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, @@ -3821,8 +3879,28 @@ AFSSetEndOfFileInfo( IN PIRP Irp, AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource, TRUE); - bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer, - &pBuffer->EndOfFile); + __try + { + + bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer, + &pBuffer->EndOfFile); + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + bUserMapped = FALSE; + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSSetEndOfFileInfo MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pFcb->ObjectInformation->FileId.Cell, + pFcb->ObjectInformation->FileId.Volume, + pFcb->ObjectInformation->FileId.Vnode, + pFcb->ObjectInformation->FileId.Unique, + ntStatus)); + } AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index c3e5cc782..85e762561 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -3188,12 +3188,30 @@ AFSVerifyEntry( IN GUID *AuthGroup, AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource, TRUE); - pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers); - - if ( pCCFileObject != NULL) + __try + { + + pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers); + + if ( pCCFileObject != NULL) + { + CcSetFileSizes( pCCFileObject, + (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize); + } + } + __except( EXCEPTION_EXECUTE_HANDLER) { - CcSetFileSizes( pCCFileObject, - (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize); + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSVerifyEntry CcSetFileSized failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pObjectInfo->FileId.Cell, + pObjectInfo->FileId.Volume, + pObjectInfo->FileId.Vnode, + pObjectInfo->FileId.Unique, + ntStatus)); } AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, @@ -4347,16 +4365,34 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry, AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource, TRUE); - pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers); + __try + { - pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart; - pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart; - pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart; + pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers); - if ( pCCFileObject != NULL) + pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart; + pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart; + pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart; + + if ( pCCFileObject != NULL) + { + CcSetFileSizes( pCCFileObject, + (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize); + } + } + __except( EXCEPTION_EXECUTE_HANDLER) { - CcSetFileSizes( pCCFileObject, - (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize); + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSValidateEntry CcSetFileSizes failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pObjectInfo->FileId.Cell, + pObjectInfo->FileId.Volume, + pObjectInfo->FileId.Vnode, + pObjectInfo->FileId.Unique, + ntStatus)); } AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp b/src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp index b2298cf25..3354bdc48 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp @@ -177,10 +177,28 @@ AFSLockControl( IN PDEVICE_OBJECT LibDeviceObject, AFSAcquireShared( &pFcb->NPFcb->SectionObjectResource, TRUE); - CcFlushCache( &pFcb->NPFcb->SectionObjectPointers, - NULL, - 0, - &stIoStatus); + __try + { + + CcFlushCache( &pFcb->NPFcb->SectionObjectPointers, + NULL, + 0, + &stIoStatus); + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSLockControl CcFlushCache failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pFcb->ObjectInformation->FileId.Cell, + pFcb->ObjectInformation->FileId.Volume, + pFcb->ObjectInformation->FileId.Vnode, + pFcb->ObjectInformation->FileId.Unique, + ntStatus)); + } if( !NT_SUCCESS( stIoStatus.Status)) { @@ -244,10 +262,29 @@ AFSLockControl( IN PDEVICE_OBJECT LibDeviceObject, AFSAcquireShared( &pFcb->NPFcb->SectionObjectResource, TRUE); - CcFlushCache( &pFcb->NPFcb->SectionObjectPointers, - &pIrpSp->Parameters.LockControl.ByteOffset, - pIrpSp->Parameters.LockControl.Length->LowPart, - &stIoStatus); + + __try + { + + CcFlushCache( &pFcb->NPFcb->SectionObjectPointers, + &pIrpSp->Parameters.LockControl.ByteOffset, + pIrpSp->Parameters.LockControl.Length->LowPart, + &stIoStatus); + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + ntStatus = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSLockControl CcFlushCache failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pFcb->ObjectInformation->FileId.Cell, + pFcb->ObjectInformation->FileId.Volume, + pFcb->ObjectInformation->FileId.Vnode, + pFcb->ObjectInformation->FileId.Unique, + ntStatus)); + } AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp b/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp index 317406b16..6c5eea8c2 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp @@ -1137,20 +1137,40 @@ AFSCommonRead( IN PDEVICE_OBJECT DeviceObject, bReleaseSectionObject = TRUE; - AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSCommonRead (%p) IRP_MN_COMPLETE being processed\n", - Irp)); + __try + { - CcMdlReadComplete(pIrpSp->FileObject, Irp->MdlAddress); + AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSCommonRead (%p) IRP_MN_COMPLETE being processed\n", + Irp)); - // - // Mdl is now Deallocated - // + CcMdlReadComplete(pIrpSp->FileObject, Irp->MdlAddress); + + // + // Mdl is now Deallocated + // + + Irp->MdlAddress = NULL; + + try_return( ntStatus = STATUS_SUCCESS ); + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + ntStatus = GetExceptionCode(); - Irp->MdlAddress = NULL; + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSCommonRead CcMdlReadComplete failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", + pFcb->ObjectInformation->FileId.Cell, + pFcb->ObjectInformation->FileId.Volume, + pFcb->ObjectInformation->FileId.Vnode, + pFcb->ObjectInformation->FileId.Unique, + ntStatus)); - try_return( ntStatus = STATUS_SUCCESS ); + try_return( ntStatus); + } } // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp b/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp index 285342164..f6148b924 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp @@ -759,19 +759,39 @@ try_exit: bReleaseMain = FALSE; } - if ( !CcPurgeCacheSection( &pNPFcb->SectionObjectPointers, - &liStartingByte, - ulByteCount, - FALSE)) + __try { - AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, - AFS_TRACE_LEVEL_WARNING, - "AFSCommonWrite CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", + if ( !CcPurgeCacheSection( &pNPFcb->SectionObjectPointers, + &liStartingByte, + ulByteCount, + FALSE)) + { + + AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING, + AFS_TRACE_LEVEL_WARNING, + "AFSCommonWrite CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n", + pFcb->ObjectInformation->FileId.Cell, + pFcb->ObjectInformation->FileId.Volume, + pFcb->ObjectInformation->FileId.Vnode, + pFcb->ObjectInformation->FileId.Unique)); + + SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); + } + } + __except( EXCEPTION_EXECUTE_HANDLER) + { + + DWORD ntStatus2 = GetExceptionCode(); + + AFSDbgTrace(( 0, + 0, + "EXCEPTION - AFSProcessOverwriteSupercede MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n", pFcb->ObjectInformation->FileId.Cell, pFcb->ObjectInformation->FileId.Volume, pFcb->ObjectInformation->FileId.Vnode, - pFcb->ObjectInformation->FileId.Unique)); + pFcb->ObjectInformation->FileId.Unique, + ntStatus2)); SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); } -- 2.39.5