Determining which version of Windows Embedded your device is running

So, you’ve got a device that’s running Windows Embedded, but you can’t remember exactly which version of XPe or WES the image was built with. Is there some way to check what version of Windows Embedded the device is running? There sure is!

The version information for Windows Embedded is located in the following three registry entries:

Now you’re probably saying to yourself, “Robert, this is great! Now I can figure out which version of Windows Embedded is installed on my device! Now I’ll just go on the device, hit Start->Run, type in “regedit”, and navigate to these entries….. Ugh! Robert, I didn’t include the Registry Editor component in my image! What do I do now?”

If you didn’t include the Registry Editor in your device’s image, you’ve got two options: connect to your device using your developer machine and the Remote Registry Service, or connect your device’s storage media to your developer machine and manually load the SYSTEM hive.

Remote Registry Service

If your device has a network connection and you happened to include the Remote Registry Service component, then this option is for you. Open up the Registry Editor (Start->Run, type in regedit, hit enter) on your developer computer (a computer with a network connection running a desktop version of Windows). Go to File->Connect Network Registry. In the “Enter the object name to select” box, type in your Windows Embedded device’s IP address or computer name and click OK.

Depending on a variety of security settings and the network connectivity of your device, you’ll either be brought back to Registry Editor (where you’ll now see your device’s registry alongside your local computer’s registry and you can find the version information from the table above) or you’ll see some sort of error message saying you can’t connect. If you were unlucky enough to receive such an error, there are a few things you can try.

Make sure your device has network connectivity

Make sure (or hope) that your image contains the Remote Registry Service, and that the service is turned on (it is by default)

If the account you’re trying to connect with doesn’t have a password associated with it, or the password is blank, the connection will fail. Give the account a password, or use an account that already has one set.

If you have the Windows Firewall component installed on your device, make sure the Remote Assistance exception is turned on. If this doesn’t help, you may want to try just temporarily turning off the firewall. Make sure you turn it back on when you’re done!

Manually Loading a Registry Hive

So, your device doesn’t have network connectivity, doesn’t have the Remote Registry Service component, or you’ve tried the steps above and couldn’t get things to connect? Well luckily there’s one final option that can be a bit of a pain, but is much less dependent on the device’s configuration, which makes it a bit more foolproof.

First, plug your device’s storage media into your developer computer. If your device’s Windows Embedded image is installed on a hard drive, this can be a bit of a pain, but if it’s installed on a USB key, compact flash disk, or CD, then this should be pretty easy.

Open up Registry Editor on the developer computer. Click on your local copy of HKEY_LOCAL_MACHINE (HKLM), and then go to File->Load Hive. Navigate to your device’s disk, and go to \Windows\System32\config\, and then open up the file named SYSTEM. This is your Windows Embedded device’s HKLM\SYSTEM branch of the registry. After you select the SYSTEM file, you’ll be asked to enter a Key Name. This is what you want to name the device’s registry entry when you’re viewing it in Registry Editor, not which key you want to open. So, give it a name that’s distinctive, and that you’ll easily be able to find, like MyDeviceRegistry.

Now your device’s SYSTEM branch of the registry should be loaded under HKLM\MyDeviceRegistry. For some reason, CurrentControlSet won’t show up, but the same version entries will be available under ControlSet001 and ControlSet002, so you can check either of those branches for the entries listed above.