MiFindEmptyAddressRangeInTree
VOID __stdcall MiFindEmptyAddressRangeInTree(
_RTL_AVL_TREE *Table,
UINT64 SizeOfRange,
UINT64 Alignment,
PVOID MinimumAddress){
UINT64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
UINT64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
_RTL_BALANCED_NODE *Root;
unsigned __int64 i;
unsigned __int64 v13;
unsigned __int64 v14;
_QWORD **v15;
unsigned __int64 v16;
_QWORD *v17;
UINT64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
UINT64 v21;
unsigned __int64 v22;
unsigned __int64 v23;
_QWORD *v24;
v4 = Alignment >> 12;
v5 = (SizeOfRange + 4095) >> 12;
v6 = (unsigned __int64)MinimumAddress >> 12;
v8 = ~((Alignment >> 12) - 1);
v9 = v8 & ((Alignment >> 12) + (v22 >> 12) - 1);
if( (unsigned __int64)MinimumAddress >> 12 )
v9 = MiHonorRangeStraddleRequirement(v9, (SizeOfRange + 4095) >> 12, v6, 0i64);
v10 = v23 >> 12;
if( v9 > v23 >> 12 || v5 > v10 - v9 + 1 )
return;
Root = Table->Root;
if( !Table->Root )
goto LABEL_33;
do
{
i = (unsigned __int64)Root;
Root = Root->Children[0];
}
while( Root );
v13 = i;
v14 = *(unsigned int *)(i + 24) | ((unsigned __int64)*(unsigned __int8 *)(i + 32) << 32);
if( v14 > v9 && v5 <= v14 - v9 )
goto LABEL_33;
while( 1 )
{
v15 = *(_QWORD ***)(i + 8);
v16 = i;
if( v15 )
{
v17 = *v15;
for( i = *(_QWORD *)(i + 8); v17; v17 = (_QWORD *)*v17 )
i = (unsigned __int64)v17;
}
else
{
while( 1 )
{
i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !i || *(_QWORD *)i == v16 )
break;
v16 = i;
}
}
v18 = v4 + (*(unsigned int *)(v13 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v13 + 33) << 32));
if( !i )
break;
if( (v8 & (v18 - 1)) < v9 )
{
if( (*(unsigned int *)(i + 24) | ((unsigned __int64)*(unsigned __int8 *)(i + 32) << 32)) <= v9 )
goto LABEL_21;
v19 = v9;
}
else
{
v19 = v8 & v18;
}
if( v6 )
v19 = MiHonorRangeStraddleRequirement(v19, v5, v6, 0i64);
if( v19 > v10 )
return;
v20 = *(unsigned int *)(i + 24) | ((unsigned __int64)*(unsigned __int8 *)(i + 32) << 32);
if( v20 > v19 && v5 <= v20 - v19 && v5 <= v10 - v19 + 1 )
{
*v24 = v19 << 12;
return;
}
LABEL_21:
v13 = i;
}
v21 = v8 & v18;
if( v21 >= v9 )
v9 = v21;
if( v6 )
v9 = MiHonorRangeStraddleRequirement(v9, v5, v6, 0i64);
if( v10 >= v9 && v5 <= v10 - v9 + 1 )
LABEL_33:
*v24 = v9 << 12;
}Referenced by:
MiFindEmptyAddressRange