KiSetProcessorSignature
NTSTATUS __stdcall KiSetProcessorSignature(INT64 a1, INT64 a2){
unsigned __int32 v3;
__int64 v4;
unsigned __int32 v5;
unsigned __int64 v6;
unsigned __int64 v7;
int v8;
__int64 i;
__int64 v10;
unsigned int v11;
unsigned int v12;
unsigned int v13;
int v14;
void *BugCheckParameter4;
unsigned __int64 v16;
int v17;
int v18;
int v19;
__int64 v20;
__int64 j;
__int64 m;
unsigned int *v23;
unsigned int v24;
unsigned int v25;
unsigned __int64 v26;
int v27;
__int64 v28;
NTSTATUS result;
unsigned __int64 v30;
__int64 k;
unsigned __int64 v32;
unsigned int v33;
unsigned int v34;
int v35;
int v36;
void *v37;
_KPRCB *Prcb;
int v39;
unsigned __int32 v40;
unsigned __int32 v41;
int v42;
unsigned int BugCheckParameter2;
__int128 v44;
int v45;
v45 = a2;
v3 = EAX(__cpuid(0x80000000, 0));
v41 = v3;
v4 = __cpuid(0, 0);
v5 = EAX(v4);
v40 = v5;
*(_QWORD *)&v44 = __PAIR64__(EBX(v4), v5);
*((_QWORD *)&v44 + 1) = __PAIR64__(EDX(v4), ECX(v4));
v6 = 0i64;
v7 = 0i64;
v8 = 0;
v39 = 0;
for( i = 0i64; ; i = (unsigned int)(v42 + 1) )
{
v42 = 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 = dword_1400101A0[6 * i];
BugCheckParameter2 = v13;
if( v13 != v8 )
{
v39 = dword_1400101A0[2 * v10];
if( (v13 < 0x80000000 || v13 > v3) && v13 > v5 )
{
v44 = 0i64;
}
else
{
v20 = __cpuid(v13, 0);
*(_QWORD *)&v44 = __PAIR64__(EBX(v20), EAX(v20));
*((_QWORD *)&v44 + 1) = __PAIR64__(EDX(v20), ECX(v20));
}
}
v14 = 0;
BugCheckParameter4 = (void *)dword_1400101A8[2 * v10];
v16 = (unsigned int)dword_1400101A4[2 * v10];
if( ((unsigned int)v16 & *((_DWORD *)&v44 + (_QWORD)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,
(PVOID)0xFFFFFFFFi64,
(PVOID)(unsigned int)dword_1400101A0[2 * v10],
(PVOID)(unsigned int)v16,
(PVOID)(int)BugCheckParameter4);
}
if( (v11 & 4) != 0 && *(_DWORD *)(a1 + 36) )
{
v19 = 0;
if( (v11 & 8) != 0 )
{
LOBYTE(v19) = ((unsigned __int64)KeFeatureBits & qword_1400101B0[v10]) == qword_1400101B0[v10];
}
else if( v18 && ((unsigned __int64)KeFeatureBits2 & qword_1400101B0[v10]) == qword_1400101B0[v10] )
{
LABEL_70:
KeBugCheckEx(0x5Du, (PVOID)0xFFFFFFFEi64, (PVOID)BugCheckParameter2, (PVOID)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) = ((unsigned __int64)KeFeatureBits & qword_1400101B0[v10]) == qword_1400101B0[v10];
goto LABEL_13;
}
if( (v11 & 0x10) == 0 || ((unsigned __int64)KeFeatureBits2 & qword_1400101B0[v10]) != qword_1400101B0[v10] )
{
LABEL_13:
if( !v17 )
KeBugCheckEx(
0x5Du,
(PVOID)0xFFFFFFFDi64,
(PVOID)(unsigned int)dword_1400101A0[2 * v10],
(PVOID)v16,
BugCheckParameter4);
}
}
LABEL_14:
v8 = v39;
v5 = v40;
v3 = v41;
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) )
{
v30 = __readmsr(*v23);
for( k = *(_QWORD *)(0x140000008i64 + 24 * j + 24912); ; k += 24i64 )
{
v32 = *(_QWORD *)k;
if( !*(_QWORD *)k )
break;
v33 = *(_DWORD *)(k + 8);
if( (v33 & 2) == 0 )
{
if( !HIBYTE(v33) || (v34 = HIBYTE(v33), _bittest((const int *)&v34, *(unsigned __int8 *)(a1 + 141))) )
{
if( (v32 & v30) != 0 )
{
if( (v33 & 8) != 0 )
{
v6 |= *(_QWORD *)(k + 16);
}
else if( (v33 & 0x10) != 0 )
{
v7 |= *(_QWORD *)(k + 16);
}
if( (v33 & 4) != 0 && *(_DWORD *)(a1 + 36) )
{
v36 = 0;
if( (v33 & 8) != 0 )
{
LOBYTE(v36) = ((unsigned __int64)KeFeatureBits & *(_QWORD *)(k + 16)) == *(_QWORD *)(k + 16);
}
else if( (v33 & 0x10) != 0
&& ((unsigned __int64)KeFeatureBits2 & *(_QWORD *)(k + 16)) == *(_QWORD *)(k + 16) )
{
continue;
}
if( !v36 )
KeBugCheckEx(0x5Du, (PVOID)0xFFFFFFFAi64, (PVOID)*v23, (PVOID)v32, (PVOID)HIDWORD(v32));
}
}
else
{
if( (v33 & 1) != 0 )
{
if( !*(_DWORD *)(a1 + 36) )
{
KdInitSystem(0i64, KeLoaderBlock_0);
v32 = *(_QWORD *)k;
}
KeBugCheckEx(0x5Du, (PVOID)0xFFFFFFFCi64, (PVOID)*v23, (PVOID)v32, (PVOID)HIDWORD(v32));
}
if( (v33 & 4) != 0 && *(_DWORD *)(a1 + 36) )
{
v35 = 0;
if( (v33 & 8) != 0 )
{
LOBYTE(v35) = ((unsigned __int64)KeFeatureBits & *(_QWORD *)(k + 16)) == *(_QWORD *)(k + 16);
}
else if( (v33 & 0x10) != 0
&& ((unsigned __int64)KeFeatureBits2 & *(_QWORD *)(k + 16)) == *(_QWORD *)(k + 16) )
{
LABEL_92:
KeBugCheckEx(0x5Du, (PVOID)0xFFFFFFFBi64, (PVOID)*v23, (PVOID)v32, (PVOID)HIDWORD(v32));
}
if( v35 )
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] == v45 )
{
*(_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 && (v28 & KeGetPrcb(0i64)->FeatureBits) != 0 )
{
v37 = (void *)*(unsigned int *)(a1 + 36);
Prcb = KeGetPrcb(0i64);
KeBugCheckEx(0x5Du, (PVOID)0x4D535546, (PVOID)v28, (PVOID)Prcb->FeatureBits, v37);
}
*(_DWORD *)(a1 + 1736) = v45;
*(_QWORD *)(a1 + 34208) |= ~v28 & v6;
result = *(_DWORD *)(a1 + 36);
if( result )
{
if( (PVOID)v7 != KeFeatureBits2 )
KeBugCheckEx(0x5Du, (PVOID)0xFFFFFFF7i64, (PVOID)v7, KeFeatureBits2, (PVOID)*(unsigned int *)(a1 + 36));
}
else
{
KeFeatureBits2 = (PVOID)(v7 | (unsigned __int64)KeFeatureBits2);
return KiPublishProcessorFeatures(a1);
}
return result;
}Referenced by:
KiInitializeBootStructures
KiSetFeatureBits