Installing Windows 10/11 from ISO on Windows on Arm (WOA) Surface Pro X

Jul 4, 2024

…or, how to spend a holiday in a miserable way.

Background (you can skip this if you know what you are doing)

I hate the bloatware that comes with Windows. It’s not that much, but even Microsoft’s OEM images have some kind of bloat that I want to get rid of. And because the Surface Pro X is a Windows on Arm device, Microsoft does not provide a method (officially) to install Windows on Surface Pro X using a Windows Installation Media, only a Surface recovery image that you need to put in your serial number for, and includes bloatware.

My motivation initially was to install Windows 10 on the Wi-Fi only Surface Pro X (Model 2010), which officially only supports Windows 11. There are two ways you can do this:

  • Borrow a Surface Pro X 4G LTE (SQ1 or SQ2) serial number from someone and use that to get the Windows 10 recovery media, then figure out Wi-Fi does not work, and install the Drivers manually from here. But you’ll still get the bloatware.
  • Install Windows 10/11 fresh from an official ISO media (obviously, for Arm64). This will be my journey.

What needs to be done

Don’t even try to do this on Linux. You can do this on Windows on any arch, e.g., x64 will work.

Obtain a Arm64 Windows Installation Media

From a legal, official source. Then use Rufus to burn it to a USB drive. I may or may not know that LTSC versions will work, all I can say is that I strongly encourage trying.

Obtaining the drivers

This needs to be done because Arm devices are that special, Windows does not include even the most basic drivers for the the pre-installation environment to boot. If you try to burn a Windows on Arm iso directly onto a flash drive then boot it, USB ports won’t work, the screen will not respond, and there is no way to provide input to the system. You cannot load drivers at runtime because of this, they must be slipstreamed.

Download the folder with the latest drivers for your Surface device from WOA-Project/Qualcomm-Reference-Drivers which others have helpfully scraped from Windows Update.

Extract all the .cab files in the folder. (ChatGPT will help you write a decent batch script if you ask nicely.) For my purpose I will put them in C:\Users\hplin\Downloads\WOA-Drivers-Extracted

Slipstream the drivers into the .wim media

Create C:\mount.

Do the following steps in any order, for both index 1 and index 2 of boot.wim and install.wim:

dism /mount-wim /wimfile:D:\sources\boot.wim /index:1 /mountdir:C:\mount
dism /image:C:\mount /add-driver /driver:C:\Users\hplin\Downloads\WOA-Drivers-Extracted /recurse
dism /unmount-wim /mountdir:C:\mount /commit

Copy the drivers into a folder on your flash drive. You will need it in a future step.

Install Windows

If you used Rufus you may have to turn off Secure Boot. Volume Up + Power, UEFI Options, Turn off Secure Boot, Boot from USB.

Fixing inaccessible boot device

After first reboot the system will not boot because the drivers are not installed. Boot to USB again, choose recovery options, command prompt.

Use diskpart to assign a drive letter to your new system drive, i.e., D:. Assuming your flash drive is mounted on C::

dism /image:D: /add-driver /driver:C:\WOA-Drivers-Extracted /recurse

Reboot.

Success (hopefully!)

Hopefully you now have a clean WoA device which does not have the bloatware. The OEM keys in the system should automatically activate your newly installed copy of Windows, if you installed the edition you are properly licensed for.

With the prevalence of the new Snapdragon X Elite-based Windows on Arm Surface Pro / Laptop devices, hopefully more people will have the need to install a clean copy of Windows on their machines and realize that Windows on Arm is built different. But we’ve come a long way since Surface RT (I remember the days when it was exciting to jailbreak it to run other Arm32 programs, and there was a debug secure boot policy to install some neat tools on the device!)