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