RtlpHpFixedHeapCreate

INT64 __fastcall RtlpHpFixedHeapCreate(
        PVOID BaseAddress,
        NTSTATUS (__fastcall *a2)(__int64 a1, PVOID *a2, ULONG_PTR *a3),
        unsigned __int64 a3,
        unsigned __int64 a4,
        int a5,
        __int64 a6){
  __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  INT64 v10; 
  NTSTATUS(__fastcall *v11)(INT64, PVOID *, UINT64 *); 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  int v14; 
  int v15; 
  int v16; 
  unsigned __int64 v18; 
  INT64 v19[2]; 
  __int128 v20; 
  __int128 v21; 
  __int128 v22; 
  __int128 a3a; 
  INT64(__fastcall *v24)(INT64, INT64, UINT64); 
  INT64(__stdcall *v25)(PVOID, _WHEA_ERROR_SEVERITY *); 
  __int64 v26; 
  __int128 MemoryInformation; 
  __int128 v28; 
  __int128 v29; 
  PVOID BaseAddressa; 
  int a6a; 
  BaseAddressa = BaseAddress;
  v6 = 0i64;
  v7 = a4;
  v8 = a3;
  v10 = (INT64)BaseAddress;
  MemoryInformation = 0i64;
  v28 = 0i64;
  v29 = 0i64;
  v20 = 0i64;
  v21 = 0i64;
  v22 = 0i64;
  if( a2 )
  {
    if( !a4 || !a3 || a4 > a3 )
      return v6;
  }
  else
  {
    if( ZwQueryVirtualMemory(
           (PVOID)0xFFFFFFFFFFFFFFFFi64,
           BaseAddress,
           MemoryBasicVlmInformation,
           &MemoryInformation,
           0x30ui64,
           0i64) < 0 )
      return v6;
    if( ZwQueryVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, BaseAddressa, MemoryBasicInformation, &v20, 0x30ui64, 0i64) < 0 )
      return v6;
    v10 = (INT64)BaseAddressa;
    if( (PVOID)v20 != BaseAddressa || (_DWORD)v22 == 0x10000 )
      return v6;
    v8 = v28;
    if( (_DWORD)v22 == 4096 )
      v7 = *((_QWORD *)&v21 + 1);
  }
  v11 = RtlpHpFixedHeapCommitRoutine;
  if( a2 )
    v11 = a2;
  v12 = v8 >> 12;
  v13 = (((v12 >> 3) + 7) & 0xFFFFFFFFFFFFFFF8ui64) + 4351;
  v18 = v13 & 0xFFFFFFFFFFFFF000ui64;
  if( v7 < (v13 & 0xFFFFFFFFFFFFF000ui64) )
  {
    if( v11(v10, &BaseAddressa, &v18) < 0 )
      return v6;
    v10 = (INT64)BaseAddressa;
  }
  memset(v10, 0i64);
  if( v11 )
    *(_QWORD *)(v10 + 8) = RtlpHpHeapGlobals ^ (unsigned __int64)v11;
  *(_DWORD *)(v10 + 32) = *(_DWORD *)a6 & 1;
  *(_QWORD *)(v10 + 24) = 0i64;
  v14 = a5;
  v15 = a5 & 0x13000003;
  *(_DWORD *)(v10 + 16) = -857879331;
  *(_DWORD *)(v10 + 20) = v15;
  *(_QWORD *)v10 = v12;
  v19[0] = v12;
  v19[1] = v10 + 256;
  RtlSetBitsEx((INT64)v19, 0i64, v13 >> 12);
  *(_QWORD *)(v10 + 48) = v12;
  *(_QWORD *)(v10 + 56) = v10 ^ (v10 + 256);
  v16 = *(_DWORD *)(v10 + 32);
  *(_QWORD *)&a3a = RtlpHpFixedVsAllocate;
  v26 = 0i64;
  *((_QWORD *)&a3a + 1) = RtlpHpFixedVsFree;
  v24 = RtlpHpFixedVsCommit;
  v25 = xHalTimerWatchdogStop;
  a6a = 0;
  RtlpHpVsContextInitialize(v10 + 64, v10, &a3a, v16, v14 & 0x8000000, &a6a);
  return v10;
}

Referenced by:

RtlCreateHeap