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