MiGetHugeRangeFromNode
INT64 __fastcall MiGetHugeRangeFromNode(_QWORD *a1, UINT64 a2, INT64 a3){
__int64 v3;
INT64 v4;
__int64 v6;
unsigned int v7;
__int64 v8;
_QWORD *v9;
__int64 v10;
_QWORD *v11;
int v12;
_QWORD *v13;
__int64 v14;
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT64 *SpinLock;
int v18;
v18 = a3;
v3 = a1[770];
v4 = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
v6 = a1[2] + 4544i64 * (unsigned int)a2;
if( v3 )
{
v7 = dword_140C4DCC0[0];
v8 = (unsigned int)dword_140C4DCC0[0];
v9 = (_QWORD *)(v3 + 8i64 * (unsigned int)(2 * a2 * dword_140C4DCC0[0]));
if( (_DWORD)a3 )
{
v10 = 0i64;
}
else
{
v9 += (unsigned int)dword_140C4DCC0[0];
v10 = 1i64;
}
v11 = 0i64;
SpinLock = a1 + 516;
KeAcquireInStackQueuedSpinLock(a1 + 516, &LockHandle);
while( 1 )
{
if( *(_QWORD *)(v6 + 8 * v10 + 4192) )
{
v4 &= 0xFFFFFFFFFFFC0000ui64;
v12 = 0;
v11 = &v9[*(_DWORD *)(v6 + 4184) % v7];
if( v7 )
{
while( 1 )
{
v4 ^= (v4 ^ *v11) & 0x3FFFF;
if( (v4 & 0x3FFFF) != 0 )
break;
v13 = v11 + 1;
v11 = v9;
if( v13 != &v9[v8] )
v11 = v13;
if( ++v12 >= v7 )
goto LABEL_14;
}
MiUnlinkHugeRange((INT64)a1, v4);
}
}
LABEL_14:
v14 = v4 & 0x3FFFF;
if( (v4 & 0x3FFFF) != 0 )
break;
if( v18 )
{
if( v10 )
goto LABEL_22;
v9 += v8;
v10 = 1i64;
}
else
{
if( v10 != 1 )
goto LABEL_22;
v10 = 0i64;
v9 -= v8;
}
v7 = v8;
}
*(_DWORD *)(v6 + 4184) = v11 - v9 + 1;
LABEL_22:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v14 && v18 && (*(_DWORD *)(qword_140C4E3B0 + 8 * v14) & 0x3FFFF) == 1i64 )
{
MiHugePageOperation(v4);
KeAcquireInStackQueuedSpinLock(SpinLock, &LockHandle);
*(_QWORD *)(qword_140C4E3B0 + 8 * v14) &= 0xFFFFFFFFFFFC0000ui64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
}
return v4;
}Referenced by:
MiAllocatePartitionPhysicalPages