RtlpHpSegMgrCommit
INT64 __fastcall RtlpHpSegMgrCommit(INT64 rcx0, INT64 rdx0, UINT64 a3, INT64 r9_0, INT64 a5, INT64 arg28, INT64 a7){
int v7;
unsigned __int64 v8;
int v9;
unsigned __int64 v10;
unsigned int v11;
volatile INT16 *v14;
INT64 v15;
size_t v16;
bool v17;
int v18;
int v19;
int v20;
volatile INT16 *v21;
__int128 v23;
union _RTL_RUN_ONCE *HeapManager;
CHAR v25;
int v26;
int v27;
unsigned __int64 v28;
INT64 v29;
PEX_SPIN_LOCK SpinLock;
INT64 result;
size_t a2;
volatile INT16 *v33;
LONG v34[2];
_DWORD a1[4];
INT64 a6[2];
__int128 a4[2];
__int128 v38;
UINT8 v39;
v7 = r9_0;
v8 = (int)a5;
v9 = arg28 & 0x40000000;
v10 = (unsigned int)a3;
v11 = arg28 & 0xBFFFFFFF;
v39 = 0;
*(_QWORD *)v34 = 0i64;
if( (int)a5 > 0 && !(unsigned int)RtlpHpSegHeapCheckCommitLimit((int)((_DWORD)a5 << 12), *(UINT64 **)(rcx0 + 56)) )
return 3221225773i64;
if( (*(_BYTE *)(rcx0 + 13) & 7) != 0 )
{
a4[1] = 0i64;
v38 = 0i64;
v23 = *(_OWORD *)(rcx0 + 40);
result = rdx0 & 0xFFFFFFFFFFE00000ui64;
*(_OWORD *)a1 = v23;
HeapManager = RtlpHpEnvGetHeapManager(a1);
RtlpHpVaMgrCtxQuery((UINT64)&HeapManager[11], v25);
v14 = (volatile INT16 *)(v38 + 2 * (v10 >> 9));
}
else
{
v14 = 0i64;
}
v15 = (unsigned int)((_DWORD)v10 << 12) + rdx0;
v33 = v14;
v16 = (unsigned int)(v7 << 12);
while( 1 )
{
result = v15;
a2 = v16;
if( !v14 )
goto LABEL_7;
v26 = RtlpHpSegMgrCommitInitiate(rcx0, v14, (unsigned int)v8, (unsigned int)a7, (UINT64)v34, &v39);
if( v26 == -1073741568 )
break;
if( v26 == -1073741566 )
{
result &= 0xFFFFFFFFFFE00000ui64;
v27 = v11 | 0x20000000;
a2 = 0x200000i64;
if( (int)v8 <= 0 )
v27 = v11;
v11 = v27;
}
LABEL_7:
if( (int)v8 <= 0 )
{
a4[0] = *(_OWORD *)(rcx0 + 40);
v20 = RtlpHpFreeVA((UINT64 *)&result, &a2, v11, a4);
}
else
{
if( v9 && (v11 & 0x20000000) == 0 )
v11 |= 0x40000000u;
v17 = (*(_DWORD *)(*(_QWORD *)(rcx0 + 56) + 20i64) & 0x40000000) == 0;
v18 = 64;
*(_OWORD *)a6 = *(_OWORD *)(rcx0 + 40);
if( v17 )
v18 = 4;
LODWORD(SpinLock) = v18;
v19 = RtlpHpAllocVA(&result, &a2, 0i64, v11, (UINT64)SpinLock, (INT64)a6);
v20 = v19;
if( v9 && v19 >= 0 && (v11 & 0x40000000) == 0 )
memset(result, 0i64);
}
v21 = v33;
if( !v33 )
return(unsigned int)v20;
if( (*v33 & 0x4000) != 0 )
{
if( v20 < 0 )
goto LABEL_40;
v28 = 1i64;
if( (int)v8 <= 0 )
v28 = -1i64;
_InterlockedExchangeAdd64((volatile signed __int64 *)(*(__int16 *)(rcx0 + 20) + rcx0 + 8), v28);
_InterlockedExchangeAdd64((volatile signed __int64 *)(*(__int16 *)(rcx0 + 20) + rcx0), v8);
}
if( v20 < 0 )
{
LABEL_40:
v29 = 0i64;
goto LABEL_37;
}
v29 = 1i64;
LABEL_37:
RtlpHpSegMgrCommitComplete(rcx0, v21, (unsigned int)v8, v29, (UINT64)v34, v39);
if( (v11 & 0x20000000) == 0 || v20 >= 0 || (a7 & 2) != 0 )
return(unsigned int)v20;
v14 = v33;
LODWORD(a7) = a7 | 1;
v11 &= ~0x20000000u;
}
_InterlockedExchangeAdd64((volatile signed __int64 *)(*(__int16 *)(rcx0 + 20) + rcx0), v8);
if( v9 )
memset(result, 0i64);
return 0i64;
}Referenced by:
RtlpHpSegMgrAllocate
RtlpHpSegMgrRelease
RtlpHpSegPageRangeCommit