PsWow64GetSupportedArchitectures

NTSTATUS __stdcall PsWow64GetSupportedArchitectures(
        VOID *ArchInfo,
        UINT64 ArchInfoLength,
        UINT64 *ReturnLength,
        _EPROCESS *TargetProcess){
  size_t v6; 
  NTSTATUS IsMachineSupported; 
  NTSTATUS v9; 
  int v10; 
  size_t v11; 
  __int16 Machine; 
  unsigned int v13; 
  int v14; 
  unsigned int v15; 
  unsigned int v16; 
  int v17; 
  unsigned int v18; 
  int v19; 
  _EWOW64PROCESS *WoW64Process; 

  v6 = ArchInfoLength;
  IsMachineSupported = PsWow64IsMachineSupported(332);
  v9 = PsWow64IsMachineSupported(452);
  v10 = (IsMachineSupported != 0) + 2;
  if( !v9 )
    v10 = (IsMachineSupported != 0) + 1;
  v11 = 4 * v10 + 4;
  *(_DWORD *)ReturnLength = v11;
  if( v11 > v6 )
    return -1073741789;
  Machine = 0;
  if( TargetProcess )
  {
    WoW64Process = TargetProcess->WoW64Process;
    if( !WoW64Process || (Machine = WoW64Process->Machine) == 0 )
      Machine = -31132;
  }
  memset(ArchInfo, 0i64, v11);
  v13 = *(_DWORD *)ArchInfo & 0xFFFF0000 | 0x8664;
  *(_DWORD *)ArchInfo = v13;
  v13 |= 0x10000u;
  *(_DWORD *)ArchInfo = v13;
  v13 |= 0x20000u;
  *(_DWORD *)ArchInfo = v13;
  v14 = v13 | 0x40000;
  *(_DWORD *)ArchInfo = v14;
  if( Machine == -31132 )
    *(_DWORD *)ArchInfo = v14 | 0x80000;
  v15 = 1;
  if( IsMachineSupported )
  {
    v16 = *((_DWORD *)ArchInfo + 1) & 0xFFFF0000 | 0x14C;
    *((_DWORD *)ArchInfo + 1) = v16;
    v17 = v16 | 0x20000;
    *((_DWORD *)ArchInfo + 1) = v17;
    if( Machine == 332 )
      *((_DWORD *)ArchInfo + 1) = v17 | 0x80000;
    v15 = 2;
  }
  if( v9 )
  {
    v18 = *((_DWORD *)ArchInfo + v15) & 0xFFFF0000 | 0x1C4;
    *((_DWORD *)ArchInfo + v15) = v18;
    v19 = v18 | 0x20000;
    *((_DWORD *)ArchInfo + v15) = v19;
    if( Machine == 452 )
      *((_DWORD *)ArchInfo + v15) = v19 | 0x80000;
  }
  return 0;
}

Referenced by:

ExpQuerySystemInformation