Fix for Xbox One Wireless Adapter Not Working in Windows 10 – “XBOX ACC” Driver

Xbox One Wireless Adapter for WindowsWhen I received the new Oculus Rift last month, one of the bundled accessories was a wireless Xbox One controller with a wireless USB adapter. Curiously, despite my system being completely up-to-date, the plug-and-play driver installation was never able to succeed correctly. I have seen similar issues pop up occasionally on Facebook and other discussion groups.

The official Microsoft support link on troubleshooting the wireless adapter suggest a wide range of potential solutions, none-of-which helped in my situation. At the end of the first solution that most closely matched my issue (“The adapter didn’t auto-install“), Microsoft tells the reader to attempt the uninstall/update process once more and “if this doesn’t work, your adapter needs to be replaced.” Luckily that isn’t really the case and the fix only takes a moment to apply.


  • The Xbox Home button on the controller continues to slowly pulse when powered on, never staying solid.
  • The Xbox One controller does not appear in Devices and Printers.
  • The LED light on the adapter does not come on at all when plugged in, even after pressing Sync button.
  • The Device Manager shows an “XBOX ACC” entry in Other Devices with an explanation mark.


In short, you’ll need to manually download compatible drivers on Microsoft’s site and then update the missing device drivers accordingly. Sadly, Microsoft does a fantastic job of hiding these files deep within their site. The main Software Downloads page for the controller only includes links to the user guide and specs sheet, no drivers. Microsoft assumes that the plug-and-play adapter will install without issue—and in many cases I’m sure they are correct, just not always.

The only official way to get at these drivers is through Microsoft’s Software Catalog site, which begrudgingly restricts its usage to Internet Explorer browsers. That said, here’s a quick way to get what you need and have your controller up and running in minutes!

