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