KiGetXSaveSupportedFeatures
VOID __stdcall KiGetXSaveSupportedFeatures(_XSTATE_CONFIGURATION *Configuration){
__int64 v2;
unsigned __int32 v3;
unsigned int v4;
char v5;
unsigned __int32 v6;
unsigned __int32 v7;
__int64 v8;
int v9;
unsigned int v10;
unsigned __int64 v11;
unsigned int *p_Size;
unsigned int *v13;
unsigned int v14;
unsigned int i;
unsigned int v16;
unsigned int ControlFlags;
__int32 v18;
char v19;
__int32 v20;
__int64 v21;
__int64 v22;
__int64 v23;
if( (ECX(__cpuid(1, 0)) & 0x4000000) != 0
&& (v2 = __cpuid(13, 0),
v3 = EAX(v2),
Configuration->EnabledFeatures = v3 | ((unsigned __int64)(unsigned int)EDX(v2) << 32),
(v3 & 3) == 3) )
{
v4 = 0;
v8 = __cpuid(13, 1);
v5 = EAX(v8);
v7 = ECX(v8);
v6 = EDX(v8);
v9 = 0;
if( (v5 & 0xA) == 10 )
v9 = 2;
v10 = Configuration->ControlFlags & 0xFFFFFFFC | v5 & 1 | v9;
Configuration->ControlFlags = v10;
if( (v10 & 2) != 0 )
v11 = v7 | ((unsigned __int64)v6 << 32);
else
v11 = 0i64;
Configuration->EnabledSupervisorFeatures = v11;
p_Size = &Configuration->Features[0].Size;
Configuration->Features[0].Offset = 0;
Configuration->Features[0].Size = 160;
v13 = &Configuration->Features[2].Size;
Configuration->Features[1].Offset = 160;
v14 = 576;
Configuration->Features[1].Size = 256;
for( i = 2; i < 0x40; ++i )
{
v16 = v14;
if( ((1i64 << i) & Configuration->EnabledFeatures) != 0 )
{
v21 = __cpuid(13, i);
v18 = EAX(v21);
v20 = EBX(v21);
v19 = ECX(v21);
*(v13 - 1) = v20;
*v13 = v18;
v14 = v20 + v18;
if( v16 >= v20 + v18 )
v14 = v16;
if( (v19 & 2) != 0 )
Configuration->AlignedFeatures |= 1i64 << i;
}
v13 += 2;
}
ControlFlags = Configuration->ControlFlags;
Configuration->Size = v14;
if( (ControlFlags & 2) != 0 )
{
v22 = 556i64;
do
{
if( ((1i64 << v4) & Configuration->EnabledSupervisorFeatures) != 0 )
{
v23 = __cpuid(13, v4);
*(_DWORD *)((char *)&Configuration->EnabledFeatures + v22) = EAX(v23);
if( (ECX(v23) & 2) != 0 )
Configuration->AlignedFeatures |= 1i64 << v4;
}
else
{
*(_DWORD *)((char *)&Configuration->EnabledFeatures + v22) = *p_Size;
}
++v4;
v22 += 4i64;
p_Size += 2;
}
while( v4 < 0x40 );
}
}
else
{
Configuration->EnabledFeatures = 0i64;
Configuration->Size = 0;
}
}Referenced by:
KiInitializeXSave