KiCheckMicrocode
VOID __stdcall KiCheckMicrocode(INT64 a1){
char v2;
unsigned __int32 v3;
unsigned __int64 v4;
unsigned int v5;
unsigned __int64 v6;
__int64 v7;
char *i;
void *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 = (char *)&unk_140CFBC84; ; i += 24 )
{
if( !*((_DWORD *)i - 1) )
{
v10 = 3 * v7;
*((_DWORD *)&KiMicrocodeTracker + 2 * v10) = 1;
*((_DWORD *)&KiMicrocodeTracker + 2 * v10 + 1) = v3;
*((_QWORD *)&KiMicrocodeTracker + v10 + 1) = v6;
*((_DWORD *)&KiMicrocodeTracker + 2 * v10 + 4) = v5;
return;
}
if( *(_DWORD *)i == v3 && *(_QWORD *)(i + 4) == v6 )
break;
v7 = (unsigned int)(v7 + 1);
if( (unsigned int)v7 >= 4 )
return;
}
v9 = (void *)*((unsigned int *)&KiMicrocodeTracker + 6 * v7 + 4);
if( (_DWORD)v9 != v5 )
KeBugCheckEx(0x17Eu, (PVOID)v3, v9, (PVOID)v5, (PVOID)*(unsigned int *)(a1 + 36));
}
}Referenced by:
KiInitializeKernel
KiRestoreFeatureBits