KiInitializeXSave
VOID __stdcall KiInitializeXSave(_LOADER_PARAMETER_BLOCK *LoaderBlock, UINT64 ProcessorNumber){
int v2;
__int64 v4;
int v5;
__int64 v6;
unsigned __int64 v7;
unsigned int ControlFlags;
__int64 v9;
XSTATE_CONFIGURATION *p_BugCheckParameter1;
_OWORD *v11;
__int128 v12;
ULONG_PTR BugCheckParameter3[2];
XSTATE_CONFIGURATION BugCheckParameter1;
v2 = ProcessorNumber;
BugCheckParameter3[0] = 0i64;
if( !(_DWORD)ProcessorNumber )
KiParseLoadOptions(*((PSTR *)LoaderBlock + 27));
memset((INT64)&BugCheckParameter1, 0i64);
KiGetXSaveSupportedFeatures(&BugCheckParameter1);
KiGetIptInfo((UINT32 *)BugCheckParameter3 + 1, BugCheckParameter3);
if( v2 )
{
if( (BugCheckParameter1.EnabledFeatures & KUSER_SHARED_DATA.XState.EnabledFeatures) != KUSER_SHARED_DATA.XState.EnabledFeatures
|| (BugCheckParameter1.EnabledSupervisorFeatures & KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures) != KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures
|| (BugCheckParameter1.ControlFlags & 1) == 0 && (KUSER_SHARED_DATA.XState.ControlFlags & 1) != 0
|| (BugCheckParameter1.ControlFlags & 2) == 0 && (KUSER_SHARED_DATA.XState.ControlFlags & 2) != 0 )
{
KeBugCheckEx(0x3Eu, (ULONG_PTR)&BugCheckParameter1, 0xFFFFF780000003D8ui64, 1ui64, 0i64);
}
if( (BugCheckParameter3[0] & (unsigned int)KiIptMsrMask) != (_DWORD)KiIptMsrMask )
KeBugCheckEx(
0x3Eu,
(unsigned int)KiIptSaveAreaLength,
(unsigned int)KiIptMsrMask,
HIDWORD(BugCheckParameter3[0]),
LODWORD(BugCheckParameter3[0]));
}
else
{
v4 = *((_QWORD *)LoaderBlock + 30);
v5 = *(_DWORD *)(v4 + 2840);
if( BugCheckParameter1.EnabledFeatures )
{
v6 = *(_QWORD *)(v4 + 2832);
BugCheckParameter1.EnabledSupervisorFeatures &= v6;
v7 = v6 & BugCheckParameter1.EnabledFeatures;
ControlFlags = BugCheckParameter1.ControlFlags;
BugCheckParameter1.EnabledFeatures = v7;
if( (v5 & 0x10) == 0 )
{
ControlFlags = BugCheckParameter1.ControlFlags & 0xFFFFFFFD;
BugCheckParameter1.ControlFlags &= ~2u;
}
if( (v5 & 8) == 0 )
BugCheckParameter1.ControlFlags = ControlFlags & 0xFFFFFFFE;
}
KiIntersectFeaturesWithPolicy(LoaderBlock, &BugCheckParameter1);
if( KeTestRemovedFeatureMask )
{
BugCheckParameter1.EnabledFeatures &= ~KeTestRemovedFeatureMask;
BugCheckParameter1.EnabledSupervisorFeatures &= ~KeTestRemovedFeatureMask;
}
if( KeTestDisableXSave )
{
BugCheckParameter1.EnabledFeatures = 0i64;
BugCheckParameter1.EnabledSupervisorFeatures = 0i64;
BugCheckParameter1.ControlFlags &= 0xFFFFFFFC;
}
KiUpdateXSaveSizeAndVolatileFeatures(&BugCheckParameter1);
v9 = 6i64;
p_BugCheckParameter1 = &BugCheckParameter1;
v11 = (_OWORD *)(&KUSER_SHARED_DATA + 984);
do
{
*v11 = *(_OWORD *)&p_BugCheckParameter1->EnabledFeatures;
v11[1] = *(_OWORD *)&p_BugCheckParameter1->Size;
v11[2] = *(_OWORD *)&p_BugCheckParameter1->Features[1].Offset;
v11[3] = *(_OWORD *)&p_BugCheckParameter1->Features[3].Offset;
v11[4] = *(_OWORD *)&p_BugCheckParameter1->Features[5].Offset;
v11[5] = *(_OWORD *)&p_BugCheckParameter1->Features[7].Offset;
v11[6] = *(_OWORD *)&p_BugCheckParameter1->Features[9].Offset;
v11 += 8;
v12 = *(_OWORD *)&p_BugCheckParameter1->Features[11].Offset;
p_BugCheckParameter1 = (XSTATE_CONFIGURATION *)((char *)p_BugCheckParameter1 + 128);
*(v11 - 1) = v12;
--v9;
}
while( v9 );
*v11 = *(_OWORD *)&p_BugCheckParameter1->EnabledFeatures;
v11[1] = *(_OWORD *)&p_BugCheckParameter1->Size;
v11[2] = *(_OWORD *)&p_BugCheckParameter1->Features[1].Offset;
*((_QWORD *)v11 + 6) = p_BugCheckParameter1->Features[3];
if( BugCheckParameter1.EnabledFeatures )
{
KeXStateLength = KUSER_SHARED_DATA.XState.AllFeatureSize;
KiXSaveAreaLength = KUSER_SHARED_DATA.XState.AllFeatureSize;
}
if( (*(_DWORD *)(*((_QWORD *)LoaderBlock + 30) + 2840i64) & 0x20) != 0 )
{
KiXSaveAreaLength += HIDWORD(BugCheckParameter3[0]);
LODWORD(KiIptSaveAreaLength) = HIDWORD(BugCheckParameter3[0]);
LODWORD(KiIptMsrMask) = BugCheckParameter3[0];
}
}
}Referenced by:
KiSystemStartup