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