FsRtlAcquireFileForCcFlushEx
NTSTATUS __stdcall FsRtlAcquireFileForCcFlushEx(_FILE_OBJECT *FileObject){
int v2;
_FS_FILTER_CTRL *v3;
char v4;
_DEVICE_OBJECT *v5;
_DEVICE_OBJECT *v6;
INT64 v7;
INT64 v8;
_DEVICE_OBJECT *v9;
_DEVICE_OBJECT *v10;
int v11;
_DRIVER_OBJECT *DriverObject;
_FAST_IO_DISPATCH *FastIoDispatch;
_FS_FILTER_CALLBACKS *FsFilterCallbacks;
NTSTATUS result;
_ETHREAD *CurrentThread;
char v17;
int(__fastcall *AcquireForCcFlush)(_FILE_OBJECT *, _DEVICE_OBJECT *);
_ETHREAD *v19;
_DEVICE_OBJECT *v20;
_DRIVER_OBJECT *v21;
_QWORD *FsContext;
UINT64 v23;
NTSTATUS IsResourceAcquiredSharedLite;
INT64 v25;
UINT64 v26;
UINT64 v27;
UINT8 BaseFsFailedOp[8];
_DEVICE_OBJECT *DeviceObject;
_FS_FILTER_CTRL FsFilterCtrl[144];
memset(FsFilterCtrl, 0i64, 0x238u);
v2 = 0;
v3 = FsFilterCtrl;
*(_DWORD *)&BaseFsFailedOp[4] = 0;
v4 = 0;
LODWORD(v5) = IoGetRelatedDeviceObject((INT64)FileObject);
DeviceObject = v5;
LODWORD(v6) = IoGetBaseFileSystemDeviceObject((INT64)FileObject);
v10 = v6;
v11 = 0;
DriverObject = v6->DriverObject;
FastIoDispatch = DriverObject->FastIoDispatch;
FsFilterCallbacks = DriverObject->DriverExtension->FsFilterCallbacks;
if( FsFilterCallbacks
&& (FsFilterCallbacks->SizeOfFsFilterCallbacks >= 0x30 && FsFilterCallbacks->PreAcquireForCcFlush
|| FsFilterCallbacks->SizeOfFsFilterCallbacks >= 0x38 && FsFilterCallbacks->PostAcquireForCcFlush) )
{
v4 = 1;
}
if( DeviceObject != v10 || v4 )
{
result = FsFilterCtrlInit(FsFilterCtrl, 0xFBu, DeviceObject, v9, FileObject, 1u);
if( result < 0 )
return result;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v2 = FsFilterPerformCallbacks(FsFilterCtrl, 1u, 1u, &BaseFsFailedOp[4]);
v11 = 0;
}
else
{
v19 = (_ETHREAD *)KeGetCurrentThread();
v3 = 0i64;
--v19->Tcb.KernelApcDisable;
}
if( v2 >= 0 )
{
if( v2 )
{
if( v2 != 294 )
v11 = v2;
v2 = v11;
}
else
{
if( v3 && (FileObject = *(_FILE_OBJECT **)&FsFilterCtrl[4], (FsFilterCtrl[16] & 4) != 0) )
{
LODWORD(v20) = IoGetDeviceAttachmentBaseRef(*(INT64 *)&FsFilterCtrl[2], v7, v8);
v10 = v20;
v17 = 1;
v21 = v20->DriverObject;
FastIoDispatch = v21->FastIoDispatch;
FsFilterCallbacks = v21->DriverExtension->FsFilterCallbacks;
}
else
{
v17 = 0;
}
if( !FsFilterCallbacks
|| (FsFilterCallbacks->SizeOfFsFilterCallbacks < 0x30 || !FsFilterCallbacks->PreAcquireForCcFlush)
&& (FsFilterCallbacks->SizeOfFsFilterCallbacks < 0x38 || !FsFilterCallbacks->PostAcquireForCcFlush) )
{
if( FastIoDispatch
&& FastIoDispatch->SizeOfFastIoDispatch >= 0xD8
&& (AcquireForCcFlush = FastIoDispatch->AcquireForCcFlush) != 0i64 )
{
v2 = AcquireForCcFlush(FileObject, v10);
}
else
{
v2 = -1073741808;
}
*(_DWORD *)&BaseFsFailedOp[4] |= 1u;
}
if( v17 )
HalPutDmaAdapter((PADAPTER_OBJECT)v10);
}
}
if( v2 == -1073741808 && (BaseFsFailedOp[4] & 1) != 0 )
{
FsContext = FileObject->FsContext;
v23 = FsContext[1];
if( v23 )
{
IsResourceAcquiredSharedLite = ExIsResourceAcquiredSharedLite(v23, v7, v8);
v26 = FsContext[1];
if( IsResourceAcquiredSharedLite )
ExAcquireResourceSharedLite(v26, 1);
else
ExAcquireResourceExclusiveLite(v26, 1, v25);
}
v27 = FsContext[2];
if( v27 )
ExAcquireResourceSharedLite(v27, 1);
v2 = 0;
}
if( v3 )
{
if( *((_WORD *)v3 + 37) )
FsFilterPerformCompletionCallbacks(FsFilterCtrl, (unsigned int)v2);
FsFilterCtrlFree(FsFilterCtrl);
}
if( v2 < 0 )
KeLeaveCriticalRegion();
return v2;
}Referenced by:
MiDeleteCachedSubsection
MiFlushControlArea
MmFlushSection
MmFlushVirtualMemory