KiSetProcessorSignature
INT64 __fastcall KiSetProcessorSignature(INT64 a1, INT64 a2){
unsigned __int32 v3;
__int64 v4;
unsigned __int32 v5;
ULONG_PTR v6;
ULONG_PTR v7;
int v8;
__int64 i;
__int64 v10;
unsigned int v11;
unsigned int v12;
unsigned int v13;
int v14;
ULONG_PTR BugCheckParameter4;
ULONG_PTR v16;
int v17;
int v18;
int v19;
__int64 v20;
__int64 j;
__int64 m;
unsigned int *v23;
unsigned int v24;
unsigned int v25;
ULONG_PTR v26;
int v27;
ULONG_PTR v28;
__int64 v29;
INT64 result;
unsigned __int64 v31;
__int64 k;
ULONG_PTR v33;
unsigned int v34;
unsigned int v35;
int v36;
int v37;
ULONG_PTR v38;
__int64 v39;
int v40;
unsigned __int32 v41;
unsigned __int32 v42;
int v43;
unsigned int BugCheckParameter2;
__int128 v45;
int v46;
v46 = a2;
v3 = EAX(__cpuid(0x80000000, 0));
v42 = v3;
v4 = __cpuid(0, 0);
v5 = EAX(v4);
v41 = v5;
*(_QWORD *)&v45 = __PAIR64__(EBX(v4), v5);
*((_QWORD *)&v45 + 1) = __PAIR64__(EDX(v4), ECX(v4));
v6 = 0i64;
v7 = 0i64;
v8 = 0;
v40 = 0;
for( i = 0i64; ; i = (unsigned int)(v43 + 1) )
{
v43 = i;
if( (unsigned int)i >= 0x29 )
break;
v10 = 3 * i;
v11 = dword_1400101AC[6 * i];
if( (v11 & 2) == 0 )
{
if( !HIBYTE(v11) || (v12 = HIBYTE(v11), _bittest((const int *)&v12, *(unsigned __int8 *)(a1 + 141))) )
{
v13 = KiCpuFeatureTable[6 * i];
BugCheckParameter2 = v13;
if( v13 != v8 )
{
v40 = KiCpuFeatureTable[2 * v10];
if( (v13 < 0x80000000 || v13 > v3) && v13 > v5 )
{
v45 = 0i64;
}
else
{
v20 = __cpuid(v13, 0);
*(_QWORD *)&v45 = __PAIR64__(EBX(v20), EAX(v20));
*((_QWORD *)&v45 + 1) = __PAIR64__(EDX(v20), ECX(v20));
}
}
v14 = 0;
BugCheckParameter4 = dword_1400101A8[2 * v10];
v16 = (unsigned int)dword_1400101A4[2 * v10];
if( ((unsigned int)v16 & *((_DWORD *)&v45 + BugCheckParameter4)) == 0
&& ((v11 & 8) == 0 || (v6 & qword_1400101B0[v10]) != qword_1400101B0[v10]) )
{
v18 = v11 & 0x10;
if( (v11 & 0x10) != 0 )
{
if( (v7 & qword_1400101B0[v10]) == qword_1400101B0[v10] )
v14 = 1;
v18 = v11 & 0x10;
}
if( !v14 )
{
if( (v11 & 1) != 0 )
{
if( !*(_DWORD *)(a1 + 36) )
{
KdInitSystem(0i64, KeLoaderBlock_0);
LODWORD(BugCheckParameter4) = dword_1400101A8[2 * v10];
LODWORD(v16) = dword_1400101A4[2 * v10];
}
KeBugCheckEx(
0x5Du,
0xFFFFFFFFui64,
(unsigned int)KiCpuFeatureTable[2 * v10],
(unsigned int)v16,
(int)BugCheckParameter4);
}
if( (v11 & 4) != 0 && *(_DWORD *)(a1 + 36) )
{
v19 = 0;
if( (v11 & 8) != 0 )
{
LOBYTE(v19) = (KeFeatureBits & qword_1400101B0[v10]) == qword_1400101B0[v10];
}
else if( v18 && (KeFeatureBits2 & qword_1400101B0[v10]) == qword_1400101B0[v10] )
{
LABEL_70:
KeBugCheckEx(0x5Du, 0xFFFFFFFEui64, BugCheckParameter2, v16, BugCheckParameter4);
}
if( v19 )
goto LABEL_70;
}
goto LABEL_14;
}
}
if( (v11 & 8) != 0 )
{
v6 |= qword_1400101B0[v10];
}
else if( (v11 & 0x10) != 0 )
{
v7 |= qword_1400101B0[v10];
}
if( (v11 & 4) != 0 && *(_DWORD *)(a1 + 36) )
{
v17 = 0;
if( (v11 & 8) != 0 )
{
LOBYTE(v17) = (KeFeatureBits & qword_1400101B0[v10]) == qword_1400101B0[v10];
goto LABEL_13;
}
if( (v11 & 0x10) == 0 || (KeFeatureBits2 & qword_1400101B0[v10]) != qword_1400101B0[v10] )
{
LABEL_13:
if( !v17 )
KeBugCheckEx(0x5Du, 0xFFFFFFFDui64, (unsigned int)KiCpuFeatureTable[2 * v10], v16, BugCheckParameter4);
}
}
LABEL_14:
v8 = v40;
v5 = v41;
v3 = v42;
continue;
}
}
}
for( j = 0i64; !(_DWORD)j; j = 1i64 )
{
v23 = (unsigned int *)(0x140000000i64 + 24 * j + 24912);
v24 = *(_DWORD *)(0x140000004i64 + 24 * j + 24912);
if( (v24 & 2) == 0 )
{
if( !HIBYTE(v24) || (v25 = HIBYTE(v24), _bittest((const int *)&v25, *(unsigned __int8 *)(a1 + 141))) )
{
if( (v24 & 8) != 0 )
{
v26 = v6;
}
else
{
if( (v24 & 0x10) == 0 )
continue;
v26 = v7;
}
if( (v26 & *(_QWORD *)(0x140000010i64 + 24 * j + 24912)) == *(_QWORD *)(0x140000010i64 + 24 * j + 24912) )
{
v31 = __readmsr(*v23);
for( k = *(_QWORD *)(0x140000008i64 + 24 * j + 24912); ; k += 24i64 )
{
v33 = *(_QWORD *)k;
if( !*(_QWORD *)k )
break;
v34 = *(_DWORD *)(k + 8);
if( (v34 & 2) == 0 )
{
if( !HIBYTE(v34) || (v35 = HIBYTE(v34), _bittest((const int *)&v35, *(unsigned __int8 *)(a1 + 141))) )
{
if( (v33 & v31) != 0 )
{
if( (v34 & 8) != 0 )
{
v6 |= *(_QWORD *)(k + 16);
}
else if( (v34 & 0x10) != 0 )
{
v7 |= *(_QWORD *)(k + 16);
}
if( (v34 & 4) != 0 && *(_DWORD *)(a1 + 36) )
{
v37 = 0;
if( (v34 & 8) != 0 )
{
LOBYTE(v37) = (KeFeatureBits & *(_QWORD *)(k + 16)) == *(_QWORD *)(k + 16);
}
else if( (v34 & 0x10) != 0 && (KeFeatureBits2 & *(_QWORD *)(k + 16)) == *(_QWORD *)(k + 16) )
{
continue;
}
if( !v37 )
KeBugCheckEx(0x5Du, 0xFFFFFFFAui64, *v23, v33, HIDWORD(v33));
}
}
else
{
if( (v34 & 1) != 0 )
{
if( !*(_DWORD *)(a1 + 36) )
{
KdInitSystem(0i64, KeLoaderBlock_0);
v33 = *(_QWORD *)k;
}
KeBugCheckEx(0x5Du, 0xFFFFFFFCui64, *v23, v33, HIDWORD(v33));
}
if( (v34 & 4) != 0 && *(_DWORD *)(a1 + 36) )
{
v36 = 0;
if( (v34 & 8) != 0 )
{
LOBYTE(v36) = (KeFeatureBits & *(_QWORD *)(k + 16)) == *(_QWORD *)(k + 16);
}
else if( (v34 & 0x10) != 0 && (KeFeatureBits2 & *(_QWORD *)(k + 16)) == *(_QWORD *)(k + 16) )
{
LABEL_92:
KeBugCheckEx(0x5Du, 0xFFFFFFFBui64, *v23, v33, HIDWORD(v33));
}
if( v36 )
goto LABEL_92;
}
}
}
}
}
}
}
}
}
for( m = 0i64; dword_140020DD8[5 * m] != 19; m = (unsigned int)(m + 1) )
{
if( KiCpuTable[5 * m] == *(unsigned __int8 *)(a1 + 141) && dword_140020DD4[5 * m] == v46 )
{
*(_DWORD *)(a1 + 1740) = dword_140020DE0[5 * m];
break;
}
}
v27 = *(_DWORD *)(a1 + 36);
if( v27 )
{
KeGetPrcb(0i64);
v27 = *(_DWORD *)(a1 + 36);
}
v28 = 0i64;
if( *(_BYTE *)(a1 + 141) == 1 && ((*(_BYTE *)(a1 + 64) - 16) & 0xFD) == 0 )
v28 = 0x800000000000i64;
if( v27 )
{
KeGetPrcb(0i64);
if( (v28 & *(_QWORD *)(v29 + 34208)) != 0 )
{
v38 = *(unsigned int *)(a1 + 36);
KeGetPrcb(0i64);
KeBugCheckEx(0x5Du, 0x4D535546ui64, v28, *(_QWORD *)(v39 + 34208), v38);
}
}
*(_DWORD *)(a1 + 1736) = v46;
*(_QWORD *)(a1 + 34208) |= ~v28 & v6;
result = *(unsigned int *)(a1 + 36);
if( (_DWORD)result )
{
if( v7 != KeFeatureBits2 )
KeBugCheckEx(0x5Du, 0xFFFFFFF7ui64, v7, KeFeatureBits2, *(unsigned int *)(a1 + 36));
}
else
{
KeFeatureBits2 |= v7;
return KiPublishProcessorFeatures(a1);
}
return result;
}Referenced by:
KiInitializeBootStructures
KiSetFeatureBits