MiIssueAsynchronousFlush

_MI_FLUSH_ENTRY *__stdcall MiIssueAsynchronousFlush(
        _FILE_OBJECT *FileObject,
        _MI_FLUSH_ENTRY *FlushEntry,
        _MI_FLUSH_ARRAY *FlushArray,
        _MI_OVERLAPPED_FLUSH_ENTRY *OverlappedFlushEntry,
        UINT64 StartingOffset,
        UINT8 IrpSpFlags,
        _IO_PRIORITY_HINT IoPriority,
        VOID *IoAttributionContext){
  _MDL *v10; 
  _MI_FLUSH_ENTRY *v11; 
  NTSTATUS v12; 
  unsigned __int8 CurrentIrql; 
  int v15; 
  unsigned __int8 v16; 
  _IO_STATUS_BLOCK *Alertable; 
  UINT64 v18; 
  VOID *ApcContext; 
  VOID *v20; 
  _IO_STATUS_BLOCK *v21; 
  _IRP **v22; 

  *((_BYTE *)FlushEntry + 50) = 6;
  *((_WORD *)FlushEntry + 24) = 0;
  *((_QWORD *)FlushEntry + 8) = FlushEntry + 14;
  *((_QWORD *)FlushEntry + 7) = FlushEntry + 14;
  FlushEntry[13] = 0;
  v10 = (_MDL *)*((_QWORD *)FlushEntry + 9);
  v11 = FlushEntry;
  *FlushEntry = 0;
  *((_QWORD *)FlushEntry + 1) = 0i64;
  *((_QWORD *)FlushEntry + 2) = (char *)v10 + 8 * ((unsigned __int64)v10->ByteCount >> 12) + 48;
  if( OverlappedFlushEntry )
    _InterlockedAdd(OverlappedFlushEntry + 4, 1u);
  LOBYTE(ApcContext) = IrpSpFlags;
  LODWORD(v18) = 0;
  LODWORD(Alertable) = IoPriority;
  v12 = IoAsynchronousPageWrite(
          FileObject,
          v10,
          (_LARGE_INTEGER *)&StartingOffset,
          MiFlushComplete,
          FlushEntry,
          Alertable,
          v18,
          ApcContext,
          (_IO_PRIORITY_HINT)IoAttributionContext,
          (UINT64)FlushEntry,
          (_BYTE)FlushEntry + 24,
          v20,
          v21,
          v22);
  if( (v12 & 0xC0000000) == -1073741824 )
  {
    *v11 = v12;
    *((_QWORD *)v11 + 1) = 0i64;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(1ui64);
    MiFlushComplete(v11, (_IO_STATUS_BLOCK *)v11, 0i64);
    __writecr8(CurrentIrql);
    if( OverlappedFlushEntry )
      OverlappedFlushEntry[5] = v12;
    v10->ByteCount = 0;
  }
  else
  {
    v15 = 0;
    v16 = KeGetCurrentIrql();
    __writecr8(1ui64);
    do
    {
LABEL_9:
      v11 += 66;
      if( v11 >= FlushArray + 528 )
        v11 = FlushArray;
      if( !*((_QWORD *)v11 + 2) || v11[13] == 1 )
      {
        __writecr8(v16);
        return v11;
      }
      ++v15;
    }
    while( v15 != 8 );
    __writecr8(v16);
    KeWaitForMultipleObjects(
      8ui64,
      (VOID **)FlushArray + 264,
      WaitAny,
      WrPageOut,
      0,
      0,
      0i64,
      (_KWAIT_BLOCK *)(FlushArray + 544));
    v11 = FlushArray;
    while( *v11 >= 0 )
    {
      v11 += 66;
      if( !--v15 )
      {
        v16 = KeGetCurrentIrql();
        __writecr8(1ui64);
        goto LABEL_9;
      }
    }
    *(_DWORD *)(*((_QWORD *)v11 + 9) + 40i64) = 0;
  }
  return 0i64;
}

Referenced by:

MiFlushSectionInternal