Downloading the Correct Drivers

  1. First, determine whether you are using a 32-bit or 64-bit operating system. You can press Windows Logo + Pause/Break if you need to verify your system type.
  2. With that information in mind, launch Internet Explorer (important) and navigate to:
  3. The results should be sorted by Last Updated; the top two results correspond to the latest adapter drivers for 32/64-bit machines:
    1. If your operating system is 32-bit, click the “Add” button next to the lower of the two versions (i.e.,
    2. If your operating system is 64-bit, click the “add” button next to the higher of the two versions (i.e.,
The top two results at the provided link will be for the 32 and 64-bit drivers for the Xbox One Wireless Adapter.

The top two results will be for the 32/64-bit drivers for the Xbox One Wireless Adapter. Click Add next to the correct one for your system.

  1. Once the correct driver has been added to your download basket, click on View Basket (1) in the top-right of the page.
  2. On the following page, verify your selection and then click Download.
  3. Click “Browse” and navigate to the temporary location you wish to download the drivers to; the Desktop is just fine.
  4. Click Continue and once the download lists as “Done” you can close all Internet Explorer windows.
  5. Finally, navigate to the downloaded file. It will have a .cab extension. Open this file in 7-Zip or WinRAR and extract its contents somewhere.

Updating the Wireless Adapter Drivers

  1. Plug the wireless adapter into any USB port on your computer; you should hear a sound effect. If the Device Setup window appears, wait until it is finished.
  2. Go into the Device Manager (Windows Key + Pause/Break > Device Manager).
  3. You should see XBOX ACC listed under Other Devices. Right-click this entry and select Update Driver Software.
  4. Click on Browse my computer for driver software.
  5. Click “Browse” and navigate to where you previously extracted the .cab files to. Then click OK and Next.
  6. The proper driver should then install and within a few seconds you’ll get the message that the driver has been successfully updated. Click Close.

Xbox One Wireless Adapter Driver Update

The device will then show up as Xbox Wireless Adapter for Windows under the Network Adapters category of devices.

Xbox One Wireless Adapter

Syncing the Controller with the Adapter

Chances are you can now turn on your Xbox controller by holding the Home button in until it lights up; after a few pulses it should auto-sync with the now functional USB adapter. If the Home button light does not become solid or otherwise behaves peculiarly in Windows, try re-syncing it as follows:

  1. Press and hold the Sync button on the adapter until it starts flashing.
  2. Once the adapter is flashing, press and hold the Xbox controller bind button front of the controller until the Xbox Home light flashes rapidly.
  3. In a moment, the light on both the adapter and the controller should light solid. You are all set!

Finally, consider downloading Xbox Accessories from the Windows Store to fully customize the gaming controller and update its firmware.

Note that I have seen a few people report issues using the wireless adapter in USB 3.0 ports. I have never experienced this issue on my machine and don’t think you will either (it is rated for use in either). Of course, there is no harm in using a USB 2.0 port if needed.

Project Postmortem: Panasonic VIERA Connect (3)

Apple Muncher IconThis is the third of a four-part story documenting my somewhat excruciating and wholly uncharted experience developing an indie game for Panasonic’s obscure VIERA Connect television app market several years ago.

In the first part of this postmortem, I detailed the pains of becoming a VIERA Connect third party developer and struggles of setting up the rigid development environment required by Panasonic.

In the second part, I documented the development process of actually creating a game using the often restrictive VIERA Connect framework.

Time to Submit the App!

Panasonic VIERA ConnectOver the course of approximately three weeks, I learned the ins and outs of the original VIERA Connect API (Ajax-CE) and used it to develop a Snake game. In coming up with a name for the app, I observed that the Pansonic app market sorted apps alphabetically by title, with no option to sort by latest releases or popularity (official partners like Game Loft were given preferential treatment, with their apps pinned above the rest). With that in mind, I decided upon the name Apple Muncher to ensure that it would appear on the first page of available games for added visibility. In this short window of time, I had developed a full-featured game with 25 levels, multiple themes and an online high score system.

As indicated in previous installments, I was one of the first independent developers to jump aboard the Panasonic app market. At the time, there were less than two dozen apps available across all categories and almost all of these apps were from official partners like Netflix, Game Loft and Amazon. Upon inquiry, I was told by Panasonic that these partners were allowed special access to a “native” API that was not available to third party developers. As such, the big players were able to port their existing Web apps over with little hassle and could leverage far more capabilities than permitted by third party members.

With my app ready to go, I ventured over to the app submission section of the VIERA Connect portal. There was limited information provided apart from a few general guidelines and the submission form itself. I assumed the review and approval process would be comparable to iTunes and Google Play, but had to go in blind as no outside information existed about Panasonic’s app vetting process.

Submission Form

App SubmissionThe first objective was to prepare all of the assets and complete the online submission form. One aspect that threw me off guard was that the app had to be hosted on one of my own external servers. Although not a big deal, I had assumed that for quality control reasons Panasonic would had hosted these apps on their own servers in the same vein as Apple and Google. Panasonic, in fact, required both a production and staging URL where the app was to be hosted. Bare in mind that these apps are essentially JavaScript packages so they are hosted and served up in the same fashion as typical websites.

The most difficult part of asset generation came when having to prepare a set of screenshots. Since the only way to execute the app was via the television set itself, there was no easy way to capture the screen. On computers and mobile devices, the print screen functionality makes this an effortless process.  However, even an HD capture card connected to the TV would do no good, since the entire app was executed on the television’s internal OS with no video out capability.  Since the television supported SD cards, a welcomed feature would had been a ‘screenshot’ function that could be called from the code to save the screen’s current view to a PNG. Alas, that functionality did not exist.

My approach to acquiring the mandatory screenshots was a mix of painstakingly recreating the scenes sprite-by-sprite using graphic editing software, and photographing my television set’s screen and cleaning it up as best as possible in post-process. In the end, I had 4-5 screenshots that had to be scaled down to 480×270 for the submission form, and several different icons at 360×252, 160×112 and 256×60. The various icons are used on different screens of the app portal once the app has been installed.

The five screenshots I recreated via sprite-by-sprite graphic composition and taking physical photos of my television screen, due to the lack of any available screenshot functionality within the Panasonic API.

The five screenshots I recreated via sprite-by-sprite graphic composition and taking physical photos of my television screen, due to the lack of any available screenshot functionality within the Panasonic API.

The rest of the required metadata was mundane: Title, Description, Price, Available Countries, Supported Devices and so on. I set the price to $1.99 USD and indicated that it would work on all VIERA Connect capable television sets, which at the time was really only a single generation of sets. Finally, I submitted the form.  I received an automated email confirming the submission but with no additional information about how or when it would be reviewed. The email simply said “Application created (automatic notification).”

Price Considerations

When submitting the app, I made careful considerations about the price point. Realistically, I had no knowledge of how many VIERA Connect capable television sets had been sold and, in turn, did not know what the user-base would ever conceivably amount to. I researched Panasonic press releases, stockholder data and other avenues yet was still unable to ascertain with any grade of certainty how many compatible sets had been sold.

Piggy BankIn the mobile and PC markets, freemium and free-to-play revenue models have become so popular for good reason. By releasing an application free-of-charge, the potential exists for many more users to discover and try it out without any financial investment required. Revenue from free applications can still be earned any number of ways including via in-app purchases and advertisements. I have had great success in other markets by releasing free ad-supported apps that offered optional paid upgrades.

Unfortunately, the Panasonic API did not offer any sort of revenue-generating capabilities for free apps. There was no way to include third party advertisements or in-app upgrades. Likewise, no ability existed to allow a time-based trial so that users could enjoy the full app for a limited amount of time before having to purchase it (a much-welcomed feature on the Microsoft app store for Windows and Xbox).

Given the fact that I had already invested a month of my time and approximately $130 on the developer license, the only feasible way to make any return on my investment was to charge for the app. Other apps on the market cost about $1.99 average, so that is what I went with. In this way, if I could sell even 100 copies I would at least break even after all fees and expenses.

A couple of days after I submitted my app, I was approached by a member at Panasonic who encouraged me to make a free version of the app. They only supported paid apps in the United States and Europe, whereas the free version would be available to “100 countries” and instantly open the doors for “tens of thousands of players.” Still unclear was how many potential users existed within the United States and Europe alone, but I was reluctant to rework the app as a free version and go through the entire submission process a second time when my first submission hadn’t yet been approved.

Required App Documentation

The first correspondence about my app’s submission came two days later, where a Word document attachment advised me to complete more detailed documentation for the app.  This paperwork was about seven pages long and required the creation of an application flow diagram, sectional information, technical requirements, cheat codes to allow the testers to progress through the game, screenshots and more.

The application flow diagram I had to create as part of the documentation for this simple game.

The application flow diagram I had to create as part of the documentation for this simple game.

With the documentation complete I sent it back via email. Four days later, I got another email that my app status had been changed to “In QA.

Quality Assurance

Approximately a week after my initial submission, my app went into the “quality analysis” phase by Panasonic.  I had assumed this was not unlike Apple setting the status to “under review” after submitting an app through their market.  However, that thought quickly went astray as I got the report back from “the first round” of my testing in the form of a detailed spreadsheet.

Round One Testing: Four Failures [January 30]

The spreadsheet I received included four reported issues across two categories including Message Prompts and Functionality.

  • If there is no connection to the network or server, an error message SHOULD be displayed.
  • The game speed is too fast for the lower level. Cannot go to next row. ↑→↓ / →↓← etc
  • Name Textbox is not cleared after Pressing Cancel / Submit.
  • Highlight Day week month year in scores

Three of the four listed failures were related to the user experience, and seemed heavily subject to personal preference. I and several others who tested the original game did not have any trouble navigating the snake across the levels at the default speed. The game also supports keyboard controls for more responsive input, for those who do have a USB keyboard hooked up. Even so, I agreed to amend this and subsequently added a ‘easy’ and ‘hard’ mode, where the hard mode is what the original speed was. I added some checking to see if there was a connection error and made it so the high score buttons were highlighted more correctly.


The reported issue of “Name Textbox is not cleared after Pressing Cancel / Submit” was a deliberate design decision I made when coding the game. In playtesting, I found that having to repeatedly enter your name at the end of each round was a nuisance and very time-consuming with the on-screen keyboard. In the majority of use-case scenarios, the same person would often play multiple rounds of the game in a row. As such, I intentionally retained the entered name until the user exited the app. They were still able to delete and replace the name as they needed, but as a user convenience I stored it in memory. This feature was seen as an issue by the QA person at Panasonic, who must have preferred to manually re-enter their same name every time.

[Sidenote: Panasonic did not publicly allow third party developers to interface with the SD card so there was also no advertised way to store any app data internally; once the app closed all data would be wiped clean. There also was no way to get a unique ID for each device to store and retrieve personalized data remotely in any easy manner.]

I took care of all of the issues and wrote my comments and arguments in the spreadsheet. I disputed the name issue and explained the convenience factor of storing the previous name, but still made some enhancements to it so anyone who did want to change the name could type it immediately without having to manually erase the stored value. I sent back the revised spreadsheet.

Round Two Testing: One Failure [February 2]

A couple days later, I received a second round of testing results. The three previously listed Functionality issues had now passed their requirements. However, they were still hanging on the network connectivity issues, and included these unlikely steps to reproduce the issue:


  • Start the game > Unplug the Ethernet cable > Play the game > Submit a score

I had already worked in safeguards against a loss of connectivity to my server for any reason, but now was being told that if a person explicitly unplugs their network cable or adapter from the TV it should detect and warn of this in the app. I personally felt that if it came down to a total loss of Internet signal, the television firmware itself should monitor and alert the user since no aspect of the app portal or OS is accessible without connectivity. In either case, I spent additional time reworking the behavior so that if the user did unplug their network cable or otherwise lost total connectivity, then tried to submit a score, a more direct error notice would display.

With this and some additional refinements in place, I submitted the revised spreadsheet once again.

Round Three Testing: No Failures [February 8]

Finally after more than a week of QA testing and fixing, I got the good word that my app has passed the “Initial QA” and would “be sent to the QA team at Panasonic Headquarters for final round testing.” Say what? Apparently even after all of this there was still another round of vigorous testing to go. In this email notice I had to also confirm that it was an original creation and did not violate any copyright laws. Still, progress was progress.

Round Four Testing: Weeks Upon Weeks in Limbo [March 19]

This last bout of testing took a staggering 5 weeks to complete. During this time, I received a few other emails including:

  • Paid app support was now available in Canada alongside US and Europe. [March 6]
  • The app is officially now entering QA testing. [March 7].
  • BlackBerry App World / RIM / Digital River contract data for managing the app sales. [March 12]

On March 19, my app was finally marked as Approved and Waiting to Go Live. Hurray! Well, it was approved, but still hadn’t gone live. So I played the waiting game a little longer.

App Status Updated: Finally Live! [April 1]

Finally, after more than nine weeks had passed since I first submitted the app, it went live on the Panasonic app portal. Keep in mind that my app was one of the only new submissions that would had needed to be tested as I was one of only a few third party developers to try out the platform. Meanwhile, Apple is able to test and approve apps in about a week’s time period despite having thousands of new apps to run through at any given time, Amazon generally reviews apps within 24 hours and Google within several hours.

I was just relieved to have made it through the unforgiving validation process. To Panasonic’s credit, the spreadsheets detailing the specific issues were thorough and far more informative than the details (or lack thereof) you get if your app is rejected during Apple’s approval process.

Apple Muncher Panasonic

Whew! After over two months of “quality assurance” testing, my app was finally available on the Panasonic app market.

In the final installment of this postmortem, I will be detailing all of the post-launch events. This will include app usage statistics, revenue and further developments.

Fully Automated Image Processing for eBay

eBay LogoWhen I list items for sale on eBay, I use a custom-developed HTML template with the item’s pictures uploaded externally and embedded into the description for more visual appeal than what eBay provides. This allows me to apply custom styles to the images via CSS, provide descriptive content below specific images and generally offers a lot more flexibility and professionalism.

By default, eBay allows you to upload up to 12 images for free to be included in the ad, and requires uploading at least one image through their service to be displayed in the auction results and so forth. The images uploaded in this manner appear at the very top of the auction page alongside the auction metadata. These eBay-hosted pictures are scaled to 500x375px regardless of the user’s screen resolution, with an option to view larger versions by clicking/hovering over them.

eBay Example Ad

An example eBay ad depicting the fixed image resolution and placement using the default eBay image hosting.

This layout is convenient for when users first visit an auction or when there is not a lot of descriptive content needed, as all the information the user needs is right up at the top without needing to scroll. The functionality of the image slideshow and enlarging has also improved substantially over the years from when eBay first started offering free image hosting.  I want to also emphasize, before describing my automated method of image processing and hosting, that it is still essential to use eBay’s own image hosting service alongside your own (for up to 12 images) so that you can still embrace their free top-of-the-page slideshow.

The Tedious Process of Manually Hosting Pictures

There are usually a lot of steps involved in taking photographs and ultimately embedding them into your eBay auction description. In my case, managing images (with or without using eBay’s own service) proved to be the most time-consuming process of listing an item. The basic process of capturing, transferring, optimizing and re-saving images can itself consume a lot of time. The general method many people use for manual image preparation and hosting is as follows:

  1. Take the photographs of the item you wish to list on a digital camera.
  2. Transfer the pictures to your computer using a card reader, direct connect or via WiFi on supported cameras.
  3. Open the images in a photo editor and resize them to reduce file size and load time.
  4. Enhance each image by adjusting brightness, levels etc.
  5. Re-save the optimized images, renaming them as needed.
  6. Connect to an FTP server or file host via a third party application.
  7. Upload all of the auction item pictures to the remote server.
  8. Add custom HTML tags for each image within your auction description, specifying the full URL and image names accordingly.

Writing an Automated Script to Do It All

I hate needless repetition and boring tasks. With that in mind, I set out to create a completely automated system of transferring, resizing, enhancing, saving, uploading and embedding images into a custom HTML document. Essentially, I wanted to be able to perform steps #2 through #8 above with a single click after inserting my camera’s memory card into my computer. The end result is a batch file that does exactly that!

Baseline Script Requirements

To successfully use my automated script provided below, a few basic requirements need to be in place.

  • You must have a memory card reader for transferring your camera’s photos (direct connect would also work, but WiFi will not).
  • You must have an external FTP server/host available for transferring the images to (e.g., and know the login credentials.
  • You must know the location on the FTP server where your eBay images should be uploaded to, and that directory must be created. (e.g., /ebay/)
  • You must know the absolute URL of where the images are accessible once uploaded (e.g.,
  • You must have the ImageMagick command-line tools installed and available to the system (see below).
  • You should transfer the photos via this script on a per-item basis (i.e., after taking a set of photos for one specific item).

Using ImageMagick for Image Enhancements and Optimization

ImageMagickTo apply image enhancements and resizing as part of the automated process, I embrace the free, cross-platform library ImageMagick. This set of tools enables you to perform any number of programmatic operations on as many images as needed from a command-line interface, in a very efficient manner. To install the necessary components, head on over to the Binary Releases page of the ImageMagick website and review the instructions for your particular platform.

Note that I wrote my script to run on Windows as a standard batch file, so if you are using another operating system you will have to revise the script accordingly using commands available to that platform. For Windows, there are a number of ImageMagick binary packages available. You will want to get the one that matches your machine’s architecture (32-bit or 64-bit); the static variant works fine for this process. In this example, I downloaded the ImageMagick-6.9.3-5-Q16-x64-static.exe installer and ran it. I changed the install path to C:\ImageMagick\ as a personal preference so that it is a short path with no spaces and within a writable location.

Important: To verify that ImageMagick has been installed and mapped correctly on your machine, open a command prompt / terminal and enter:

You should then see a few lines of information about the currently installed version of ImageMagick—this means it is ready to roll! If you attempt to run this command in a write-protected directory, you may instead get the message “Invalid drive specification.” Don’t fret, this still indicates that the ImageMagick library is installed successfully.

If you instead get the message that “‘convert’ is not recognized as an internal or external command” when running the above command, you will need to add the base path (i.e., c:\imagemagick\) to your environmental path.

Finally, the Script!

With all that headway taken care of, all that remains is to present my batch file script. You will want to copy the contents below into a new text file, and save it as “Images.bat” or whatever you prefer. The batch file should be placed in the base directory where you wish to store all eBay photos on your computer (i.e., C:\ebay\). Make sure, when saving, to wrap the name in quotes to ensure that the extension is not overwritten (especially important if using Notepad).

As a convenience, the script below can also be downloaded as a batch file here: Images.bat

Important: See below the script for initial setup details.

Initial Script Setup

The script is well-commented and generally self-explanatory. Under the “Initialization and Variable Declaration” section, you will need to update the following:

  • FTP Details: Your FTP host, username, password, and directory to navigate to once connected before uploading images (the directory must already exist). Note that since this is stored in plaintext, you may wish to create a custom FTP account through your host and restrict its access to the ebay pictures folder, and use those account credentials here.
  • Remote URL: The absolute URL that the images will be accessible at. (i.e.,
  • Memory Card: The full system path to your memory card’s photo location (i.e., E:\DCIM\123D4567\)
  • Image Prefix: The first few letters or numbers that your camera prepends to each image (i.e., DSC).
  • Image Width: The width, in pixels, that the image should be resized to. This depends on your HTML template but should never exceed 1390px as that is the maximum available space eBay provides for the description content (1460px body – 70px padding).

When you launch the batch file, you will be prompted for a Base Photo Name. This should reference the item in a few unique letters to ensure no conflicts arise when uploading to the server (i.e., alarmclock). The script will then name the images accordingly (i.e.,  alarmclock-1.jpg, alarmclock-2.jpg).

After entering the base photo name, hit ENTER and the rest should be automated! At the end, the HTML image tag code will already be copied to your clipboard and ready for insertion into your favorite HTML template or directly into the eBay description field.

Script Notes and Information

  • Delayed expansion is disabled and enabled a couple times in the script to best handle different types of variables and operations.
  • A temporary JavaScript file is created to generate a YYYYMMDD string of the current date, for the folder naming, and is then deleted.
  • The images are temporarily renamed to *.tmp during processing to prevent conflicts with previously stored images in the same directory; if you are using the script to process multiple photo sets on a single day, this ensures no file overwriting or redundant processing.
  • The ImageMagick tool Mogrify is used to enhance and optimize the images. I apply the “normalize” filter to improve visual contrast and brightness, but you can experiment with others such as “auto-levels” for differing effects.
  • A temporary text file is created in the current picture directory named html.txt that stores the generated HTML image tags with the uploaded image paths. This data is copied to your clipboard automatically by the script, but the file is preserved so that it can be accessed in the event that you copy something else to your clipboard before pasting the data. You can uncomment line 133 (del html.txt 2>NUL) if you’d wish for this file to be deleted automatically.
  • The FTP functionality creates a temporary secondary batch file for queuing the FTP login, navigation and uploading commands. This file is deleted automatically on finish.

Making the Images Responsive and Getting Creative

The script presented above generates the bare-minimum HTML required for inserting full-sized images into your custom HTML template. As-is, this method will display the images at their original dimensions (as defined via the imagewidth declaration and up to 1390px wide on eBay) regardless of the user’s screen resolution or platform. This means that on mobile devices–where the user may only have a 320px wide viewport–the page contents in their entirety will be shrunk down on most browsers, resulting in the microscopic text effect seen often on non-mobile optimized sites and forcing the user to zoom-in and scroll horizontally.

There are a few simple ways to remedy this issue. One could hard-code width="100%" height="auto" attributes into each image tag (by modifying the script above slightly), thus ensuring that the images will stretch to the maximum space allocated by its parent container. However, this adds unnecessarily to the body content and also provides quite limited customization. My personal recommendation is to instead embed the generated image HTML code inside of a custom parent container, and then add styles to your template that set the parent image container attributes along with the images themselves, as follows:

Insert the generated image HTML tags into a custom image container element:

At the top of your template code, add styles for the image container and item images.

The .imgContainer styles ensure that it will not exceed 100% width and also put in basic center alignment properties so the images will appear centered on-screen. The .imgContainer img styles specify a 100% width and auto height so the images will scale to full-width while retaining their original aspect ratio. I also add some general styling to give the images soft corners, a shaded border and other basic attributes. If you do not want to scale-up any images beyond their original size, change the width parameter to max-width.

With this modified code, assuming your overall template container (either a TABLE or another DIV) also has a width property of 100%, the images will then scale appropriately depending on the user’s resolution.

2016/03/20 Edit: Added a blurb about converting the generated images into a responsive format to ensure proper rendering on mobile devices.

Windows XP Drivers for NVIDIA Geforce GTX 970, 980, 980 TI and Titan X, say what?!

Windows XPI recently built a new computer to better accommodate the forthcoming line of resource-intensive tech products, namely the Oculus Rift and related VR devices. While my old computer was nothing to shake a stick at, its hardware was not satisfactory enough to produce a consistently smooth experience on the Developer Kit 2 (DK2). The second iteration of the developer headset kit requires rendering a 1920×1080 display (960×1080 per eye) 75 times per second or else latency and lag lead to a jittery and nauseating experience. When the consumer version drops next year the hardware demands will be even greater.

With my latest PC upgrade (Geforce GTX 980 TI, MSI Z97 Gaming 5 motherboard with an Intel i7 4790k CPU, 32GB RAM, Samsung SSD 840 Pro, Sound Blaster Zx) I made the sudden, albeit fully expected observation—none of these new components provided any Windows XP support by the manufacturers. After all, Microsoft itself ceased mainstream support for XP way back in 2009 and officially declared it to be ‘end of life’ and fully unsupported in April 2014.  It makes zero sense for any manufacturers to waste additional developer resources maintaining support for such an archaic and unsupported operating system, even as millions of diehards still cling on.

Holding On to Windows XP

Confession time. From the moment I upgraded to Windows Vista many years ago (and abruptly to Windows 7, then 8, now 10) I have always maintained a separate partition or dedicated hard drive with Windows XP 32-bit installed as a multi-boot system. Why? For an absurdly limited number of reasons, if I’m honest. It is a lot more convenient and often perfectly adequate to simply create a virtual machine (i.e., using Virtual Box or Hyper-V) for Windows XP as a guest OS. One of the key reasons for using XP these days is for niche software that may not run appropriately or at all on more recent operating systems, even when in compatibility mode.

But, even as revolutionary as OS emulation has become with the advent of hardware virtualization, it still doesn’t compare to a bare metal native OS install. This is especially true when running games that may utilize OpenGL or DirectX, 3D applications and other computer-intensive processes. This typically comes down to GPU restrictions, although even that sector of virtualization is making strides with innovations like NVidia Grid. In my case specifically, I keep Windows XP 32-bit on-hand for a select handful of very obscure and specific applications, including some games and programs developed with older technologies and frameworks from the 1990s.

Jetmen Revival

Jetmen Revival: One example of a Windows XP game that does not work properly in later versions of Windows or virtual machines, regardless of compatibility mode settings.

Exhibit A: There is an old indie game known as Jetmen Revival, developed by Crew42 in the early 2000s (I believe using a Delphi 5 library). I enjoyed this game endlessly over the years, and even had a stab at redeveloping it myself for modern hardware but never found the opportunity to complete it. On non-XP machines, depending on the video card and driver software, the game will either crash upon launch, glitch out upon play, or chug along sluggishly creating an equally unplayable experience. No matter what compatibility settings and hardware adjustments are made, this game simply will not run as it was intended on modern machines nor in virtual machines.

Installing Geforce GTX 980 TI (970/980/Titan X) On Windows XP

Naturally, none of the latest video cards by NVIDIA or AMD officially support Windows XP. If you perform a Windows XP driver search on the respective manufacturer websites for any later cards such as the Geforce 970+ or AMD R7 3xx+ you’ll find no results. However, where there’s a will there’s a way.

Here’s the basic process of how to get the Geforce GTX 980 TI to cooperate with Windows XP. The same process can be used if you have a GTX 970, 980, Titan X or other unsupported cards.

  1. Download the latest and greatest Windows XP driver available from NVIDIA’s official website. As it turns out, the last video card that NVIDIA still offers active XP drivers for is the GTX 960. As such, modifying them to accommodate subsequent 900-series cards is pretty effortless since the cards all share the same driver base. This should also work for other cards that NVIDIA may not directly support such as the GTX 690. Make sure you select the correct driver architecture for the XP driver, 32-bit or 64-bit based on your specific install. I personally prefer Windows XP 32-bit as it holds the greatest compatibility with apps and can be less of a pain to get up and running with the Geforce drivers, but if you do need more than ~3.5GB of usable RAM or want to squeeze the very most out of your 64-bit CPU then Windows XP 64-bit would be the better option. At the time of this writing, version 359.06 was available from December 1, 2015 but future ones will work equally well.

    GTX 960 Official Drivers

    GTX 960 Official Drivers

  2. Once the file has been downloaded, launch it. Specify an extraction path and copy this path to your clipboard or otherwise note it for future reference. By default it will extract the driver files to: C:\NVIDIA\DisplayDriver\359.06\WinXP\International Click OK and wait for the files to extract. Close the installer when it appears.
  3. Navigate to the extracted directory from the previous step. Once there, go into the Display.Driver directory and open up the file nv4_dispi.inf in your favorite plain text editor (Notepad will suffice).
  4. There are two areas of interest in this .inf file that you’ll need to modify. First, the section [NVIDIA_Devices.NTx86.5.1] includes the hardware identifiers for all of NVIDIA’s supported cards under Windows XP. (If you are using the 64-bit version of XP you’ll instead want to find [NVIDIA_Devices.NTamd64.5.1] [NVIDIA_Devices.NTamd64.5.2] {corrected per comment from filippo}). Anywhere in this section, add the following hardware IDs.

    This corresponds to the device IDs of NVIDIA’s entire top tier line of non-XP supported cards including the GTX 970, GTX 980, GTX 980 TI, GTX Titan X and Quadro M6000. By adding these identifiers, we can fake the driver installer into believing the installed GPU is supported by XP; since the underlying drivers are not any different it will be just fine! The Section### clause in the lines above corresponds to what settings and components will be installed for these particular cards; in the case of the 900 series it matches the same category referenced by the GTX 960. However, different drivers and versions may alter this section number (i.e., the Windows 10 drivers use Section044 for the 900 series). So if you get a ‘Failed’ message upon trying to install the driver, you may have to double check this section number.

    Note: If you are attempting this in the future or on a card not referenced above, the easiest way to find the proper identifier is to first note the device hardware ID of the graphics card from within the Device Manager. The device ID will be listed similar to “PCI\VEN_10DE&DEV_17C8&4CC_0300” Note the four characters after DEV_. Next, download the latest Windows 7/10 driver from NVIDIA’s site, extract it (steps 2-3 above), and open the nv_dispi.inf file. Do a search for the four digit code and copy the found lines to the corresponding Windows XP nv4_dispi.inf file.

  5. The second part of the nv4_dispi.inf file that needs editing is found at the bottom under [Strings]. Go to this section and add the following:

    Notice that all of the DEV.#### references above correspond to the entries we added in step 4 and reflect the hardware device IDs for the previously unsupported cards.

  6. Re-save this file under the same nv4_dispi.inf name (select ‘Yes‘ to overwrite, if prompted).

Breathe. If you followed the steps above, you should now be able to run the setup.exe file in the parent directory that the original package was extracted to in step #2 above without it failing.

NVIDIA Driver Setup

The NVIDIA driver setup wizard using the custom install process, running Windows XP and a GTX 980 TI.

During the setup process, you will receive at least one driver signing alert. Press the Continue Anyway button to proceed.

If you attempted to run the setup wizard previously, you would receive an alert that no compatible card was found on your system. However, now that we added the missing product identifiers, the setup continues without error. Either choose Express or Custom setup and finish it up. I recommend specifying Custom and checking the option to Perform a Clean Installation just to ensure all bits of default video drivers are cleared up and not conflicting. (Instead of running the setup wizard, you could had optionally installed the driver directly from within the Device Manager, but would then be missing NVIDIA’s control panel and other core packages essential to its operations).

NVIDIA Driver Setup

Success! The full suite of NVIDIA driver software has been installed on Windows XP 32-bit for a GTX 980 TI.

Restart your computer after the install is complete and you should be ready to rock like it’s 2001 all over again, except with a super pumped up machine!

Windows XP on Modern Hardware: Other Considerations

There is obviously a lot more to work out when pitting modern hardware against Windows XP than just video drivers. Just getting the two operating systems to dual boot nicely can prove challenging. The easiest route is typically to install Windows XP first and then install Windows 10 to a new partition or separate connected drive afterward. This will allow Windows to create a suitable bootloader automatically to switch between them (I recommend also running ” bcdedit /set {default} bootmenupolicy legacy” from an elevated command prompt in Windows 10 to restore the original black bootloader screen and F8 boot functionality).

If your Windows 10 install is done via UEFI you could run into more complications and will generally need to alter your BIOS to disable secure boot and enable legacy boot mode alongside UEFI. I’ve done it both ways successfully, installing XP both before and after Windows 10, but when installing it afterward there are more headaches trying to get appropriate bootloader functionality and you’ll sometimes wind up unable to boot at all!

Modern motherboards will also not include any chipset drivers for XP on their own website. Thankfully, a lot of motherboard components are actually from third parties (i.e., Realtek HD / AC97 audio) so you can look up the device hardware IDs and seek out XP drivers that way. It becomes a trade-off of how much time are you willing to spend chasing chipset drivers down or modifying existing drivers to work; if the system is functioning well enough for you to do everything you need then you probably don’t need to worry about installing specific chipset drivers for the legacy XP install. For audio, if you cannot find drivers for your particular sound card and are not using on-board sound, consider purchasing simple USB-powered desktop speakers to alleviate the need of hacking together your own drivers for a modern sound card. Another option would be to embrace the HDMI/DisplayPort audio out if your display supports sound; the driver will be installed during the NVIDIA driver installation.

Who would had thought I’d be spending this much time writing about Windows XP near the dawn of 2016? 🙂