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