RtlpHpSegMgrCommit

NTSTATUS __stdcall RtlpHpSegMgrCommit(INT64 a1, INT64 a2, UINT64 a3, INT64 a4, INT64 a5, INT64 a6, INT64 a7){
  int v7; 
  unsigned __int64 v8; 
  int v9; 
  unsigned __int64 v10; 
  unsigned int v11; 
  INT64 v14; 
  INT64 v15; 
  __int64 v16; 
  bool v17; 
  int v18; 
  NTSTATUS v19; 
  NTSTATUS v20; 
  INT64 v21; 
  __int128 v23; 
  _RTL_RUN_ONCE *HeapManager; 
  INT64 v25; 
  NTSTATUS v26; 
  int v27; 
  unsigned __int64 v28; 
  INT64 v29; 
  UINT64 BugCheckParameter2; 
  INT64 v31; 
  __int64 v32; 
  INT64 v33; 
  ULONG_PTR v34[2]; 
  __int128 v35; 
  __int64 v36[2]; 
  __int128 v37; 
  INT64 v38[2]; 
  __int128 v39; 
  INT64 v40; 

  v7 = a4;
  v8 = (int)a5;
  v9 = a6 & 0x40000000;
  v10 = (unsigned int)a3;
  v11 = a6 & 0xBFFFFFFF;
  LOBYTE(v40) = 0;
  *(_QWORD *)v34 = 0i64;
  if( (int)a5 > 0 && !RtlpHpSegHeapCheckCommitLimit((int)((_DWORD)a5 << 12), *(UINT64 **)(a1 + 56)) )
    return -1073741523;
  if( (*(_BYTE *)(a1 + 13) & 7) != 0 )
  {
    *(_OWORD *)v38 = 0i64;
    v39 = 0i64;
    v23 = *(_OWORD *)(a1 + 40);
    v31 = a2 & 0xFFFFFFFFFFE00000ui64;
    v35 = v23;
    HeapManager = RtlpHpEnvGetHeapManager(&v35);
    RtlpHpVaMgrCtxQuery((INT64)&HeapManager[11], v25, (INT64)v38);
    v14 = v39 + 2 * (v10 >> 9);
  }
  else
  {
    v14 = 0i64;
  }
  v15 = (unsigned int)((_DWORD)v10 << 12) + a2;
  v33 = v14;
  v16 = (unsigned int)(v7 << 12);
  while( 1 )
  {
    v31 = v15;
    v32 = v16;
    if( !v14 )
      goto LABEL_7;
    v26 = RtlpHpSegMgrCommitInitiate(a1, v14, (unsigned int)v8, (unsigned int)a7, (ULONG_PTR)v34, (INT64)&v40);
    if( v26 == -1073741568 )
      break;
    if( v26 == -1073741566 )
    {
      v31 &= 0xFFFFFFFFFFE00000ui64;
      v27 = v11 | 0x20000000;
      v32 = 0x200000i64;
      if( (int)v8 <= 0 )
        v27 = v11;
      v11 = v27;
    }
LABEL_7:
    if( (int)v8 <= 0 )
    {
      v37 = *(_OWORD *)(a1 + 40);
      v20 = RtlpHpFreeVA((UINT64 *)&v31, (UINT64 *)&v32, v11, &v37);
    }
    else
    {
      if( v9 && (v11 & 0x20000000) == 0 )
        v11 |= 0x40000000u;
      v17 = (*(_DWORD *)(*(_QWORD *)(a1 + 56) + 20i64) & 0x40000000) == 0;
      v18 = 64;
      *(_OWORD *)v36 = *(_OWORD *)(a1 + 40);
      if( v17 )
        v18 = 4;
      LODWORD(BugCheckParameter2) = v18;
      v19 = RtlpHpAllocVA(&v31, &v32, 0i64, v11, BugCheckParameter2, (__int64)v36);
      v20 = v19;
      if( v9 && v19 >= 0 && (v11 & 0x40000000) == 0 )
        memset((VOID *)v31, 0i64, v16);
    }
    v21 = v33;
    if( !v33 )
      return v20;
    if( (*(_WORD *)v33 & 0x4000) != 0 )
    {
      if( v20 < 0 )
        goto LABEL_40;
      v28 = 1i64;
      if( (int)v8 <= 0 )
        v28 = -1i64;
      _InterlockedExchangeAdd64((volatile signed __int64 *)(*(__int16 *)(a1 + 20) + a1 + 8), v28);
      _InterlockedExchangeAdd64((volatile signed __int64 *)(*(__int16 *)(a1 + 20) + a1), v8);
    }
    if( v20 < 0 )
    {
LABEL_40:
      v29 = 0i64;
      goto LABEL_37;
    }
    v29 = 1i64;
LABEL_37:
    RtlpHpSegMgrCommitComplete(a1, v21, (unsigned int)v8, v29, (PEX_SPIN_LOCK)v34, v40);
    if( (v11 & 0x20000000) == 0 || v20 >= 0 || (a7 & 2) != 0 )
      return v20;
    v14 = v33;
    LODWORD(a7) = a7 | 1;
    v11 &= ~0x20000000u;
  }
  _InterlockedExchangeAdd64((volatile signed __int64 *)(*(__int16 *)(a1 + 20) + a1), v8);
  if( v9 )
    memset((VOID *)v31, 0i64, v16);
  return 0;
}

Referenced by:

RtlpHpSegMgrAllocate
RtlpHpSegMgrRelease
RtlpHpSegPageRangeCommit