RtlpFindAndCommitPages
UINT64 __fastcall RtlpFindAndCommitPages(INT64 a1, UINT64 *a2){
__int64 *UCREntry;
__int64 *v5;
INT64 v6;
UINT64 v7;
char v8;
__int64 v9;
unsigned __int64 v10;
int v11;
void *v12;
UINT64 v13;
UINT64 v15;
UINT64 v16;
INT64 v17;
UINT64 AllocationType;
UINT64 Protect;
PVOID BaseAddress;
UCREntry = RtlpFindUCREntry(a1, *a2);
v5 = UCREntry;
if( UCREntry == (__int64 *)(a1 + 240) )
return 0i64;
if( RtlpHeapErrorHandlerThreshold >= 1 && UCREntry[5] < *a2 )
{
DbgPrint("(UCRBlock->Size >= *Size)");
RtlpHeapHandleError(v6);
}
v7 = (UINT64)(UCREntry - 2);
v8 = 0;
v9 = *((unsigned __int8 *)UCREntry - 2);
if( (_BYTE)v9 )
v10 = (v7 & 0xFFFFFFFFFFFF0000ui64) - (v9 << 16) + 0x10000;
else
v10 = a1;
BaseAddress = (PVOID)v5[4];
if( RtlpHeapKey != *(_QWORD *)(a1 + 360) )
{
v11 = ((__int64(__fastcall *)(INT64, PVOID *, UINT64 *))(RtlpHeapKey ^ *(_QWORD *)(a1 + 360)))(
a1,
&BaseAddress,
a2);
}
else
{
v13 = (*a2 + 4095) & 0xFFFFFFFFFFFFF000ui64;
*a2 = v13;
if( (unsigned int)RtlpHpHeapCheckCommitLimit(
v13,
*(_QWORD *)(a1 + 576) - *(_QWORD *)(a1 + 664),
a1,
(UINT64 *)(a1 + 376)) )
{
LODWORD(Protect) = 4;
LODWORD(AllocationType) = 4096;
ZwAllocateVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, 0i64, a2, AllocationType, Protect);
}
RtlpUpdateHeapRates((_DWORD *)a1, 2);
}
if( v11 < 0 )
{
++*(_DWORD *)(a1 + 632);
return 0i64;
}
if( *(_DWORD *)(a1 + 124) )
{
*(_DWORD *)(v7 + 8) ^= *(_DWORD *)(a1 + 136);
LOBYTE(v12) = *(_BYTE *)(v7 + 8) ^ *(_BYTE *)(v7 + 9) ^ *(_BYTE *)(v7 + 10);
if( *(_BYTE *)(v7 + 11) != (_BYTE)v12 )
RtlpAnalyzeHeapFailure(a1, v7);
}
*(_BYTE *)(v7 + 10) = 0;
*(_BYTE *)(v7 + 15) = 0;
RtlpRemoveUCRBlock(v12, v5);
--*(_DWORD *)(v10 + 84);
*(_DWORD *)(v10 + 80) -= (unsigned __int64)v5[5] >> 12;
*(_QWORD *)(a1 + 576) += v5[5];
++*(_DWORD *)(a1 + 608);
--*(_DWORD *)(a1 + 604);
v15 = v5[5];
if( v15 >= 0xFF000 )
{
*(_QWORD *)(a1 + 584) -= v15;
v15 = v5[5];
}
v16 = *a2;
if( v15 > *a2 || v15 + v5[4] == *(_QWORD *)(v10 + 72) )
{
RtlpCreateUCREntry(a1, v10, v16 - 48 + v5[4], v15 - v16, v7, (INT64 *)a2);
*a2 *= 16i64;
}
else
{
*a2 = v16 + 16i64 * *(unsigned __int16 *)(v7 + 8);
}
*(_BYTE *)(v7 + 11) = 0;
v17 = *(_QWORD *)(v10 + 40);
if( v17 != v10 )
{
if( ((v7 - v10) >> 16) + 1 >= 0xFE )
RtlpLogHeapFailure(3i64, v17, v7, v10, 0i64, 0i64);
v8 = ((unsigned int)(v7 - v10) >> 16) + 1;
}
*(_BYTE *)(v7 + 14) = v8;
return v7;
}Referenced by:
RtlpExtendHeap