KiEnableXSave
INT64 __stdcall KiEnableXSave(){
unsigned __int64 v0;
INT64 result;
struct _KPRCB *CurrentPrcb;
v0 = __readcr4();
result = 0x40000i64;
if( (KeFeatureBits & 0x800000) != 0 )
{
if( (v0 & 0x40000) == 0 )
__writecr4(v0 | 0x40000);
_xsetbv(0, KUSER_SHARED_DATA.XState.EnabledFeatures);
if( KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures )
__writemsr(0xDA0u, KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures);
CurrentPrcb = KeGetCurrentPrcb();
result = (INT64)CurrentPrcb + 496;
if( *((struct _KPRCB **)CurrentPrcb + 4280) != (struct _KPRCB *)((char *)CurrentPrcb + 496) )
*((_DWORD *)CurrentPrcb + 8562) |= 0x100040u;
}
else if( (v0 & 0x40000) != 0 )
{
__writecr4(v0 & 0xFFFFFFFFFFFBFFFFui64);
}
return result;
}Referenced by:
KiConfigureDynamicProcessor
KiInitializeKernel
KiRestoreXSaveSupport