MiAllocateFastLargePagesForMdl
NTSTATUS __fastcall MiAllocateFastLargePagesForMdl(UINT64 rcx0, UINT64 edx0, INT8 a3){
unsigned int v4;
int v6;
__int64 v7;
__int64 v8;
int v9;
int v10;
unsigned __int64 v11;
_MI_LARGEPAGE_MEMORY_INFO *LargeZeroPages;
int v13;
unsigned __int8 CurrentIrql;
__int64 v15;
_QWORD *v16;
INT64 *v17;
unsigned __int64 v18;
INT64 v19;
unsigned int v20;
__int64 v21;
__int64 v22;
UINT64 ZeroFillNeeded;
INT64 *v25[2];
__int128 v26;
INT64 v27[48];
v4 = edx0;
memset(v27, 0i64, sizeof(v27));
v6 = *(_DWORD *)(rcx0 + 60);
v7 = *(_QWORD *)(rcx0 + 64);
v8 = 4i64;
*(_OWORD *)v25 = 0i64;
v26 = 0i64;
if( v6 )
{
if( v6 == 2 )
{
v9 = 28;
}
else
{
v9 = 4;
if( v6 == 3 )
v9 = 0;
}
}
else
{
v9 = 12;
}
v10 = a3 & 1;
v11 = (unsigned __int64)*(unsigned int *)(v7 + 40) >> 12;
LODWORD(ZeroFillNeeded) = v9;
LargeZeroPages = MiAllocateLargeZeroPages(
*(_QWORD *)rcx0,
*(_QWORD *)(rcx0 + 40) - v11,
*(_QWORD *)(rcx0 + 32),
v4,
ZeroFillNeeded);
v13 = (int)LargeZeroPages;
if( LargeZeroPages )
{
CurrentIrql = KeGetCurrentIrql();
MiInitializeDpcGang((INT64)v27, v4, CurrentIrql < 2u ? 0 : 2);
LODWORD(v27[23]) |= 0x40u;
v15 = 0i64;
*(_QWORD *)(rcx0 + 72) = KeGetCurrentThread()->ApcState.Process;
v27[0] = rcx0;
v16 = (_QWORD *)(v7 + 48 + 8 * v11);
do
{
v17 = v25[v15];
v18 = MiLargePageSizes[v15];
if( v17 )
{
do
{
v19 = *v17;
v20 = 0;
v21 = ((char *)v17 - (char *)MmGetPfnDb()) / 48;
if( v18 )
{
v22 = 0i64;
do
{
++v20;
*v16++ = v21 + v22;
v22 = v20;
}
while( v20 < v18 );
}
MiInsertDpcGang((INT64)v27, v17);
v17 = (INT64 *)v19;
}
while( v19 );
}
++v15;
--v8;
}
while( v8 );
*(_DWORD *)(v7 + 40) += v13 << 12;
MiStartDpcGang((UINT64 *)v27);
MiEndDpcGang((INT64)v27);
*(_QWORD *)(v7 + 16) = 0i64;
LODWORD(LargeZeroPages) = 2;
*(_WORD *)(v7 + 10) |= 2u;
if( v10 )
*(_QWORD *)(v7 + 24) = 1i64;
}
return(int)LargeZeroPages;
}Referenced by:
MiFindPagesForMdl