RtlpAllocateHeapInternal
NTSTATUS __stdcall RtlpAllocateHeapInternal(PVOID HeapHandle, UINT64 Size, UINT64 Flags){
__int16 v3;
unsigned __int64 v4;
unsigned int v6;
void *v7;
int v9;
unsigned __int64 v10;
int v11;
int v12;
int v13;
unsigned __int64 v14;
__int64 v15;
_DWORD *v16;
__int64 v17;
_DWORD *v18;
char v19;
unsigned __int64 v20;
int v21;
LOWORD(v21) = v3;
v4 = Size;
if( *((_DWORD *)HeapHandle + 4) == -857879331 )
{
if( Size > 0x20000 )
{
LODWORD(v7) = 0;
}
else
{
v6 = RtlpHpConvertFlagsToSegmentFlags((unsigned int)Flags);
LODWORD(v7) = RtlpHpVsContextAllocate(
(INT64)HeapHandle + 64,
(unsigned int)v4,
(unsigned int)v4,
*((_DWORD *)HeapHandle + 5) | v6);
}
return(int)v7;
}
v9 = *((_DWORD *)HeapHandle + 29) | Flags;
v10 = 0i64;
v21 = 0;
v20 = 0i64;
if( Size > 0x7FFFFFFFFFFFFFFFi64
|| !(unsigned int)RtlpHpCheckAllocationSizeLimit(Size, (INT64)HeapHandle, (INT64)HeapHandle + 376) )
{
goto LABEL_24;
}
v11 = *((_DWORD *)HeapHandle + 36);
v12 = -1073741823;
if( v11 )
{
if( (v9 & 0x3C000102) != 0 )
{
v11 = 0;
}
else
{
if( (_WORD)v11 == 1 )
v13 = ((__int64(__fastcall *)(PVOID, _QWORD, __int64, unsigned __int64 *))RtlpInterceptorRoutines)(
HeapHandle,
0i64,
1i64,
&v20);
else
v13 = -1073741823;
if( v13 < 0 )
goto LABEL_24;
v14 = (v20 + 15) & 0xFFFFFFFFFFFFFFF0ui64;
v4 += v14 + 16;
v20 = v14 + 16;
}
}
v15 = 1i64;
if( v4 )
v15 = v4;
v10 = (v15 + 23) & 0xFFFFFFFFFFFFFFF0ui64;
v16 = RtlpAllocateHeap((__int64)HeapHandle, v9 | 2u, v4, v10, v19, &v21);
LODWORD(v7) = (_DWORD)v16;
if( !v16 )
goto LABEL_25;
if( v11 )
{
v18 = v16;
v4 -= v20;
v7 = (void *)RtlpSetupExtendedBlock((__int64)HeapHandle, v9, (__int64)v16, v17, v20, v11);
if( (_WORD)v11 == 1 )
v12 = ((__int64(__fastcall *)(PVOID, void *, __int64, _DWORD *))RtlpInterceptorRoutines)(
HeapHandle,
v7,
2i64,
v18);
if( v12 < 0 )
{
RtlFreeHeap(HeapHandle, 0i64, v7);
LABEL_24:
LODWORD(v7) = 0;
LABEL_25:
if( (v9 & 4) != 0 )
{
if( v10 )
v4 = v10;
RtlpAllocateHeapRaiseException(v4);
}
}
}
return(int)v7;
}Referenced by:
RtlAllocateHeap
RtlpHpAllocWithExceptionProtection