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