MiInitializeProcessBottomUpEntropy

VOID __stdcall MiInitializeProcessBottomUpEntropy(_EPROCESS *NewProcess){
  unsigned int MitigationFlags; 
  unsigned int v2; 
  _MMWSL_INSTANCE *VmWorkingSetList; 
  char v5; 
  unsigned __int64 v6; 
  int v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  UINT64 v16; 

  MitigationFlags = NewProcess->MitigationFlags;
  v2 = 0;
  VmWorkingSetList = NewProcess->Vm.Instance.VmWorkingSetList;
  v16 = 0i64;
  v5 = 0;
  v15 = 1i64;
  v6 = 2i64;
  if( (MitigationFlags & 0x40) != 0 )
    goto LABEL_20;
  v7 = ExGenRandom(ExGenRandomDomainUserVisible);
  v8 = (unsigned __int8)v7;
  if( !(_DWORD)InitializationPhase )
    NewProcess->MitigationFlags |= 0x20u;
  if( NewProcess->HighestUserAddress > (void *)0x100000000i64 && (NewProcess->MitigationFlags & 0x20) != 0 )
  {
    v9 = *(_QWORD *)&v7 & 0xFFFFFFi64;
    v8 = 0x10000i64;
    v5 = 1;
    if( v9 > 0x10000 )
      v8 = v9;
  }
  if( !v8 )
    v8 = 1i64;
  v15 = v8;
  if( !v5 )
  {
LABEL_20:
    _InterlockedAnd((volatile signed __int32 *)&NewProcess->2512, 0xFFFFFFDF);
    v8 = v15;
  }
  if( v5 == 1 )
    v14 = v8 + (ExGenRandom(ExGenRandomDomainUserVisible) & 0xFFFFFF) + 0x1000000;
  else
    v14 = v8;
  if( NewProcess->HighestUserAddress <= (void *)0x100000000i64 )
  {
    v6 = 3i64;
    v16 = (ExGenRandom(ExGenRandomDomainUserVisible) & 0xFFFFFF) + 0x10000;
  }
  *(_QWORD *)&VmWorkingSetList[6].LastAccessClearingRemainder = v6;
  v10 = 0i64;
  do
  {
    v11 = 9 * v10;
    v12 = (unsigned __int64)NewProcess->HighestUserAddress - 1;
    if( v2 == 2 )
      v12 = 0x7FFFFFFEFFFFi64;
    ++v2;
    (&VmWorkingSetList[2].NextPteToAge)[9 * v10] = (_MMPTE *)(v12 >> 16);
    v13 = *(&v14 + v10);
    *(&VmWorkingSetList[2].LockedEntries + 9 * v10) = v13;
    v10 = v2;
    *((_QWORD *)&VmWorkingSetList[2].LastAccessClearingRemainder + v11) = v13 << 16;
  }
  while( v2 < v6 );
}

Referenced by:

MmInitializeProcessAddressSpace