RtlpInitializeHeapSegment
CHAR __fastcall RtlpInitializeHeapSegment(
INT64 a1,
INT64 a2,
INT64 a3,
INT64 a4,
INT64 a5,
INT64 a6,
UINT64 BaseAddress,
UINT64 a8){
UINT64 v8;
INT64 v11;
UINT64 v12;
__int64 v13;
UINT64 v14;
__int64 v15;
INT64 v16;
__int64 v17;
__int64 v18;
INT64 v19;
unsigned __int64 v20;
UINT64 v22;
UINT64 *v23;
INT64 *v24;
UINT64 AllocationType;
UINT64 Protect;
ULONG_PTR RegionSize[2];
v8 = a8;
RegionSize[0] = 0i64;
if( a8 - a6 > 0xFFFFF000 )
return 0;
v11 = a3 + 15;
v12 = BaseAddress;
v11 &= 0xFFFFFFFFFFFFFFF0ui64;
v13 = (__int64)(a8 - a6) / 4096;
v14 = v11 + a2;
v15 = v11 >> 4;
if( v14 + 80 >= BaseAddress )
{
if( v14 + 80 < a8 )
{
v16 = *(_QWORD *)(a1 + 576) - *(_QWORD *)(a1 + 664);
RegionSize[0] = (v14 - BaseAddress + 4111) & 0xFFFFFFFFFFFFF000ui64;
if( (unsigned int)RtlpHpHeapCheckCommitLimit(RegionSize[0], v16, a1, (UINT64 *)(a1 + 376)) )
{
LODWORD(Protect) = 4;
LODWORD(AllocationType) = 4096;
if( ZwAllocateVirtualMemory(
(PVOID)0xFFFFFFFFFFFFFFFFi64,
(PVOID *)&BaseAddress,
0i64,
RegionSize,
AllocationType,
Protect) >= 0 )
{
v12 = RegionSize[0] + BaseAddress;
BaseAddress += RegionSize[0];
goto LABEL_7;
}
}
++*(_DWORD *)(a1 + 632);
}
return 0;
}
LABEL_7:
*(_WORD *)(a2 + 8) = v15;
*(_WORD *)(a2 + 10) = 1;
*(_BYTE *)(a2 + 15) = 1;
*(_WORD *)(a2 + 12) = *(_WORD *)(a1 + 140);
v17 = (__int64)(v8 - v12) / 4096;
*(_QWORD *)(a2 + 40) = a1;
*(_DWORD *)(a2 + 20) = a5;
v18 = (unsigned int)((_DWORD)v13 << 12);
*(_QWORD *)(a2 + 72) = a6 + v18;
*(_DWORD *)(a2 + 16) = -1114130;
*(_QWORD *)(a2 + 48) = a6;
*(_QWORD *)(a2 + 64) = v14;
*(_DWORD *)(a2 + 56) = v13;
*(_DWORD *)(a2 + 80) = 0;
*(_QWORD *)(a1 + 576) += v18;
*(_QWORD *)(a1 + 568) += v18;
*(_QWORD *)(a2 + 104) = a2 + 96;
*(_QWORD *)(a2 + 96) = a2 + 96;
*(_BYTE *)(a2 + 14) = *(_QWORD *)(a2 + 40) != a2;
*(_WORD *)(v14 + 12) = *(_WORD *)(a2 + 8) ^ *(_WORD *)(a1 + 140);
v19 = *(_QWORD *)(a2 + 40);
if( v19 == a2 )
{
LOBYTE(v20) = 0;
}
else
{
v20 = ((v14 - a2) >> 16) + 1;
if( v20 >= 0xFE )
{
RtlpLogHeapFailure(3i64, v19, v14, a2, 0i64, 0i64);
v12 = BaseAddress;
}
}
*(_BYTE *)(v14 + 14) = v20;
RtlpCreateUCREntry(a1, a2, v12 - 48, (unsigned int)((_DWORD)v17 << 12), v14, (INT64 *)RegionSize);
if( *(_DWORD *)(a1 + 124) )
{
*(_BYTE *)(a2 + 11) = *(_BYTE *)(a2 + 8) ^ *(_BYTE *)(a2 + 9) ^ *(_BYTE *)(a2 + 10);
*(_DWORD *)(a2 + 8) ^= *(_DWORD *)(a1 + 136);
}
if( RegionSize[0] )
RtlpInsertFreeBlock(a1, v14, RegionSize[0]);
v22 = a1 + 288;
v23 = (UINT64 *)(a2 + 24);
v24 = *(INT64 **)(a1 + 296);
if( *v24 == a1 + 288 )
{
*v23 = v22;
v23[1] = (UINT64)v24;
*v24 = (INT64)v23;
*(_QWORD *)(a1 + 296) = v23;
}
else
{
RtlpLogHeapFailure(13i64, 0i64, v22, 0i64, *v24, 0i64);
}
++*(_DWORD *)(a1 + 600);
return 1;
}Referenced by:
RtlCreateHeap
RtlpExtendHeap