Working with customer is fun and challenging, best thing is that the ask very relevant question, questions that I asked my self long ago but never gave it any thoughts. Recently a customer asked me, “How do make Windows pick the correct driver?” and that my friends are a really god question
The secret behind this is called ranking, ranking occurs when drivers are added to the driver store and that happens of course when we deploy a new Windows 7 machine and drivers are injected. When using MDT in a LiteTouch configuration, the LiteTouch script will do a Plug and Play scanning of the hardware and the use the information the get the correct drivers from the MDT out-of box drivers folder. Now, MDT cant really “know” if that particular driver is the perfect driver so it will copy all drivers to the \Drivers folder on the machine to be deployed. But if you use Driver Groups or any other method that will “filter” the drivers the script would then only copy the one and only driver need.
Well that’s in the perfect word and since that does not exist we will get multiple drivers copied down to the \Drivers folder and then when MDT (using DISM in a offline mode) pushes those drivers into the OS there will be scenarios when we are going to have drivers that have the same PNP number and Windows must choose the correct one and now its time for ranking. In the best of worlds, when all the vendors created perfect drivers and everyone is always running the latest and the greatest this would not be a problem. But in the reality not all vendors have a perfect .inf file, in fact some of them are uglier then others and they does not even work.
Before we go into details on how that work, you might want to know how to “see” this, well that is not a secret there is of course a log file for that and the logical name for that is c:\Windows\inf\setupapi.dev.log and here is a sample where it just happens to be two drivers to pick from: (This log files has been modified and shortened just to show you)
The answer is in setupapi.dev.log
dvi: Enumerating INFs from path list ‘C:\Windows\inf’
inf: Opened PNF: ‘C:\Windows\System32\DriverStore\FileRepository\usb.inf_amd64_neutral_e2b28ecac19a29af\usb.inf’ ([strings.0409])
dvi: Created Driver Node:
dvi: InfName – C:\Windows\System32\DriverStore\FileRepository\usb.inf_amd64_neutral_e2b28ecac19a29af\usb.inf
dvi: Rank – 0x00ff2007
dvi: Created Driver Node:
dvi: InfName – C:\Windows\System32\DriverStore\FileRepository\ewusbdev.inf_amd64_neutral_7ed8b2230e11292c\ewusbdev.inf
dvi: Rank – 0x00ff0001
inf: Searched 2 potential matches in published INF directory
ndv: Selecting best match from Driver Store (including Device Path)…
dvi: Description – [HUAWEI Mobile Connect – USB Device]
dvi: InfFile – [c:\windows\system32\driverstore\filerepository\ewusbdev.inf_amd64_neutral_7ed8b2230e11292c\ewusbdev.inf]
dvi: Rank – [0x00ff0001]
- Windows is missing a driver for 0x00ff2007
- It finds two INF files that could be used
- By “ranking” them Windows then make a decision
- The driver with the lowest value wins, since that just have to be the best…
- In this case
- 0x00ff0001 is lower then 0x00ff2007 and therefore the HUAWEI Mobile Connect – USB Device is better then a generic USB driver
Why and how?
It is always nice to know what all these number means and here it is:
(The official “not so easy to understand” page is here http://msdn.microsoft.com/en-us/library/ff546225(VS.85).aspx“)
The ranking number is divided into 3 parts 0xAABBCCCC
- AA stands for: – “Signature Code”
- This one is easy, 00 means its signed, ff means that it is not signed. You can also see how the signer is in the log file
- BB stands for: – “Feature Score”
- Well, here is when the fun begins, the feature score is something the vendor decide by themselves, but to be honest I have not seen this being used by anyone. It should popup in the .inf file if they do.
- CCCC stands for: – “Identifier Score”
- This is also pretty simple, almost every device have at least for different PNP number, here is my NVidia card
And you can see that I have four different PNP numbers on this one, the top one is the exact match, the bottom is kind of generic. The better driver I have the better it will match the top of this list and that will make a low value.
So the best driver you could possible have is 0x00000000, but I have not really seen that kind of driver (yet)
You can find some more information on TechEd on this here:
/mike aka Deployment Bunny