RtlpHpSegMgrRelease

CHAR __stdcall RtlpHpSegMgrRelease(INT64 a1, INT64 a2, INT64 a3){
  __int64 v3; 
  UINT64 v4; 
  unsigned __int64 v6; 
  _WORD *v7; 
  unsigned __int64 v8; 
  unsigned int v9; 
  INT64 v11; 
  INT64 v12; 
  INT64 v13; 
  __int128 v14; 
  UINT64 v15; 
  unsigned __int64 v16; 
  INT64 v17; 

  LODWORD(v6) = *(_DWORD *)a1;
  v3 = a2;
  v16 = 0i64;
  v17 = a2;
  v4 = (unsigned int)-(int)v6;
  LOBYTE(v6) = *(_BYTE *)(a1 + 13) & 7;
  v15 = v4;
  if( !(_BYTE)v6 )
  {
LABEL_2:
    if( v3 )
    {
      v14 = *(_OWORD *)(a1 + 40);
      LOBYTE(v6) = RtlpHpFreeVA((UINT64 *)&v17, &v15, 0x8000i64, &v14);
    }
    return v6;
  }
  if( v4 >= 0x200000 )
  {
LABEL_10:
    v14 = *(_OWORD *)(a1 + 40);
    LOBYTE(v6) = RtlpHpQueryVA(v3, &v14, &v16, 0i64);
    v7 = (_WORD *)v16;
    v8 = v16 + 2 * (v4 >> 21);
    v9 = 0;
    if( v16 < v8 )
    {
      do
      {
        LOWORD(v6) = *v7;
        if( (*v7 & 0x7FF) != 0 )
        {
          LODWORD(v13) = 0;
          LODWORD(v12) = 0x4000;
          LODWORD(v11) = -(v6 & 0x7FF);
          LOBYTE(v6) = RtlpHpSegMgrCommit(a1, v3, v9, 512i64, v11, v12, v13);
        }
        ++v7;
        v9 += 512;
      }
      while( (unsigned __int64)v7 < v8 );
    }
    goto LABEL_2;
  }
  if( (int)a3 > 0 )
  {
    LODWORD(v13) = 0;
    LODWORD(v12) = 0x4000;
    LODWORD(v11) = -(int)a3;
    RtlpHpSegMgrCommit(a1, a2, 0i64, (unsigned int)v4 >> 12, v11, v12, v13);
  }
  v6 = RtlpHpSegMgrVaCtxFree(a1, v3, &v15);
  v17 = v6;
  v3 = v6;
  if( v6 )
  {
    v4 = v15;
    goto LABEL_10;
  }
  return v6;
}

Referenced by:

RtlpHpSegMgrAllocate
RtlpHpSegSegmentFree