KeRestoreExtendedAndSupervisorState
VOID __stdcall KeRestoreExtendedAndSupervisorState(XSTATE_SAVE *XStateSave){
unsigned __int8 CurrentIrql;
_ETHREAD *CurrentThread;
unsigned __int8 v4;
ULONG_PTR Level;
_ETHREAD *Thread;
unsigned __int64 Mask;
bool v8;
CurrentIrql = KeGetCurrentIrql();
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( CurrentIrql > 2u )
KeBugCheckEx(0x131u, 1ui64, CurrentIrql, 0i64, 0i64);
if( CurrentIrql || (*((_BYTE *)CurrentThread + 192) & 1) != 0 )
v4 = CurrentIrql + 1;
else
v4 = 0;
Level = XStateSave->Level;
if( (_BYTE)Level != v4 )
KeBugCheckEx(0x131u, 4ui64, Level, v4, 0i64);
Thread = XStateSave->Thread;
if( Thread != CurrentThread )
KeBugCheckEx(0x131u, 3ui64, (ULONG_PTR)Thread, (ULONG_PTR)CurrentThread, 0i64);
if( !CurrentIrql )
--*((_WORD *)CurrentThread + 243);
*((_QWORD *)CurrentThread + 51) = XStateSave->Prev;
Mask = XStateSave->XStateContext.Mask;
if( (KeFeatureBits & 0x800000) != 0 )
{
if( CurrentIrql == 2 && (KUSER_SHARED_DATA.XState.ControlFlags & 2) != 0 )
v8 = (~(KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures) & Mask) == 0;
else
v8 = (~KUSER_SHARED_DATA.XState.EnabledFeatures & Mask) == 0;
}
else
{
v8 = (Mask & 0xFFFFFFFFFFFFFFFCui64) == 0;
}
if( !v8 )
KeBugCheckEx(0x131u, 0i64, KeFeatureBits & 0x800000, (unsigned int)Mask, HIDWORD(Mask));
if( Mask && (KeFeatureBits & 0x800000) != 0 )
{
if( CurrentIrql == 2 && (KUSER_SHARED_DATA.XState.ControlFlags & 2) != 0 )
{
RtlXRestoreS(&XStateSave->XStateContext.Area->LegacyState.ControlWord, Mask);
goto LABEL_19;
}
RtlXRestore(XStateSave->XStateContext.Area, Mask);
}
if( !CurrentIrql )
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
LABEL_19:
if( XStateSave->XStateContext.Buffer )
KeFreeXStateContext(&XStateSave->XStateContext);
}Referenced by:
KeRestoreExtendedProcessorState
PnprQuiesceProcessorDpc
PopHandleNextState