MiGetPoolPages
NTSTATUS __stdcall MiGetPoolPages(INT64 a1, INT64 a2, INT64 a3){
int v3;
_QWORD *v4;
_MMPFN *v5;
int v7;
signed __int32 v8;
__int64 v9;
_MMPFN *v10;
unsigned __int64 v12;
INT64 v13;
_MMPFN *bf_0;
$559D8309DABD45803AD694472C7FC28A *v15;
$559D8309DABD45803AD694472C7FC28A *v16;
_MMPFN *PfnDb;
int v18;
_MI_COLOR_BASE ColorBase[4];
_KLOCK_QUEUE_HANDLE LockHandle;
UINT64 v21;
__int128 v22;
INT64 v23;
__int128 v24;
v3 = a2;
memset(&LockHandle, 0, sizeof(LockHandle));
*(_OWORD *)ColorBase = 0i64;
v4 = (_QWORD *)(*(&stru_140C4DB30 + 22) + 176i64 * (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 )
{
bf_0 = (_MMPFN *)v4[19];
a3 -= v13;
v5 = bf_0;
v4[17] = v12 - v13;
do
{
v15 = ($559D8309DABD45803AD694472C7FC28A *)bf_0;
bf_0 = (_MMPFN *)bf_0->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
--v13;
}
while( v13 );
v15->_bf_0 = 0i64;
v4[19] = bf_0;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( (v7 & 0x40000000) != 0 )
{
v16 = ($559D8309DABD45803AD694472C7FC28A *)v5;
if( v5 )
{
PfnDb = MmGetPfnDb();
do
{
MiFillPhysicalPages((PVOID)(((char *)v16 - (char *)PfnDb) / 48));
v16 = ($559D8309DABD45803AD694472C7FC28A *)v16->_bf_0;
}
while( v16 );
}
}
if( !a3 )
return(int)v5;
}
if( MiObtainPoolCharges(a3, 0i64) )
{
MiInitializePageColorBase(0i64, (unsigned int)(v3 + 1), ColorBase);
if( a3 )
{
while( (unsigned __int64)a3 <= 1
|| (*(_DWORD *)&KeGetCurrentThread()[1].gapD8[12] & 2) == 0
|| MiSufficientAvailablePages((INT64)&Irp, a3 + 160) )
{
MiRetryNonPagedAllocation();
v8 = _InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
LODWORD(v9) = MiGetPage(
(ULONG_PTR *)&Irp.Core.PartitionId,
ColorBase[3] | (unsigned int)v8 & ColorBase[2],
(v7 & 0x40000000) != 0 ? 782 : 524);
if( v9 == -1 )
{
MiRetryNonPagedAllocation();
if( !v18 )
break;
}
else
{
v10 = &MmGetPfnDb()[v9];
MiSetPfnTbFlushStamp(v10, 0i64, 0i64);
v10->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (__int64)v5;
--a3;
v5 = v10;
}
if( !a3 )
break;
}
if( a3 )
{
v22 = 0i64;
v24 = 0i64;
if( v5 )
{
MiReturnPhysicalPoolPages(v5);
LODWORD(v5) = 0;
}
v21 = a3;
v23 = a3;
MiReturnPoolCharges(&v21, 0i64);
}
}
return(int)v5;
}
if( v5 )
MiReturnPhysicalPoolPages(v5);
return 0;
}Referenced by:
MiInitializePoolCommitPacket