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