Alternate Guide – Running Windows 10 on the Pi 4

The following is an alternate tutorial for installing and running Windows 10 on the Raspberry Pi 4. This version concentrates on running Windows from a single USB drive plugged on one of the rear USB 3.0 ports, which is both much faster than other methods and does not require the use of a micro SD card at all.

Disclaimer

This guide is provided “AS IS”, with NO WARRANTY that it will work for your specific environment or even that you may not end up losing important data as a result. Therefore, by using this guide, you accept that the responsibility for any software or hardware damage is entirely with YOU.

Also, though perfectly legal (since nothing in the licensing terms for Microsoft Windows prevents you from installing it on a Pi and you can download the Windows 10 ARM64 installation files straight from Microsoft), this method of installing or running of Windows on a Raspberry Pi, is NOT endorsed by Microsoft or the Raspberry Pi Foundation. If you choose to follow this guide, you accept that Microsoft and the Raspberry Pi Foundation do not bear any liability with regards to the behaviour of Windows on the targeted platform.

By following any of the steps below, you implicitly acknowledge that you have read these conditions and have agreed to them.

Hardware Requirements

  • A Raspberry Pi 4 where the EEPROM is up to date enough to allow straight to USB boot. If you purchased a Pi 4 recently, this should already be the case, but if not (i.e. if you find that your machine cannot boot from USB) then you should download a recent version of a rpi-boot-eeprom-recovery archive from here, put all the files on a MBR-partitioned, FAT32-formatted SD card, and apply the update.
  • A fast USB 3.0 drive, with a capacity of at least 32 GB, such as a fast flash drive (please use a drive that has a write speed greater than 50 MB/s, and that also have a sufficient random I/O speed, as your experience will be greatly diminished otherwise), a USB 3.0 SSD enclosure, etc.
  • Screen, keyboard, mouse & a powerful enough PSU.

As mentioned above, you will notice that no microSD card is used when following this guide (provided that your EEPROM is recent enough).

Software Requirements

  • A Windows host machine to create the drive, since this guide uses Windows-only utilities.
  • A recent image of Windows 10 for ARM64. At this stage, we recommend using the Windows 10 2004 final release. But if you are feeling adventurous, you may experiment with more recent Insider releases…
    Because Microsoft does not yet publish retail ARM64 ISOs, like they do for x86 or x64, you may have to use a third party utility, such as the one from https://uup.rg-adguard.net/, that allows you to create your own ARM64 ISO with their OneClick! ISO compiler script. If you do use uup, make sure that you select [arm64] for the Windows version.
  • WoR (Windows on Raspberry) version 2.0.0 or later, which can be downloaded from https://www.worproject.ml/downloads.
  • The latest version of winpatch, which can be downloaded from https://github.com/pbatard/winpatch/releases.

Installation

  • Plug in your target USB 3.0 drive. It is recommended that you unplug any other USB media, such as flash drives or USB HDDs, so that you don’t end up erasing them by mistake
  • Run WoR.exe and select your language. Note that the language you select for WoR has no effect on the language Windows will be installed into, which is dependent on your source image.
  • Select your device in the dropdown (again, make sure you do select the right device as internal drives may be listed!) and select Raspberry Pi 4 [ARM64] for the other option.
  • On the Select your Windows on ARM image, pick the .iso/.wim/.esd/.ffu for the Windows 10 image you want to install, which you obtained in the Software Requirements. If needed wait for the image to be mounted and then select the edition you would like to install.
  • On the Select the drivers screen, choose the option that is suitable for you (most likely Use the latest package available on the server if you haven’t already downloaded the drivers).
  • On the Select the UEFI firmware, choose Use the latest firmware available on the server, as you will need the most up to date official UEFI firmware for USB boot.
  • On the Configuration screen, select Advanced (accept the warning) and change Memory Limit to 8192 MB. Don’t worry if you have less than 8 GB of RAM, as the other limits, such as the ones from the hardware or from the UEFI firmware will still apply. If you don’t change the limit here, you will be limited to 1 GB of RAM and have to manually remove that limit through bcdedit.
  • Click Next (Don’t change the General configuration options unless you know what you are doing), then double check that the Target device being listed is really the drive you want to use on your Raspberry Pi, and press Install.
  • Wait for the installation to finish. Note that if that process takes more than 25 minutes to complete, it means that the drive you are trying to use is slow and will probably result in a poor Windows experience. In other words, the longer you spend creating the drive, the more likely it is that Windows will perform poorly.
  • Close WoR by clicking Finish, but do not remove the drive yet. Instead use your file explorer to find the letter of the drive labelled “Windows” (e.g. F:) and open an elevated command prompt. Then navigate to the directory where you extracted winpatch.exe and enter the exact command below, after making sure that you alter the #:\Windows\… path to use your drive letter (e.g. F:\Windows\…):
    winpatch #:\Windows\System32\drivers\USBXHCI.SYS EA000037E8630091 EA000036E8630091 0A010037E8430091 0A010036E8430091 If the command completes successfully, you should see the output:
    Successfully patched 2 sections in '#:\Windows\System32\drivers\USBXHCI.SYS'
  • Remove the USB and plug it to one of the USB 3.0 ports of your Raspberry Pi 4 (make sure that it is one of the blue USB 3.0 ones). Windows should boot, go through the finalization stage of the installation process (it should reboot once), and let you log on.

