KiRestoreProcessorState

VOID __stdcall KiRestoreProcessorState(KTRAP_FRAME *TrapFrame){
  _KEXCEPTION_FRAME *v1; 
  struct _KPRCB *CurrentPrcb; 
  _KEXCEPTION_FRAME *v3; 
  __int64 v5; 
  UINT64 v6; 
  CHAR PreviousMode; 
  CurrentPrcb = KeGetCurrentPrcb();
  v3 = v1;
  v5 = *((_QWORD *)CurrentPrcb + 4280);
  v6 = *(unsigned int *)(v5 + 48);
  PreviousMode = *(_BYTE *)(v5 + 56) & 1;
  if( !PreviousMode
    && ((v6 & 0x100008) == 1048584 || (v6 & 0x100040) == 1048640)
    && (v6 & 0x100040) == 1048640
    && (KUSER_SHARED_DATA.XState.EnabledVolatileFeatures & 0xFFFFFFFC) != 0 )
  {
    RtlXRestore(
      (XSAVE_AREA *)(*(int *)(v5 + 1248) + v5 + 720),
      KUSER_SHARED_DATA.XState.EnabledVolatileFeatures & 0xFFFFFFFC);
  }
  KeContextToKframes(TrapFrame, v3, (_CONTEXT *)v5, v6, PreviousMode);
  KiRestoreProcessorControlState((INT64)CurrentPrcb + 256);
}

Referenced by:

KiFreezeTargetExecution