Software Is Hardwork

ISimplicityAffinative: The endless pursuit of anti-complexity.
The technology-centric blog of D. P. Bullington.

Email D. P. Bullington View D. P. Bullington\ Get Software Is Hardwork code on CodePlex

Blog Post(s)

WoW64 Registry Intricacies
Monday, March 30, 2009

I have been working on x64 hardware for quite some time, except I was running a 32-bit OS because I did not want to deal with compatibility issues. Now that x64 has come into mainstream adoption, I am exposed to more instances of x64 editions of Windows on real and fake hardware. But 32-bit applications are still around and will be for the foreseeable future. One of the things I have encountered when working with x64 systems is accurately reading the registry, due to the need for 32-bit compatibility mode (a.k.a. WoW64).

A 32-bit application is provided a special view on the registry for compatibility reasons. The following table illustrates the logical 32-bit mapping to the physical 64-bit registry nodes.

32-bit logical registry node 64-but physical registry node
HKEY_CLASSES_ROOT HKEY_CLASSES_ROOT\Wow6432Node
HKEY_CURRENT_USER\Software\Classes HKEY_CURRENT_USER\Software\Classes\Wow6432Node
HKEY_LOCAL_MACHINE\SOFTWARE HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node

When enumerating the registry from a 64-bit application and you care if a 32-bit application has similar values of interested, you must query both the 64-bit and 32-bit registry locations. An example of this is the script I wrote to write out all the applications installed on a machine:

#    (c) 2008-2009 D. P. Bullington <dpbullington@hotmail.com>
#    appwiz.ps1: gets a list of installed application from the registry similar to appwiz.cpl.
#    USAGE: powershell -command ".\appwiz.ps1"
#    Supports x86 and Wow64 and user private installs.

$paths =
    "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
    "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
    "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall",
    "HKCU:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"

$ht = @()

foreach ($path in $paths)
{    
    if(!(test-path -path $path -PathType Container)) { continue }    
    
    $reg = Get-ItemProperty ($path + "\*")
        
    foreach ($subreg in $reg)
    {    
        $dispname = $subreg.DisplayName
        $dispver = $subreg.DisplayVersion
        $value = ""
        
        if ($dispname -eq $null)
            {$value = "[" + $subreg.PSChildName + "]"}
        else
            {$value = $dispname + "  (" + $dispver  + ")"}
            
        $ht += @($value)
    } 
}

[System.Array]::Sort($ht)

$vz = ""
foreach ($v in $ht)
    {$vz = $vz + $v + "`r`n"}

[System.IO.File]::WriteAllText([System.Environment]::machineName + ".appwiz.output.txt", $vz)


As you can see, I must query both 32-bit and 64-bit application specific registry nodes in order to compile the correct list of installed applications. Note, that I do query for a 32-bit current user although this is not currently segregated like the 32-bit local machine node.

All the magic of WoW64 takes place via a registry redirector that "isolates 32-bit and 64-bit applications by providing separate logical views of key portions of the registry on WOW64. The registry redirector intercepts 32-bit registry calls to each logical registry view and maps them to the corresponding physical registry location. The redirection process is transparent to the application." [MSDN]

Moral of the story: we aware of subtleties on x64 when using 32-bit applications.

0 comments:

Speaking Enagements

  • 11/18/2010 | Charlottesville .NET Users Group | Charlottesville, VA | Topic TBD
  • 09/14/2010 | Hampton Roads .NET Users Group | Cheaspeake, VA | Topic TBD
  • 07/01/2010 | Richmond .NET Users Group | Richmond, VA | Topic TBD
  • (past) 12/08/2009 | Hampton Roads .NET Users Group | Cheaspeake, VA | SharePoint Antithesis - A Case Study in Pragmatic Software Architecture and Engineering Processes
  • (past) 10/04/2009 | Richmond Code Camp 2009.2 | Richmond, VA | Soothing the Pain Points: Data Access, Validation, Rules, UI, Presentation, et. al
  • (past) 07/23/2009 | Charlottesville .NET Users Group | Charlottesville, VA | Debugging on the Windows Platform
  • (past) 05/23/2008 | NoVa CodeCamp 2009.01 | Reston, VA | Going Proxy-less - The WCF Proxy Factory
  • (past) 04/25/2009 | Richmond Code Camp 2009.1 | Richmond, VA | Software Programmer to Software Engineer: Concepts to Span the Divide
  • (past) 02/05/2009 | Richmond .NET Users Group | Richmond, VA | Debugging on the Windows Platform
  • (past) 10/04/2008 | Richmond Code Camp 2008.2 | Richmond, VA | Going Proxy-less - The WCF Proxy Factory

Blog Archive

Post Labels

.NET (64) .NETv4.0 (3) ACID (1) ActiveDirectory (1) ADF (2) Affiliate (1) Agile (6) AJAX (1) Allocator (3) Analysis (1) AOP (4) ASP.NET (6) ASP.NET MVC (1) Assembly (2) BadIdeaPile (1) BagOfBolts (5) Blogger (1) Books (2) BuildMgmt (8) C# (46) ChoDNUG (1) CLR (1) CLRv4.0 (2) CMP (1) CMS (2) CodeCamp (2) COM (1) Conversation (1) Coverage (1) CUI (1) Database (2) DDD (1) DeadFxs (1) Debugging (9) Design (4) DevAuto (3) DevCfg (1) Development (118) DI (6) DiffMerge (1) Domain (1) DTfW (2) EclipseIDE (1) ECM (1) EntityFramework (1) Estimating (1) FileShare (1) Frameworks (7) GAC (2) Google (1) Hardware (2) HRNUG (1) Humor (6) IIS (4) ILDASM (1) Impersonation (2) InstallError (1) IoC (6) KingTodd (1) LinkedIn (1) LINQtoSQL (2) MarketingHype (1) MBUnit (1) Mentoring (22) Metadata (1) Microsoft (7) MOSS2007 (5) MSBuild (2) MSIL (4) MSSCCI (2) NAnt (2) NCore (2) NCover (1) NDatabase (4) NetUse (1) NHibernate (2) NoVaCodeCamp (2) NTSD/CDB (2) NUnit (1) Observation (2) Office (2) OOD (7) OOP (6) OpenSource (14) Opinion (19) Personal (3) PMP (1) Polymorphism (1) PowerPoint (1) PowerShell (2) Presentation (3) Process (4) ProjectManagement (2) PublicKeyToken (1) QA (2) RDNUG (1) Reflection (2) Registry (2) Resharper (1) Reversing (2) RichmondCodeCamp (5) SCM (11) Scrum (5) Security (2) Series (3) Server2008 (4) ServicePack (1) SES (7) SharePoint (7) Silverlight (1) SoC (3) Software (49) SoftwareIsHardwork (17) Speaking (7) SQL (2) SSO (2) StrongName (2) Suite2008 (9) Suite2010 (1) SwEng (19) TechBlunder (1) Testing (14) Thread (3) Tools (8) Troubleshooting (10) Twitter (3) Types (2) UAC (1) UIP (1) Vault (2) VB6 (1) VC (1) Vista (3) VisualStudio (15) VSIP (2) VSTS (1) WCF (4) Web (4) WebForms (1) Win32 (3) WinDBG (3) WindowsIdentity (3) WinForms (1) WIT (1) Workhorse (1) WoW64 (1) WPF (1) WSS3 (2) x64 (2) x86 (2) xUnit (1)

Disclaimer

© D. P. Bullington, all rights reserved. Everything posted on this blog is my personal opinion and does not represent the views of my employer nor serves to infringe on the sovereignty of any nation.