MiFindEmptyAddressRangeDownTree
__int64 __fastcall MiFindEmptyAddressRangeDownTree(
__int64 *a1,
__int64 a2,
unsigned __int64 a3,
unsigned __int64 a4,
unsigned __int64 a5,
unsigned __int64 a6,
unsigned __int64 *a7){
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
__int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
__int64 v21;
unsigned __int64 v22;
INT64 *v23;
INT64 *v24;
unsigned __int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
INT64 *v28;
unsigned __int64 v29;
unsigned __int64 v30;
unsigned __int64 v31;
unsigned __int64 v32;
unsigned __int64 v33;
unsigned __int64 v34;
__int64 v35;
__int64 v36;
unsigned __int64 v37;
unsigned __int64 v38;
INT64 v39;
INT64 v41;
INT64 v42;
INT64 result[3];
int v44;
int v45;
char v46;
char v47;
unsigned __int64 v48;
__int64 v49;
memset((INT64)result, 0i64);
v11 = (a2 + 4095) & 0xFFFFFFFFFFFFF000ui64;
v12 = a4 >> 12;
v13 = v11 >> 12;
if( a5 >= a6 || a6 - a5 < v11 )
goto LABEL_39;
v14 = a3;
v15 = -(__int64)a3;
v16 = a6 >> 12;
v17 = v15 & (a6 - v11);
v18 = v14 >> 12;
v19 = v17 >> 12;
v20 = 0i64;
v48 = v18;
if( v12 )
{
v41 = MiHonorRangeStraddleRequirement((v15 & (a6 - v11)) >> 12, v11 >> 12, v12, 1i64);
v18 = v48;
v16 = a6 >> 12;
v19 = ~(v48 - 1) & v41;
v17 = v19 << 12;
}
if( v17 < a5 )
{
LABEL_39:
LODWORD(v20) = -1073741801;
}
else
{
v21 = *a1;
if( *a1 )
{
v22 = v20;
do
{
v23 = (INT64 *)v21;
v49 = v21;
v21 = *(_QWORD *)(v21 + 8);
}
while( v21 );
v24 = v23;
v25 = a5 >> 12;
while( 1 )
{
if( v23 )
{
v24 = result;
v22 = (unsigned __int64)v23;
v46 = a6 >> 44;
v49 = v20;
v44 = v16;
}
else
{
v26 = *(_QWORD *)v22;
v27 = v22;
if( *(_QWORD *)v22 )
{
while( 1 )
{
v22 = v26;
if( *(_QWORD *)(v26 + 8) == v20 )
break;
v26 = *(_QWORD *)(v26 + 8);
}
}
else
{
while( 1 )
{
v22 = *(_QWORD *)(v22 + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !v22 || *(_QWORD *)(v22 + 8) == v27 )
break;
v27 = v22;
}
}
}
v28 = result;
if( v22 )
{
v29 = v18 - 1;
v30 = a5 >> 12;
v31 = (*(unsigned int *)(v22 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v22 + 33) << 32)) + 1;
if( v31 >= v25 )
v30 = (*(unsigned int *)(v22 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v22 + 33) << 32)) + 1;
if( v31 >= v25 )
v28 = (INT64 *)v22;
v32 = v30 + v18 - 1;
}
else
{
v45 = v20;
v29 = v18 - 1;
v47 = v20;
v32 = v25 + v18 - 1;
}
v33 = ~v29;
v34 = v33 & v32;
if( v12 )
{
v42 = MiHonorRangeStraddleRequirement(v34, v13, v12, 0i64);
v18 = v48;
v34 = v42;
}
v16 = a6 >> 12;
if( v34 <= v19 )
{
v35 = *((unsigned __int8 *)v24 + 32);
v36 = *((unsigned int *)v24 + 6);
v37 = a6 >> 12;
v38 = v36 | (v35 << 32);
if( v38 <= a6 >> 12 )
v37 = v38;
if( v37 > v34 && v13 <= v37 - v34 )
break;
}
if( v28 == result )
goto LABEL_39;
v23 = (INT64 *)v49;
v24 = v28;
}
v39 = v33 & (v37 - v13);
if( v12 )
v39 = v33 & MiHonorRangeStraddleRequirement(v39, v13, v12, 1i64);
*a7 = v39 << 12;
}
else
{
*a7 = v17;
}
}
return(unsigned int)v20;
}Referenced by:
MiFindEmptyAddressRangeDown
MiFinishCreateSection