HalpLaDeleteBlt

NTSTATUS __stdcall HalpLaDeleteBlt(INT64 a1, UINT64 a2){
  __int64 v2; 
  NTSTATUS v4; 
  __int64 v5; 
  __int64 v7; 
  _HALP_ALLOC_CONTEXT *v8; 
  _HALP_ALLOC_CONTEXT **v9; 
  _HALP_ALLOC_CONTEXT *v10; 
  __int64 *v11; 
  __int64 v12; 

  v2 = *(_QWORD *)(a1 + 56);
  v4 = 0;
  while( *(_QWORD *)(v2 + 48) != a2 || *(_QWORD *)(v2 + 24) || *(_QWORD *)(v2 + 32) )
  {
    v5 = *(_QWORD *)(v2 + 32);
    if( v5 && *(_QWORD *)(v5 + 48) <= a2 )
    {
      v2 = *(_QWORD *)(v2 + 32);
    }
    else
    {
      v2 = *(_QWORD *)(v2 + 24);
      if( !v2 )
        return -1073741823;
    }
  }
  if( !*(_BYTE *)(v2 + 56) )
    return -1073741823;
  *(_QWORD *)(a1 + 32) -= *(_QWORD *)(v2 + 72);
  *(_QWORD *)(a1 + 40) -= *(_QWORD *)(v2 + 64);
  *(_BYTE *)(v2 + 56) = 0;
  *(_QWORD *)(v2 + 72) = 0i64;
  while( 1 )
  {
    v11 = (__int64 *)(v2 + 16);
    v12 = *(_QWORD *)(v2 + 16);
    if( !v12 )
      break;
    v7 = *(_QWORD *)(v12 + 24);
    if( v2 == v7 )
      v7 = *(_QWORD *)(v12 + 32);
    if( *(_BYTE *)(v7 + 56) )
      break;
    v8 = *(_HALP_ALLOC_CONTEXT **)v7;
    if( *(_QWORD *)(*(_QWORD *)v7 + 8i64) != v7
      || (v9 = *(_HALP_ALLOC_CONTEXT ***)(v7 + 8), *v9 != (_HALP_ALLOC_CONTEXT *)v7) )
    {
      __fastfail(3u);
    }
    *v9 = v8;
    v8->BufferList.Blink = (_LIST_ENTRY *)v9;
    *(_QWORD *)(v7 + 8) = v7;
    *(_QWORD *)v7 = v7;
    v2 = *v11;
    HalpMmAllocCtxFree(v8, *(VOID **)(*v11 + 24));
    HalpMmAllocCtxFree(v10, *(VOID **)(v2 + 32));
    *(_QWORD *)(v2 + 24) = 0i64;
    *(_QWORD *)(v2 + 32) = 0i64;
    *(_BYTE *)(v2 + 56) = 0;
    *(_DWORD *)(a1 + 24) -= 2;
  }
  HalpLaBltAdd((INT64 *)v2, a1);
  return v4;
}

Referenced by:

HalpDomainLaDelete