KeRestoreExtendedAndSupervisorState
VOID __stdcall KeRestoreExtendedAndSupervisorState(_XSTATE_SAVE *XStateSave){
unsigned __int8 CurrentIrql;
_ETHREAD *CurrentThread;
unsigned __int8 v4;
void *Level;
_ETHREAD *Thread;
unsigned __int64 Mask;
bool v8;
CurrentIrql = KeGetCurrentIrql();
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( CurrentIrql > 2u )
KeBugCheckEx(0x131u, (PVOID)1, (PVOID)CurrentIrql, 0i64, 0i64);
if( CurrentIrql || (CurrentThread->Tcb.ApcState.InProgressFlags & 1) != 0 )
v4 = CurrentIrql + 1;
else
v4 = 0;
Level = (void *)XStateSave->Level;
if( (_BYTE)Level != v4 )
KeBugCheckEx(0x131u, (PVOID)4, Level, (PVOID)v4, 0i64);
Thread = XStateSave->Thread;
if( Thread != CurrentThread )
KeBugCheckEx(0x131u, (PVOID)3, Thread, CurrentThread, 0i64);
if( !CurrentIrql )
--CurrentThread->Tcb.SpecialApcDisable;
CurrentThread->Tcb.WaitBlock[1].SparePtr = XStateSave->Prev;
Mask = XStateSave->XStateContext.Mask;
if( ((unsigned int)KeFeatureBits & 0x800000) != 0 )
{
if( CurrentIrql == 2 && (KUSER_SHARED_DATA.XState._bf_0 & 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,
(PVOID)((unsigned int)KeFeatureBits & 0x800000),
(PVOID)(unsigned int)Mask,
(PVOID)HIDWORD(Mask));
if( Mask && ((unsigned int)KeFeatureBits & 0x800000) != 0 )
{
if( CurrentIrql == 2 && (KUSER_SHARED_DATA.XState._bf_0 & 2) != 0 )
{
RtlXRestoreS((PFN_IO_CONNECT_INTERRUPT *)XStateSave->XStateContext.Area, (_XSTATE_CONFIGURATION *)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