IoAsynchronousPageWrite

NTSTATUS __stdcall IoAsynchronousPageWrite(
        _FILE_OBJECT *FileObject,
        _MDL *MemoryDescriptorList,
        _LARGE_INTEGER *StartingOffset,
        VOID *ApcRoutine,
        VOID *a5,
        _IO_STATUS_BLOCK *a6,
        UINT64 a7,
        VOID *ApcContext,
        _IO_PRIORITY_HINT Priority,
        UINT64 HybridPriority,
        UINT8 IrpSpFlags,
        VOID *IoAttributionContext,
        _IO_STATUS_BLOCK *IoStatusBlock,
        _IRP **Irp){
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  _DEVICE_OBJECT *v19; 
  _DEVICE_OBJECT *v20; 
  _IRP *v21; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  _ETHREAD *CurrentThread; 
  NTSTATUS result; 
  _IOP_RESERVE_IRP_TYPE v25; 
  CHAR v26; 
  int v27; 
  _IRP *ReserveIrp; 
  unsigned __int8 CurrentIrql; 
  VOID *retaddr; 

  SectionObjectPointer = FileObject->SectionObjectPointer;
  if( SectionObjectPointer && SectionObjectPointer->SharedCacheMap )
  {
    __incgsdword(0x8134u);
    __addgsdword(0x8138u, (MemoryDescriptorList->ByteCount + 4095) >> 12);
  }
  LODWORD(v19) = IoGetRelatedDeviceObject((INT64)FileObject);
  v20 = v19;
  v21 = IopAllocateIrpExReturn(v19, v19->StackSize, 0, retaddr);
  if( !v21 )
  {
    MmIsFileObjectAPagingFile(FileObject);
    if( v27 )
    {
      _InterlockedAdd((_DWORD *)&stru_140C452E0 + 713, 1u);
      LOBYTE(v25) = v20->StackSize;
      ReserveIrp = IopAllocateReserveIrp(v26, v25, IopPagefileWriteIrp);
    }
    else
    {
      _InterlockedAdd((_DWORD *)&stru_140C452E0 + 716, 1u);
      ReserveIrp = IopAllocateBackpocketIrp(v20, v20->StackSize, 0);
    }
    v21 = ReserveIrp;
    if( !ReserveIrp )
      return -1073741670;
  }
  if( IrpSpFlags )
    *(_QWORD *)IrpSpFlags = v21;
  v21->AllocationFlags |= 0x20u;
  CurrentStackLocation = v21->Tail.CurrentStackLocation;
  v21->MdlAddress = MemoryDescriptorList;
  v21->Flags = (((_DWORD)a6 + 1) << 17) | 3;
  v21->Tail.Thread = (_ETHREAD *)KeGetCurrentThread();
  v21->Tail.OriginalFileObject = FileObject;
  v21->UserBuffer = (char *)MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset;
  v21->RequestorMode = 0;
  v21->UserIosb = (_IO_STATUS_BLOCK *)HybridPriority;
  v21->Overlay.UserApcRoutine = (void(__fastcall *)(void *, _IO_STATUS_BLOCK *, unsigned int))ApcRoutine;
  v21->Overlay.UserApcContext = a5;
  CurrentStackLocation[-1].MajorFunction = 4;
  LODWORD(CurrentStackLocation[-1].Parameters.SecurityContext) = MemoryDescriptorList->ByteCount;
  *(_LARGE_INTEGER *)&CurrentStackLocation[-1].Parameters.FileAttributes = *StartingOffset;
  CurrentStackLocation[-1].Flags |= (unsigned __int8)ApcContext;
  CurrentStackLocation[-1].FileObject = FileObject;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( *(_QWORD *)&Priority )
    IopSetDiskIoAttributionExtension(v21, *(_QWORD *)(*(_QWORD *)&Priority + 24i64));
  else
    IoSetDiskIoAttributionFromThread(v21, CurrentThread);
  IopQueueThreadIrp(v21);
  if( (_DWORD)a7 )
    StRtlIoStorInfoSetNvCachePriority(v21, a7);
  result = IofCallDriver((UINT64)v20, (UINT64)v21);
  if( (result & 0xC0000000) == -1073741824 )
  {
    *(_QWORD *)(HybridPriority + 8) = 0i64;
    *(_DWORD *)HybridPriority = result;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(1ui64);
    ((void(__fastcall *)(VOID *, UINT64, _QWORD))ApcRoutine)(a5, HybridPriority, 0i64);
    __writecr8(CurrentIrql);
    return 259;
  }
  return result;
}

Referenced by:

MiGatherMappedPages
MiGatherPagefilePages
MiIssueAsynchronousFlush