RtlpWow64SetContextOnAmd64

INT64 __fastcall RtlpWow64SetContextOnAmd64(INT64 a1, INT64 a2, INT64 a3, BYTE *a4){
  INT64 v6; 
  unsigned int v8; 
  __int16 v9; 
  int v10; 
  int v11; 
  int v12; 
  *a4 = 0;
  v6 = a2;
  v8 = *(_DWORD *)a3;
  if( a2 )
  {
    v9 = *(_WORD *)(a2 + 56);
    RtlpWow64CtxToAmd64(v8, (_DWORD *)a3, a2);
    if( v9 == 35 )
      goto LABEL_18;
  }
  if( (v8 & 0x10001) == 65537 )
  {
    *(_DWORD *)(a1 + 180) = *(_DWORD *)(a3 + 180);
    *(_DWORD *)(a1 + 184) = *(_DWORD *)(a3 + 184);
    *(_DWORD *)(a1 + 188) = 35;
    *(_DWORD *)(a1 + 192) = *(_DWORD *)(a3 + 192) & 0x3F0DD5 | 0x202;
    *(_DWORD *)(a1 + 196) = *(_DWORD *)(a3 + 196);
    *(_DWORD *)(a1 + 200) = *(_DWORD *)(a3 + 200);
  }
  if( (v8 & 0x10002) == 65538 )
  {
    *(_DWORD *)(a1 + 156) = *(_DWORD *)(a3 + 156);
    *(_DWORD *)(a1 + 160) = *(_DWORD *)(a3 + 160);
    *(_DWORD *)(a1 + 164) = *(_DWORD *)(a3 + 164);
    *(_DWORD *)(a1 + 168) = *(_DWORD *)(a3 + 168);
    *(_DWORD *)(a1 + 172) = *(_DWORD *)(a3 + 172);
    *(_DWORD *)(a1 + 176) = *(_DWORD *)(a3 + 176);
  }
  v10 = 1048584;
  if( (v8 & 0x10008) != 65544 )
    v10 = 0;
  v11 = v10 | 0x100010;
  if( (v8 & 0x10010) != 65552 )
    v11 = v10;
  if( (v8 & 0x10020) == 65568 )
  {
    v11 |= 0x100008u;
    *(_OWORD *)(a1 + 364) = *(_OWORD *)(a3 + 364);
    *(_OWORD *)(a1 + 380) = *(_OWORD *)(a3 + 380);
    *(_OWORD *)(a1 + 396) = *(_OWORD *)(a3 + 396);
    *(_OWORD *)(a1 + 412) = *(_OWORD *)(a3 + 412);
    *(_OWORD *)(a1 + 428) = *(_OWORD *)(a3 + 428);
    *(_OWORD *)(a1 + 444) = *(_OWORD *)(a3 + 444);
  }
  v12 = v11 | 0x100040;
  if( (v8 & 0x10040) != 65600 )
    v12 = v11;
  if( v12 && v6 )
  {
    *(_DWORD *)(v6 + 48) = v12;
LABEL_18:
    *a4 = 1;
  }
  return 0i64;
}

Referenced by:

PspWow64SetContextThread