KiRestoreSetContextState

VOID __stdcall KiRestoreSetContextState(INT64 a1, INT64 a2, INT64 a3, INT64 a4, CHAR a5){
  __int64 v5; 
  _CONTEXT *Thread; 
  _ETHREAD *CurrentThread; 
  INT64 v8; 
  INT64 v9; 
  unsigned __int8 BpbUserSpecCtrl; 
  unsigned __int8 v11; 
  __int64 v14; 
  void *retaddr; 
  __int16 v16; 
  __int32 v17; 
  void *v18; 
  __int16 v19; 

  __writecr8(1ui64);
  _enable();
  Thread = (_CONTEXT *)KeGetCurrentThread()[1].WaitBlock[3].Thread;
  KeContextToKframes((_KTRAP_FRAME *)(v5 - 128), (_KTRAP_FRAME *)&v14, Thread, Thread->ContextFlags, 1);
  _disable();
  __writecr8(0i64);
  _interlockedbittestandreset((volatile signed __int32 *)KeGetCurrentThread(), 0x1Bu);
  if( (*((_BYTE *)&KeGetPcr()->Prcb.2 + 14) & 2) != 0 )
    KiUpdateStibpPairing(0i64);
  if( (*(_BYTE *)(v5 + 240) & 1) == 0 )
  {
    _mm_setcsr(*(_DWORD *)(v5 - 84));
    __iretq(retaddr, v16, v17, v18, v19);
  }
  if( (_BYTE)KeSmapEnabled )
    __stac();
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (*(_DWORD *)CurrentThread->Tcb.gap0 & 0x40010000) != 0 )
  {
    if( (CurrentThread->Tcb.gap0[2] & 1) != 0 )
    {
      KiCopyCounters(&CurrentThread->Tcb);
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    }
    if( (CurrentThread->Tcb.gap0[3] & 0x40) != 0 )
      KiUmsExit(1);
  }
  _mm_setcsr(*(_DWORD *)(v5 - 84));
  if( *(_WORD *)(v5 + 128) )
    KiRestoreDebugRegisterState();
  v8 = *(_QWORD *)(v5 - 48);
  v9 = *(_QWORD *)(v5 - 56);
  __writegsbyte(0x853u, 0);
  BpbUserSpecCtrl = KeGetPcr()->Prcb.BpbUserSpecCtrl;
  if( KeGetPcr()->Prcb.BpbCurrentSpecCtrl != BpbUserSpecCtrl )
  {
    __writegsbyte(0x27Au, BpbUserSpecCtrl);
    __writemsr(0x48u, BpbUserSpecCtrl);
  }
  v11 = _bittestandreset16(MK_FP(__GS__, 632i64), 2u);
  if( v11 )
    __writemsr(0x49u, 1ui64);
  v11 = _bittestandreset16(MK_FP(__GS__, 632i64), 5u);
  if( v11 )
    __flush_rsb();
  if( (KiKvaShadow & 1) == 0 )
  {
    __swapgs();
    __iretq(retaddr, v16, v17, v18, v19);
  }
  KiKernelExit(*(_QWORD *)(v5 - 72), *(_QWORD *)(v5 - 64), v9, v8, a5);
}

Referenced by:

KiApcInterrupt
KiBoundFault
KiControlProtectionFault
KiDpcInterrupt
KiExceptionDispatch
KiFastFailDispatch
KiInvalidOpcodeFault
KiIpiInterrupt
KiPageFault
KiSpuriousDispatchNoEOI
KiSwInterrupt
KiSystemCall64
KiUmsFastReturnToUser
KiVirtualizationException
KxIsrLinkage
KxMcheckAlternateReturn
KxStartUserThread
NtCallEnclave
NtContinueEx
NtRaiseException