MiAllocateSlabEntry
_QWORD *__fastcall MiAllocateSlabEntry(INT64 a1, _MI_PARTITION *Partition, int a3){
_QWORD *Pool;
_QWORD *v7;
INT64 *v8;
int v9;
unsigned int v10;
UINT64 v11;
_MMPFN *PfnDb;
_MMPFN *v13;
unsigned __int64 v14;
unsigned __int8 CurrentIrql;
_MIPFNBLINK *p_u2;
unsigned __int64 v17;
int v19[8];
UINT64 PreferredNode;
UINT64 Flags;
UINT64 *StartingPfn;
__int64 v23;
INT64 *v24;
UINT64 SpinCount;
if( !MiSlabAllocatorRecentFailure(a1) )
{
Pool = MiAllocatePool(64i64, 0x90ui64, 0x6553694Dui64);
v7 = Pool;
if( Pool )
{
Pool[5] = a1;
Pool[7] = Pool + 8;
v8 = Pool + 3;
*((_DWORD *)Pool + 12) = 512;
v9 = a3 & 0x40;
*((_DWORD *)Pool + 33) = 512;
v10 = v9 != 0;
if( (a3 & 0x40) == 0 )
a3 |= 0x40u;
do
{
v24 = v8;
v23 = 0i64;
LODWORD(StartingPfn) = a3 | 0x40000001;
LODWORD(Flags) = 0x80000000;
LODWORD(PreferredNode) = 0x80000000;
if( MiFindContiguousPages(
Partition,
0i64,
0xFFFFFFFFFui64,
0x200ui64,
0x200ui64,
MiCached,
PreferredNode,
Flags,
StartingPfn) >= 0 )
{
v11 = (unsigned __int64)*v8 >> 9;
v7[4] = *v8 + 511;
RtlInterlockedSetClearRunEx((_RTL_BITMAP_EX *)((char *)&stru_140C50B28 + 6040), v11, 1ui64);
PfnDb = MmGetPfnDb();
v13 = &PfnDb[*v8];
v14 = (unsigned __int64)&PfnDb[v7[4]];
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
if( (unsigned __int64)v13 <= v14 )
{
p_u2 = &v13->u2;
do
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)p_u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( p_u2->_bf_0 < 0 );
}
_InterlockedOr(v19, 0);
v17 = (p_u2->_bf_0 ^ ((unsigned __int64)(unsigned int)KiTbFlushTimeStamp << 56)) & 0xF00000000000000i64;
LOWORD(p_u2[1]._bf_0) = 0;
p_u2->_bf_0 ^= v17;
MiReInitializeFreeSlabPfn((INT64)&p_u2[-3], a1);
if( !*(_DWORD *)(a1 + 48) )
{
p_u2[2]._bf_0 = p_u2[2]._bf_0 & 0x8FFFFFFFFFFFFFFFui64 | 0x3000000000000000i64;
MiAbortCombineScan((_MMPFN *)&p_u2[-3]);
}
_InterlockedAnd64(&p_u2->Lock, 0x7FFFFFFFFFFFFFFFui64);
p_u2 += 6;
}
while( (unsigned __int64)&p_u2[-3] <= v14 );
}
__writecr8(CurrentIrql);
MiUpdateSlabPagePlaceholderState(a1, *v8, 512i64, 1);
return v7;
}
a3 &= ~0x40u;
++v10;
}
while( v10 < 2 );
ExFreePoolWithTag(v7, 0);
if( v9 )
return 0i64;
}
*(_QWORD *)(a1 + 112) = KiQueryUnbiasedInterruptTime(1u);
}
return 0i64;
}Referenced by:
MiReplenishSlabAllocator