I just might be able to help with this. After some searching in my ancient notes I found some snapshots of an experiment I did ( about 13 years ago! ) moving a modem to different PCI slots on an MSI motherboard using Win98se.
But first a digression! ... Let me explain what I deduced about how a motherboard works in concert with the Win9x registry from experimental trial and error. I believe that hardware device information is entered into the registry by
CfgMgr32.dll at Windows Install, during the PnP phase at bootstrap, Add/Remove a device, when INF files are executed, when Device Manager or the kernel specifically calls it and perhaps at other times as well
Using the IDE bus as an example ( limiting this to "
Type80" for brevity but "
Type47" seems interchangeable ), moving a HDD among the four possible positions ( PM PS SM SS ) results in four different
key names ( subvalues not shown ) ...
[HKEY_LOCAL_MACHINE\Enum\Esdi\Generic_IDE__Disk_Type80_\Mf&Child0000&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0100]
[HKEY_LOCAL_MACHINE\Enum\Esdi\Generic_IDE__Disk_Type80_\Mf&Child0000&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0110]
[HKEY_LOCAL_MACHINE\Enum\Esdi\Generic_IDE__Disk_Type80_\Mf&Child0001&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0100]
[HKEY_LOCAL_MACHINE\Enum\Esdi\Generic_IDE__Disk_Type80_\Mf&Child0001&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0110]
Which I decode as follows ...
; PM ... Primary Master ..... Child0000 ... Func_0100
; PS ... Primary Slave ...... Child0000 ... Func_0110
; SM ... Secondary Master ... Child0001 ... Func_0100
; SS ... Secondary Slave .... Child0001 ... Func_0110
This is important because Windows is keeping track of the four possible positions as separate entities. Hardware seems to be utilized from a positional basis. Continuing this example, each specific position on either IDE channel is hard-coded into the registry key
name, and is necessary because of the way the two "
ASD" keys work. These two keys to the best of my knowledge ( which means trial and error because this information is really sparse ) are critical to system startup and I believe the contents are executed directly in sequential order by the kernel in Win9x ( like CONFIG.SYS in plain DOS ). Their purpose ...
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{9b4e7760-3196-11cf-97ea-00aa0034319d}]
;;; These devices are Enumerated
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{cf2524c0-29ae-11cf-97ea-00aa0034319d}]
;;; These devices are Started
Most devices appear in both locations, but some are only seen in the latter ( I can't recall if any were only "Enumerated" ). This is where I did my hardware debugging ( and I learned that I could simply hand-edit the entries myself and import custom settings to "move" hardware around at will and some other tricks ). When a device would not work I would look here to see if the entries were correct and if it "Enumerated" and "Started". There are some more things to the "ASD" keys, and there are more than two, but that's probably beyond the current scope of this thread.
Okay, now here are the 4 possible ways a given HDD is later "Enumerated" and "Started" ( again: defined by bus location only, they are not identified by serial like NT is, in other words Win9x starts whatever HDD happens to be in that position ) ...
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{9b4e7760-3196-11cf-97ea-00aa0034319d}]
; Enumerate HDD Type 80 on PM ...
"Esdi\\Generic_IDE__Disk_Type80_\\Mf&Child0000&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0100"=hex:00
; Enumerate HDD Type 80 on PS ...
"Esdi\\Generic_IDE__Disk_Type80_\\Mf&Child0000&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0110"=hex:00
; Enumerate HDD Type 80 on SM ...
"Esdi\\Generic_IDE__Disk_Type80_\\Mf&Child0001&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0100"=hex:00
; Enumerate HDD Type 80 on SS ...
"Esdi\\Generic_IDE__Disk_Type80_\\Mf&Child0001&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0110"=hex:00
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{cf2524c0-29ae-11cf-97ea-00aa0034319d}]
; Start HDD Type 80 on PM ...
"Esdi\\Generic_IDE__Disk_Type80_\\Mf&Child0000&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0100"=hex:00
; Start HDD Type 80 on PS ...
"Esdi\\Generic_IDE__Disk_Type80_\\Mf&Child0000&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0110"=hex:00
; Start HDD Type 80 on SM ...
"Esdi\\Generic_IDE__Disk_Type80_\\Mf&Child0001&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0100"=hex:00
; Start HDD Type 80 on SS ...
"Esdi\\Generic_IDE__Disk_Type80_\\Mf&Child0001&Pci&Ven_8086&Dev_24db&SubSys_101e147b&Rev_02&Bus_00&Dev_1f&Func_0110"=hex:00
If you look closely you see how incredibly simple the mechanism is that the system uses to "call" those keys, it merely repeats the actual registry key name ( collapse the double "\\" escaped backslashes ) as
value names and ends it with "=hex:00"
value data, which indicates "okay" and "no problem"..
If these were optical drives, the strategy is exactly the same but they appear under different key names, such as
\Enum\Scsi\.
Important: the
official comment for those two keys is actually
"Problem"="Enumerating a Device" and
"Problem"="Starting a Device", but my trial and error suggests that that is only part of the story. When a device fails, indeed the entry is modified from "hex:00" to something else, but this is long after the fact. These two keys apparently are the Win9x equivalent of CONFIG.SYS where all entries are executed in order. Removing an entry effectively removes the device. Moreover, I noticed that the system bootstrap ( the Windows cloud screen with the animated bar ) is quicker when the entries are deleted for items that do not physically exist, which makes sense because it is trying to handshake an empty location or worse, a non-terminated bus. So when I see a system hang on the "Cloud Screen" I normally would audit the "ASD" keys for dead entries for ones that point to the wrong position.
So that ends my rough overview of how I believe the Win9x kernel "CONFIG.SYS procedure" works. There are some major differences in how the NT Windows versions operate and I never really got a clear handle on it. Win9x works relatively simply, almost exactly like DOS and CONFIG.SYS. Back to the current topic ...
So I set about finding some corresponding snapshots for something in the PCI slots, and I got lucky with a well documented test complete with registry snapshots before and after moving a WinModem to each PCI slot position, and I even noted the corresponding BIOS hardware information as seen by HwInfo ( 3rd party hardcore system information ). Here it is with the changes shown, the duplicate information between tests removed ...
;;; this is from a WinModem in TOP SLOT (#1) ... HWINFO: Irq9 PCI Device Number: Bus: 1, Device: 0, Function: 0
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\00f000]
; dupes under here
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{9b4e7760-3196-11cf-97ea-00aa0034319d}]
; Entry under "Enumeration" key not always present ( maybe this modem only needs to be "Started"
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{cf2524c0-29ae-11cf-97ea-00aa0034319d}]
"Pci\\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\\00f000"=hex:00
;;; this is from a WinModem in MIDDLE SLOT (#2) ... HWINFO: Irq11 PCI Device Number: Bus: 1, Device: 1, Function: 0
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\08f000]
; dupes under here
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{9b4e7760-3196-11cf-97ea-00aa0034319d}]
; Entry under "Enumeration" key not always present ( maybe this modem only needs to be "Started"
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{cf2524c0-29ae-11cf-97ea-00aa0034319d}]
"Pci\\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\\08f000"=hex:00
;;; this is from a WinModem in BOTTOM SLOT (#3) ... HWINFO: Irq3 PCI Device Number: Bus: 1, Device: 2, Function: 0
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\10f000]
; dupes under here
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{9b4e7760-3196-11cf-97ea-00aa0034319d}]
; Entry under "Enumeration" key not always present ( maybe this modem only needs to be "Started"
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Asd\Prob\{cf2524c0-29ae-11cf-97ea-00aa0034319d}]
"Pci\\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\\10f000"=hex:00
Distilled down for easier comparison and readability ...
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\00f000]
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\08f000]
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\10f000]
What I would conclude from those tests is that the PCI slots are definitely serialized with that 6-digit hex number added as a registry subkey ( e.g.,
\00f000] ), and the corresponding mapping is ...
00f000 ...... TOP SLOT (#1) ... PCI Device Number: Bus: 1, Device: 0, Function: 0
08f000 ... MIDDLE SLOT (#2) ... PCI Device Number: Bus: 1, Device: 1, Function: 0
10f000 ... BOTTOM SLOT (#3) ... PCI Device Number: Bus: 1, Device: 2, Function: 0
If there was a 4th, 5th, 6th PCI slot in that motherboard we might assume it would merely increment in the same fashion ...
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\00f000]
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\08f000]
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\10f000]
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\18f000]
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\20f000]
[HKEY_LOCAL_MACHINE\Enum\Pci\Ven_11c1&Dev_0441&SubSys_041013e0&Rev_01\28f000]
Also note that in the test data above, the ASD key "starts" the associated key depending on which slot the modem was in.
To the OP,
naaloh ... if you still have access to that machine, you can determine this for yourself by doing full registry exports with the device in different slots. You may want to first remove the device ( although it may not remove all entries ) and take a preliminary snapshot with nothing and then proceed with a separate export after installing it and after each time it is moved. Then WINDIFF can tell you everything you need to know. It's the only sure way to decode the positions with 100% certainty.
P.S. Note that I disregarded the IRQs used by the modem. At least in Win9x and as long as the motherboard works correctly the actual IRQs are fungible ( although there are many motherboards with strange designs that only allow certain IRQs to certain slots ). I am disregarding them in this case because they are not noted in the registry, this is one difference I believe in the NT kernel but I really cannot say for sure. For all practical purposes, the IRQs have little to do with Win9x and this can be proven if you ever tried to manage them from Device Manager which has little facility for successfully adjusting them. The BIOS does the juggling and stores them in CMOS ( which can be dumped to a file and examined ). If in a hypothetical BIOS you could simply change the IRQ from 9 to 11 ( assuming free ), the registry wouldn't know and wouldn't care. This is to the best of my knowledge, YMMV, because I obviously haven't seen every possible eventuality.
EDIT: clarity, typos
This post has been edited by CharlotteTheHarlot: 18 February 2013 - 11:04 PM