KeContextFromKframes

VOID __stdcall KeContextFromKframes(_KTRAP_FRAME *TrapFrame, _KTRAP_FRAME *ExceptionFrame, PCONTEXT ContextFrame){
  unsigned __int8 CurrentIrql; 
  unsigned int ContextFlags; 
  unsigned __int64 Dr7; 
  __int64 P3Home_low; 
  _QWORD *SparePtr; 
  INT64 v11; 
  unsigned __int8 *v12; 
  _QWORD *i; 

  CurrentIrql = KeGetCurrentIrql();
  if( !CurrentIrql )
  {
    KeGetCurrentIrql();
    __writecr8(1ui64);
  }
  ContextFlags = ContextFrame->ContextFlags;
  if( (ContextFlags & 0x100001) == 1048577 )
  {
    ContextFrame->_Rip = TrapFrame->_Rip;
    ContextFrame->SegCs = TrapFrame->SegCs;
    ContextFrame->SegSs = TrapFrame->SegSs;
    ContextFrame->_Rsp = TrapFrame->_Rsp;
    ContextFrame->EFlags = TrapFrame->EFlags;
  }
  if( (ContextFlags & 0x100004) == 1048580 )
  {
    *(_DWORD *)&ContextFrame->SegDs = 2818091;
    *(_DWORD *)&ContextFrame->SegFs = 2818131;
  }
  if( (ContextFlags & 0x100002) == 1048578 )
  {
    ContextFrame->_Rax = TrapFrame->_Rax;
    ContextFrame->_Rcx = TrapFrame->_Rcx;
    ContextFrame->_Rdx = TrapFrame->_Rdx;
    ContextFrame->_R8 = TrapFrame->_R8;
    ContextFrame->_R9 = TrapFrame->_R9;
    ContextFrame->_R10 = TrapFrame->_R10;
    ContextFrame->_R11 = TrapFrame->_R11;
    ContextFrame->_Rbp = TrapFrame->_Rbp;
    ContextFrame->_Rbx = ExceptionFrame->Dr7;
    ContextFrame->_Rdi = ExceptionFrame->DebugControl;
    ContextFrame->_Rsi = ExceptionFrame->LastBranchToRip;
    ContextFrame->_R12 = ExceptionFrame->LastBranchFromRip;
    ContextFrame->_R13 = ExceptionFrame->LastExceptionToRip;
    ContextFrame->_R14 = ExceptionFrame->LastExceptionFromRip;
    ContextFrame->_R15 = *(_QWORD *)&ExceptionFrame->SegDs;
  }
  if( (ContextFlags & 0x100040) == 1048640 )
  {
    if( (TrapFrame->SegCs & 1) != 0 )
    {
      P3Home_low = SLODWORD(ContextFrame[1].P3Home);
      SparePtr = KeGetCurrentThread()->WaitBlock[1].SparePtr;
      if( SparePtr )
      {
        for( i = (_QWORD *)*SparePtr; i; i = (_QWORD *)*i )
          SparePtr = i;
        v11 = SparePtr[5];
      }
      else
      {
        v11 = 0i64;
      }
      v12 = &ContextFrame->FltSave.Reserved4[P3Home_low + 48];
      if( v11 )
        KiCopyXStateArea((INT64)v12, KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64, v11);
      else
        RtlXSaveS(
          (INT64)v12,
          (KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64);
    }
    ContextFrame->_MxCsr = TrapFrame->_MxCsr;
    ContextFrame->FltSave._MxCsr = TrapFrame->_MxCsr;
  }
  if( (ContextFlags & 0x100008) == 1048584 )
  {
    if( (TrapFrame->SegCs & 1) != 0 )
      _fxsave(&ContextFrame->256);
    ContextFrame->_Xmm0 = TrapFrame->_Xmm0;
    ContextFrame->_Xmm1 = TrapFrame->_Xmm1;
    ContextFrame->_Xmm2 = TrapFrame->_Xmm2;
    ContextFrame->_Xmm3 = TrapFrame->_Xmm3;
    ContextFrame->_Xmm4 = TrapFrame->_Xmm4;
    ContextFrame->_Xmm5 = TrapFrame->_Xmm5;
    ContextFrame->_Xmm6 = *(_M128A *)&ExceptionFrame->_Rax;
    ContextFrame->_Xmm7 = *(_M128A *)&ExceptionFrame->_Rdx;
    ContextFrame->_Xmm8 = *(_M128A *)&ExceptionFrame->_R9;
    ContextFrame->_Xmm9 = *(_M128A *)&ExceptionFrame->_R11;
    ContextFrame->_Xmm10 = ExceptionFrame->_Xmm0;
    ContextFrame->_Xmm11 = ExceptionFrame->_Xmm1;
    ContextFrame->_Xmm12 = ExceptionFrame->_Xmm2;
    ContextFrame->_Xmm13 = ExceptionFrame->_Xmm3;
    ContextFrame->_Xmm14 = ExceptionFrame->_Xmm4;
    ContextFrame->_Xmm15 = ExceptionFrame->_Xmm5;
    ContextFrame->_MxCsr = TrapFrame->_MxCsr;
    ContextFrame->FltSave._MxCsr = TrapFrame->_MxCsr;
  }
  if( (ContextFlags & 0x100010) == 1048592 )
  {
    if( (TrapFrame->Dr7 & 0x355) != 0 )
    {
      ContextFrame->Dr0 = TrapFrame->Dr0;
      ContextFrame->Dr1 = TrapFrame->Dr1;
      ContextFrame->Dr2 = TrapFrame->Dr2;
      ContextFrame->Dr3 = TrapFrame->Dr3;
      ContextFrame->Dr6 = TrapFrame->Dr6;
      Dr7 = TrapFrame->Dr7;
    }
    else
    {
      ContextFrame->Dr0 = 0i64;
      ContextFrame->Dr1 = 0i64;
      ContextFrame->Dr2 = 0i64;
      ContextFrame->Dr3 = 0i64;
      ContextFrame->Dr6 = 0i64;
      Dr7 = 0i64;
    }
    ContextFrame->Dr7 = Dr7;
    KeCopyLastBranchInformation((INT64)ContextFrame, (INT64)TrapFrame);
  }
  if( !CurrentIrql )
    __writecr8(0i64);
}

Referenced by:

KeCopyContextFromUch
KiCaptureUmsThreadContext
KiDispatchException
KiInitializeUserApc
KiSaveProcessorState