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