SymCryptDetectCpuFeaturesByCpuid

VOID __stdcall SymCryptDetectCpuFeaturesByCpuid(UINT32 flags){
  char v1; 
  int v2; 
  int v3; 
  int v4; 
  __int64 *v5; 
  unsigned int i; 
  int v7; 
  int v8; 
  unsigned int v9; 
  INT64 v10; 
  int v11; 
  int v12; 
  v1 = flags;
  v2 = 0;
  v3 = -2016;
  SymCryptCpuidExFunc(&v10, 0i64, 0i64);
  v4 = v10;
  v5 = cpuidBitInfo;
  for( i = 0; i < 0xD; ++i )
  {
    v7 = *(unsigned __int8 *)v5;
    if( v7 != v2 )
    {
      v2 = *(unsigned __int8 *)v5;
      SymCryptCpuidExFunc(&v10, *(unsigned __int8 *)v5, 0i64);
      LOBYTE(v7) = *(_BYTE *)v5;
    }
    if( (unsigned __int8)v7 > v4
      || (v8 = *((_DWORD *)&v10 + *((unsigned __int8 *)v5 + 1)), !_bittest(&v8, *((unsigned __int8 *)v5 + 2))) )
    {
      v3 |= *((_DWORD *)v5 + 1);
    }
    ++v5;
  }
  if( (v1 & 1) != 0 )
  {
    SymCryptCpuidExFunc(&v10, 1i64, 0i64);
    if( (v11 & 0x8000000) == 0 || (_xgetbv(0) & 6) != 6 )
      v3 |= 0x10u;
  }
  if( (v3 & 4) == 0 )
  {
    SymCryptCpuidExFunc(&v10, 0i64, 0i64);
    if( HIDWORD(v10) == 1752462657 && v11 == 1145913699 && v12 == 1769238117 )
    {
      SymCryptCpuidExFunc(&v10, 1i64, 0i64);
      v9 = ((int)v10 >> 8) & 0xF;
      if( v9 == 15 )
        v9 = (unsigned __int8)((int)v10 >> 20) + 15;
      if( v9 < 0x15 )
        v3 |= 4u;
    }
  }
  SymCryptCpuidExFunc(g_SymCryptCpuid1, 1i64, 0i64);
  g_SymCryptCpuFeaturesNotPresent = v3;
}

Referenced by:

SymCryptInitEnvWindowsKernelmodeWin8_1nLater