KiInitializeXSave
VOID __stdcall KiInitializeXSave(_LOADER_PARAMETER_BLOCK *LoaderBlock, UINT64 ProcessorNumber){
int v2;
_LOADER_PARAMETER_EXTENSION *Extension;
unsigned int XsaveFlags;
unsigned __int64 XsaveAllowedFeatures;
unsigned __int64 v7;
unsigned int ControlFlags;
__int64 v9;
_XSTATE_CONFIGURATION *p_Configuration;
_OWORD *v11;
__int128 v12;
PVOID BugCheckParameter3[2];
_XSTATE_CONFIGURATION Configuration;
v2 = ProcessorNumber;
BugCheckParameter3[0] = 0i64;
if( !(_DWORD)ProcessorNumber )
KiParseLoadOptions(LoaderBlock->LoadOptions);
memset(&Configuration, 0i64, sizeof(Configuration));
KiGetXSaveSupportedFeatures(&Configuration);
KiGetIptInfo((unsigned __int32 *)BugCheckParameter3 + 1, BugCheckParameter3);
if( v2 )
{
if( (Configuration.EnabledFeatures & KUSER_SHARED_DATA.XState.EnabledFeatures) != KUSER_SHARED_DATA.XState.EnabledFeatures
|| (Configuration.EnabledSupervisorFeatures & KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures) != KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures
|| (Configuration._bf_0 & 1) == 0 && (KUSER_SHARED_DATA.XState._bf_0 & 1) != 0
|| (Configuration._bf_0 & 2) == 0 && (KUSER_SHARED_DATA.XState._bf_0 & 2) != 0 )
{
KeBugCheckEx(0x3Eu, &Configuration, &KUSER_SHARED_DATA.XState, (PVOID)1, 0i64);
}
if( ((__int64)BugCheckParameter3[0] & (unsigned int)KiIptMsrMask) != (_DWORD)KiIptMsrMask )
KeBugCheckEx(
0x3Eu,
(PVOID)(unsigned int)KiIptSaveAreaLength,
(PVOID)(unsigned int)KiIptMsrMask,
(PVOID)HIDWORD(BugCheckParameter3[0]),
(PVOID)LODWORD(BugCheckParameter3[0]));
}
else
{
Extension = LoaderBlock->Extension;
XsaveFlags = Extension->XsaveFlags;
if( Configuration.EnabledFeatures )
{
XsaveAllowedFeatures = Extension->XsaveAllowedFeatures;
Configuration.EnabledSupervisorFeatures &= XsaveAllowedFeatures;
v7 = XsaveAllowedFeatures & Configuration.EnabledFeatures;
ControlFlags = Configuration.ControlFlags;
Configuration.EnabledFeatures = v7;
if( (XsaveFlags & 0x10) == 0 )
{
ControlFlags = Configuration.ControlFlags & 0xFFFFFFFD;
Configuration.ControlFlags &= ~2u;
}
if( (XsaveFlags & 8) == 0 )
Configuration.ControlFlags = ControlFlags & 0xFFFFFFFE;
}
KiIntersectFeaturesWithPolicy(LoaderBlock, &Configuration);
if( *(&stru_140CF2E80 + 937) )
{
Configuration.EnabledFeatures &= ~*(&stru_140CF2E80 + 937);
Configuration.EnabledSupervisorFeatures &= ~*(&stru_140CF2E80 + 937);
}
if( *(&stru_140CF2E80 + 7504) )
{
Configuration.EnabledFeatures = 0i64;
Configuration.EnabledSupervisorFeatures = 0i64;
Configuration.ControlFlags &= 0xFFFFFFFC;
}
KiUpdateXSaveSizeAndVolatileFeatures(&Configuration);
v9 = 6i64;
p_Configuration = &Configuration;
v11 = (_OWORD *)(&KUSER_SHARED_DATA + 984);
do
{
*v11 = *(_OWORD *)&p_Configuration->EnabledFeatures;
v11[1] = *(_OWORD *)&p_Configuration->Size;
v11[2] = *(_OWORD *)&p_Configuration->Features[1].Offset;
v11[3] = *(_OWORD *)&p_Configuration->Features[3].Offset;
v11[4] = *(_OWORD *)&p_Configuration->Features[5].Offset;
v11[5] = *(_OWORD *)&p_Configuration->Features[7].Offset;
v11[6] = *(_OWORD *)&p_Configuration->Features[9].Offset;
v11 += 8;
v12 = *(_OWORD *)&p_Configuration->Features[11].Offset;
p_Configuration = (_XSTATE_CONFIGURATION *)((char *)p_Configuration + 128);
*(v11 - 1) = v12;
--v9;
}
while( v9 );
*v11 = *(_OWORD *)&p_Configuration->EnabledFeatures;
v11[1] = *(_OWORD *)&p_Configuration->Size;
v11[2] = *(_OWORD *)&p_Configuration->Features[1].Offset;
*((_QWORD *)v11 + 6) = p_Configuration->Features[3];
if( Configuration.EnabledFeatures )
{
KeXStateLength = KUSER_SHARED_DATA.XState.AllFeatureSize;
KiXSaveAreaLength = KUSER_SHARED_DATA.XState.AllFeatureSize;
}
if( (LoaderBlock->Extension->XsaveFlags & 0x20) != 0 )
{
KiXSaveAreaLength += HIDWORD(BugCheckParameter3[0]);
LODWORD(KiIptSaveAreaLength) = HIDWORD(BugCheckParameter3[0]);
LODWORD(KiIptMsrMask) = BugCheckParameter3[0];
}
}
}Referenced by:
KiSystemStartup