Introduction
Today, I'm going to share with you some rather crude infographic cards I created to give me a smooth start when navigating the driver quagmire. These cards serve as simple guides that illuminate the driver search process, illustrating how various OS environment attributes knit together. They have worked well for me over time, and have certainly helped me context switch that little bit faster when submerging myself once again into that driver import hell.
Tricksy Network Drivers and the Computer Deployment Process
To better understand the the confusion that can occur when bringing new drivers into a deployment process, let's see what a typical process looks like in practice. Please bear in mind too that no matter what vendor you partner with to deploy your Microsoft Windows operating systems, the underlying processes involved are fundamentally (and necessarily) the same.
Below is a pictorial representation of what I see as being a typical process for deploying a Windows machine (this feels about right for the 10 years plus that I've been doing it). To give it some grit, I've specifically tuned the graphic to illustrate the common deployment scenario of pushing out Windows 7 64-bit.
- The machine boots into a pre-boot imaging Operating System (in this case WinPE4)
- An imaging tool launches. This locates a remote image file (in this case Sysprep'd Win7 64-bit image) and extracts its contents to the local harddisk
- Drivers are injected into the dormant Operating System now on the local harddisk
- Configuration files are injected into the dormant Operating System now on the local harddisk
- The machine is rebooted into the dormant Operating System, so it can awaken, configure, and become live
Hopefully there is nothing too contentious in all this. As we're here to talk about drivers, I've specifically highlighted a couple of red areas in the 5-point deployment graphic as they require special consideration from a driver point of view),
- 32-bit NIC driver library for WinPE4
When deploying a 64-bit operating system, the conceptual ideal is to deploy it with the 64-bit flavour of it's Windows PreInstallation Environment (WinPE) for maximum flexibility. So, why do we here appear to be complicating matters by using 32-bit WinPE?Well, 64-bit WinPE has a problem. Microsoft have for years resisted including within WinPE the Windows-On-Windows (WoW) technology that permits downlevel application architectures to run. This is a pain, as most of the useful tools which we'd like to include inside WinPE are compiled primarily for 32-bit Windows and often do not have 64-bit variants. For this reason (and because in-house apps are still easier to write in 32-bit) most of us end up deploying our machines with the 32-bit flavours of WinPE.
Whilst this might seem strange, using a 32-bit environment to deploy a 64-bit OS, it's not all bad. Most of the drivers we'd normally install to get a machine fully up and running are not required in WinPE -this environment is designed to be lightweight and the primary task we set it is to pull an image file from a remote network location and dump it to disk. Typically, it's therefore only the NIC drivers (and occasionally mass storage) that we deem critical to include at this stage.
From the point of view of introducing new models to WinPE, one important consideration is time it takes to confirm a successful import. The process of adding drivers to WinPE, recompiling, and then testing can take over an hour. Every driver chosen in error at this point therefore costs, so anything which reduces that failure rate is welcomed with open arms.
- 64-bit Driver Library for Windows 7
This is for the driver injection process that forms the heart of most Hardware Independent Imaging (HII) implementations. HII traditionally uses a combination of sysprep'd images and targeted driver copies to make images more portable. The end result is that we can deploy a single image to multitude of models with full confidence that all the correct drivers automagically installed.In order for the driver injection process to work however, a library of drivers needs to be compiled in advance so that the process can correctly target and pull as required. Step 3 in the deployment process injects these drivers to provide this functionality.
For new models, the process of testing each and every driver can take days, as each driver test requires a full image deployment. Many vendors provide per-model or per-series driver packs which can massively accelerate this process.
In most instances, populating the above libraries can be a simple case of downloading the drivers for the target OS and importing it. NIC drivers however can be slightly thorny as the are often filed using an unfamiliar standards version numbers rather than using something human-readable like the OS name. This leaves many of us guessing as to which is the correct driver to import into our library. The end result all too often for that many admins is that they have to test every driver variant to discover exactly which driver works in each environment.
Getting The Right Driver for your WinPE Version
So, how do we do this smarter? First I think it will be instructive to see the 'problem' in action. Let's consider the scenario where we have a new model to put in our fold, and that has a new Intel NIC, say the Intel i218-LM adapter. Let's also assume we're still in the scenario depicted in the deployment graphic where we are using 32-bit WinPE4 to deliver our Windows 7 64-bit OS.
Now, the first environment we need to get working for this is the WinPE4 environment (without a function NIC adapter in WinPE, we don't be able to pull the disk image down to the local machine in the imaging process).
A quick visit to the Intel website gives us these options for the i218-LM NIC,
So which do we choose for our WinPE environment? At this point we are left to Google to see which one applies to our environment. The wikipedia entries for the Windows PreInstallation Environment are a good reference, and if we merge that with the Windows Version numbers we get a most useful table,
Windows OS Name | OS Version | WinPE Version |
Windows 10 | 10.0.10240 | 10.0 |
Windows 2012 R2 / Windows 8.1 | 6.3.9600 | 5.0 |
Windows 2012 / Windows 8 | 6.2.9200 | 4.0 |
Windows 7 SP1, Windows 2008 R2 SP1 | 6.1.7601 | 3.1 |
Windows 7, Windows 2008 R2 | 6.1.7600 | 3.0 |
Windows 2008 | 6.0.6000 | 2.1 |
Windows Vista | 6.0.6000 | 2.0 |
So, here we see that WinPE4 it turns out to be built on the same core that's used to build Windows 8 and Windows Server 2012. So in this case, we are deploying Windows 7 using the core of Windows 8. That isn't as dumb as it sounds -the Windows 8 core is a better choice for us as it has by default an awful lot more driver support out-of-the-box
For extra piece of mind, we can be doubly sure of the WinPE version by typing the ver command in a command-shell once WinPE is loaded,
Which is in exact agreement with the table.
So, here we've identified that WinPE 4 requires Windows 8 (or Windows 2012 server) drivers. So, let's now download these and see what we get.
The Network Driver Interface Specification (NDIS)
Once you unpack those Intel I218-LM drivers, this is the folder structure you see,
This is frankly a bit opaque. So what happens now? Why do we see three options before we even start looking at the driver files, and just what is NDIS? These look faintly reminiscent of the windows version numbers (6.2, 6.3, etc) but they aren't. They actually relate to the NDIS (Network Driver Interface Specification) version which is unfortunate in that sometimes can have the unfortunate luck of matching up with a Windows version number.
The history here is that many years ago, when the internet was was just a spotty teenager, there existed a huge problem with network driver stability, interoperability, and ownership. Back then, it was not uncommon for a network application author to be tasked with writing the entire code stack from the application at the top, right down through the OS, through the protocol layers, and then down to the network card beneath. It's bizarre to think of anyone doing this now, but back then when you bought a server networking application, you also got the list of network cards it was written to work with.
With application authors writing with such penetration into the operating system, stability and interoperability became key concerns. In 1988, Microsoft and 3COM showed a better path, for everyone's benefit, with the publishing of their Network Driver Interface Specification, NDIS. What this did was separate the application authors from the kernel driver authors through the intervention of a layer through which data could only pass using published, standard NDIS libraries. Not only did this stop dead the full penetration of 3rd-party code through the entire OS, massively improving stability, it also allowed network card manufacturers to focus on writing drivers, and the application authors to focus on writing applications.
Over time, the focus on NDIS has meant that network card manufacturers tended to think more about supporting the latest NDIS version, rather than the latest Microsoft Windows Operating System. So what we are seeing here is just the manufacturer specifying the OS support through the NDIS versions.
What we need now is another table to figure is all out...
Windows OS Name | NDIS Version |
Windows 10 / Window 2016 | 6.5 |
Windows 2012 R2 / Windows 8.1 | 6.4 |
Windows 2012 / Windows 8 | 6.3 |
Windows 7, Windows 7 SP1 | 6.2 |
Windows 2008 R2, Windows 2008 R2 SP1 | 6.2 |
Windows Vista SP1, Windows Vista SP2 | 6.1 |
Windows 2008, Windows 2008 SP1, Windows 2008 SP2 | 6.1 |
Windows Vista | 6.0 |
Which tells us rather rapidly that it's the NDIS 6.3 folder we want to import achieve our goal of Windows 8 support.
The Quick Reference Cards For Driver Hunting
In summary, it seems that in order to even start the process of getting hold of the correct Network drivers you need to have a good handle on the following OS attributes (and the relationships between them) in your environment,
- Windows OS Version
- WinPE version
- NDIS version
Looking at tables is OK for this, and for some people that will be the preference. I however have a dislike for rows of text and numbers, and find that they can often obscure interesting relationships. By munging the WinPE and NDIS tables, I came up with the following infographics which should cover the bases for most Windows deployments today,
What these cards illustrate (apart from the fact that we're all waiting for Windows 2016 Server!) is how the Microsoft Operating Systems and their WinPE counterparts are all inter-related under the NDIS framework. The sea of blue shows the extent of the NDIS version boundary, the green labels show the base OS version number, and the 'underpants' labels help illustrate how the WinPE releases relate to the OS release. With these cards, I find that I'm never confused by obscured driver downloads (or WinPE environments that don't explicitly tell you what version they are).
For Windows 8 and beyond, we see that the relationships between OS, WinPE and NDIS versions become very simple; a result perhaps of the technology nomenclature in use here now being fairly mature. Going back to Windows 7 we see an extra layer of complexity appearing with two WinPE versions existing. If we go further back to Windows XP, to the time when WinPE in particular was just finding its feet, we see a very different story.
The Quick-Reference Cards For Legacy Operating Systems
For those supporting legacy environments, I also have some cards that cover these older releases. These too tell interesting stories. For example, with Windows Vista we see clearly how it alone pioneered NDIS 6.0, creating some confusion for driver authors as they tried to fathom whether they were installing on Windows Vista RTM or Windows Server 2008 (they shared the same OS build number yet implemented different NDIS versions!!).
The Windows XP/ Server 2003 Server card is also fascinating as it captures that time when WinPE first emerged. With each service pack, we see in the card below that WinPE blossomed, finding popularity on it's path to becoming the highly versatile imaging environment we know today.
Conclusion
What I've tried to do today is demonstrate a different way of looking at the relationships between Windows Operating System versions in the context of NDIS boundaries. The infograhics I shared here help point me in the right direction when assimilating new computer models into our deployment process.
Please bear in mind however that this isn't an exact science. As all veteran IT bods all know, it's perfectly possible for driver written for one OS to work trouble-free on others. So, when all else fails in the search for your 'proper' driver, you might find there is some mileage in just testing out whatever you can find.
Looking at them now makes me feel almost nostalgic to that rich early era of WinPE development at a time where Microsoft had just begun to sort it's act out with the Trustworthy Computing Initiative. Moving to more recent times, what these infographics also illustrate really well is that with the release of Windows 7, the relationships between NDIS, OS and the WinPE offshoots had really begun to stabilised. This stabilisation provided Microsoft a nice, clear model moving to Windows 8 and beyond.
I hope you find some of these cards useful memory joggers. I hope that with them, you can target the drivers from the outset without having to go into all that peskiness of delving into the innards of the .inf files. At least not from the outset anyway.... ;-)
Further Reading
- WinPE version history
https://en.wikipedia.org/wiki/Windows_Preinstallation_Environment
- NDIS Overview from Microsoft
https://msdn.microsoft.com/en-us/library/windows/hardware/ff556026(v=vs.85).aspx
- NDIS Developers Reference
http://www.ndis.com