MiFindEmptyAddressRange
NTSTATUS __stdcall MiFindEmptyAddressRange(
UINT64 SizeOfRange,
UINT64 Alignment,
PVOID HighestVadAddress,
UINT64 ProtectionMask,
UINT64 InternalFlags,
PVOID *Base,
UINT64 *HINTHonored){
PVOID *v7;
void *v8;
char *v10;
int v13;
_DWORD *v14;
__int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
UINT64 v18;
UINT64 v19;
UINT64 v20;
__int64 v21;
UINT64 ClearBits;
UINT64 v23;
NTSTATUS result;
unsigned __int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
int v28;
PVOID *v29;
UINT64 v30;
UINT64 v31;
bool v32;
_RTL_AVL_TREE *v33;
__int64 v34;
UINT64 v35;
__int64 v36;
UINT64 InternalFlagsa;
unsigned __int64 Basea;
_QWORD *v41;
_DWORD *v42;
v7 = Base;
v8 = (void *)ProtectionMask;
v10 = (char *)HighestVadAddress;
if( (unsigned __int64)Base - InternalFlags + 1 < Alignment )
return -1073741801;
v13 = 1;
v14 = v42;
v15 = *((_QWORD *)KeGetCurrentThread() + 23);
v36 = v15;
*v42 = 1;
if( ((unsigned __int8)HINTHonored & 2) != 0 )
{
v25 = *(_QWORD *)(v15 + 1496);
v16 = (unsigned __int8)*(_DWORD *)(SizeOfRange + 64);
v17 = *(_QWORD *)(SizeOfRange + 48) >> 16;
InternalFlagsa = v17;
Basea = v16;
if( v25 > 0x100000000i64 )
{
v17 = (v25 >> 16) - (unsigned __int8)v17 - 1;
InternalFlagsa = v17;
}
v15 = v36;
if( !(unsigned __int8)*(_DWORD *)(SizeOfRange + 64) )
{
v16 = 1i64;
Basea = 1i64;
}
}
else
{
v16 = 0i64;
v13 = 0;
v17 = 0i64;
Basea = 0i64;
InternalFlagsa = 0i64;
}
if( !ProtectionMask )
{
if( v10 == (char *)0x10000 )
{
v18 = Alignment + 0xFFFF;
}
else
{
if( (unsigned __int64)(v10 - 0x200000) > 0x7FE00000 || ((unsigned __int64)(v10 - 1) & Alignment) != 0 )
goto LABEL_35;
v18 = Alignment;
}
v19 = v18 >> 16;
if( !InternalFlags && (unsigned __int64)v7 >= (*(_QWORD *)(SizeOfRange + 40) << 16) + 0xFFFFi64 )
{
while( 1 )
{
v20 = *(_QWORD *)(SizeOfRange + 16);
if( v19 != 1 && v19 >= *(_QWORD *)(SizeOfRange + 24) )
v20 = *(_QWORD *)(SizeOfRange + 32);
v21 = *(_QWORD *)(SizeOfRange + 8) - qword_140C4E0A0;
if( v13 == 1 )
{
v26 = v20 + 8 * v21;
if( v26 < v16 || v26 >= v17 )
{
v20 = v16;
*v14 = 0;
}
}
if( v10 == (char *)0x10000 )
ClearBits = RtlFindClearBitsEx((UINT64 *)SizeOfRange, v19, v20);
else
ClearBits = MiFindClearVadBitsAligned((RTL_BITMAP *)SizeOfRange, (UINT64)v10, v19, v20);
v23 = ClearBits;
if( ClearBits != -1i64 )
{
if( v13 != 1 || (v27 = ClearBits + 8 * v21, v27 >= Basea) && v27 < InternalFlagsa )
{
*v41 = (v23 + 8 * (*(_QWORD *)(SizeOfRange + 8) - qword_140C4E0A0)) << 16;
return 0;
}
}
MiExpandVadBitMap();
if( v28 != 1 )
break;
v10 = (char *)HighestVadAddress;
v14 = v42;
v17 = InternalFlagsa;
v16 = Basea;
}
if( v13 == 1 )
return -1073741801;
v10 = (char *)HighestVadAddress;
v14 = v42;
v17 = InternalFlagsa;
v16 = Basea;
v15 = v36;
}
v8 = (void *)ProtectionMask;
}
LABEL_35:
*v14 = 0;
if( v13 == 1 )
{
v29 = (PVOID *)(v17 << 16);
if( v7 > v29 )
v7 = v29;
}
v30 = *(_QWORD *)(SizeOfRange + 56);
v31 = InternalFlags;
if( v30 > InternalFlags )
v31 = v30;
v32 = v31 < (unsigned __int64)v7;
if( v31 > (unsigned __int64)v7 )
{
if( (*(_DWORD *)(v15 + 2512) & 0x20) == 0 || (v34 = 0x3FFFFFFFi64, (unsigned __int64)v7 <= 0x3FFFFFFF) )
v34 = 0xFFFFFFi64;
v31 &= v34;
if( !v31 || v31 > (unsigned __int64)v7 )
v31 = 0x10000i64;
if( v13 == 1 && v31 < v30 )
v31 = v16 << 16;
if( v31 < InternalFlags )
v31 = InternalFlags;
v32 = v31 < (unsigned __int64)v7;
}
if( !v32 || (unsigned __int64)v7 - v31 + 1 < Alignment )
return -1073741801;
v33 = (_RTL_AVL_TREE *)(v15 + 2008);
MiFindEmptyAddressRangeInTree((_RTL_AVL_TREE *)(v15 + 2008), Alignment, (UINT64)v10, v8);
if( result < 0 )
{
v35 = Basea << 16;
if( v13 != 1 )
v35 = 0x10000i64;
if( v35 < InternalFlags )
v35 = InternalFlags;
if( v35 < v31 )
MiFindEmptyAddressRangeInTree(v33, Alignment, (UINT64)HighestVadAddress, v8);
}
return result;
}Referenced by:
MiSelectUserAddress