RtlpHpAllocateHeap
UINT8 *__stdcall RtlpHpAllocateHeap(VOID *HeapAddress, VOID *Param2, INT64 a3, INT16 a4){
int v5;
unsigned int v7;
INT64 v8;
int v9;
int v10;
char *v11;
char *v12;
unsigned __int64 v13;
_XSTATE_CONFIGURATION *HeapInternal;
INT64 v15;
_XSTATE_CONFIGURATION *v16;
int v18;
UINT64 v19;
INT64 v20;
INT64 v21;
__int64 v22;
LOWORD(v22) = a4;
v5 = a3 | *((_DWORD *)HeapAddress + 5);
LODWORD(v22) = 0;
v7 = v5 & 0x93000F0B;
if( !RtlpHpCheckAllocationSizeLimit(Param2, HeapAddress, (INT64)HeapAddress + 32) )
return 0i64;
v8 = 0i64;
v21 = 0i64;
v9 = 0;
v10 = -1073741823;
if( (v7 & 0x1000000) == 0 )
{
v9 = *((_DWORD *)HeapAddress + 6);
if( v9 )
{
v7 |= 8u;
if( (_WORD)v9 == 1 )
{
v18 = ((__int64(__fastcall *)(VOID *, _QWORD, __int64, INT64 *))RtlpInterceptorRoutines.QuadPart)(
HeapAddress,
0i64,
1i64,
&v21);
v8 = v21;
}
else
{
v18 = -1073741823;
}
if( v18 < 0 )
return 0i64;
}
}
v11 = (char *)Param2 + v8;
v12 = (char *)Param2 + v8 + 16;
if( (v7 & 0x10000000) == 0 )
v12 = v11;
if( (v7 & 0x20000F08) != 0 )
v12 = (char *)(((unsigned __int64)(v12 + 15) & 0xFFFFFFFFFFFFFFF0ui64) + 16);
v13 = 1i64;
if( v12 )
v13 = (unsigned __int64)v12;
if( v13 < (unsigned __int64)Param2 || (unsigned __int64)Param2 > 0x7FFFFFFFFFFFFFFFi64 )
return 0i64;
HeapInternal = (_XSTATE_CONFIGURATION *)RtlpHpAllocateHeapInternal(
(INT64)HeapAddress,
(UINT64)Param2,
v13,
v7 & 0x13000003,
(__int64)&v22);
v16 = HeapInternal;
if( HeapInternal )
{
if( (v7 & 0x30000F08) != 0 )
{
LODWORD(v20) = v7;
v19 = RtlpHpExtrasAppend((INT128 *)HeapAddress, HeapInternal, (INT64)Param2, v15, v21, v20, 0);
if( v9 )
{
*(_BYTE *)(v19 + 2) ^= (v9 ^ *(_BYTE *)(v19 + 2)) & 0xF;
if( (_WORD)v9 == 1 )
v10 = ((__int64(__fastcall *)(VOID *, _XSTATE_CONFIGURATION *, __int64, UINT64))RtlpInterceptorRoutines.QuadPart)(
HeapAddress,
v16,
2i64,
v19 + 16);
if( v10 < 0 )
{
RtlpHpFreeHeap(HeapAddress, v16, v7);
return 0i64;
}
}
}
}
return(UINT8 *)v16;
}Referenced by:
ExAllocateHeapPages
RtlpHpMetadataAlloc