RtlpHpFixedHeapCreate

NTSTATUS __stdcall RtlpHpFixedHeapCreate(VOID *BaseAddress, INT64 a2, INT64 a3){
  unsigned __int64 v3; 
  NTSTATUS v4; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  __int64 v8; 
  INT64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  int v13; 
  int v14; 
  int v15; 
  unsigned __int64 v17; 
  _RTL_BITMAP_EX BitMapHeader; 
  __int128 v19; 
  __int128 v20; 
  __int128 v21; 
  __int128 v22; 
  NTSTATUS(__stdcall *v23)(INT64, INT64, UINT64); 
  NTSTATUS(__stdcall *v24)(PVOID, _WHEA_ERROR_SEVERITY *); 
  __int64 v25; 
  __int128 MemoryInformation; 
  __int128 v27; 
  __int128 v28; 
  PVOID BaseAddressa; 
  int v30; 
  int v31; 
  _DWORD *v32; 

  BaseAddressa = BaseAddress;
  v4 = 0;
  v5 = v3;
  v6 = a3;
  v8 = (__int64)BaseAddress;
  MemoryInformation = 0i64;
  v27 = 0i64;
  v28 = 0i64;
  v19 = 0i64;
  v20 = 0i64;
  v21 = 0i64;
  if( a2 )
  {
    if( !v3 || !a3 || v3 > a3 )
      return v4;
  }
  else
  {
    if( ZwQueryVirtualMemory(-1, BaseAddress, MemoryRegionInformation, &MemoryInformation, 48, 0i64) < 0 )
      return v4;
    if( ZwQueryVirtualMemory(-1, BaseAddressa, MemoryBasicInformation, &v19, 48, 0i64) < 0 )
      return v4;
    v8 = (__int64)BaseAddressa;
    if( (PVOID)v19 != BaseAddressa || (_DWORD)v21 == 0x10000 )
      return v4;
    v6 = v27;
    if( (_DWORD)v21 == 4096 )
      v5 = *((_QWORD *)&v20 + 1);
  }
  v9 = (INT64)RtlpHpFixedHeapCommitRoutine;
  if( a2 )
    v9 = a2;
  v10 = v6 >> 12;
  v11 = ((v10 >> 3) + 7) & 0xFFFFFFFFFFFFFFF8ui64;
  v12 = v11 + 4351;
  v17 = (v11 + 4351) & 0xFFFFFFFFFFFFF000ui64;
  if( v5 < v17 )
  {
    if( ((int(__fastcall *)(__int64, PVOID *, unsigned __int64 *))v9)(v8, &BaseAddressa, &v17) < 0 )
      return v4;
    v8 = (__int64)BaseAddressa;
  }
  memset((VOID *)v8, 0i64, v11 + 256);
  if( v9 )
    *(_QWORD *)(v8 + 8) = RtlpHpHeapGlobals ^ v9;
  *(_DWORD *)(v8 + 32) = *v32 & 1;
  *(_QWORD *)(v8 + 24) = 0i64;
  v13 = v31;
  v14 = v31 & 0x13000003;
  *(_DWORD *)(v8 + 16) = -857879331;
  *(_DWORD *)(v8 + 20) = v14;
  *(_QWORD *)v8 = v10;
  BitMapHeader.SizeOfBitMap = v10;
  BitMapHeader.Buffer = (unsigned __int64 *)(v8 + 256);
  RtlSetBitsEx(&BitMapHeader, 0i64, v12 >> 12);
  *(_QWORD *)(v8 + 48) = v10;
  *(_QWORD *)(v8 + 56) = v8 ^ (v8 + 256);
  v15 = *(_DWORD *)(v8 + 32);
  *(_QWORD *)&v22 = RtlpHpFixedVsAllocate;
  v25 = 0i64;
  *((_QWORD *)&v22 + 1) = RtlpHpFixedVsFree;
  v23 = RtlpHpFixedVsCommit;
  v24 = xHalTimerWatchdogStop;
  v30 = 0;
  RtlpHpVsContextInitialize(v8 + 64, v8, &v22, v15, v13 & 0x8000000, &v30);
  return v8;
}

Referenced by:

RtlCreateHeap