Fix it now
1633 is ERROR_INSTALL_PLATFORM_UNSUPPORTED: this installation package is not supported on this platform. 1623 is the same refusal about language rather than platform. Neither is corruption, and neither is fixed by downloading the same file again – you need the variant of the package that matches the machine, and the machine will tell you which one that is in about ten seconds.
(Get-CimInstance Win32_OperatingSystem).OSArchitecture
$env:PROCESSOR_ARCHITECTURE
Get-FileHash C:\pkg\app.msi -Algorithm SHA256
- Match the download to what those commands report: x86 for 32-bit, x64 for 64-bit Intel and AMD, ARM64 for Arm devices.
- Remember which way compatibility runs. A 32-bit package installs on 64-bit Windows; a 64-bit package will not install on 32-bit Windows at all.
- If the error is 1623 rather than 1633, get the localised package for your system language, or ask the vendor for the language transform that adds it.
- Install from an elevated Command Prompt with logging so the refusal is recorded:
msiexec /i "C:\pkg\app.msi" /l*v "C:\pkg\install.log". - If you get 0x8007000B or 0x800700C1 instead, the file is not the executable type it claims to be – check the hash and obtain it again.
For runtimes and drivers, match the architecture of the application rather than of Windows. A 32-bit application needs the 32-bit runtime even on 64-bit Windows, and installing the 64-bit one instead will not make it start.
If the correct variant installs and the application runs, you are done. If the package still refuses, the next section covers what it is actually declaring.
Why it happens
Every MSI carries a summary information stream, and one of its properties records the platform and the language the package was built for. Windows Installer reads that before doing anything else and refuses immediately when the platform does not match. That is why 1633 arrives instantly, with no progress bar and nothing in the log about files, and why the same package installs perfectly on a colleague’s machine.
Compatibility runs one way only. Sixty-four-bit Windows carries the subsystem that runs 32-bit code, so an x86 package installs there and the application runs. Thirty-two-bit Windows has no equivalent for 64-bit code, so an x64 package is rejected outright. On Arm devices the picture is different again: Microsoft’s position is that Windows on Arm runs native Arm apps as well as many unmodified x86 and x64 applications through emulation, with support for unmodified x64 applications being a Windows 11 capability. Native Arm64 remains the better choice where the vendor publishes one.
Language works the same way through a different property. A package built for a single language declares it, and if the system language is not in that list and no transform supplies it, the install stops with 1623 – Microsoft’s text is that this language of the installation package is not supported by your system. Vendors handle this either by shipping one package per language or by shipping a multilingual package with language transforms, which is why the fix is sometimes a different download and sometimes an extra argument on the command line.
A 64-bit package on 32-bit Windows
You have this one if OSArchitecture reports 32-bit, and the package or its download page describes itself as x64 or 64-bit.
- Download the 32-bit build of the same product.
- Where the vendor no longer ships one, the application cannot run on this installation and the honest answer is a rebuild onto 64-bit Windows.
- Before planning that, confirm the hardware supports it and that the machine’s other software has 64-bit builds available.
The wrong architecture chosen for a runtime or driver
You have this one if The package installs on some machines and not others, and the product ships separate x86 and x64 packages that look almost identical.
- Match the runtime to the application, not to Windows: a 32-bit application needs the 32-bit runtime even on 64-bit Windows.
- Where an application’s requirements are unclear, inspect its binaries to see which architecture they import.
- For deployment, detect the architecture at run time and select the package rather than hard-coding one.
- Install both architectures of shared runtimes where the estate mixes 32-bit and 64-bit applications.
An Arm device and a package built for something else
You have this one if The machine is an Arm-based Windows device and the package refuses even though the same file works on Intel hardware.
- Look for an Arm64 build on the vendor’s download page first; a native build will always outperform anything emulated.
- Where there is no Arm64 build, try the vendor’s 32-bit build, which is generally the most widely compatible option on these devices.
- Check the vendor’s own statement about Arm support before assuming a workaround exists.
- Confirm afterwards that the application actually runs, not merely that setup finished.
The package is not signed in a way the device will accept
You have this one if 1654 rather than 1633, on an Arm device or a machine in a locked-down configuration.
- Read Microsoft’s wording for 1654: the app you are trying to run is not supported on this version of Windows, and a Windows Installer package, patch or transform that has not been signed by Microsoft cannot be installed on an Arm computer.
- Check the Application log for the matching event, which records that a file is not Microsoft signed and is being rejected under the Windows Lockdown Policy.
- Obtain the vendor’s signed build, or install through the route the device’s configuration permits.
- Do not attempt to disable the signing requirement to get one package on; that is the configuration doing what it was chosen to do.
The package language does not match the system
You have this one if 1623 rather than 1633, often on a machine set up in one language with software downloaded for another.
- Download the package for your system language.
- Where the vendor supplies a multilingual package, apply the appropriate language transform through the TRANSFORMS property.
- Where a product genuinely supports one language only, install it and change the application’s own language setting afterwards rather than forcing the package.
- Read the log to confirm it really was the language check that stopped the install.
Full reference
The six codes, as Microsoft states them
| Code | Constant | Message |
|---|---|---|
| 1633 | ERROR_INSTALL_PLATFORM_UNSUPPORTED | This installation package isn’t supported on this platform. Contact your application vendor |
0x80070661 |
HRESULT form of 1633 | Facility 0x8007 with 0x661, which is 1633 |
| 1623 | ERROR_INSTALL_LANGUAGE_UNSUPPORTED | This language of this installation package isn’t supported by your system |
0x8007000B |
ERROR_BAD_FORMAT (11) | An attempt was made to load a program with an incorrect format |
| 1654 | ERROR_INSTALL_REJECTED | The app that you’re trying to run isn’t supported on this version of Windows. A Windows Installer package, patch, or transform that has not been signed by Microsoft can’t be installed on an ARM computer |
0x800700C1 |
ERROR_BAD_EXE_FORMAT (193) | %1 is not a valid Win32 application |
1654 is the one people misread, because the first sentence sounds like a Windows version problem and the second sentence is the actual rule. It is about signing on Arm hardware, not about which build of Windows you are on. Microsoft’s Windows Installer event list carries the matching event, recording that a file is not Microsoft signed and is being rejected under the Windows Lockdown Policy – which is the same statement written into the Application log.
Working out what the machine is
| Question | How to answer it |
|---|---|
| Which Windows architecture? | (Get-CimInstance Win32_OperatingSystem).OSArchitecture |
| Which processor architecture? | $env:PROCESSOR_ARCHITECTURE, read in a native shell rather than a 32-bit one |
| Which architecture is this application? | Inspect its binaries, or check the folder it installs into on a machine where it works |
| Is this file what it claims to be? | Get-FileHash against the vendor’s published value, and the Digital Signatures tab of its properties |
Bad format is not the same as wrong platform
0x8007000B and 0x800700C1 look like architecture errors and are not. ERROR_BAD_FORMAT is an attempt to load a program with an incorrect format, and ERROR_BAD_EXE_FORMAT says the file is not a valid Win32 application. Both are what you get from a truncated download, a file renamed from one type to another, or an executable extracted incorrectly from an archive. Check the hash and the signature before you go looking for a different architecture, because a different architecture of the same broken file will fail the same way.
Deploying across a mixed estate
- Detect the architecture at run time and select the package. Hard-coding one is the single most common cause of this error in managed environments.
- Where a shared runtime is needed by applications of both architectures, install both. They are separate products and coexist.
- Keep the Arm64 build in the catalogue where the vendor publishes one; falling back to an emulated build should be a decision, not an accident.
- Where a vendor ships one package per language, treat language as a deployment variable in the same way as architecture, and test at least one machine per language.
- Test the deployment on one machine of each architecture and each language you actually run before rolling it out.
When you genuinely cannot get a matching build
- Ask the vendor directly whether a build for your architecture exists but is not published on the general download page. Many keep them.
- Where the application is 32-bit only and the machine is 64-bit, that is not a problem – install it and move on.
- Where the application is 64-bit only and the machine is 32-bit, the machine is the constraint. Plan a rebuild rather than looking for a workaround; there is no supported way to run 64-bit code on a 32-bit installation.
- On Arm hardware with no Arm64 build, try the vendor’s 32-bit build, then confirm the application actually runs rather than merely installing.
- If the refusal is 1654, stop looking for a different architecture. The package needs to be signed appropriately for that device, and that is the vendor’s job.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
1633 |
ERROR_INSTALL_PLATFORM_UNSUPPORTED: this installation package is not supported on this platform | Microsoft Learn |
0x80070661 |
The same platform refusal in HRESULT form: facility 0x8007 with 0x661, which is 1633 | Microsoft Learn |
1623 |
ERROR_INSTALL_LANGUAGE_UNSUPPORTED: this language of the installation package is not supported by your system | Microsoft Learn |
0x8007000B |
ERROR_BAD_FORMAT: an attempt was made to load a program with an incorrect format – usually a damaged or misnamed file rather than a wrong architecture | Microsoft Learn |
1654 |
ERROR_INSTALL_REJECTED: the app is not supported on this version of Windows, and a package, patch or transform not signed by Microsoft cannot be installed on an Arm computer | Microsoft Learn |
0x800700C1 |
ERROR_BAD_EXE_FORMAT: the file is not a valid Win32 application | Microsoft Learn |
Confirm the fix worked
- The install completes and the product appears in Settings, Apps, Installed apps.
- The application launches, not merely that setup finished.
- For runtimes, both architectures are present where the estate runs both 32-bit and 64-bit applications.
- The file hash matches the vendor’s published value, so you know you are testing the right file.
- The deployment succeeds on one machine of each architecture and language you run, before it goes any wider.
Questions people ask about this
Does this cost anything to fix?
No. You are downloading a different variant of software you already have rights to, and vendors publish architecture and language variants under the same licence.
How do I tell which architecture a package is?
The vendor’s download page normally says. Failing that, open the package in an MSI editing tool and read the platform value in its summary information, or look at which Program Files folder it installs into on a machine where it works.
Can I force a 64-bit package onto 32-bit Windows?
No, and there is no supported trick that changes it. The code inside cannot execute on that installation. Install the 32-bit build or move the machine to 64-bit Windows.
Why does 1654 mention my Windows version rather than the processor?
Because the first half of Microsoft’s message is generic and the second half is the rule that matters: a Windows Installer package, patch or transform that has not been signed by Microsoft cannot be installed on an Arm computer. It is a signing requirement, not an architecture mismatch, and the Application log records the same decision under the Windows Lockdown Policy.
The error is 0x800700C1, not 1633. Same problem?
No. That is ERROR_BAD_EXE_FORMAT – the file is not a valid Win32 application. Check the hash and the signature: it is usually a truncated download or a file renamed from one type to another, and downloading a different architecture of the same broken file will not help.
