KiUpdateXSaveSizeAndVolatileFeatures
VOID __stdcall KiUpdateXSaveSizeAndVolatileFeatures(_XSTATE_CONFIGURATION *Conf){
unsigned __int64 EnabledFeatures;
unsigned int v2;
__int64 v4;
unsigned __int64 k;
unsigned int v6;
unsigned __int64 v7;
unsigned int v8;
unsigned __int64 v9;
unsigned __int64 i;
unsigned int Size;
unsigned __int64 v12;
unsigned __int64 j;
unsigned int AllFeatureSize;
EnabledFeatures = Conf->EnabledFeatures;
Conf->Size = 576;
v2 = 2;
Conf->AllFeatureSize = 576;
if( (Conf->ControlFlags & 2) != 0 )
{
v8 = 2;
v9 = Conf->AlignedFeatures >> 2;
for( i = EnabledFeatures >> 2; i; i >>= 1 )
{
if( v8 >= 0x40 )
break;
if( (i & 1) != 0 )
{
Size = Conf->Size;
if( (v9 & 1) != 0 )
{
Size = (Size + 63) & 0xFFFFFFC0;
Conf->Size = Size;
}
Conf->Features[v8].Offset = Size;
Conf->Size += Conf->Features[v8].Size;
}
v9 >>= 1;
++v8;
}
EnabledFeatures = Conf->EnabledFeatures;
v12 = (Conf->EnabledFeatures | Conf->EnabledSupervisorFeatures) >> 2;
for( j = Conf->AlignedFeatures >> 2; v12; v12 >>= 1 )
{
if( v2 >= 0x40 )
break;
if( (v12 & 1) != 0 )
{
AllFeatureSize = Conf->AllFeatureSize;
if( (j & 1) != 0 )
{
AllFeatureSize = (AllFeatureSize + 63) & 0xFFFFFFC0;
Conf->AllFeatureSize = AllFeatureSize;
}
Conf->AllFeatureSize = AllFeatureSize + Conf->AllFeatures[v2];
}
j >>= 1;
++v2;
}
}
else
{
v4 = 0i64;
for( k = EnabledFeatures; k; k >>= 1 )
{
if( (unsigned int)v4 >= 0x40 )
break;
if( (k & 1) != 0 )
{
v6 = Conf->Features[v4].Size + Conf->Features[v4].Offset;
if( Conf->Size < v6 )
Conf->Size = v6;
}
v4 = (unsigned int)(v4 + 1);
}
Conf->AllFeatureSize = Conf->Size;
}
v7 = Conf->EnabledSupervisorFeatures & 0x800;
Conf->EnabledVolatileFeatures = EnabledFeatures & 0xBFFFFFFFFFFFFFEFui64;
Conf->EnabledUserVisibleSupervisorFeatures = v7;
}Referenced by:
KiInitializeXSave