MiMakeSystemRangeAvailable
NTSTATUS __stdcall MiMakeSystemRangeAvailable(PVOID BugCheckParameter2, PVOID BugCheckParameter3){
unsigned int v2;
ULONG_PTR BugCheckParameter4;
unsigned __int64 v4;
INT64 *v7;
__int128 *v8;
unsigned __int64 v9;
unsigned __int8 v10;
NTSTATUS result;
__int64 v12;
__int64 *v13;
__int64 v14;
__int64 *v15;
INT64 v16;
bool i;
__int128 v18;
struct _KLOCK_QUEUE_HANDLE LockHandle;
BugCheckParameter4 = (int)v2;
v4 = (unsigned __int64)BugCheckParameter3 >> 21;
memset(&LockHandle, 0, sizeof(LockHandle));
v18 = 0i64;
if( v2 == 1 )
{
MiReleaseSessionVa(BugCheckParameter2, (unsigned int)v4);
return result;
}
if( v2 == 5 )
v7 = (INT64 *)((char *)SListHead + 176 * (unsigned int)MiNonPagedPoolToNode(BugCheckParameter2) + 64);
else
v7 = MiSystemVaToDynamicBitmap(v2);
v8 = (__int128 *)v7;
v9 = ((unsigned __int64)BugCheckParameter2 - v7[4]) >> 21;
if( (_DWORD)BugCheckParameter4 == 13 )
{
v8 = &v18;
v16 = v7[2];
*((_QWORD *)&v18 + 1) = v7[1];
*(_QWORD *)&v18 = v16;
}
KeAcquireInStackQueuedSpinLock((UINT64 *)v7 + 8, &LockHandle);
if( v9 >= *(_QWORD *)v8 )
goto LABEL_31;
if( v4 > 1 )
{
if( *(_QWORD *)v8 - v9 >= v4 )
{
v12 = *((_QWORD *)v8 + 1);
v13 = (__int64 *)(v12 + 8 * (v9 >> 6));
v14 = *v13;
v15 = (__int64 *)(v12 + 8 * ((v9 + v4 - 1) >> 6));
if( v13 != v15 )
{
for( i = ((-1i64 << v9) & v14) == -1i64 << v9; ; i = *v13 == -1 )
{
if( !i )
goto LABEL_31;
if( ++v13 == v15 )
break;
}
if( ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v9 + (unsigned __int8)v4 - 1)) & *v13) == 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v9 + (unsigned __int8)v4 - 1) )
goto LABEL_11;
v10 = 0;
goto LABEL_10;
}
if( ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v4) << v9) & v14) == 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v4) << v9 )
goto LABEL_11;
}
LABEL_31:
KeBugCheckEx(0x1Au, 0x2104ui64, (ULONG_PTR)BugCheckParameter2, (ULONG_PTR)BugCheckParameter3, BugCheckParameter4);
}
if( v4 != 1 )
goto LABEL_31;
v10 = _bittest64(*((const signed __int64 **)v8 + 1), v9);
LABEL_10:
if( !v10 )
goto LABEL_31;
LABEL_11:
RtlClearBitsEx((INT64)v8, v9, v4);
if( (_DWORD)BugCheckParameter4 == 13 )
{
LODWORD(BugCheckParameter4) = 9;
if( v9 < v7[6] )
v7[6] = v9;
}
else if( v9 < v7[3] )
{
v7[3] = v9;
}
_InterlockedExchangeAdd64(&qword_140C4F688[(int)BugCheckParameter4], -(__int64)v4);
if( (_DWORD)BugCheckParameter4 == 8 )
qword_140C4DD88 += (__int64)BugCheckParameter3;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
MiReturnSystemVa