Configuring the Client Registry for NIC Variations
Modifying the registry to support minor variation in NIC PCI headers.
Problem:
Customer is reporting that identical hardware platforms won’t boot BXP properly. Certain client systems hang indefinitely during the boot up process.
Cause:
After close examination of the problem, it has been determined that the systems are NOT identical. Subtle differences in the Ethernet controller are causing the problem. These subtle differences are causing XP not to recognize the Ethernet controller and begin the process of ‘New Hardware’ installation.
Even if the chips use the same software driver, differences in the Subsystem and/or Revision can prevent XP/BXP from recognizing it properly. The Table below displays the PCI header information for the Ethernet controllers from the 2 different systems:
PCI Information
Unit A (Boots properly)
Unit B (Hangs during boot)
Vendor Id
8086
8086
Device Id
1229
1229
Subsystem
00000000
30008086
Revision
08
08
The different subsystem is the cause of the problem in this case. Additionally, if the Revision were different while all other fields remain identical, the same problem would occur.
Solution:
The solution requires modification of the registry to “trick” Xp into thinking it has seen this Ethernet controller previously.
This solution assumes the same software driver can be used to support both versions of the NIC chipset.
For the purposes of implementing this solution, I will be referring to 2 units: A and B.
Unit A will have a HD used to install XP and BXP Client.
Unit B will be our problem unit (No HD)
You will also need a previously configured BXP Server.
Disclaimer: This document assumes the reader is familiar with terminology associated with the registry (Hives, Keys, Values, GUID, …) and is comfortable making direct modifications to the registry. Improper modifications to the registry can prevent the system from booting.
Step 1 C Identify the PCI Configuration information on Unit B (our problem unit)
Within the PCI configuration header information, there are 4 pieces of information we need: Vendor Id, Device Id, Subsystem (Vendor and Id), and Revision Id.
If you do not know this information, 3rd party utilities are available on the internet. I searched for ‘Pciview” and used a DOS version from Canopus (canopus.com/US/products/free … lities.asp)
This is a partial printout of the PCI configuration header for the Ethernet Controller from Unit B.
(Notice the byte order is reversed C I’ve written it down in the format you will need later)
Offset 0x00 & 0x01 = Vendor Id = 8086
Offset 0x02 & 0x03 = Device Id = 1229
Offset 0x08 = Revision Id = 08
Offset 0x2c―0x2F = Subsystem Id = 30008086
Step 2 C Modifying the Registry
Begin with the normal steps for installing and preparing a client for BXP.
-
Install XP on Unit A.
-
Install BXP Client on Unit A.
-
Enable the ‘Boot from Lan’ option in the BIOS of Unit A.
-
On the BXP Server, configure Unit A to boot from HD First.
-
Boot Unit A.
-
Build the BXP Client Image using the BXP Image Builder.
After completing the image build…
-
Start the registry editor (regedit)
-
Click on the HKEY_LOCAL_MACHINE key.
-
Use File / Load Hive to load the System hive from the BXP Image you just created. The system hive is located in
(VirtualDrive):\WINDOWS\SYSTEM32\CONFIG\SYSTEM
-
You will be prompted to give the new Hive a name. For this example, I used ‘Client-SystemHive’
-
All of the Keys used in the remaining steps will be from this hive only. Make sure you examine and modify the proper hive.
-
Choose the ‘Select’ Key under the Client hive:
Client-SystemHive\Select
Examine the values for this key. Note the ‘Default’ value
Client-SystemHive\Select\Default
This indicates which ControlSet will be used when XP boots.
In this example, Default is a 1, which indicates we will be using ControlSet001.
- In the appropriate ControlSetnnn Key, examine the Services\BNNS\Parameters Key
In this example, we are using
Client-SystemHive\ControlSet001\Services\BNNS\Parameters
- In the Parameters Key, write down the value for the Interface0 Value. It’ll be a GUID.
This GUID identifies the NIC that BXP is bound to.
In this example, it’s {18F9C371-4f81-4a49-b59c-e977917a44ba}
- Now open the ControlSetnnn\Control\Class\ key.
Under this key, you will see numerous keys whose name is a GUID.
Look for {4d36e972-e325-11ce-bfc1-08002be10318}
Examine the Class Value C It should say ‘Net’. If it doesn’t, you’re looking at the wrong key.
Open the key and examine the subkeys. Subkeys of this key will be 0000, 0001, 0002, …
Examine the values in each of these subkeys until you find the one whose value for ‘NetCfgInstanceId’ matches the GUID from Step 8.
Remember this GUID and index combination. It’ll be used later.
In this example, it’s {4d36e972-e325-11ce-bfc1-08002be10318}\0001
- Open the ControlSetnnn\Enum\PCI Key
The subkeys will have the format
VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx
Find the key that matches your Vendor Id and Device Id from Unit B (Step 1).
For this example, it’s
VEN_8086&DEV_1229&SUBSYS_xxxxxxxx&REV_xx
Each of these keys will have another subkey consisting of some numbers and ‘&’ characters.
For this example, it’s “3&61aaa01&0&30”
Search each of the
VEN_8086&DEV_1229&SUBSYS_xxxxxxxx&REV_xx\x&xxxxxxx&x&xx keys.
Examine the values for each of these keys until you find one whose ‘Driver’ value matches the GUID and index combination (From Step 9).
Driver = {4d36e972-e325-11ce-bfc1-08002be10318}\0001
- Once you’ve found the matching ‘Driver’ value. Select the VENxxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx key that contained that matching ‘Driver’ entry.
In my case, it was
VEN_8086&DEV_1229&SUBSYS_00000000&REV_08
- Export this key to a file by choosing ‘Export…’ from the File menu or right-click and choose Export from the pop-up menu.
For this example, it’s called BxpPci.reg
(Don’t close regedit C we’ll be back to it in a moment)
- Open the exported file in NOTEPAD and VERY CAREFULLY make the following changes…
13.1 (Optional) You may change the ‘DeviceDesc’ field to use a different text string.
“DeviceDesc”=“Intel(R) 82559 Fast Ethernet LAN on Motherboard”
I appended “(Bxp)” on the end
“DeviceDesc”=“Intel(R) 82559 Fast Ethernet LAN on Motherboard (Bxp)”
13.2 Remove the following keys and their values from the file (if they are present).
LogConf
Control
In my case, they are shown as the following…
[HKEY_LOCAL_MACHINE\Client-SystemHive\ControlSet001\Enum\PCI\VEN_8086&DEV_1229&SUBSYS_00000000&REV_08\3&61aaa01&0&30\LogConf]
[HKEY_LOCAL_MACHINE\Client-SystemHive\ControlSet001\Enum\PCI\VEN_8086&DEV_1229&SUBSYS_00000000&REV_08\3&61aaa01&0&30\Control]
13.3 Remove the following values
LocationInformation
UINumber
In this example, they exist in the following Key
[HKEY_LOCAL_MACHINE\Client-SystemHive\ControlSet001\Enum\PCI\VEN_8086&DEV_1229&SUBSYS_00000000&REV_08\3&61aaa01&0&30]
13.4 Embedded in the key names are the Subsystem Id and Revision Id you need to change. These appear in several places and you will need to change all of them using the subsystem Id and Rev Id from Unit B. (You got this information back in Step 1)
Replace the SUBSYS and/or REV entries with the value from Unit B.
In this example, the key has the following name:
VEN_8086&DEV_1229&SUBSYS_00000000&REV_08
I carefully changed it (in 3 places) to
VEN_8086&DEV_1229&SUBSYS_30008086&REV_08
-
Exit notepad, saving the changes back into the file.
-
Go back to Regedit and import the modified file back into the registry by choosing ‘Import…’ from the File menu.
(If you get an error, you may need to set the permission on the Enum\PCI Key. Select the Enum\PCI key, and choose Edit\Permissions… from the menu. Grant yourself ‘Full Control’ and click OK.)
After completing the import, you should see the new key listed in the Enum\PCI Key. (You may need to press F5 to have Regedit refresh the display.)
-
Select the [HKEY_LOCAL_MACHINE\Client-SystemHive] and unload it from the registry using File \ Unload Hive… from the menu.
-
Shutdown Unit A.
-
Enable the ‘Boot from Lan’ option in the BIOS of Unit B.
-
Boot Unit B and configure it to use the same Vdisk image as Unit A.