MiFindEmptyAddressRangeDownTree
NTSTATUS __stdcall MiFindEmptyAddressRangeDownTree(
_RTL_AVL_TREE *Table,
UINT64 SizeOfRange,
UINT64 Alignment,
VOID *LowestAddress,
VOID *HighestAddressToEndAt,
VOID **Base){
UINT64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
UINT64 v13;
__int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
UINT64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
_RTL_BALANCED_NODE *Root;
unsigned __int64 v21;
int *v22;
int *v23;
unsigned __int64 v24;
unsigned __int64 v25;
unsigned __int64 v26;
int *v27;
UINT64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
unsigned __int64 v31;
UINT64 v32;
unsigned __int64 v33;
__int64 v34;
__int64 v35;
unsigned __int64 v36;
unsigned __int64 v37;
INT64 v38;
__int64 v40;
unsigned __int64 v41;
__int64 v42;
int v43[30];
UINT64 v44;
_RTL_BALANCED_NODE *v45;
unsigned __int64 *v46;
memset(v43, 0i64, 0x40u);
v10 = (SizeOfRange + 4095) & 0xFFFFFFFFFFFFF000ui64;
v11 = (unsigned __int64)LowestAddress >> 12;
v12 = v10 >> 12;
if( HighestAddressToEndAt >= Base || (char *)Base - (_BYTE *)HighestAddressToEndAt < v10 )
goto LABEL_39;
v13 = Alignment;
v14 = -(__int64)Alignment;
v15 = (unsigned __int64)Base >> 12;
v16 = v14 & ((unsigned __int64)Base - v10);
v17 = v13 >> 12;
v18 = v16 >> 12;
v19 = 0i64;
v44 = v17;
if( v11 )
{
LODWORD(v40) = MiHonorRangeStraddleRequirement((v14 & ((unsigned __int64)Base - v10)) >> 12, v10 >> 12, v11, 1i64);
v17 = v44;
v15 = (unsigned __int64)Base >> 12;
v18 = ~(v44 - 1) & v40;
v16 = v18 << 12;
}
if( v16 < (unsigned __int64)HighestAddressToEndAt )
{
LABEL_39:
LODWORD(v19) = -1073741801;
}
else
{
Root = Table->Root;
if( Table->Root )
{
v21 = v19;
do
{
v22 = (int *)Root;
v45 = Root;
Root = Root->Children[1];
}
while( Root );
v23 = v22;
v24 = (unsigned __int64)HighestAddressToEndAt >> 12;
while( 1 )
{
if( v22 )
{
v23 = v43;
v21 = (unsigned __int64)v22;
LOBYTE(v43[8]) = (unsigned __int64)Base >> 44;
v45 = (_RTL_BALANCED_NODE *)v19;
v43[6] = v15;
}
else
{
v25 = *(_QWORD *)v21;
v26 = v21;
if( *(_QWORD *)v21 )
{
while( 1 )
{
v21 = v25;
if( *(_QWORD *)(v25 + 8) == v19 )
break;
v25 = *(_QWORD *)(v25 + 8);
}
}
else
{
while( 1 )
{
v21 = *(_QWORD *)(v21 + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !v21 || *(_QWORD *)(v21 + 8) == v26 )
break;
v26 = v21;
}
}
}
v27 = v43;
if( v21 )
{
v28 = v17 - 1;
v29 = (unsigned __int64)HighestAddressToEndAt >> 12;
v30 = (*(unsigned int *)(v21 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v21 + 33) << 32)) + 1;
if( v30 >= v24 )
v29 = (*(unsigned int *)(v21 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v21 + 33) << 32)) + 1;
if( v30 >= v24 )
v27 = (int *)v21;
v31 = v29 + v17 - 1;
}
else
{
v43[7] = v19;
v28 = v17 - 1;
BYTE1(v43[8]) = v19;
v31 = v24 + v17 - 1;
}
v32 = ~v28;
v33 = v32 & v31;
if( v11 )
{
LODWORD(v41) = MiHonorRangeStraddleRequirement(v33, v12, v11, 0i64);
v17 = v44;
v33 = v41;
}
v15 = (unsigned __int64)Base >> 12;
if( v33 <= v18 )
{
v34 = *((unsigned __int8 *)v23 + 32);
v35 = (unsigned int)v23[6];
v36 = (unsigned __int64)Base >> 12;
v37 = v35 | (v34 << 32);
if( v37 <= (unsigned __int64)Base >> 12 )
v36 = v37;
if( v36 > v33 && v12 <= v36 - v33 )
break;
}
if( v27 == v43 )
goto LABEL_39;
v22 = (int *)v45;
v23 = v27;
}
v38 = v32 & (v36 - v12);
if( v11 )
{
LODWORD(v42) = MiHonorRangeStraddleRequirement(v38, v12, v11, 1i64);
v38 = v32 & v42;
}
*v46 = v38 << 12;
}
else
{
*v46 = v16;
}
}
return v19;
}Referenced by:
MiFindEmptyAddressRangeDown
MiFinishCreateSection