RtlpHpVsContextAllocateInternal
CHAR *__fastcall RtlpHpVsContextAllocateInternal(INT64 *SpinLock, UINT64 a2, UINT64 a3, UINT64 a4, INT64 a5, INT64 a6){
unsigned int v6;
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;
unsigned __int64 v25;
CHAR *v26;
__int64 v27;
int v28;
__int64 v30;
int v31;
__int16 v32;
__int16 v33;
INT64 v34;
INT64 v35;
unsigned int Size;
Size = a2;
v6 = a4;
v7 = a3;
if( (_DWORD)a2 != (_DWORD)a3 )
v7 = a3 + 2;
v9 = (_DWORD *)a6;
v10 = a5;
v11 = ((v7 + 15) >> 4) + (SpinLock[22] & 1) + 1;
v12 = v11 << 16;
if( !*(_DWORD *)a6 )
{
*(_DWORD *)a6 = 1;
if( (a4 & 1) == 0 )
{
RtlpHpAcquireQueuedLockExclusive((INT8)SpinLock, (UINT64 *)*((unsigned int *)SpinLock + 2));
v10 = a5;
}
}
v13 = SpinLock + 2;
while( 1 )
{
v14 = SpinLock[3];
v15 = *v13;
if( (v14 & 1) != 0 && v15 )
v15 ^= (unsigned __int64)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( (v6 & 1) == 0 )
RtlpHpReleaseQueuedLockExclusive(*((unsigned int *)SpinLock + 2), v10);
*v9 = 0;
v34 = RtlpHpVsSubsegmentCreate((INT64)SpinLock, v7, v6);
if( !v34 )
return 0i64;
*(_DWORD *)a6 = 1;
if( (v6 & 1) == 0 )
RtlpHpAcquireQueuedLockExclusive((INT8)SpinLock, (UINT64 *)*((unsigned int *)SpinLock + 2));
RtlpHpVsContextAddSubsegment(SpinLock, v34);
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 = (v22 - (unsigned int)(v24 << 12)) & 0xFFFFFFFFFFFFF000ui64;
if( (((unsigned __int16)(*(_WORD *)(v25 + 32) ^ *(_WORD *)(v25 + 34)) ^ 0x2BED) & 0x7FFF) != 0 )
{
RtlpLogHeapFailure(18i64, (unsigned __int64)SpinLock ^ SpinLock[16], v25, v15 - 8, 0i64, 0i64);
return 0i64;
}
if( (SpinLock[22] & 1) != 0 && ((v20 + 32) & 0xFFF) != 0 )
--v11;
LODWORD(v35) = v6;
if( !(unsigned int)RtlpHpVsChunkSplit(SpinLock, v25, v15 - 8, v11, v35, v10) )
return 0i64;
v26 = (CHAR *)(v20 + 16);
v27 = 16 * (WORD1(RtlpHpHeapGlobals) ^ WORD1(v20) ^ *(unsigned __int16 *)(v20 + 2)) - 16;
if( (SpinLock[22] & 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( Size < (unsigned int)v27 )
{
v30 = (unsigned int)v27;
v31 = v27 - Size;
*(_DWORD *)v15 = v28 | 0x100;
v26[v27 - 1] = 0;
v32 = *(_WORD *)&v26[v27 - 2];
v33 = v32 ^ (v32 ^ (v27 - Size)) & 0x1FFF;
if( v31 == 1 )
v33 = v32 | 0x8000;
*(_WORD *)&v26[v30 - 2] = v33;
}
else
{
*(_DWORD *)v15 = v28 & 0xFFFFFEFF;
}
if( (v6 & 2) != 0 )
{
if( (v6 & 1) == 0 )
RtlpHpReleaseQueuedLockExclusive(*((unsigned int *)SpinLock + 2), a5);
*(_DWORD *)a6 = 0;
memset((INT64)v26, 0i64);
}
return v26;
}Referenced by:
ExAllocateHeapPool
RtlpHpVsContextAllocate
RtlpHpVsContextMultiAlloc