RtlpHpLfhSubsegmentInitialize
UINT64 __stdcall RtlpHpLfhSubsegmentInitialize(INT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, INT64 a5){
unsigned int v6;
unsigned int v7;
unsigned int v8;
unsigned int v9;
int v10;
unsigned int v11;
unsigned int v12;
unsigned int v13;
__int64 v14;
_WORD *v15;
_WORD *v16;
_WORD *v17;
unsigned __int64 v18;
signed __int64 *v19;
__int16 Ucb_high;
UINT64 result;
unsigned int i;
int v23;
v6 = a2;
v7 = a4;
*(_OWORD *)a1 = 0i64;
LOWORD(v23) = a4;
v8 = (unsigned int)a2 / (unsigned int)a3;
*(_OWORD *)(a1 + 16) = 0i64;
*(_OWORD *)(a1 + 32) = 0i64;
v9 = (8 * ((unsigned int)a2 - 2 * ((unsigned int)a2 / (unsigned int)a3)) - 384) / (8 * (int)a4 + 2);
v10 = (2 * ((unsigned int)a2 / (unsigned int)a3 + 4 * (((unsigned __int64)(2 * v9) + 63) >> 6)) + 63) & 0xFFFFFFF0;
v11 = ((int)a2 - v10) / (unsigned int)a4;
if( v9 < v11 )
v11 = (8 * ((unsigned int)a2 - 2 * ((unsigned int)a2 / (unsigned int)a3)) - 384) / (8 * (int)a4 + 2);
v12 = (unsigned int)a1 >> 12;
HIWORD(v23) = (2 * ((unsigned int)a2 / (unsigned int)a3 + 4 * (((unsigned __int64)(2 * v9) + 63) >> 6)) + 63) & 0xFFF0;
*(_DWORD *)(a1 + 40) = v23 ^ DWORD2(RtlpHpHeapGlobals) ^ ((unsigned int)a1 >> 12);
_BitScanForward(&v13, a3);
*(_BYTE *)(a1 + 45) = v8;
*(_BYTE *)(a1 + 44) = v13;
*(_WORD *)(a1 + 32) = v11;
v14 = (unsigned __int16)(8 * ((((unsigned __int64)(2 * v11) + 63) >> 6) + 6));
*(_WORD *)(a1 + 46) = v14;
v15 = (_WORD *)(a1 + v14);
*(_WORD *)(a1 + 34) = v11;
*(_BYTE *)(a1 + 38) = 2;
v16 = &v15[(unsigned __int8)v8];
v17 = v15 + 1;
*v15 = 1;
v18 = (2 * (unsigned __int64)(unsigned __int8)v8 - 2 + 1) >> 1;
if( v17 > v16 )
v18 = 0i64;
if( v18 )
{
while( v18 )
{
*v17++ = -1;
--v18;
}
}
v19 = (signed __int64 *)(a1 + 48);
memset((VOID *)(a1 + 48), 0i64, ((unsigned __int64)(2 * v11) + 7) >> 3);
if( ((2 * (_BYTE)v11) & 0x3F) != 0 )
v19[(unsigned __int64)(2 * v11) >> 6] |= ~((1i64 << ((2 * v11) & 0x3F)) - 1);
if( v6 > 0x1000 && (*(_BYTE *)(a5 + 62) & 1) != 0 )
{
if( ((v7 - 1) & v7) != 0 )
{
for( i = 4096; i < v6; i += 4096 )
{
if( (i - v10) % v7 )
{
_bittestandset64(v19, 2 * ((i - v10) / v7));
--*(_WORD *)(a1 + 32);
--*(_WORD *)(a1 + 34);
++*(_BYTE *)(a1 + 39);
}
}
}
else
{
if( (unsigned __int16)v10 - ((v7 - 1) & ((unsigned __int16)v10 + v7 - 1)) + v7 - 1 + v7 * v11 != v6 )
NT_ASSERT("FirstBlockOffset + BlockSize * BlockCount == SubsegmentSize");
HIWORD(v23) = v10 - ((v7 - 1) & (v10 + v7 - 1)) + v7 - 1;
*(_DWORD *)(a1 + 40) = v23 ^ DWORD2(RtlpHpHeapGlobals) ^ v12;
}
}
Ucb_high = HIWORD(KeGetCurrentThread()[1].Ucb);
result = RtlpHeapGenerateRandomValue64() & 0x7F7F7F7F7F7F7F7Fi64;
RtlpLowFragHeapRandomData[(unsigned __int8)Ucb_high >> 3] = result;
return result;
}Referenced by:
RtlpHpLfhSubsegmentCreate