Wednesday, December 15, 2010

Why DPInst sometimes chooses the wrong driver

DPInst is a great tool to automatically deploy drivers to computers (see this post for more details). The easiest way is to create a folder, put all drivers packages there and then let DPInst run. Usually it picks the correct one and you are happy. If you later on add a newer drive and let DPInst run again, it will pick that new driver. This normally works just fine.

However, we had a case where DPInst was not using a newer driver, but instead downgraded the driver to an older version - the worst thing that could happen.

Everything started with a download of a driver package for the 82567LM NIC from Intel. The driver version preloaded on the machine was 11.6.92.0:

clip_image002

The new driver we wanted to use was 11.8.75.0, because this version has some bug fixes applied. So we copied the decompressed files from the package to the DPInst folder (where other Network drivers are also saved) and run our batch file.

After DPInst was finished, we were a little bit shocked to see that it hasn’t installed the new driver, but instead installed an even older driver (11.5.10.1011):

clip_image004

So, for some strange reason DPInst used the old driver, and simply ignored the new one. After the second run of it, we examined the log file (%WINDIR%\DPInst.log) which displayed this:

INFO: Did not install 'c:\temp\netdrv\_intel network adapter driver for windows 7_15.7_11_11_2010_x32\pro1000\win32\ndis62\e1k6232.inf' because it is not better than the current drivers.

Somehow DPInst thinks that this driver (which is even older than the previously installed one) is better suited for the computer! Searching for the mentioned e1k6232.inf, we found two files on the share. One was from a direct download of HP (11.5.10.1011 – the old one that DPInst installed) and one was the new driver package we had copied (11.8.75.0 – from Intel.com directly).

Inside the INF file of the old version, this device ID existed:

%E10DENC.DeviceDesc% = E10DE.6.1.1, PCI\VEN_8086&DEV_10DE&SUBSYS_3034103C

The new package from Intel only showed this

%E10DENC.DeviceDesc% = E10DE, PCI\VEN_8086&DEV_10DE

After some investigation, the reason for this is pretty simple: DPInst will always use the driver that is the best suitable driver. As we had an HP machine, the network driver had the PCI ID of VEN_8086 &DEV_10DE &SUBSYS_3034103C.

And this means that driver from the older version suits better (because everything from the PCI ID matches) than the new driver that misses the &SUBSYS_3034103C part. Confused? Here’s the detailed explanation:

The NIC in the computer is: Intel (VEN_8086) – Type 82567LM (DEV_10DE) – HP Branded (SUBSYS_3034103C)

DPInst was started and scanned the available drivers and the hardware and came up with the following list:

- Hardware: Intel - 82567LM – HP Branded
- Installed Driver : Version 11.6.92.0, usable with Intel – 82567LM
- Driver #1 found: Version 11.8.75.0 (new), usable with Intel – 82567LM
- Driver #2 found: Version 11.5.10.1011 (old), usable with Intel - 82567LM – HP Branded

From these drivers, only one was the best “suited”, because it included the “HP Branded” (SUBSYS_3034103C) part. So it chooses this version which was actually a version downgrade…

Running DPInst again will cause the following internal list by DPInst:

- Hardware: Intel - 82567LM – HP Branded
- Installed Driver : Version 11.5.10.1011 (old), usable with Intel - 82567LM – HP Branded
- Driver #1 found: Version 11.8.75.0 (new), usable with Intel - 82567LM

Because the newer version does not include the “HP Branded” part, it is again not installed by DPInst.

Once the strange behavior was clear, the next question: How do we fix this?

Option #1: You try to get a new driver from the vendor (in this case HP) which included the “HP Branded” option and will cause DPInst to update the driver. Unfortunately, HP hasn’t adopted the new version from Intel so far, so this isn’t possible.

Option #2: You use “Add or Remove Programs” and remove the driver packages DPInst has installed (this is automatically done by it). Then, remove the old driver directory from the DPInst folder.

Since now the old driver are activated again (without the HP Branded part within the INF), DPInst will happily pick up the new version we wanted to use from the beginning.

Who said driver installation is supposed to be Plug and Play?

No comments:

Post a Comment