Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve compatibility of NVDA for Windows 10 on ARM64. #7508

merged 2 commits into from Sep 5, 2017


Copy link

@michaelDCurran michaelDCurran commented Aug 21, 2017

Summary of the issue:

Windows 10 (Desktop) will be available for running on ARM64 devices in the near future. This version of Windows (code named Cobalt) Will be able to run any existing x86 application through an x86 emulation layer similar to WOW64 on x86-64 builds of Windows.
More info:
However there are the following limitations:


NVDA cannot inject into any ARM64 or ARM32 process (as we do not have any dlls compiled for these architectures, nor is it currently possible to do so with VS / windows SDK).
The largest limitation here is that speaking of typed characters does not work in ARM processes, but does for other x86 ones.
We definitely use injection for other things as well, but these are not as important anymore for core Windows Operating System reatures. Note that all 3rd party desktop applictions on ARM devices must be x86. Therefore, as an example, NVDA will still work fine with Mozilla Firefox, or in deed even Microsoft Office.

64-bit identification

NVDA does not currently treat ARM64 as a 64-bit architecture.
This means that where we have 64-bit specific code, such as for SysListivew32, it is not used and therefore these controls remain inaccessible. Examples being the list in Registry Editor, and the list in the Details tab of Task Manager.

Description of how this pull request fixes the issue:

  • In windows 10 RS2 and above it is possible to support speaking of typed characters with out injection via ToUnicodeEx. We already do this for Microsoft Edge and other UWP apps. Therefore this PR extends that support to any application where we cannot inject (I.e. we do not have a binding handle to our in-proc RPC interfaces). However, the one exclusion Windows consoles where they already have their own typed character support separate to this.
  • appModuleHandler.AppModule.is64BitProcess now treats ARM64 as 64-bit as it does for AMD64. This allows our 64 bit support for SysListview32 controls to work and therefore regedit and task manager are again accessible.

Testing performed:

Known issues with pull request:

  • This does not solve other reasons why we need to inject, such as display model or virtualBuffers etc. However, this is not relevant until 3rd party apps start becoming compiled for ARM64. Note that though when they do start becoming compiled, at that stage we should also be able to compile are own DLLs for ARM64 and therefore be able to inject again.
  • responsiveness is noticeably worse for NVDA interacting with other x86 applications on ARM64 due to double emulation. One day in the future we may consider compiling all of NVDA for ARM64 and remove one layer of emulation, however all x86 applications running on an ARM device will always have some kind of performance loss.

Change log entry:

New features:

  • Initial support for Windows 10 on ARM64.
…A to inject in-process, therefore if we have not injected, support speak typed characters the same way we currently do for UWB apps (I.e. with ToUnicodeEx). Of course this is only possible on Windows 10 Creators update and above as ToUnicodeEx had a bug before that.
…lows NVDA's 64 bit specific code for SysListview32 etc to function on ARM64 when being emulated as x86.
@michaelDCurran michaelDCurran requested a review from feerrenrut Aug 21, 2017
@michaelDCurran michaelDCurran changed the title Improve compatibility of NVDA on ARM devices (I.e. Windows Cobalt) Improve compatibility of NVDA on ARM64 devices (I.e. Windows Cobalt) Aug 21, 2017
Copy link

@josephsl josephsl commented Aug 21, 2017

michaelDCurran added a commit that referenced this pull request Aug 21, 2017
@michaelDCurran michaelDCurran changed the title Improve compatibility of NVDA on ARM64 devices (I.e. Windows Cobalt) Improve compatibility of NVDA for Windows 10 on ARM64. Aug 22, 2017
@michaelDCurran michaelDCurran merged commit f0f4761 into master Sep 5, 2017
1 check passed
1 check passed
continuous-integration/appveyor/branch AppVeyor build succeeded
@nvaccessAuto nvaccessAuto added this to the 2017.4 milestone Sep 5, 2017
@josephsl josephsl mentioned this pull request Oct 15, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
None yet
None yet
Linked issues

Successfully merging this pull request may close these issues.

None yet

4 participants