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