KxContextToKframes

PXMM_SAVE_AREA32 __stdcall KxContextToKframes(
        PKTRAP_FRAME TrapFrame,
        PKEXCEPTION_FRAME ExceptionFrame,
        PCONTEXT ContextRecord,
        UINT32 ContextFlags,
        _KPROCESSOR_MODE PreviousMode){
  unsigned __int8 v5; 
  unsigned int EFlags; 
  int v11; 
  unsigned __int64 Rip; 
  unsigned __int16 v13; 
  PXMM_SAVE_AREA32 result; 
  unsigned __int64 Dr0; 
  unsigned __int64 Dr1; 
  unsigned __int64 Dr2; 
  unsigned __int64 Dr3; 
  unsigned __int64 v19; 
  volatile signed __int32 *CurrentThread; 
  bool v21; 
  PFN_IO_CONNECT_INTERRUPT *v22; 
  _QWORD *SparePtr; 
  _QWORD *v24; 
  INT64 v25; 

  v5 = 0;
  if( (ContextFlags & 0x100001) == 1048577 )
  {
    EFlags = ContextRecord->EFlags;
    if( (_BYTE)PreviousMode )
      v11 = EFlags & 0x210DD5 | 0x200;
    else
      v11 = EFlags & 0x250FD5;
    TrapFrame->EFlags = v11;
    Rip = ContextRecord->_Rip;
    TrapFrame->_Rip = Rip;
    TrapFrame->_Rsp = ContextRecord->_Rsp;
    if( (_BYTE)PreviousMode == 1 )
    {
      TrapFrame->SegSs = 43;
      v13 = 51;
      if( ContextRecord->SegCs != 51 )
        v13 = 35;
      TrapFrame->SegCs = v13;
      Rip = TrapFrame->_Rip;
      if( v13 == 35 )
        Rip = (unsigned int)Rip;
      else
        Rip = (__int64)(Rip << 16) >> 16;
    }
    else
    {
      TrapFrame->SegCs = 16;
      TrapFrame->SegSs = 24;
    }
    TrapFrame->_Rip = Rip;
  }
  if( (ContextFlags & 0x100002) == 1048578 )
  {
    TrapFrame->_Rax = ContextRecord->_Rax;
    TrapFrame->_Rcx = ContextRecord->_Rcx;
    TrapFrame->_Rdx = ContextRecord->_Rdx;
    TrapFrame->_R8 = ContextRecord->_R8;
    TrapFrame->_R9 = ContextRecord->_R9;
    TrapFrame->_R10 = ContextRecord->_R10;
    TrapFrame->_R11 = ContextRecord->_R11;
    TrapFrame->_Rbp = ContextRecord->_Rbp;
    ExceptionFrame->_Rbx = ContextRecord->_Rbx;
    ExceptionFrame->_Rsi = ContextRecord->_Rsi;
    ExceptionFrame->_Rdi = ContextRecord->_Rdi;
    ExceptionFrame->_R12 = ContextRecord->_R12;
    ExceptionFrame->_R13 = ContextRecord->_R13;
    ExceptionFrame->_R14 = ContextRecord->_R14;
    ExceptionFrame->_R15 = ContextRecord->_R15;
  }
  if( (ContextFlags & 0x100040) == 1048640 && (_BYTE)PreviousMode == 1 )
  {
    v22 = (PFN_IO_CONNECT_INTERRUPT *)((char *)&ContextRecord->1 + SLODWORD(ContextRecord[1].P3Home) + 464);
    SparePtr = KeGetCurrentThread()->WaitBlock[1].SparePtr;
    if( !SparePtr )
      goto LABEL_42;
    v24 = (_QWORD *)*SparePtr;
    if( *SparePtr )
    {
      do
      {
        SparePtr = v24;
        v24 = (_QWORD *)*v24;
      }
      while( v24 );
    }
    v25 = SparePtr[5];
    if( v25 )
      KiCopyXStateArea(v25, KUSER_SHARED_DATA.XState.EnabledVolatileFeatures & 0xFFFFFFFFFFFFFFFCui64, (INT64)v22);
    else
LABEL_42:
      RtlXRestoreS(
        v22,
        (_XSTATE_CONFIGURATION *)((KUSER_SHARED_DATA.XState.EnabledVolatileFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64));
  }
  if( (ContextFlags & 0x100008) == 1048584 )
  {
    TrapFrame->_Xmm0 = ContextRecord->_Xmm0;
    TrapFrame->_Xmm1 = ContextRecord->_Xmm1;
    TrapFrame->_Xmm2 = ContextRecord->_Xmm2;
    TrapFrame->_Xmm3 = ContextRecord->_Xmm3;
    TrapFrame->_Xmm4 = ContextRecord->_Xmm4;
    TrapFrame->_Xmm5 = ContextRecord->_Xmm5;
    ExceptionFrame->_Xmm6 = ContextRecord->_Xmm6;
    ExceptionFrame->_Xmm7 = ContextRecord->_Xmm7;
    ExceptionFrame->_Xmm8 = ContextRecord->_Xmm8;
    ExceptionFrame->_Xmm9 = ContextRecord->_Xmm9;
    ExceptionFrame->_Xmm10 = ContextRecord->_Xmm10;
    ExceptionFrame->_Xmm11 = ContextRecord->_Xmm11;
    ExceptionFrame->_Xmm12 = ContextRecord->_Xmm12;
    ExceptionFrame->_Xmm13 = ContextRecord->_Xmm13;
    ExceptionFrame->_Xmm14 = ContextRecord->_Xmm14;
    ExceptionFrame->_Xmm15 = ContextRecord->_Xmm15;
    TrapFrame->_MxCsr = KiMxCsrMask & ContextRecord->_MxCsr;
    if( (_BYTE)PreviousMode == 1 )
    {
      v5 = 1;
      ContextRecord->FltSave._MxCsr = _mm_getcsr();
      ContextRecord->FltSave.ControlWord &= 0x1F3Fu;
    }
  }
  if( (ContextFlags & 0x100010) != 1048592 )
    return(PXMM_SAVE_AREA32)v5;
  Dr0 = ContextRecord->Dr0;
  if( (_BYTE)PreviousMode && Dr0 > 0x7FFFFFFEFFFFi64 )
    Dr0 = 0i64;
  TrapFrame->Dr0 = Dr0;
  Dr1 = ContextRecord->Dr1;
  if( (_BYTE)PreviousMode && Dr1 > 0x7FFFFFFEFFFFi64 )
    Dr1 = 0i64;
  TrapFrame->Dr1 = Dr1;
  Dr2 = ContextRecord->Dr2;
  if( (_BYTE)PreviousMode && Dr2 > 0x7FFFFFFEFFFFi64 )
    Dr2 = 0i64;
  TrapFrame->Dr2 = Dr2;
  Dr3 = ContextRecord->Dr3;
  if( (_BYTE)PreviousMode && Dr3 > 0x7FFFFFFEFFFFi64 )
    Dr3 = 0i64;
  TrapFrame->Dr3 = Dr3;
  TrapFrame->Dr6 = 0i64;
  v19 = ContextRecord->Dr7 & 0xFFFF0355;
  TrapFrame->Dr7 = v19;
  if( !(_BYTE)PreviousMode )
    return(PXMM_SAVE_AREA32)v5;
  CurrentThread = (volatile signed __int32 *)KeGetCurrentThread();
  v21 = (v19 & 0x355) == 0;
  result = (PXMM_SAVE_AREA32)v5;
  if( v21 )
    _interlockedbittestandreset(CurrentThread, 0x18u);
  else
    _interlockedbittestandset(CurrentThread, 0x18u);
  return result;
}

Referenced by:

KeContextToKframes
KiInitializeContextThread