RtlpHpSegMgrCommit

INT64 __fastcall RtlpHpSegMgrCommit(INT64 rcx0, INT64 rdx0, UINT64 a3, INT64 r9_0, INT64 a5, INT64 arg28, INT64 a7){
  int v7; 
  unsigned __int64 v8; 
  int v9; 
  unsigned __int64 v10; 
  unsigned int v11; 
  volatile INT16 *v14; 
  INT64 v15; 
  size_t v16; 
  bool v17; 
  int v18; 
  int v19; 
  int v20; 
  volatile INT16 *v21; 
  __int128 v23; 
  union _RTL_RUN_ONCE *HeapManager; 
  CHAR v25; 
  int v26; 
  int v27; 
  unsigned __int64 v28; 
  INT64 v29; 
  PEX_SPIN_LOCK SpinLock; 
  INT64 result; 
  size_t a2; 
  volatile INT16 *v33; 
  LONG v34[2]; 
  _DWORD a1[4]; 
  INT64 a6[2]; 
  __int128 a4[2]; 
  __int128 v38; 
  UINT8 v39; 
  v7 = r9_0;
  v8 = (int)a5;
  v9 = arg28 & 0x40000000;
  v10 = (unsigned int)a3;
  v11 = arg28 & 0xBFFFFFFF;
  v39 = 0;
  *(_QWORD *)v34 = 0i64;
  if( (int)a5 > 0 && !(unsigned int)RtlpHpSegHeapCheckCommitLimit((int)((_DWORD)a5 << 12), *(UINT64 **)(rcx0 + 56)) )
    return 3221225773i64;
  if( (*(_BYTE *)(rcx0 + 13) & 7) != 0 )
  {
    a4[1] = 0i64;
    v38 = 0i64;
    v23 = *(_OWORD *)(rcx0 + 40);
    result = rdx0 & 0xFFFFFFFFFFE00000ui64;
    *(_OWORD *)a1 = v23;
    HeapManager = RtlpHpEnvGetHeapManager(a1);
    RtlpHpVaMgrCtxQuery((UINT64)&HeapManager[11], v25);
    v14 = (volatile INT16 *)(v38 + 2 * (v10 >> 9));
  }
  else
  {
    v14 = 0i64;
  }
  v15 = (unsigned int)((_DWORD)v10 << 12) + rdx0;
  v33 = v14;
  v16 = (unsigned int)(v7 << 12);
  while( 1 )
  {
    result = v15;
    a2 = v16;
    if( !v14 )
      goto LABEL_7;
    v26 = RtlpHpSegMgrCommitInitiate(rcx0, v14, (unsigned int)v8, (unsigned int)a7, (UINT64)v34, &v39);
    if( v26 == -1073741568 )
      break;
    if( v26 == -1073741566 )
    {
      result &= 0xFFFFFFFFFFE00000ui64;
      v27 = v11 | 0x20000000;
      a2 = 0x200000i64;
      if( (int)v8 <= 0 )
        v27 = v11;
      v11 = v27;
    }
LABEL_7:
    if( (int)v8 <= 0 )
    {
      a4[0] = *(_OWORD *)(rcx0 + 40);
      v20 = RtlpHpFreeVA((UINT64 *)&result, &a2, v11, a4);
    }
    else
    {
      if( v9 && (v11 & 0x20000000) == 0 )
        v11 |= 0x40000000u;
      v17 = (*(_DWORD *)(*(_QWORD *)(rcx0 + 56) + 20i64) & 0x40000000) == 0;
      v18 = 64;
      *(_OWORD *)a6 = *(_OWORD *)(rcx0 + 40);
      if( v17 )
        v18 = 4;
      LODWORD(SpinLock) = v18;
      v19 = RtlpHpAllocVA(&result, &a2, 0i64, v11, (UINT64)SpinLock, (INT64)a6);
      v20 = v19;
      if( v9 && v19 >= 0 && (v11 & 0x40000000) == 0 )
        memset(result, 0i64);
    }
    v21 = v33;
    if( !v33 )
      return(unsigned int)v20;
    if( (*v33 & 0x4000) != 0 )
    {
      if( v20 < 0 )
        goto LABEL_40;
      v28 = 1i64;
      if( (int)v8 <= 0 )
        v28 = -1i64;
      _InterlockedExchangeAdd64((volatile signed __int64 *)(*(__int16 *)(rcx0 + 20) + rcx0 + 8), v28);
      _InterlockedExchangeAdd64((volatile signed __int64 *)(*(__int16 *)(rcx0 + 20) + rcx0), v8);
    }
    if( v20 < 0 )
    {
LABEL_40:
      v29 = 0i64;
      goto LABEL_37;
    }
    v29 = 1i64;
LABEL_37:
    RtlpHpSegMgrCommitComplete(rcx0, v21, (unsigned int)v8, v29, (UINT64)v34, v39);
    if( (v11 & 0x20000000) == 0 || v20 >= 0 || (a7 & 2) != 0 )
      return(unsigned int)v20;
    v14 = v33;
    LODWORD(a7) = a7 | 1;
    v11 &= ~0x20000000u;
  }
  _InterlockedExchangeAdd64((volatile signed __int64 *)(*(__int16 *)(rcx0 + 20) + rcx0), v8);
  if( v9 )
    memset(result, 0i64);
  return 0i64;
}

Referenced by:

RtlpHpSegMgrAllocate
RtlpHpSegMgrRelease
RtlpHpSegPageRangeCommit