RtlpHpVsContextAllocateInternal
char *__fastcall RtlpHpVsContextAllocateInternal(
INT64 a1,
size_t a2,
unsigned int a3,
unsigned int a4,
INT64 a5,
__int64 a6){
unsigned int v7;
_DWORD *v9;
INT64 v10;
unsigned int v11;
unsigned int v12;
INT64 v13;
__int64 v14;
unsigned __int64 v15;
_QWORD *v16;
int v17;
unsigned int v18;
unsigned __int64 v19;
unsigned __int64 v20;
__int64 v21;
unsigned __int64 v22;
int v23;
int v24;
_WORD *v25;
char *v26;
__int64 v27;
int v28;
__int64 v30;
int v31;
__int16 v32;
__int16 v33;
INT64 v34;
INT64 v35;
VOID *Param2;
v7 = a3;
if( a2 != a3 )
v7 = a3 + 2;
v9 = (_DWORD *)a6;
v10 = a5;
v11 = ((v7 + 15) >> 4) + (*(_DWORD *)(a1 + 176) & 1) + 1;
v12 = v11 << 16;
if( !*(_DWORD *)a6 )
{
*(_DWORD *)a6 = 1;
if( (a4 & 1) == 0 )
{
RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
v10 = a5;
}
}
v13 = a1 + 16;
while( 1 )
{
v14 = *(_QWORD *)(a1 + 24);
v15 = *(_QWORD *)v13;
if( (v14 & 1) != 0 && v15 )
v15 ^= v13;
v16 = 0i64;
v17 = v14 & 1;
while( v15 )
{
v18 = RtlpHpHeapGlobals ^ *(_DWORD *)(v15 - 8) ^ (v15 - 8);
if( v12 < v18 )
{
v19 = *(_QWORD *)v15;
v16 = (_QWORD *)v15;
if( v17 && v19 )
goto LABEL_39;
}
else
{
if( v12 <= v18 )
goto LABEL_17;
v19 = *(_QWORD *)(v15 + 8);
if( v17 && v19 )
{
LABEL_39:
v15 ^= v19;
continue;
}
}
v15 = v19;
}
v15 = (unsigned __int64)v16;
LABEL_17:
if( v15 )
break;
if( (a4 & 1) == 0 )
RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), v10);
*v9 = 0;
LODWORD(v34) = RtlpHpVsSubsegmentCreate(a1, v7, a4);
v35 = v34;
if( !v34 )
return 0i64;
*(_DWORD *)a6 = 1;
if( (a4 & 1) == 0 )
RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
RtlpHpVsContextAddSubsegment((UINT64 *)a1, v35);
v10 = a5;
v9 = (_DWORD *)a6;
}
v20 = v15 - 8;
v21 = HIDWORD(*(_QWORD *)(v15 - 8));
v22 = v15 - 8;
if( ((DWORD1(RtlpHpHeapGlobals) ^ (unsigned int)v21 ^ ((v15 - 8) >> 32)) & 0xFF0000) != 0 )
{
v24 = (unsigned __int8)(RtlpHpHeapGlobals ^ v20 ^ *(_BYTE *)v15);
}
else
{
if( WORD2(RtlpHpHeapGlobals) ^ (unsigned __int16)(v21 ^ WORD2(v20)) )
{
v22 -= 16i64 * (unsigned __int16)(((unsigned __int64)RtlpHpHeapGlobals ^ v20 ^ *(_QWORD *)(v15 - 8)) >> 32);
v23 = DWORD1(RtlpHpHeapGlobals) ^ HIDWORD(v22) ^ HIDWORD(*(_QWORD *)v22);
if( (v23 & 0xFF0000) != 0 )
{
v24 = (unsigned __int8)(RtlpHpHeapGlobals ^ v22 ^ *(_BYTE *)(v22 + 8));
goto LABEL_23;
}
if( (_WORD)v23 )
{
v22 -= 16i64 * (unsigned __int16)(((unsigned __int64)RtlpHpHeapGlobals ^ v22 ^ *(_QWORD *)v22) >> 32);
v24 = (unsigned __int8)(RtlpHpHeapGlobals ^ v22 ^ *(_BYTE *)(v22 + 8));
goto LABEL_23;
}
}
v24 = 0;
}
LABEL_23:
v25 = (_WORD *)((v22 - (unsigned int)(v24 << 12)) & 0xFFFFFFFFFFFFF000ui64);
if( (((unsigned __int16)(v25[16] ^ v25[17]) ^ 0x2BED) & 0x7FFF) != 0 )
{
RtlpLogHeapFailure(
heap_failure_vs_subsegment_corruption,
(VOID *)(a1 ^ *(_QWORD *)(a1 + 128)),
v25,
(VOID *)(v15 - 8),
0i64);
return 0i64;
}
if( (*(_DWORD *)(a1 + 176) & 1) != 0 && ((v20 + 32) & 0xFFF) != 0 )
--v11;
LODWORD(Param2) = a4;
if( !RtlpHpVsChunkSplit(a1, (UINT64)v25, v15 - 8, v11, (INT64)Param2, v10) )
return 0i64;
v26 = (char *)(v20 + 16);
v27 = 16 * (WORD1(RtlpHpHeapGlobals) ^ WORD1(v20) ^ *(unsigned __int16 *)(v20 + 2)) - 16;
if( (*(_DWORD *)(a1 + 176) & 1) != 0 && ((v20 + 32) & 0xFFF) == 0 )
{
v26 = (char *)(v20 + 32);
v27 = 16 * (WORD1(RtlpHpHeapGlobals) ^ WORD1(v20) ^ *(unsigned __int16 *)(v20 + 2)) - 32;
}
v28 = *(_DWORD *)v15;
if( a2 < (unsigned int)v27 )
{
v30 = (unsigned int)v27;
v31 = v27 - a2;
*(_DWORD *)v15 = v28 | 0x100;
v26[v27 - 1] = 0;
v32 = *(_WORD *)&v26[v27 - 2];
v33 = v32 ^ (v32 ^ (v27 - a2)) & 0x1FFF;
if( v31 == 1 )
v33 = v32 | 0x8000;
*(_WORD *)&v26[v30 - 2] = v33;
}
else
{
*(_DWORD *)v15 = v28 & 0xFFFFFEFF;
}
if( (a4 & 2) != 0 )
{
if( (a4 & 1) == 0 )
RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), a5);
*(_DWORD *)a6 = 0;
memset(v26, 0i64, a2);
}
return v26;
}Referenced by:
ExAllocateHeapPool
RtlpHpVsContextAllocate
RtlpHpVsContextMultiAlloc