PspGetContext

VOID __stdcall PspGetContext(_KTRAP_FRAME *TrapFrame, _CONTEXT *ContextRecord){
  INT64 v2; 
  int v3; 
  INT64 v5; 
  unsigned __int64 Dr7; 
  unsigned int v8; 
  unsigned __int8 ExceptionActive; 
  int v10; 
  __int64 v11; 
  _QWORD *SparePtr; 
  INT64 v13; 
  INT64 v14; 
  _QWORD *v15; 

  v3 = *(_DWORD *)(v2 + 48);
  v5 = v2;
  if( (v3 & 0x100001) == 1048577 )
  {
    *(_QWORD *)(v2 + 248) = TrapFrame->_Rip;
    *(_WORD *)(v2 + 56) = TrapFrame->SegCs;
    *(_WORD *)(v2 + 66) = TrapFrame->SegSs;
    *(_QWORD *)(v2 + 152) = TrapFrame->_Rsp;
    *(_DWORD *)(v2 + 68) = TrapFrame->EFlags;
  }
  if( (v3 & 0x100004) == 1048580 )
  {
    *(_DWORD *)(v2 + 58) = 2818091;
    *(_DWORD *)(v2 + 62) = 2818131;
  }
  if( (v3 & 0x100002) == 1048578 )
  {
    *(_QWORD *)(v2 + 120) = TrapFrame->_Rax;
    *(_QWORD *)(v2 + 128) = TrapFrame->_Rcx;
    *(_QWORD *)(v2 + 136) = TrapFrame->_Rdx;
    *(_QWORD *)(v2 + 184) = TrapFrame->_R8;
    *(_QWORD *)(v2 + 192) = TrapFrame->_R9;
    *(_QWORD *)(v2 + 200) = TrapFrame->_R10;
    *(_QWORD *)(v2 + 208) = TrapFrame->_R11;
    *(_QWORD *)(v2 + 144) = *(_QWORD *)ContextRecord->_Rsp;
    *(_QWORD *)(v2 + 160) = *(_QWORD *)ContextRecord->_Rsi;
    *(_QWORD *)(v2 + 168) = *(_QWORD *)ContextRecord->_Rdi;
    *(_QWORD *)(v2 + 176) = *(_QWORD *)ContextRecord->_R8;
    *(_QWORD *)(v2 + 216) = *(_QWORD *)ContextRecord->_R13;
    *(_QWORD *)(v2 + 224) = *(_QWORD *)ContextRecord->_R14;
    *(_QWORD *)(v2 + 232) = *(_QWORD *)ContextRecord->_R15;
    *(_QWORD *)(v2 + 240) = *(_QWORD *)ContextRecord->_Rip;
  }
  Dr7 = 0i64;
  if( (v3 & 0x100040) == 1048640 )
  {
    if( (TrapFrame->SegCs & 1) != 0 )
    {
      v11 = *(int *)(v2 + 1248);
      SparePtr = KeGetCurrentThread()->WaitBlock[1].SparePtr;
      if( SparePtr )
      {
        v15 = (_QWORD *)*SparePtr;
        if( *SparePtr )
        {
          do
          {
            SparePtr = v15;
            v15 = (_QWORD *)*v15;
          }
          while( v15 );
        }
        v13 = SparePtr[5];
      }
      else
      {
        v13 = 0i64;
      }
      v14 = v5 + v11 + 720;
      if( v13 )
        KiCopyXStateArea(v14, KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64, v13);
      else
        RtlXSaveS(
          v14,
          (KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64);
    }
    *(_DWORD *)(v5 + 52) = TrapFrame->_MxCsr;
    *(_DWORD *)(v5 + 280) = TrapFrame->_MxCsr;
  }
  if( (v3 & 0x100008) == 1048584 )
  {
    *(_M128A *)(v5 + 416) = TrapFrame->_Xmm0;
    *(_M128A *)(v5 + 432) = TrapFrame->_Xmm1;
    *(_M128A *)(v5 + 448) = TrapFrame->_Xmm2;
    *(_M128A *)(v5 + 464) = TrapFrame->_Xmm3;
    *(_M128A *)(v5 + 480) = TrapFrame->_Xmm4;
    *(_M128A *)(v5 + 496) = TrapFrame->_Xmm5;
    *(_OWORD *)(v5 + 512) = *(_OWORD *)*(_QWORD *)&ContextRecord->ContextFlags;
    *(_OWORD *)(v5 + 528) = *(_OWORD *)*(_QWORD *)&ContextRecord->SegCs;
    *(_OWORD *)(v5 + 544) = *(_OWORD *)*(_QWORD *)&ContextRecord->SegGs;
    *(_OWORD *)(v5 + 560) = *(_OWORD *)ContextRecord->Dr0;
    *(_OWORD *)(v5 + 576) = *(_OWORD *)ContextRecord->Dr1;
    *(_OWORD *)(v5 + 592) = *(_OWORD *)ContextRecord->Dr2;
    *(_OWORD *)(v5 + 608) = *(_OWORD *)ContextRecord->Dr3;
    *(_OWORD *)(v5 + 624) = *(_OWORD *)ContextRecord->Dr6;
    *(_OWORD *)(v5 + 640) = *(_OWORD *)ContextRecord->Dr7;
    *(_OWORD *)(v5 + 656) = *(_OWORD *)ContextRecord->_Rax;
    *(_DWORD *)(v5 + 52) = TrapFrame->_MxCsr;
    *(_DWORD *)(v5 + 280) = TrapFrame->_MxCsr;
  }
  if( (v3 & 0x100010) == 1048592 )
  {
    if( (TrapFrame->Dr7 & 0x355) != 0 )
    {
      *(_QWORD *)(v5 + 72) = TrapFrame->Dr0;
      *(_QWORD *)(v5 + 80) = TrapFrame->Dr1;
      *(_QWORD *)(v5 + 88) = TrapFrame->Dr2;
      *(_QWORD *)(v5 + 96) = TrapFrame->Dr3;
      *(_QWORD *)(v5 + 104) = TrapFrame->Dr6;
      Dr7 = TrapFrame->Dr7;
    }
    else
    {
      *(_QWORD *)(v5 + 72) = 0i64;
      *(_QWORD *)(v5 + 80) = 0i64;
      *(_QWORD *)(v5 + 88) = 0i64;
      *(_QWORD *)(v5 + 96) = 0i64;
      *(_QWORD *)(v5 + 104) = 0i64;
    }
    *(_QWORD *)(v5 + 112) = Dr7;
    KeCopyLastBranchInformation(v5, (INT64)TrapFrame);
  }
  if( (v3 & 0x40000000) != 0 )
  {
    v8 = *(_DWORD *)(v5 + 48) & 0x67FFFFFF | 0x80000000;
    *(_DWORD *)(v5 + 48) = v8;
    ExceptionActive = TrapFrame->ExceptionActive;
    if( ExceptionActive == 1 )
    {
      v10 = v8 | 0x8000000;
    }
    else
    {
      if( ExceptionActive != 2 )
        return;
      v10 = v8 | 0x10000000;
    }
    *(_DWORD *)(v5 + 48) = v10;
  }
}

Referenced by:

PspGetSetContextInternal