MiGetPoolPages
INT64 __fastcall MiGetPoolPages(INT64 a1, INT64 a2, INT64 a3){
int v3;
_QWORD *v4;
_MMPFN *v5;
int v7;
signed __int32 v8;
UINT64 Page;
_MMPFN *v10;
unsigned __int64 v12;
INT64 v13;
_MMPFN *v14;
_MMPFN *v15;
char *v16;
_MMPFN *PfnDb;
int v18;
INT64 v19[2];
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT64 v21;
__int128 v22;
INT64 v23;
__int128 v24;
v3 = a2;
memset(&LockHandle, 0, sizeof(LockHandle));
*(_OWORD *)v19 = 0i64;
v4 = (_QWORD *)((char *)SListHead + 176 * (unsigned int)a2);
v5 = 0i64;
v7 = a1;
if( v4[17] )
{
KeAcquireInStackQueuedSpinLock(v4 + 18, &LockHandle);
v12 = v4[17];
v13 = v12;
if( v12 > a3 )
v13 = a3;
if( v13 )
{
v14 = (_MMPFN *)v4[19];
a3 -= v13;
v5 = v14;
v4[17] = v12 - v13;
do
{
v15 = v14;
v14 = *(_MMPFN **)v14;
--v13;
}
while( v13 );
*(_QWORD *)v15 = 0i64;
v4[19] = v14;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( (v7 & 0x40000000) != 0 )
{
v16 = (char *)v5;
if( v5 )
{
PfnDb = MmGetPfnDb();
do
{
MiFillPhysicalPages((PVOID)((v16 - (char *)PfnDb) / 48));
v16 = *(char **)v16;
}
while( v16 );
}
}
if( !a3 )
return(INT64)v5;
}
if( (unsigned int)MiObtainPoolCharges(a3, 0i64) )
{
MiInitializePageColorBase(0i64, (unsigned int)(v3 + 1), (INT64)v19);
if( a3 )
{
while( (unsigned __int64)a3 <= 1
|| (*((_DWORD *)KeGetCurrentThread() + 325) & 2) == 0
|| (unsigned int)MiSufficientAvailablePages((INT64)&MiSystemPartition, a3 + 160) )
{
MiRetryNonPagedAllocation();
v8 = _InterlockedExchangeAdd((volatile signed __int32 *)v19[0], 1u);
Page = MiGetPage(
(_MI_PARTITION *)&MiSystemPartition,
HIDWORD(v19[1]) | (unsigned int)v8 & v19[1],
(v7 & 0x40000000) != 0 ? 782 : 524);
if( Page == -1i64 )
{
MiRetryNonPagedAllocation();
if( !v18 )
break;
}
else
{
v10 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * Page);
MiSetPfnTbFlushStamp(v10, 0i64, 0i64);
*(_QWORD *)v10 = v5;
--a3;
v5 = v10;
}
if( !a3 )
break;
}
if( a3 )
{
v22 = 0i64;
v24 = 0i64;
if( v5 )
{
MiReturnPhysicalPoolPages(v5);
v5 = 0i64;
}
v21 = a3;
v23 = a3;
MiReturnPoolCharges(&v21, 0i64);
}
}
return(INT64)v5;
}
if( v5 )
MiReturnPhysicalPoolPages(v5);
return 0i64;
}Referenced by:
MiInitializePoolCommitPacket