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