RtlpHpVsSubsegmentCreate
NTSTATUS __stdcall RtlpHpVsSubsegmentCreate(INT64 a1, INT64 a2, UINT64 a3){
NTSTATUS v3;
__int64 v4;
unsigned int v5;
unsigned int v6;
unsigned int v8;
__int64 v9;
unsigned int v10;
unsigned __int64 v11;
__int16 v12;
__int16 v13;
int v15;
unsigned int v16;
unsigned int v17;
v3 = 0;
v4 = (unsigned int)(2 * a2 + 72);
v16 = 0;
v15 = 0;
v5 = (a2 + 4167) & 0xFFFFF000;
v17 = 0;
v6 = a3;
if( ((2 * (_DWORD)a2 + 71) & (unsigned int)v4) != 0 )
{
_BitScanReverse(&v8, v4);
v17 = v8;
v4 = (unsigned int)(1 << (v8 + 1));
}
if( (unsigned int)v4 <= 0x10000 )
v4 = 0x10000i64;
if( (unsigned int)v4 >= 0x40000 )
v4 = 0x40000i64;
while( 1 )
{
v9 = ((__int64(__fastcall *)(INT64, _QWORD, _QWORD, int *, unsigned int *))(a1 ^ RtlpHpHeapGlobals ^ *(_QWORD *)(a1 + 136)))(
a1 ^ *(_QWORD *)(a1 + 128),
(unsigned int)v4,
v6,
&v15,
&v16);
if( v9 )
break;
if( v16 < v5 )
goto LABEL_17;
v4 = v16;
}
v10 = 4096;
if( (v15 & 1) != 0 )
v10 = v4;
if( ((int(__fastcall *)(INT64, __int64, _QWORD))(a1 ^ RtlpHpHeapGlobals ^ *(_QWORD *)(a1 + 152)))(
a1 ^ *(_QWORD *)(a1 + 128),
v9,
v10) >= 0 )
{
_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 48), (unsigned __int64)v10 >> 12);
v11 = (unsigned __int64)(v4 - 48) >> 4;
*(_OWORD *)v9 = 0i64;
*(_OWORD *)(v9 + 16) = 0i64;
*(_QWORD *)(v9 + 32) = 0i64;
*(_WORD *)(v9 + 32) = v11;
v12 = 0;
*(_QWORD *)(v9 + 16) = 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)((unsigned __int64)v10 >> 12));
if( v10 == (_DWORD)v4 )
v12 = 0x8000;
v13 = *(_WORD *)(v9 + 34) & 0x7FFF | v12;
*(_WORD *)(v9 + 34) = v13;
*(_WORD *)(v9 + 34) ^= (v11 ^ v13 ^ 0x2BED) & 0x7FFF;
*(_OWORD *)(v9 + 48) = 0i64;
*(_WORD *)(v9 + 52) = 0;
v3 = v9;
*(_WORD *)(v9 + 50) = v11;
*(_QWORD *)(v9 + 48) ^= (v9 + 48) ^ RtlpHpHeapGlobals;
return v3;
}
LABEL_17:
if( v9 )
((void(__fastcall *)(INT64, __int64, _QWORD, _QWORD))(a1 ^ RtlpHpHeapGlobals ^ *(_QWORD *)(a1 + 144)))(
a1 ^ *(_QWORD *)(a1 + 128),
v9,
(unsigned int)v4,
v6);
return v3;
}Referenced by:
RtlpHpVsContextAllocateInternal