MiAllocateSlabEntry
_QWORD *__fastcall MiAllocateSlabEntry(INT64 a1, UINT64 PageFrameIndex, INT64 a3){
int v3;
__int64 v6;
_QWORD *v7;
INT64 *v8;
int v9;
__int64 v10;
UINT64 v11;
_MMPFN *PfnDb;
char *v13;
unsigned __int64 v14;
unsigned __int8 CurrentIrql;
char *v16;
unsigned __int64 v17;
int v19[8];
UINT64 PreferredNode;
UINT64 PreferredChannel;
UINT64 Flags;
INT64 *v23;
UINT64 SpinCount;
v3 = a3;
if( !(unsigned int)MiSlabAllocatorRecentFailure(a1) )
{
LODWORD(v6) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v7 = (_QWORD *)v6;
if( v6 )
{
*(_QWORD *)(v6 + 40) = a1;
*(_QWORD *)(v6 + 56) = v6 + 64;
v8 = (INT64 *)(v6 + 24);
*(_DWORD *)(v6 + 48) = 512;
v9 = v3 & 0x40;
*(_DWORD *)(v6 + 132) = 512;
v10 = v9 != 0;
if( (v3 & 0x40) == 0 )
v3 |= 0x40u;
do
{
v23 = v8;
LODWORD(Flags) = v3 | 0x40000001;
LODWORD(PreferredChannel) = 0x80000000;
LODWORD(PreferredNode) = 0x80000000;
if( (int)MiFindContiguousPages(
(_MI_PARTITION *)PageFrameIndex,
0i64,
0xFFFFFFFFFui64,
0x200ui64,
0x200ui64,
MiCached,
PreferredNode,
PreferredChannel,
Flags,
0i64) >= 0 )
{
v11 = (unsigned __int64)*v8 >> 9;
v7[4] = *v8 + 511;
RtlInterlockedSetClearRunEx((INT64)&qword_140C522C0, v11, 1ui64);
PfnDb = MmGetPfnDb();
v13 = (char *)PfnDb + 48 * *v8;
v14 = (unsigned __int64)PfnDb + 48 * v7[4];
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
if( (unsigned __int64)v13 <= v14 )
{
v16 = v13 + 24;
do
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v16, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)v16 < 0 );
}
_InterlockedOr(v19, 0);
v17 = (*(_QWORD *)v16 ^ ((unsigned __int64)(unsigned int)KiTbFlushTimeStamp << 56)) & 0xF00000000000000i64;
*((_WORD *)v16 + 4) = 0;
*(_QWORD *)v16 ^= v17;
MiReInitializeFreeSlabPfn((INT64)(v16 - 24), a1);
if( !*(_DWORD *)(a1 + 48) )
{
*((_QWORD *)v16 + 2) = *((_QWORD *)v16 + 2) & 0x8FFFFFFFFFFFFFFFui64 | 0x3000000000000000i64;
MiAbortCombineScan((INT64)(v16 - 24));
}
_InterlockedAnd64((volatile signed __int64 *)v16, 0x7FFFFFFFFFFFFFFFui64);
v16 += 48;
}
while( (unsigned __int64)(v16 - 24) <= v14 );
}
__writecr8(CurrentIrql);
MiUpdateSlabPagePlaceholderState(a1, *v8, 512i64, 1i64);
return v7;
}
v3 &= ~0x40u;
LODWORD(v10) = v10 + 1;
}
while( (unsigned int)v10 < 2 );
ExFreePoolWithTag(v7, 0);
if( v9 )
return 0i64;
}
*(_QWORD *)(a1 + 112) = KiQueryUnbiasedInterruptTime(1u);
}
return 0i64;
}Referenced by:
MiReplenishSlabAllocator