Final Notes

Make sure to carefully read the Initial Notice from the Raspberry Pi UEFI firmware, before you start to ask questions about why you can’t use the network or why you only get 3 GB of RAM available, even if you have a 4 GB or a 8 GB model.

We also don’t have any idea about when, or even if, you will ever get feature X or Y, such as a Windows network driver or support for more than 3 GB of RAM, so please don’t bother asking about this either.

Finally, this Windows 10 installation is NOT endorsed by Microsoft or the Raspberry Pi Foundation. So please do not contact them for support when it comes to running Windows 10 on the Raspberry Pi 4.

v1.17 release for Pi 4

At last, the long awaited version 1.17 of the Raspberry Pi UEFI firmware has been released!

https://github.com/pftf/RPi4/releases/tag/v1.17

This release brings the following two major features:

  • Direct USB boot. This means that you can now boot this firmware straight from USB, without the need for an SD card. [tianocore/edk2-platforms@2254262]
  • ESP support. This means that you can now place your Pi 4 boot files into a EFI System Partition, and have the UEFI firmware launch as expected, regardless of whether you are using an MBR or GPT ESP, or even of the ESP resides on a USB or SD. Of course, this feature doesn’t really come from the UEFI firmware itself, that has always supported it, but from the firmware archive containing an updated start4.elf from the Raspberry Pi Foundation, where ESP boot support has finally been added.

Note that booting from USB or from ESP does require a recent-enough version of the Pi EEPROM.

If you have acquired your Raspberry Pi model recently, this shouldn’t be a problem, but if you find that booting from USB or from ESP doesn’t work, please visit https://github.com/raspberrypi/rpi-eeprom/releases to update your EEPROM.

Additionally, this firmware improves the Genet UEFI driver for heavy loads. [tianocore/edk2-platforms@2242b99]

As always, please read the release notes and usual caveats.

v1.16 release for Pi 4

A bit of polish and correctness, making for a less frustrating experience overall and keeping up with TianoCore development.

https://github.com/pftf/RPi4/releases/tag/v1.16

What’s inside this release?

As always, read the release notes and usual caveats.

v1.15 release for Pi 4

https://github.com/pftf/RPi4/releases/tag/v1.15

What’s inside this release?

This is a minor release, but the asset tag functionality is pretty cool. This let’s you set a custom string to be reported via SMBIOS to the booted OS, which you could use for inventory or provisioning requirements.

The tag can also be set programmatically or via the UEFI Shell command line.

Shell> setvar AssetTag -guid CD7CC258-31DB-22E6-9F22-63B0B8EED6B5 -bs
-rt -nv =L"ABC123" =0x0000

The matching Pi 3 release is v1.27.

As always, read the release notes and usual caveats.

v1.14 RELEASE FOR Pi 4

Now with 8GiB (yay!) support!

https://github.com/pftf/RPi4/releases/tag/v1.14

What’s inside this release?

The 8GiB variant changes the board layout a bit, dropping the SPI EEPROM containing the xHCI (USB3 controller) microcode, which required the relevant code to be added to UEFI to load it during boot. The good news is that the same approach is harmless on the other (1GiB, 2GiB and 4GiB Pies).

Like the 4GiB variant, UEFI will default to booting with only 3GiB to deal with OSes that can’t process the ACPI-reported DMA limits.

