KiGetIptInfo
CHAR __fastcall KiGetIptInfo(UINT32 *a1, _DWORD *a2){
unsigned __int32 CpuVendor;
__int64 v5;
__int64 v6;
__int32 v7;
char v8;
char v9;
__int64 v10;
char v11;
int v12;
__int128 v14;
INT32 v15[4];
*a1 = 0;
*a2 = 0;
v14 = 0i64;
*(_OWORD *)v15 = 0i64;
CpuVendor = KiGetCpuVendor();
if( CpuVendor == 2 )
{
v5 = __cpuid(0, 0);
CpuVendor = EAX(v5);
*(_QWORD *)((char *)&v14 + 4) = __PAIR64__(ECX(v5), EBX(v5));
HIDWORD(v14) = EDX(v5);
if( CpuVendor >= 0x14 )
{
v6 = __cpuid(7, 0);
*(_QWORD *)((char *)&v14 + 4) = __PAIR64__(ECX(v6), EBX(v6));
HIDWORD(v14) = EDX(v6);
if( _bittest((const signed __int32 *)&v14 + 1, 0x19u)
|| (LOBYTE(CpuVendor) = HviGetIptFeatures(v15), (v15[0] & 0xFFFFF000) != 0) )
{
*a1 = 16;
*a2 |= 9u;
v10 = __cpuid(20, 0);
v7 = EAX(v10);
v9 = EBX(v10);
v8 = ECX(v10);
if( (v8 & 1) != 0 || (v8 & 4) != 0 )
{
*a1 += 16;
*a2 |= 6u;
}
if( (v9 & 1) != 0 )
{
*a1 += 8;
*a2 |= 0x10u;
}
if( (v9 & 4) != 0 && v7 )
{
v11 = EAX(__cpuid(20, 1));
if( (v11 & 7u) > 4 )
v11 = -4;
v12 = v11 & 7;
*a1 += 16 * v12;
*a2 |= (32 << v12) - 32;
}
CpuVendor = (*a1 + 63) & 0xFFFFFFC0;
*a1 = CpuVendor;
}
}
}
return CpuVendor;
}Referenced by:
KiInitializeXSave