RtlpHpGetOwnerHeap

NTSTATUS __stdcall RtlpHpGetOwnerHeap(INT64 a1, INT128 *a2){
  int v4; 
  __int64 v5; 
  _RTL_RUN_ONCE *HeapManager; 
  __int64 v7; 
  __int128 v8; 
  __int128 v10; 
  int v11; 
  int v12; 
  _QWORD *v13; 

  if( (_WORD)a1 )
  {
    v4 = 0;
  }
  else
  {
    v10 = *(_OWORD *)a2;
    HeapManager = RtlpHpEnvGetHeapManager(&v10);
    LODWORD(v7) = RtlCSparseBitmapBitmaskRead((INT64)&HeapManager[2], 2 * ((a1 - HeapManager[1].Value) >> 20));
    if( !v7 )
      goto LABEL_7;
    v4 = v7 - 1;
  }
  if( v4 == 2 )
  {
LABEL_7:
    v8 = *(_OWORD *)a2;
    v13 = 0i64;
    v10 = v8;
    RtlpHpQueryVA(a1, &v10, &v13, &v11);
    return *v13;
  }
  v11 = 0x100000;
  v12 = 0x1000000;
  LODWORD(v5) = (a1 & -*(&v11 + v4) ^ RtlpHpHeapGlobals ^ *(_DWORD *)((a1 & -(__int64)(unsigned int)*(&v11 + v4)) + 0x10) ^ 0xA2E64EAD)
              - 192 * v4
              - 256;
  return v5;
}

Referenced by:

ExGetHeapFromVA