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