HalpLapDeleteSubtree

INT64 **__fastcall HalpLapDeleteSubtree(INT64 **a1, INT64 *a2){
  INT64 **v3; 
  INT64 *v4; 
  INT64 *v5; 
  INT64 *v6; 
  INT64 *v7; 
  __int64 v8; 
  bool v9; 
  *((_BYTE *)a2 + 56) = 0;
  v3 = a1;
  v4 = a2;
  while( 1 )
  {
    while( 1 )
    {
      v5 = (INT64 *)v4[3];
      if( !v5 )
      {
        v5 = (INT64 *)v4[4];
        if( !v5 )
          break;
      }
      v4 = v5;
    }
    if( v4 == a2 )
      break;
    if( !*((_BYTE *)v4 + 56) )
    {
      v6 = (INT64 *)*v4;
      if( *(INT64 **)(*v4 + 8) != v4 || (a1 = (INT64 **)v4[1], *a1 != v4) )
        __fastfail(3u);
      *a1 = v6;
      v6[1] = (INT64)a1;
      v4[1] = (INT64)v4;
      *v4 = (INT64)v4;
    }
    v7 = (INT64 *)v4[2];
    v8 = v7[3];
    v9 = v8 == (_QWORD)v4;
    v4 = v7;
    if( v9 )
    {
      HalpMmAllocCtxFree((__int64)a1, v8);
      --*((_DWORD *)v3 + 6);
      v4[3] = 0i64;
    }
    else
    {
      HalpMmAllocCtxFree((__int64)a1, v7[4]);
      --*((_DWORD *)v3 + 6);
      v4[4] = 0i64;
    }
  }
  return HalpLaBltAdd(a2, (INT64)v3);
}

Referenced by:

HalpLaAllocateBlt
HalpLaFreeState
HalpLaInitializeState