MiMakeSystemRangeAvailable
NTSTATUS __stdcall MiMakeSystemRangeAvailable(PVOID BugCheckParameter2, PVOID BugCheckParameter3){
unsigned int v2;
void *BugCheckParameter4;
unsigned __int64 v4;
INT64 *v7;
_RTL_BITMAP_EX *v8;
unsigned __int64 v9;
unsigned __int8 v10;
NTSTATUS result;
unsigned __int64 *Buffer;
unsigned __int64 *v13;
unsigned __int64 v14;
unsigned __int64 *v15;
INT64 v16;
bool i;
__int128 v18;
_KLOCK_QUEUE_HANDLE LockHandle;
BugCheckParameter4 = (void *)(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 *)(*(&stru_140C4DB30 + 22) + 176i64 * (unsigned int)MiNonPagedPoolToNode(BugCheckParameter2) + 64);
else
v7 = MiSystemVaToDynamicBitmap(v2);
v8 = (_RTL_BITMAP_EX *)v7;
v9 = ((unsigned __int64)BugCheckParameter2 - v7[4]) >> 21;
if( (_DWORD)BugCheckParameter4 == 13 )
{
v8 = (_RTL_BITMAP_EX *)&v18;
v16 = v7[2];
*((_QWORD *)&v18 + 1) = v7[1];
*(_QWORD *)&v18 = v16;
}
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)v7 + 8, &LockHandle);
if( v9 >= v8->SizeOfBitMap )
goto LABEL_31;
if( v4 > 1 )
{
if( v8->SizeOfBitMap - v9 >= v4 )
{
Buffer = v8->Buffer;
v13 = &Buffer[v9 >> 6];
v14 = *v13;
v15 = &Buffer[(v9 + v4 - 1) >> 6];
if( v13 != v15 )
{
for( i = ((-1i64 << v9) & v14) == -1i64 << v9; ; i = *v13 == -1i64 )
{
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, (PVOID)0x2104, BugCheckParameter2, BugCheckParameter3, BugCheckParameter4);
}
if( v4 != 1 )
goto LABEL_31;
v10 = _bittest64((const signed __int64 *)v8->Buffer, v9);
LABEL_10:
if( !v10 )
goto LABEL_31;
LABEL_11:
RtlClearBitsEx(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((volatile signed __int64 *)&stru_140C4DB30 + (int)BugCheckParameter4 + 875, -(__int64)v4);
if( (_DWORD)BugCheckParameter4 == 8 )
*(&stru_140C4DB30 + 75) += BugCheckParameter3;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
MiReturnSystemVa