RtlpHpAllocVA
NTSTATUS __fastcall RtlpHpAllocVA(INT64 *a1, __int64 *a2, __int64 a3, int a4, UINT64 a5, __int64 a6){
unsigned int v8;
__int64 v9;
__int64 v10;
INT64 v11;
NTSTATUS result;
_RTL_RUN_ONCE *HeapManager;
INT64 v14;
__int64 v15;
INT64 v16;
__int64 v17;
UINT64 v18;
INT64 v19;
INT64 v20;
INT64 v21;
INT64 v22;
__int128 v23;
UINT64 v24;
int v25;
int v26;
__int64 v27;
INT64 v28[2];
v28[0] = 0x100000001000i64;
v28[1] = 0x4000000000200000i64;
v8 = a4 & 0xFEFFFFFF;
v23 = *(_OWORD *)a6;
if( (a4 & 0xFEFFFFFF) == 0x2000 && (a4 & 0x1000000) == 0 )
{
*(_OWORD *)v28 = *(_OWORD *)a6;
HeapManager = RtlpHpEnvGetHeapManager(v28);
v26 = 0;
if( BYTE3(v23) )
LODWORD(v24) = BYTE3(v23) - 1;
else
LODWORD(v24) = -1;
HIDWORD(v24) = BYTE1(v23);
v25 = BYTE2(v23);
if( (v23 & 8) != 0 )
v26 = 1;
v15 = *a2;
v27 = *((_QWORD *)&v23 + 1);
v28[0] = v15 - ((v15 - 1) & 0xFFFFF) + 0xFFFFF;
LODWORD(v16) = RtlpHpVaMgrCtxAlloc((INT64)&HeapManager[11], (INT64)v28, v14, &v24);
if( !v16 )
return -1073741670;
*a2 = v28[0];
*a1 = v16;
return 0;
}
v9 = *a2;
if( (a4 & 0x2000) != 0 )
{
v17 = *((unsigned int *)v28 + BYTE1(v23));
v10 = v17 - ((v9 + v17 - 1) & (unsigned int)(v17 - 1)) + v9 - 1;
}
else
{
v10 = v9 - ((v9 - 1) & 0xFFF) + 4095;
}
v28[0] = v10;
if( (a4 & 0x1000) != 0 && BYTE1(v23) >= 2u )
{
*a2 = v10;
if( (a4 & 0x40000000) != 0 )
memset((VOID *)*a1, 0i64, v10);
return 0;
}
v11 = v8;
LODWORD(v22) = BYTE2(v23);
LODWORD(v20) = BYTE1(v23);
LODWORD(v11) = v8 | 0x40000;
LODWORD(v18) = a5;
if( (((unsigned __int8)v23 >> 3) & ((v8 & 0x2000) != 0)) == 0 )
v11 = v8;
LODWORD(v19) = ((unsigned __int8)v23 >> 1) & 3;
result = RtlpHpEnvAllocVA(a1, v28, 0i64, v11, v18, v19, v20, v21, v22);
if( result >= 0 )
{
*a2 = v28[0];
return 0;
}
return result;
}Referenced by:
RtlpHpHeapAllocate
RtlpHpHeapExtendContext
RtlpHpLargeAlloc
RtlpHpSegMgrCommit
RtlpHpSegMgrReserve