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