MiInitializeCacheSizes

NTSTATUS __stdcall MiInitializeCacheSizes(){
  unsigned int SecondLevelCacheSize; 
  unsigned int SecondLevelCacheAssociativity; 
  unsigned int v2; 
  unsigned int v3; 
  int v5; 
  struct _KPRCB *CurrentPrcb; 
  __int64 CacheCount; 
  _CACHE_DESCRIPTOR *Cache; 
  NTSTATUS result; 

  SecondLevelCacheSize = KeGetPcr()->SecondLevelCacheSize;
  *(&stru_140C4DB30 + 58) = SecondLevelCacheSize;
  SecondLevelCacheAssociativity = KeGetPcr()->SecondLevelCacheAssociativity;
  if( (_BYTE)SecondLevelCacheAssociativity )
    SecondLevelCacheSize /= SecondLevelCacheAssociativity;
  if( SecondLevelCacheSize )
  {
    _BitScanReverse(&v2, SecondLevelCacheSize);
    SecondLevelCacheSize = 1 << v2;
  }
  if( SecondLevelCacheSize - 8 > 0xF8 )
  {
    if( *(&stru_140C50B28 + 853) < 0x80000ui64 )
      SecondLevelCacheSize = *(&stru_140C50B28 + 853) < 0x40000ui64 ? 64 : 128;
    else
      SecondLevelCacheSize = 256;
  }
  *(&stru_140C4DB30 + 67) = SecondLevelCacheSize;
  *(&stru_140C4DB30 + 66) = SecondLevelCacheSize - 1;
  v3 = SecondLevelCacheSize >> 4;
  if( (SecondLevelCacheSize & 0xF) != 0 )
    ++v3;
  if( _BitScanReverse((unsigned int *)&v5, v3) )
    v3 = 1 << v5;
  *(&stru_140C4DB30 + 102) = v3;
  MiInitializeLargePageColorSizes();
  CurrentPrcb = KeGetCurrentPrcb();
  CacheCount = CurrentPrcb->CacheCount;
  Cache = CurrentPrcb->Cache;
  if( (_DWORD)CacheCount )
  {
    do
    {
      if( Cache->Level == 1 && (Cache->Type & 0xFFFFFFFD) == 0 )
        *(&stru_140C4DB30 + 59) = Cache->Size;
      ++Cache;
      --CacheCount;
    }
    while( CacheCount );
  }
  result = 0x4000;
  if( *(&stru_140C4DB30 + 59) < 0x4000u )
    *(&stru_140C4DB30 + 59) = 0x4000;
  *(&stru_140C4DB30 + 71) = 256;
  return result;
}

Referenced by:

MiInitializeColors