MmFlushSection

VOID __fastcall MmFlushSection(
        _SECTION_OBJECT_POINTERS *SectionObjectPointer,
        _LARGE_INTEGER *Offset,
        UINT64 RegionSize,
        _KEVENT *CallersEvent,
        _IO_STATUS_BLOCK *IoStatus,
        UINT64 Flags){
  UINT64 v6; 
  _LARGE_INTEGER v7; 
  _IO_STATUS_BLOCK *v8; 
  int v9; 
  _ETHREAD *CurrentThread; 
  int v11; 
  NTSTATUS v12; 
  unsigned int v13; 
  _FILE_OBJECT *v14; 
  int v15; 
  UINT64 v16; 
  _ETHREAD *v17; 
  _LARGE_INTEGER Offseta; 

  Offseta.QuadPart = 0i64;
  v6 = RegionSize;
  if( Offset )
  {
    v7 = *Offset;
    Offset = &Offseta;
    Offseta = v7;
  }
  v8 = IoStatus;
  IoStatus->Status = 0;
  v8->Information = RegionSize;
  MiComputeFlushRange(SectionObjectPointer, Offset, RegionSize, 0i64);
  if( v9 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v17 = CurrentThread;
    LOBYTE(Offseta.anonymous_0.LowPart) = CurrentThread->CacheManagerActive;
    v11 = Flags;
    CurrentThread->CacheManagerActive = 1;
    if( (v11 & 1) != 0 )
    {
      v13 = 0;
      v14 = MiReferenceControlAreaFile(0i64);
      v15 = Flags;
      do
      {
        v12 = FsRtlAcquireFileForCcFlushEx(v14);
        if( v12 < 0 )
          break;
        LODWORD(v16) = v15;
        v12 = MiFlushSectionInternal(0i64, 0i64, 0i64, 0i64, 0i64, v16, v8);
        FsRtlReleaseFileForCcFlush(v14);
        if( v12 != -1073741740 )
          break;
        ++v13;
        KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Interval);
      }
      while( v13 < 5 );
      MiDereferenceControlAreaFile(0i64, v14);
      CurrentThread = v17;
      v6 = RegionSize;
    }
    else
    {
      LODWORD(v16) = v11;
      v12 = MiFlushSectionInternal(0i64, 0i64, 0i64, 0i64, 0i64, v16, v8);
    }
    if( v12 < 0 || v8->Information )
      v8->Information = v8->Information;
    else
      v8->Information = v6;
    CurrentThread->CacheManagerActive = Offseta.anonymous_0.LowPart;
    MiFlushRelease(0i64, 0i64, 0i64);
  }
}

Referenced by:

CcFlushCachePriv
CcMdlWriteComplete2
CcPurgeAndClearCacheSection
CcSetFileSizesEx
CcUnpinRepinnedBcb
MiFlushDataSection