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