RtlpHpVsContextFreeInternal

INT64 __fastcall RtlpHpVsContextFreeInternal(INT64 *SpinLock, INT64 a2, UINT64 a3, UINT64 a4, INT64 a5){
  unsigned int v5; 
  __int64 v6; 
  int v7; 
  unsigned int v8; 
  UINT64 v10; 
  int v11; 
  int v12; 
  unsigned __int64 v13; 
  INT64 v14; 
  int v16; 
  INT64 v17; 
  v5 = a4;
  v6 = HIDWORD(*(_QWORD *)a3);
  v7 = DWORD1(RtlpHpHeapGlobals) ^ HIDWORD(a3) ^ HIDWORD(*(_QWORD *)a3);
  v8 = 0;
  v10 = a3;
  if( (v7 & 0xFF0000) != 0 )
  {
    v11 = a3 ^ *(_DWORD *)(a3 + 8);
LABEL_3:
    v12 = (unsigned __int8)(RtlpHpHeapGlobals ^ v11);
    goto LABEL_4;
  }
  if( (_WORD)v7 )
  {
    v10 = a3 - 16i64 * (unsigned __int16)(WORD2(a3) ^ v6 ^ WORD2(RtlpHpHeapGlobals));
    v16 = HIDWORD(v10) ^ DWORD1(RtlpHpHeapGlobals) ^ HIDWORD(*(_QWORD *)v10);
    if( (v16 & 0xFF0000) != 0 )
    {
LABEL_17:
      v11 = v10 ^ *(_DWORD *)(v10 + 8);
      goto LABEL_3;
    }
    if( (_WORD)v16 )
    {
      v10 -= 16i64 * (unsigned __int16)(WORD2(v10) ^ HIDWORD(*(_QWORD *)v10) ^ WORD2(RtlpHpHeapGlobals));
      goto LABEL_17;
    }
  }
  v12 = 0;
LABEL_4:
  v13 = (v10 - (unsigned int)(v12 << 12)) & 0xFFFFFFFFFFFFF000ui64;
  if( (((unsigned __int16)(*(_WORD *)(v13 + 32) ^ *(_WORD *)(v13 + 34)) ^ 0x2BED) & 0x7FFF) != 0 )
  {
    a3 = v13;
    v17 = 18i64;
LABEL_21:
    RtlpLogHeapFailure(v17, (unsigned __int64)SpinLock ^ SpinLock[16], a3, 0i64, 0i64, 0i64);
    return v8;
  }
  if( ((DWORD1(RtlpHpHeapGlobals) ^ HIDWORD(a3) ^ (unsigned int)v6) & 0xFF0000) == 0 )
  {
    v17 = 8i64;
    goto LABEL_21;
  }
  v14 = RtlpHpVsChunkFree(SpinLock, v13, (_WORD *)a3, a4, a5);
  if( v14 )
  {
    if( (v5 & 1) == 0 )
      RtlpHpReleaseQueuedLockExclusive(*((unsigned int *)SpinLock + 2), a5);
    RtlpHpVsSubsegmentFree((INT64)SpinLock, v14, v5);
    if( (v5 & 1) == 0 )
      RtlpHpAcquireQueuedLockExclusive((INT8)SpinLock, (UINT64 *)*((unsigned int *)SpinLock + 2));
  }
  return 1;
}

Referenced by:

RtlpHpVsContextFreeList