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