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