MiFindEmptyAddressRangeDown
__int64 __fastcall MiFindEmptyAddressRangeDown(
__int64 a1,
unsigned __int64 a2,
unsigned __int64 a3,
unsigned __int64 a4,
unsigned __int64 a5,
unsigned __int64 a6,
char a7,
unsigned __int64 *a8){
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
__int64 v15;
int v16;
__int64 v17;
int EmptyAddressRangeDownTree;
int v19;
unsigned __int64 v21;
__int64 v22;
__int64 v23;
if( a6 - a5 + 1 < a2 )
return 3221225495i64;
v12 = a6 + 1;
v13 = *(_QWORD *)(a1 + 56);
v14 = a6 + 1;
v15 = *((_QWORD *)KeGetCurrentThread() + 23);
v23 = v15;
if( a6 + 1 > *(_QWORD *)(a1 + 48) )
v14 = *(_QWORD *)(a1 + 48);
v16 = *(_DWORD *)(a1 + 64);
v17 = (unsigned __int8)v16;
if( !(_BYTE)v16 )
v17 = 1i64;
v22 = v17;
if( v13 < a5 )
v13 = a5;
while( 1 )
{
if( v13 >= a6 || a6 - v13 + 1 < a2 )
{
v19 = -1073741801;
}
else
{
EmptyAddressRangeDownTree = MiFindEmptyAddressRangeDownTree((__int64 *)(v15 + 2008), a2, a3, a4, v13, v14, a8);
v17 = v22;
v19 = EmptyAddressRangeDownTree;
}
if( v19 >= 0 )
break;
if( v14 == v12 || (a7 & 2) != 0 )
{
v21 = v17 << 16;
if( (a7 & 2) == 0 )
v21 = 0x10000i64;
if( v21 < a5 )
v21 = a5;
if( v21 >= v13 )
return(unsigned int)v19;
v15 = v23;
v13 = v21;
}
else
{
v15 = v23;
v14 = a6 + 1;
}
}
return(unsigned int)v19;
}Referenced by:
MiSelectUserAddress