IoSynchronousPageWriteEx

NTSTATUS __stdcall IoSynchronousPageWriteEx(
        _FILE_OBJECT *FileObject,
        _MDL *MemoryDescriptorList,
        _LARGE_INTEGER *StartingOffset,
        _KEVENT *Event,
        UINT8 IrpSpFlags,
        PVOID IoAttributionContext,
        _IO_STATUS_BLOCK *IoStatusBlock){
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  _DEVICE_OBJECT *v12; 
  _DEVICE_OBJECT *v13; 
  _IRP *Irp; 
  _IO_PRIORITY_HINT IoPriorityThread; 
  __int64 v16; 
  _ETHREAD *CurrentThread; 
  _IOP_RESERVE_IRP_TYPE v19; 
  CHAR v20; 
  int v21; 
  _IRP *ReserveIrp; 
  VOID *retaddr; 

  SectionObjectPointer = FileObject->SectionObjectPointer;
  if( SectionObjectPointer && SectionObjectPointer->SharedCacheMap )
  {
    __incgsdword(0x8134u);
    __addgsdword(0x8138u, (MemoryDescriptorList->ByteCount + 4095) >> 12);
  }
  LODWORD(v12) = IoGetRelatedDeviceObject((INT64)FileObject);
  v13 = v12;
  Irp = IopAllocateIrpExReturn(v12, v12->StackSize, 0, retaddr);
  if( !Irp )
  {
    MmIsFileObjectAPagingFile(FileObject);
    if( v21 )
    {
      _InterlockedIncrement((_DWORD *)&stru_140C452E0 + 717);
      LOBYTE(v19) = v13->StackSize;
      ReserveIrp = IopAllocateReserveIrp(v20, v19, IopPagefileWriteIrp);
    }
    else
    {
      _InterlockedIncrement((_DWORD *)&stru_140C452E0 + 715);
      ReserveIrp = IopAllocateBackpocketIrp(v13, v13->StackSize, 0);
    }
    Irp = ReserveIrp;
    if( !ReserveIrp )
      return -1073741670;
  }
  Irp->AllocationFlags |= 0x20u;
  Irp->MdlAddress = MemoryDescriptorList;
  Irp->Flags = 67;
  IoPriorityThread = PsGetIoPriorityThread((_ETHREAD *)KeGetCurrentThread());
  if( IoPriorityThread < IoPriorityNormal )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    if( (CurrentThread->Tcb._bf_0 & 0x400) != 0
      || CurrentThread->Tcb.PreviousMode == 1
      || ((__int64)KeGetCurrentThread()[1].Queue & 0x40) != 0
      || KeGetCurrentThread()[1].TrapFrame == (_KTRAP_FRAME *)2 )
    {
      ++*(&stru_140C452E0 + 250);
    }
    else
    {
      ++*(&stru_140C452E0 + 249);
      IoPriorityThread = IoPriorityNormal;
    }
  }
  Irp->UserIosb = IoStatusBlock;
  Irp->RequestorMode = 0;
  Irp->UserEvent = Event;
  Irp->Flags = ((IoPriorityThread << 17) + 0x20000) | 0x43;
  Irp->UserBuffer = (char *)MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset;
  Irp->Tail.OriginalFileObject = FileObject;
  Irp->Tail.Thread = (_ETHREAD *)KeGetCurrentThread();
  *(_BYTE *)(v16 - 72) = 4;
  *(_DWORD *)(v16 - 64) = MemoryDescriptorList->ByteCount;
  *(_LARGE_INTEGER *)(v16 - 48) = *StartingOffset;
  *(_BYTE *)(v16 - 70) |= IrpSpFlags;
  *(_QWORD *)(v16 - 24) = FileObject;
  if( IoAttributionContext )
    IopSetDiskIoAttributionExtension(Irp, *((_QWORD *)IoAttributionContext + 3));
  else
    IoSetDiskIoAttributionFromThread(Irp, Irp->Tail.Thread);
  IopQueueThreadIrp(Irp);
  return IofCallDriver((UINT64)v13, (UINT64)Irp);
}

Referenced by:

IoSynchronousPageWrite
MiIssueSynchronousFlush
MiSynchronousPageWrite
MiZeroPageWrite