RtlCopyContext

NTSTATUS __stdcall RtlCopyContext(_X86_NT5_CONTEXT *Destination, UINT64 ContextFlags, _X86_NT5_CONTEXT *Source){
  unsigned int v3; 
  _CONTEXT_EX *v6; 
  _CONTEXT_EX *SourceLayout; 
  NTSTATUS result; 
  _DWORD *v9; 
  INT64 v10; 
  int *v11; 
  unsigned int *v12; 
  unsigned int v13; 
  int v14; 
  unsigned int v15; 
  NTSTATUS v16; 
  UINT64 ChunksMask; 
  _DWORD *v18; 
  UINT64 v19; 

  LODWORD(ChunksMask) = 0;
  v3 = ContextFlags;
  LODWORD(v19) = 0;
  v6 = 0i64;
  SourceLayout = 0i64;
  result = RtlpValidateContextFlags((unsigned int)ContextFlags, 0i64);
  if( result >= 0 )
  {
    LODWORD(v9) = RtlpGetContextFlagsLocation((INT64)Destination, v3);
    v18 = v9;
    LODWORD(v11) = RtlpGetContextFlagsLocation((INT64)Source, v10);
    v13 = *v12;
    v14 = *v11;
    result = RtlpValidateContextFlags(v3 | *v11 | *v12, 0i64);
    if( result >= 0 )
    {
      v15 = v3 & v14;
      result = RtlpValidateContextFlags(v15, &ChunksMask);
      if( result >= 0 )
      {
        result = RtlpValidateContextFlags(v13, &v19);
        v16 = result;
        if( result >= 0 )
        {
          if( (~(_DWORD)v19 & (unsigned int)ChunksMask) != 0 )
          {
            return -2147483643;
          }
          else
          {
            RtlpCopyLegacyContext(1, (_CONTEXT *)Destination, v15, (_CONTEXT *)Source);
            *v18 |= v13;
            if( (v19 & 0xFFFFFFFE) != 0 )
            {
              if( (v15 & 0x10000) != 0 )
              {
                SourceLayout = (_CONTEXT_EX *)(Source + 179);
                v6 = (_CONTEXT_EX *)(Destination + 179);
                if( (v13 & 0x10020) != 65568 && (v15 & 0x10020) == 65568 )
                  Destination[182] = 716;
              }
              else if( (v3 & 0x100000) != 0 )
              {
                SourceLayout = (_CONTEXT_EX *)(Source + 308);
                v6 = (_CONTEXT_EX *)(Destination + 308);
              }
              else if( (v3 & 0x200000) != 0 )
              {
                SourceLayout = (_CONTEXT_EX *)(Source + 104);
                v6 = (_CONTEXT_EX *)(Destination + 104);
              }
              else if( (v3 & 0x400000) != 0 )
              {
                SourceLayout = (_CONTEXT_EX *)(Source + 228);
                v6 = (_CONTEXT_EX *)(Destination + 228);
              }
            }
            if( (ChunksMask & 2) == 0 )
              return v16;
            result = RtlpCopyXStateChunk(1, v6, v6, SourceLayout, SourceLayout);
            v16 = result;
            if( result >= 0 )
              return v16;
          }
        }
      }
    }
  }
  return result;
}

Referenced by:

PspGetSetContextInternal
PspInitializeThunkContext
PspSetContextState
PspWow64GetContextThread
PspWow64SetContextThread