KiCheckMicrocode
VOID __fastcall KiCheckMicrocode(INT64 a1){
char v2;
unsigned __int32 v3;
unsigned __int64 v4;
unsigned int v5;
unsigned __int64 v6;
__int64 v7;
int *i;
ULONG_PTR v9;
__int64 v10;
unsigned __int64 v11;
if( KiMicrocodeTrackerEnabled
&& (!KiBootProcessorsStarted || *(_DWORD *)(a1 + 36) < (unsigned int)KiBootProcessorCount) )
{
v2 = *(_BYTE *)(a1 + 141);
if( v2 == 1 )
{
v11 = __readmsr(0x8Bu);
v6 = 0i64;
v5 = v11;
v3 = EAX(__cpuid(1, 0));
}
else
{
if( v2 != 2 )
return;
__writemsr(0x8Bu, 0i64);
v3 = EAX(__cpuid(1, 0));
v4 = __readmsr(0x8Bu);
v5 = HIDWORD(v4);
v6 = __readmsr(0x17u);
}
v7 = 0i64;
for( i = &dword_140CFBC84; ; i += 6 )
{
if( !*(i - 1) )
{
v10 = 3 * v7;
*(_DWORD *)&KiMicrocodeTracker[8 * v10] = 1;
*(_DWORD *)&KiMicrocodeTracker[8 * v10 + 4] = v3;
*(_QWORD *)&KiMicrocodeTracker[8 * v10 + 8] = v6;
*(_DWORD *)&KiMicrocodeTracker[8 * v10 + 16] = v5;
return;
}
if( *i == v3 && *(_QWORD *)(i + 1) == v6 )
break;
v7 = (unsigned int)(v7 + 1);
if( (unsigned int)v7 >= 4 )
return;
}
v9 = *(unsigned int *)&KiMicrocodeTracker[24 * v7 + 16];
if( (_DWORD)v9 != v5 )
KeBugCheckEx(0x17Eu, v3, v9, v5, *(unsigned int *)(a1 + 36));
}
}Referenced by:
KiInitializeKernel
KiRestoreFeatureBits