Of course, without the 3GiB limit, you get the full 8GiB (minus the gpu_mem amount anyway).

Booting to UEFI Shell should be a bit less awkward now, now that it is permanent to the Boot Manager menu.

The matching Pi 3 release is v1.26.

As always, read the release notes and usual caveats.

v1.13 RELEASE FOR Pi 4

Cleanup and bug fixes.

With this release, GENET networking support in UEFI is usable! You can perform PXE and HTTP boot, and use the TFTP command in the Shell.

https://github.com/pftf/RPi4/releases/tag/v1.13

What’s inside this release?

As always, read the release notes and usual caveats.

v1.12 release for Pi 4

Cleanup and bug fixes.

https://github.com/pftf/RPi4/releases/tag/v1.12

What’s inside this release?

Matching Pi 3 release is v1.25, which disables the scaled resolution by default, and improves Device Tree vs ACPI selection menu.

As always, read the release notes and usual caveats.

v1.11 release for Pi 4

Cleanup and bug fixes.

https://github.com/pftf/RPi4/releases/tag/v1.11

What’s inside this release?

Matching Pi 3 release is v1.24, which primarily fixes UART and USB regressions seen with newer VideoCore firmware.

As always, read the release notes and usual caveats.

Windows 10 drivers?

A recurring topic is Windows drivers for the Raspberry Pi 3 and 4 series.

MCCI DesignWare USB2 driver

This is for the front USB ports on Pi 3 and only the Type-C port on the Pi 4.

MCCI Corporation has made their TrueTask USB host stack available to the Raspberry Pi WoA community for non-commercial, evaluation purposes. MCCI did the original work for the 32-bit Windows IoT Core. It is available courtesy of Terrill Moore, CEO of MCCI, who graciously spent time in early 2019 to get it building and validated with the 64-bit Pi 3 UEFI.

If you like the drivers, I hope you’ll support The Things Network New York. MCCI does some pretty amazing things with LoRaWAN.

Driver is here. Launch announcement is here.

Note that the driver will not correctly work on Pi 4 boards with more than 1GB of RAM, unless you limit the RAM seen by Windows. See this guide.

OSS DesignWare USB2 driver

Before the MCCI driver was released, this was the only option. Originally based on an earlier version the UEFI USB driver and the UCX framework, it’s not particularly stable or recommended. It was originally developed by @NTAuthority, who was the first person ever to show Windows running on Pi 3 (rumor goes, with an early variant of the Pi 3 UEFI ;-)). And he thankfully left enough crumbs for the rest of us to pick up and carry the torch.

Driver repo is here.

Other BSP drivers

These were originally put up by Microsoft as part of the 32-bit Windows IoT Core BSP for the Pi 2/3. After a bit of cleaning, they build and run fine on 64-bit Windows.

Driver repo is here.

v1.23 release for Pi 3 is a bit special

https://github.com/pftf/RPi3/releases/tag/v1.23 brings in support for something I’ve wanted to add for years now – official support for other platforms built around the same BCM2836 SoC.

So, the Pi 3A+ is finally documented as being supported. It involved no code changes and is the cheapest Pi you can run the 64-bit UEFI firmware on.

Just like the Pi 3B+, but with less RAM and no USB hub or network port.

But there’s more – the work to automatically support booting via PL011 and miniUART serial ports, done by Pete Batard on the UEFI side and
Andre Przywara for TF-A, finally means we can boot on boards where PL011 is used to expose the serial port. The Pi 2B (v1.2) is one such board – the slowest member of the 64-bit UEFI for Pi family. It’s basically a Pi 3 without WiFi, BT and worse heat dissipation, so it is clocked down.

Did you know the v1.2 variant of the Pi 2B is actually 64-bit? Now you do.

And after fixing a small eMMC support regression, we even support the compute module variant of the Pi 3. To be fair, I didn’t test the CM3L (the one without eMMC), but it should be working. Let me know if it doesn’t. Also, CM3+ (which just has better heat dissipation) should work but is not validated.

A small Pi in a very big carrier – https://www.waveshare.com/compute-module-io-board-plus.htm

And in case you’re a fan of the amazing cluster carrier board from our friends over at miniNodes

It works!

Enjoy!

As always, read the release notes and usual caveats. The notes have gotten a bit of a rinse, so have a look to clear out any old assumptions.