Frequently asked questions about Windows on Arm

Use the following questions and answers to better understand the support for Arm-based devices running on Windows.

Windows on Arm FAQs

Do I need to create an Arm version of my Windows app?

Arm-based devices are becoming increasingly popular. While Windows supports emulation for apps with an x64 or x86-based architecture, providing an Arm-native build of your Windows app will improve performance and give your customers the best experience when using an Arm-based device.

Why update my app to Arm when x64 and x86 are both supported via emulation on Windows 11?

While your customers will be able to use your x64 or x86-based app on their Arm device, there is performance overhead that comes with emulation. Treat your customers to an Arm-native version of your Windows apps for the best performance, responsiveness, and optimized battery life on their Arm device.

How do I add an Arm64 native configuration to my Windows app?

Are drivers supported by emulation? Or do I have to add Arm64 native support to any drivers used in my app?

In all cases, kernel-mode drivers and user-mode print drivers MUST be built as native Arm64 binaries to work on Arm64 devices. Additionally, you cannot execute an x86 or x64 setup program to install an Arm64 driver on Arm64 devices. See Building Arm64 Drivers with the WDK.

Does Visual Studio work on Arm?

Both Visual Studio and Visual Studio Code offer Arm-native versions for you to install.

How do I test and debug on Arm64?

See Add Arm support to your Windows app - Test and Debug. For testing, you will need a Windows on Arm device, such as the Windows Dev Kit 2023, or you can run a Windows 11 Arm64 virtual machine.

What if I am blocked from building an Arm-native version of my app by a 3rd party dependency?

There are a few ways to address the scenario when your Windows app relies on a 3rd-party dependency that has not (yet) been updated for Arm. We first recommend reaching out to the owner of the dependency to ask whether there are plans to update the dependency to support Arm. You might also check resources like NuGet or vcpkg, or reach out to the Arm Open Source community for help updating dependencies (such as Linaro). You could rewrite the dependency yourself - Microsoft's "App Assure program" may be able to help. Or you may want to write your app using Arm64EC, which enables you to mix x64 and Arm64 code for a partial Arm-native implementation focused on optimizing the most important aspects of your app for Arm.

How do I update my C++ Windows app to support Arm devices?

What Program Files folder should I use to install my ARM64 application?

You may notice the following directories on your Windows device, used for installing and storing different application file types.

Windows on Arm Virtual Machine FAQ

How do I create a Windows 11 Arm64 Virtual Machine (VM)?

For help on how to create and deploy Windows 11 Arm64 VMs with with Ampere Altra Arm–based processors on Azure, see Quickstart: Create a Windows on Arm virtual machine in the Azure portal.

Can I host a Windows 11 virtual machine using Hyper-V on a Windows 11 Arm64 device?

While Hyper-V is a supported component on Windows 11 Arm64 devices, Hyper-V is not a supported Windows 11 virtual machine host since there is no TPM support. Setup will block if you try installing Windows 11 from an ISO. Windows Hyper-V Manager will display an "Operation failed" error message if you try to enable TPM on a virtual machine. There is work in-progress to add virtual TPM support in a future Windows on Arm VM.

Are there any trainings available for adding Arm support to a Windows app and running a VM for testing and debugging?

Is CPU Sampling with the Windows Performance Recorder tool supported on ARM-based Hyper-V virtual machines?

Yes, but the feature is currently only available in the Windows Insider Preview Canary channel. If you are willing to enroll your physical ARM device that is hosting your virtual machines in the Canary channel, CPU sampling will be supported in virtual machines; the feature is already supported on physical ARM devices. Sample usage: wpr -start cpu.