MiGetUltraHugeAlreadyActive
_QWORD *__fastcall MiGetUltraHugeAlreadyActive(UINT64 a1, INT64 a2, INT64 a3){
unsigned int **p_Buffer;
__int64 v5;
ULONG ClearBitsAndSet;
__int16 v7;
unsigned int *v8;
_QWORD *result;
struct _RTL_BITMAP **v10;
struct _RTL_BITMAP *i;
ULONG v12;
UINT64 v13;
UINT64 SpinCount;
LODWORD(SpinCount) = a3;
v13 = a1;
p_Buffer = *(unsigned int ***)(a2 + 224);
v5 = *(_QWORD *)(a2 + 232);
if( p_Buffer )
{
ClearBitsAndSet = RtlFindClearBitsAndSet((PRTL_BITMAP)(p_Buffer + 11), 1u, 0);
v7 = ClearBitsAndSet;
if( ClearBitsAndSet != -1 )
{
v8 = p_Buffer[21];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v8 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v8 + 3) < 0 );
}
if( !*((_BYTE *)p_Buffer + 69) )
goto LABEL_6;
_InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
MiDecrementHugeContext(p_Buffer);
*(_QWORD *)(a2 + 224) = 0i64;
}
v10 = (struct _RTL_BITMAP **)(v5 + 56);
for( i = *v10; ; i = *(struct _RTL_BITMAP **)&i->SizeOfBitMap )
{
if( i == (struct _RTL_BITMAP *)v10 )
return 0i64;
p_Buffer = &i[-5].Buffer;
v12 = RtlFindClearBitsAndSet(i + 1, 1u, 0);
v7 = v12;
if( v12 != -1 )
break;
LABEL_11:
;
}
v8 = p_Buffer[21];
LODWORD(v13) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v8 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v13);
while( *((__int64 *)v8 + 3) < 0 );
}
if( *((_BYTE *)p_Buffer + 69) )
{
_InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
goto LABEL_11;
}
++*((_DWORD *)p_Buffer + 47);
*(_QWORD *)(a2 + 224) = p_Buffer;
LABEL_6:
_InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
*(_DWORD *)(a2 + 64) = 0;
result = p_Buffer;
*(_WORD *)(a2 + 216) = v7;
return result;
}Referenced by:
MiGetHugePageToZero