MiInitializeProcessBottomUpEntropy

__int64 __fastcall MiInitializeProcessBottomUpEntropy(__int64 a1){
  int v1; 
  unsigned int v2; 
  __int64 v3; 
  char v5; 
  unsigned __int64 v6; 
  int v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  __int64 v13; 
  __int64 result; 
  __int64 v15; 
  __int64 v16; 
  INT64 v17; 
  v1 = *(_DWORD *)(a1 + 2512);
  v2 = 0;
  v3 = *(_QWORD *)(a1 + 1680);
  v17 = 0i64;
  v5 = 0;
  v16 = 1i64;
  v6 = 2i64;
  if( (v1 & 0x40) != 0 )
    goto LABEL_20;
  v7 = ExGenRandom(1i64);
  v8 = (unsigned __int8)v7;
  if( !*(_DWORD *)InitializationPhase )
    *(_DWORD *)(a1 + 2512) |= 0x20u;
  if( *(_QWORD *)(a1 + 1496) > 0x100000000ui64 && (*(_DWORD *)(a1 + 2512) & 0x20) != 0 )
  {
    v9 = *(_QWORD *)&v7 & 0xFFFFFFi64;
    v8 = 0x10000i64;
    v5 = 1;
    if( v9 > 0x10000 )
      v8 = v9;
  }
  if( !v8 )
    v8 = 1i64;
  v16 = v8;
  if( !v5 )
  {
LABEL_20:
    _InterlockedAnd((volatile signed __int32 *)(a1 + 2512), 0xFFFFFFDF);
    v8 = v16;
  }
  if( v5 == 1 )
    v15 = v8 + (ExGenRandom(1i64) & 0xFFFFFF) + 0x1000000;
  else
    v15 = v8;
  if( *(_QWORD *)(a1 + 1496) <= 0x100000000ui64 )
  {
    v6 = 3i64;
    v17 = (ExGenRandom(1i64) & 0xFFFFFF) + 0x10000;
  }
  *(_QWORD *)(v3 + 264) = v6;
  v10 = 0i64;
  do
  {
    v11 = 9 * v10;
    v12 = *(_QWORD *)(a1 + 1496) - 1i64;
    if( v2 == 2 )
      v12 = 0x7FFFFFFEFFFFi64;
    ++v2;
    *(_QWORD *)(v3 + 72 * v10 + 88) = v12 >> 16;
    v13 = *(&v15 + v10);
    *(_QWORD *)(v3 + 72 * v10 + 112) = v13;
    result = v13 << 16;
    v10 = v2;
    *(_QWORD *)(v3 + 8 * v11 + 104) = result;
  }
  while( v2 < v6 );
  return result;
}

Referenced by:

MmInitializeProcessAddressSpace