MmFlushVirtualMemory

NTSTATUS __stdcall MmFlushVirtualMemory(
        _EPROCESS *Process,
        VOID **BaseAddress,
        UINT64 *RegionSize,
        _IO_STATUS_BLOCK *IoStatus){
  unsigned __int64 v4; 
  NTSTATUS v5; 
  UINT64 v7; 
  VOID *v8; 
  unsigned __int64 v9; 
  unsigned int v10; 
  __int64 v11; 
  UINT64 v12; 
  void *v13; 
  unsigned __int64 v14; 
  int v15; 
  _CONTROL_AREA *v16; 
  int v17; 
  _SUBSECTION *v18; 
  _ETHREAD *v19; 
  int v20; 
  _FILE_OBJECT *v21; 
  _IO_STATUS_BLOCK *v22; 
  int v23; 
  _SUBSECTION *LastSubsection; 
  _IO_STATUS_BLOCK *v26; 
  UINT64 Flags; 
  UINT8 v28; 
  int v29; 
  _MMPTE *v30; 
  INT64 v31; 
  _ETHREAD *CurrentThread; 
  _SUBSECTION *Subsection; 
  _IO_STATUS_BLOCK *v34; 
  UINT64 *v35; 
  _KAPC_STATE ApcState; 

  v4 = (unsigned __int64)*BaseAddress;
  v5 = 0;
  v34 = IoStatus;
  ApcState.ApcListHead[0] = 0i64;
  v35 = RegionSize;
  v7 = *RegionSize + v4 - 1;
  v8 = (VOID *)(v4 & 0xFFFFFFFFFFFFF000ui64);
  Subsection = 0i64;
  *BaseAddress = v8;
  v9 = v7 | 0xFFF;
  memset(&ApcState.ApcListHead[1], 0, 32);
  v10 = 0;
  LODWORD(v31) = 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( CurrentThread->Tcb.ApcState.Process != Process )
  {
    v10 = 2;
    KiStackAttachProcess(Process, 0i64, &ApcState);
  }
  v29 = 0;
  v28 = KeAreAllApcsDisabled();
  LODWORD(v11) = MiObtainReferencedVadEx((UINT64)v8, 2, &v31);
  v13 = (void *)v11;
  if( !v11 )
  {
    v5 = v31;
    if( (_DWORD)v31 == -1073741664 )
      v5 = -1073741799;
    goto LABEL_24;
  }
  v14 = *(unsigned int *)(v11 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v11 + 33) << 32);
  if( !*RegionSize )
  {
    v9 = (v14 << 12) | 0xFFF;
    v10 |= 1u;
  }
  v15 = *(_DWORD *)(v11 + 48);
  if( (v15 & 0x100000) != 0 || v9 >> 12 > v14 )
  {
LABEL_30:
    v5 = -1073741799;
    goto LABEL_23;
  }
  v16 = **(_CONTROL_AREA ***)(v11 + 72);
  v31 = (INT64)v16;
  if( v16->FilePointer.Value && (v15 & 0x70) != 32 )
  {
    *v35 = v9 - (_QWORD)v8 + 1;
    if( !v28 )
    {
      v17 = 0;
      if( (v16->u.LongFlags & 0x20000) != 0 )
        v17 = 4;
      v29 = v17;
    }
    MiFlushDirtyBitsToPfn(v8, (VOID *)v9, CurrentThread, v12);
    MiGetProtoPteAddress();
    MiGetProtoPteAddress();
    v18 = Subsection;
    CurrentThread = v19;
    if( Subsection )
    {
      if( (v10 & 1) != 0 )
      {
        LastSubsection = MiFindLastSubsection(v16, 0i64);
        v30 = &LastSubsection->SubsectionBase[LastSubsection->PtesInSubsection
                                            - (unsigned __int64)(LastSubsection->_bf_34 & 0x3FFFFFFF)
                                            - 1];
        MiFlushAcquire(v16, v18, LastSubsection);
        if( v20 )
        {
          MiUnlockAndDereferenceVadShared(v13);
          if( v10 >= 2 )
            KiUnstackDetachProcess(&ApcState, 0i64);
          v21 = MiReferenceControlAreaFile(v16);
          v22 = v34;
          while( 1 )
          {
            v23 = FsRtlAcquireFileForCcFlushEx(v21);
            if( v23 < 0 )
              break;
            LODWORD(Flags) = v29;
            v23 = MiFlushSectionInternal((_MMPTE *)CurrentThread, v30, v18, LastSubsection, 0i64, Flags, v22);
            FsRtlReleaseFileForCcFlush(v21);
            if( v23 != -1073741740 )
              break;
            KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Interval);
          }
          MiDereferenceControlAreaFile((_CONTROL_AREA *)v31, v21);
          MiFlushRelease((_CONTROL_AREA *)v31, v18, LastSubsection);
          return v23;
        }
        v5 = -1073741670;
        goto LABEL_23;
      }
    }
    else if( (v10 & 1) != 0 )
    {
      v26 = v34;
      v34->Status = 0;
      v26->Information = 0i64;
      goto LABEL_23;
    }
    goto LABEL_30;
  }
  v5 = -1073741688;
LABEL_23:
  MiUnlockAndDereferenceVadShared(v13);
LABEL_24:
  if( v10 >= 2 )
    KiUnstackDetachProcess(&ApcState, 0i64);
  return v5;
}

Referenced by:

CMFFlushHitsFile
NtFlushVirtualMemory