MiPfIssueCoalescedSupport
_MMINPAGE_SUPPORT *__stdcall MiPfIssueCoalescedSupport(_LIST_ENTRY *CoalescedList, UINT64 CoalescedSize){
_LARGE_INTEGER v2;
__int64 v3;
_MMINPAGE_SUPPORT *result;
_MMINPAGE_SUPPORT *v6;
$DA99D4CD11841341409C225E54F97692 *v7;
int v8;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v10;
_LIST_ENTRY *Blink;
_FILE_OBJECT *v12;
ULONG v13;
unsigned __int64 v14;
size_t v15;
unsigned __int64 v16;
__int64 Blink_low;
NTSTATUS v18;
UINT64 Flags;
_LARGE_INTEGER StartingOffset;
_FILE_OBJECT *FileObject;
v2.QuadPart = 0i64;
v3 = (unsigned int)CoalescedSize;
StartingOffset.QuadPart = 0i64;
result = (_MMINPAGE_SUPPORT *)MiAllocatePool(64i64, 8 * ((unsigned int)CoalescedSize >> 12) + 320, 0x7343694Dui64);
v6 = result;
if( result )
{
MiInitializeInPageSupport(result, 0i64);
v6->u1.e1._bf_0 |= 0x800000u;
v6->Mdl.Next = 0i64;
v7 = &v6->320;
v6->Mdl.MdlFlags = 0;
v8 = 0;
v6->Mdl.Size = 8 * (((unsigned __int64)(v3 + 4095) >> 12) + 6);
v6->Mdl.StartVa = 0i64;
v6->Mdl.ByteOffset = 0;
v6->Mdl.ByteCount = v3;
v6->Mdl.MdlFlags |= 0x4042u;
FileObject = (_FILE_OBJECT *)MmBadPointer;
while( 1 )
{
Flink = CoalescedList->Flink;
if( CoalescedList->Flink == CoalescedList )
break;
if( Flink->Blink != CoalescedList
|| (v10 = Flink->Flink, Flink->Flink->Blink != Flink)
|| (CoalescedList->Flink = v10,
v10->Blink = CoalescedList,
Blink = v6->ListHead[0].Blink,
Blink->Flink != v6->ListHead) )
{
__fastfail(3u);
}
Flink->Blink = Blink;
Flink->Flink = v6->ListHead;
Blink->Flink = Flink;
v6->ListHead[0].Blink = Flink;
if( (WORD1(Flink[17].Blink) & 0x4000) == 0 )
v6->Mdl.MdlFlags &= ~0x4000u;
if( v8 )
{
if( (_LIST_ENTRY *)v2.QuadPart != Flink[6].Flink )
{
v6->Mdl.MdlFlags &= ~0x4000u;
v13 = LODWORD(Flink[6].Flink) - v2.anonymous_0.LowPart;
v14 = (unsigned __int64)(8 * (v13 >> 12)) >> 3;
memset64(v7, *(&stru_140C4DB30 + 497), v14);
v7 = ($DA99D4CD11841341409C225E54F97692 *)((char *)v7 + 8 * v14);
v2.QuadPart += v13;
v8 += v13;
}
}
else
{
v2 = (_LARGE_INTEGER)Flink[6].Flink;
v12 = (_FILE_OBJECT *)Flink[12].Blink;
StartingOffset = v2;
FileObject = v12;
}
v15 = 8 * (LODWORD(Flink[11].Blink) >> 12);
v16 = v15;
memmove(v7, &Flink[20], v15);
Blink_low = LODWORD(Flink[11].Blink);
v2.QuadPart += Blink_low;
v8 += Blink_low;
v7 = ($DA99D4CD11841341409C225E54F97692 *)((char *)v7 + 8 * (v16 >> 3));
}
LODWORD(Flags) = 6;
v18 = IoPageReadEx(FileObject, &v6->Mdl, &StartingOffset, (_KEVENT *)&v6->ListHead[1], &v6->IoStatus, Flags, 0i64);
if( v18 < 0 )
{
v6->IoStatus.Information = 0i64;
v6->IoStatus.Status = v18;
KeSetEvent((PRKEVENT)&v6->ListHead[1], 0, 0);
}
return v6;
}
return result;
}Referenced by:
MiPfIssueCoalesceCandidates