RtlpReadExtendedContext
NTSTATUS __stdcall RtlpReadExtendedContext(
CHAR Operation,
_CONTEXT_EX *Destination,
UINT64 ContextFlags,
VOID *Source,
_CONTEXT_EX *SourceLayout){
unsigned int v5;
int v6;
_CONTEXT_EX *v7;
_CONTEXT_EX *v8;
NTSTATUS result;
UINT64 v10;
char v11;
__int64 Length;
__int64 Offset;
unsigned __int64 v14;
int v15;
_CONTEXT_EX *v16;
NTSTATUS v17;
unsigned int *v18;
char *v19;
__int64 v20;
__int64 v21;
char *v22;
unsigned __int64 v23;
_CONTEXT_EX *Sourcea;
INT8 v25;
_CONTEXT_EX *Layout;
_CONTEXT_EX *v27;
_CONTEXT_EX *Destinationa;
__int128 v29;
__int64 v30;
_CONTEXT_EX *v31;
v5 = (unsigned int)Source;
Destinationa = (_CONTEXT_EX *)ContextFlags;
v25 = (char)Destination;
LODWORD(Layout) = 0;
v6 = 0;
v29 = 0i64;
v30 = 0i64;
v7 = 0i64;
v27 = 0i64;
v8 = (_CONTEXT_EX *)&v29;
if( v31 )
v8 = v31;
result = RtlpValidateContextFlags((unsigned int)Source, (UINT64 *)&Layout);
if( result < 0 )
return result;
v11 = (char)Layout;
result = RtlpReadExtendedContextLayout(v10, (VOID *)v5, (UINT64)SourceLayout, (_CONTEXT_EX *)(unsigned int)Layout);
HIDWORD(Layout) = result;
if( result < 0 )
return result;
if( (v5 & 0x10000) != 0 )
{
v6 = 4;
v7 = (_CONTEXT_EX *)((char *)SourceLayout + 716);
}
else
{
if( (v5 & 0x100000) != 0 )
{
v7 = (_CONTEXT_EX *)((char *)SourceLayout + 1232);
}
else
{
if( (v5 & 0x200000) != 0 )
{
v6 = 8;
v7 = (_CONTEXT_EX *)((char *)SourceLayout + 416);
goto LABEL_9;
}
if( (v5 & 0x400000) == 0 )
goto LABEL_10;
v7 = SourceLayout + 38;
}
v6 = 16;
}
LABEL_9:
v27 = v7;
LABEL_10:
if( (v11 & 1) != 0 )
{
Length = v8->Legacy.Length;
if( (_DWORD)Length )
{
Offset = v8->Legacy.Offset;
if( ((unsigned int)(v6 - 1) & ((unsigned __int64)v7 + Offset)) != 0 )
ExRaiseDatatypeMisalignment();
v14 = (unsigned __int64)v7 + Offset + Length;
if( v14 > 0x7FFFFFFF0000i64 || v14 < (unsigned __int64)v7 + Offset )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
v15 = v11 & 2;
if( v15 )
{
v20 = v8->XState.Length;
if( (_DWORD)v20 )
{
v21 = v8->XState.Offset;
v22 = (char *)v7 + v21;
if( (((_BYTE)v21 + (_BYTE)v7) & 0x3F) != 0 )
ExRaiseDatatypeMisalignment();
v23 = (unsigned __int64)v7 + v20 + v21;
if( v23 > 0x7FFFFFFF0000i64 || v23 < (unsigned __int64)v22 )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
Sourcea = v7;
v16 = Destinationa;
result = RtlpCopyExtendedContext(v25, Destinationa, 0i64, v5, Sourcea, v8);
v17 = result;
HIDWORD(Layout) = result;
if( result >= 0 )
{
v18 = (unsigned int *)((char *)v16 + v16->Legacy.Offset);
if( (v5 & 0x10000) == 0 )
{
if( (v5 & 0x100000) != 0 )
{
v18[12] = v5;
LABEL_20:
if( v15 )
{
v19 = (char *)v16 + v16->XState.Offset;
*(_QWORD *)v19 &= (KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64;
if( (KUSER_SHARED_DATA.XState._bf_0 & 2) != 0 )
*((_QWORD *)v19 + 1) &= KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures | 0x8000000000000000ui64;
else
*((_QWORD *)v19 + 1) = 0i64;
*((_OWORD *)v19 + 1) = 0i64;
*((_OWORD *)v19 + 2) = 0i64;
*((_OWORD *)v19 + 3) = 0i64;
}
return v17;
}
if( (v5 & 0x200000) == 0 && (v5 & 0x400000) == 0 )
goto LABEL_20;
}
*v18 = v5;
goto LABEL_20;
}
return result;
}Referenced by:
KiContinuePreviousModeUser
KiRaiseException
KiUnwindUserSspForApcContextCopyBypass
PspGetContextThreadInternal
PspSetContextThreadInternal
PspWow64GetContextThread
PspWow64SetContextThread