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