MiRebuildLargeZeroPage
VOID __stdcall MiRebuildLargeZeroPage(INT64 rcx0){
unsigned __int64 v1;
unsigned __int64 v3;
unsigned __int64 v4;
unsigned __int64 v5;
__int64 v6;
unsigned __int64 v7;
_QWORD *v8;
__int64 v9;
unsigned __int64 v10;
INT64 v11;
__int64 v12;
__int64 v13;
unsigned __int8 CurrentIrql;
__int64 v15;
_BYTE *v16;
unsigned __int64 v17;
_WORD *v18;
_KLOCK_QUEUE_HANDLE LockQueue;
v1 = 0i64;
v3 = 0i64;
memset(&LockQueue, 0, sizeof(LockQueue));
LABEL_2:
v4 = *(_QWORD *)(rcx0 + 5112);
v5 = v3;
v6 = *(_QWORD *)(rcx0 + 5120);
if( v3 >= v4 )
v5 = 0i64;
v7 = v4 - 1;
while( 1 )
{
if( v7 - v5 != -1i64 )
{
v8 = (_QWORD *)(v6 + 8 * (v5 >> 6));
v9 = ((1i64 << (v5 & 0x3F)) - 1) | ~*v8;
if( v9 == -1 )
{
while( (unsigned __int64)++v8 <= v6 + 8 * (v7 >> 6) )
{
v9 = ~*v8;
if( *v8 )
goto LABEL_7;
}
}
else
{
LABEL_7:
_BitScanForward64((unsigned __int64 *)&v9, ~v9);
v10 = v9 + (((__int64)v8 - v6) >> 3 << 6);
if( v10 <= v7 && v10 != -1i64 )
{
v11 = v10 << 18;
LODWORD(v12) = MiSearchNumaNodeTable((PVOID)(v10 << 18));
v13 = *(_QWORD *)(rcx0 + 16) + 4544i64 * *(unsigned int *)(v12 + 8);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(v13 + 4328);
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(v13 + 4328));
_bittestandreset64(*(signed __int64 **)(rcx0 + 5120), v10);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
__writecr8(CurrentIrql);
v3 = v10 + 1;
v15 = 512i64;
v16 = (_BYTE *)(*(_QWORD *)(rcx0 + 5104) + (v10 << 9));
do
{
if( *v16 == 32 )
MiCoalesceFreeLargePages(rcx0, v11, 2ui64);
v11 += 512i64;
++v16;
--v15;
}
while( v15 );
goto LABEL_2;
}
}
}
if( !v5 )
break;
v17 = v3 + 1;
if( v3 + 1 > v4 )
v17 = *(_QWORD *)(rcx0 + 5112);
v7 = v17 - 1;
v5 = 0i64;
}
if( _InterlockedExchange((volatile __int32 *)(rcx0 + 5136), 0) )
{
v18 = *(_WORD **)(rcx0 + 5128);
do
{
if( *v18 == 512 )
MiCoalesceFreeLargePages(rcx0, v1, 1ui64);
++v18;
v1 += 0x40000i64;
}
while( v1 < 0x1000000000i64 );
}
}Referenced by:
MiRebuildLargePagesThread