RtlpReadExtendedContext
INT64 __fastcall RtlpReadExtendedContext(INT64 *a1, UINT64 *a2, BYTE *a3){
unsigned int v3;
unsigned int v4;
int v5;
__int64 v6;
__int128 *v7;
INT64 result;
INT64 v9;
char v10;
__int64 v11;
__int64 v12;
unsigned __int64 v13;
int v14;
INT64 v15;
unsigned int v16;
unsigned int *v17;
INT64 v18;
__int64 v19;
__int64 v20;
unsigned __int64 v21;
unsigned __int64 v22;
INT64 v23;
CHAR v24;
INT64 v25;
__int64 v26;
INT64 v27;
__int128 v28;
__int64 v29;
INT64 v30;
INT64 v31;
v4 = v3;
v27 = (INT64)a3;
v24 = (char)a2;
LODWORD(v25) = 0;
v5 = 0;
v28 = 0i64;
v29 = 0i64;
v6 = 0i64;
v26 = 0i64;
v7 = &v28;
if( v31 )
v7 = (__int128 *)v31;
LODWORD(result) = RtlpValidateContextFlags(v3, (UINT64 *)&v25);
if( (int)result < 0 )
return result;
v10 = v25;
result = RtlpReadExtendedContextLayout(v9, v4, v30, (unsigned int)v25, (INT64 *)v7);
HIDWORD(v25) = result;
if( (int)result < 0 )
return result;
if( (v4 & 0x10000) != 0 )
{
v5 = 4;
v6 = v30 + 716;
}
else
{
if( (v4 & 0x100000) != 0 )
{
v6 = v30 + 1232;
}
else
{
if( (v4 & 0x200000) != 0 )
{
v5 = 8;
v6 = v30 + 416;
goto LABEL_9;
}
if( (v4 & 0x400000) == 0 )
goto LABEL_10;
v6 = v30 + 912;
}
v5 = 16;
}
LABEL_9:
v26 = v6;
LABEL_10:
if( (v10 & 1) != 0 )
{
v11 = *((unsigned int *)v7 + 3);
if( (_DWORD)v11 )
{
v12 = *((int *)v7 + 2);
if( ((unsigned int)(v5 - 1) & (unsigned __int64)(v12 + v6)) != 0 )
ExRaiseDatatypeMisalignment();
v13 = v6 + v12 + v11;
if( v13 > 0x7FFFFFFF0000i64 || v13 < v12 + v6 )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
v14 = v10 & 2;
if( v14 )
{
v19 = *((unsigned int *)v7 + 5);
if( (_DWORD)v19 )
{
v20 = *((int *)v7 + 4);
v21 = v20 + v6;
if( (((_BYTE)v20 + (_BYTE)v6) & 0x3F) != 0 )
ExRaiseDatatypeMisalignment();
v22 = v6 + v19 + v20;
if( v22 > 0x7FFFFFFF0000i64 || v22 < v21 )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
v23 = v6;
v15 = v27;
result = RtlpCopyExtendedContext(v24, v27, 0i64, v4, v23, (INT64)v7);
v16 = result;
HIDWORD(v25) = result;
if( (int)result >= 0 )
{
v17 = (unsigned int *)(v15 + *(int *)(v15 + 8));
if( (v4 & 0x10000) == 0 )
{
if( (v4 & 0x100000) != 0 )
{
v17[12] = v4;
LABEL_20:
if( v14 )
{
v18 = v15 + *(int *)(v15 + 16);
*(_QWORD *)v18 &= (KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64;
if( (KUSER_SHARED_DATA.XState.ControlFlags & 2) != 0 )
*(_QWORD *)(v18 + 8) &= KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures | 0x8000000000000000ui64;
else
*(_QWORD *)(v18 + 8) = 0i64;
*(_OWORD *)(v18 + 16) = 0i64;
*(_OWORD *)(v18 + 32) = 0i64;
*(_OWORD *)(v18 + 48) = 0i64;
}
return v16;
}
if( (v4 & 0x200000) == 0 && (v4 & 0x400000) == 0 )
goto LABEL_20;
}
*v17 = v4;
goto LABEL_20;
}
return result;
}Referenced by:
KiContinuePreviousModeUser
KiRaiseException
KiUnwindUserSspForApcContextCopyBypass
PspGetContextThreadInternal
PspSetContextThreadInternal
PspWow64GetContextThread
PspWow64SetContextThread