MiGetUltraHugeAlreadyActive
VOID __stdcall MiGetUltraHugeAlreadyActive(_EPROCESS *Process){
__int64 v1;
int v2;
UINT8 *v3;
__int64 v4;
__int64 v5;
__int64 v6;
unsigned int ClearBitsAndSet;
__int16 v8;
__int64 v9;
_QWORD **v10;
_QWORD *i;
_QWORD *v12;
unsigned int v13;
VOID *v14;
_TABLE_SEARCH_RESULT v15;
UINT64 v16;
UINT64 SpinCount;
LODWORD(SpinCount) = v2;
v16 = (UINT64)Process;
v4 = *(_QWORD *)(v1 + 224);
v5 = v1;
v6 = *(_QWORD *)(v1 + 232);
if( v4 )
{
ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet((_RTL_AVL_TABLE *)(v4 + 88), (VOID *)1, 0i64, v3, v14, v15);
v8 = ClearBitsAndSet;
if( ClearBitsAndSet != -1 )
{
v9 = *(_QWORD *)(v4 + 168);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v9 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(v9 + 24) < 0 );
}
if( !*(_BYTE *)(v4 + 69) )
{
LABEL_6:
_InterlockedAnd64((volatile signed __int64 *)(v9 + 24), 0x7FFFFFFFFFFFFFFFui64);
*(_DWORD *)(v5 + 64) = 0;
*(_WORD *)(v5 + 216) = v8;
return;
}
_InterlockedAnd64((volatile signed __int64 *)(v9 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
MiDecrementHugeContext((PVOID)v4);
*(_QWORD *)(v5 + 224) = 0i64;
}
v10 = (_QWORD **)(v6 + 56);
for( i = *v10; i != v10; i = (_QWORD *)*i )
{
v12 = i - 9;
v13 = (unsigned int)RtlFindClearBitsAndSet((_RTL_AVL_TABLE *)(i + 2), (VOID *)1, 0i64, v3, v14, v15);
v8 = v13;
if( v13 != -1 )
{
v9 = v12[21];
LODWORD(v16) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v9 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&v16);
while( *(__int64 *)(v9 + 24) < 0 );
}
if( !*((_BYTE *)v12 + 69) )
{
++*((_DWORD *)v12 + 47);
*(_QWORD *)(v5 + 224) = v12;
goto LABEL_6;
}
_InterlockedAnd64((volatile signed __int64 *)(v9 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
}
}Referenced by:
MiGetHugePageToZero