HalpLaAllocateBlt
INT64 __fastcall HalpLaAllocateBlt(INT64 **a1, UINT64 a2, INT64 a3, UINT64 *a4, INT64 a5, INT64 a6){
INT64 *v8;
UINT64 v9;
unsigned __int64 i;
__int64 v11;
unsigned __int64 v12;
UINT64 v13;
INT64 *v14;
int v15;
UINT64 v16;
__int64 *Free;
INT64 v18;
__int64 v19;
_QWORD *v20;
INT64 *v21;
INT64 *v22;
INT64 *v23;
unsigned __int64 v24;
unsigned __int64 v25;
v8 = a1[2];
v9 = 0i64;
if( a2 > (unsigned __int64)a1[1] )
return(unsigned int)-1073741811;
for( i = (unsigned __int64)*a1; i < a2; i *= 2i64 )
;
if( a4 )
v9 = *a4;
if( a5 )
v8 = *(INT64 **)a5;
if( ((i - 1) & i) == 0
&& i
&& (v11 = ~(i - 1), v12 = v11 & (i + v9 - 1), v12 >= v9)
&& ((v13 = -1i64, v8 == (INT64 *)-1i64)
|| (v13 = (v11 & ((unsigned __int64)v8 + 1)) - 1, v13 <= (unsigned __int64)v8))
&& v12 <= v13
&& (i <= v13 - v12 + 1 || v13 - v12 == -1i64)
&& (v14 = a1[7], v15 = 0, v16 = v14[6], v14[8] + v16 - 1 >= v12)
&& v16 <= v13 )
{
Free = HalpLaBltFindFree(i, (INT64)a1, v12, v13);
v18 = (INT64)Free;
if( Free )
{
v19 = *Free;
if( *(_QWORD *)(v19 + 8) != v18 || (v20 = *(_QWORD **)(v18 + 8), *v20 != v18) )
__fastfail(3u);
*v20 = v19;
v21 = (INT64 *)v18;
*(_QWORD *)(v19 + 8) = v20;
*(_QWORD *)(v18 + 8) = v18;
*(_QWORD *)v18 = v18;
while( *(_QWORD *)(v18 + 64) != i )
{
v15 = HalpLapSplitNode((INT64)a1, v18);
if( v15 < 0 )
goto LABEL_34;
v22 = *(INT64 **)(v18 + 24);
v23 = *(INT64 **)(v18 + 32);
v18 = (INT64)v22;
v24 = v22[8] - 1 + v22[6];
if( v24 < v12 )
v18 = (INT64)v23;
if( v24 < v12 )
v23 = v22;
HalpLaBltAdd(v23, (INT64)a1);
}
v25 = *(_QWORD *)(v18 + 48);
if( v25 >= v12 && *(_QWORD *)(v18 + 64) + v25 - 1 <= v13 )
{
*(_QWORD *)(v18 + 40) = 0i64;
*(_BYTE *)(v18 + 56) = 1;
*(_QWORD *)(v18 + 72) = a2;
a1[4] = (INT64 *)((char *)a1[4] + a2);
a1[5] = (INT64 *)((char *)a1[5] + *(_QWORD *)(v18 + 64));
*(_QWORD *)a6 = *(_QWORD *)(v18 + 48);
return(unsigned int)v15;
}
LABEL_34:
HalpLapDeleteSubtree(a1, v21);
}
return(unsigned int)-1073741670;
}
else
{
return(unsigned int)-1073741811;
}
}Referenced by:
HalpDomainLaAllocate