Step 2: Enumerating Devices on the PCI Bus (Windows CE 5.0)

Send Feedback

After configuring the PCI bus, the PCI bus driver scans the PCI bus again to enumerate devices and match them with registry entries. When the driver enumerates a device, it searches the registry using the device's identifiers.

The following table shows the device identifiers.

Subkey Description
Class Basic function of a device, for example, a mass storage controller.
SubClass Specific subclass of a basic function, for example, an IDE controller.
ProgIF Register-specific programming interface, for example, USB OHCI or UHCI.
VendorID Manufacturer of the device.
DeviceID Type of device.
SubsystemVendorID Vendor of a card or subsystem that uses a device.
SubsystemID Type of card or subsystem that uses a device.
RevisionID Revision number of a device.

The identifiers are listed in order of increasing specificity. When matching a found device with a registry entry, all of the values that are listed in the registry must match the found device. For example, the following table shows the registry entries for a driver that works with all 16550-compatible serial controllers.

Subkey Value Description
Class 7 Simple communications controllers
SubClass 0 Serial
ProgIF 2 16550-compatible serial controller

Note   These values are part of the PCI Revision 2.2 Specification.

If a particular serial driver were tailored to a particular vendor's device, then the VendorID and DeviceID values would be listed as well. The registry entry for this driver would only match a device that contains exactly same Class, SubClass, ProgIF, VendorID and DeviceID. The VendorID, DeviceID, SubsystemVendorID, SubsystemID and RevisionID can have a list of values associated so the driver can be matched with a subset of cards.

Registry Keys Before Enumeration

The following registry example shows the state of the registry before the drivers are enumerated.

[HKEY_LOCAL_MACHINE\Drivers]
    "RootKey"="Drivers"
    "Dll"="BusEnum.dll"

[HKEY_LOCAL_MACHINE\Drivers\Debug]
    "Dll"="BusEnum.dll"
    "Order"=dword:0
    "Flags"=dword:1

[HKEY_LOCAL_MACHINE\Drivers\Debug\KITL]
    "Flags"=dword:4
    "Irq"=dword:1
    "MemBase"=dword:FFBFA000
    "MemLen"=dword:1000
    "SysIntr"=dword:11

[HKEY_LOCAL_MACHINE\Drivers\Virtual]
    "Dll"="BusEnum.dll"
    "Order"=dword:1
    "Flags"=dword:1

[HKEY_LOCAL_MACHINE\Drivers\Virtual\NDIS]
    "Dll"="NDIS.dll"
    "Order"=dword:1
    "Prefix"="NDS"
    "Index"=dword:0

[HKEY_LOCAL_MACHINE\Drivers\CSP]
    "Dll"="BusEnum.dll"
    "Order"=dword:2
    "Flags"=dword:1

[HKEY_LOCAL_MACHINE\Drivers\CSP\Serial]
    "Dll"="Com16550.Dll"
    "Order"=dword:0
    "Irq"=dword:3
    "MemBase"=dword:FFBFC000
    "MemLen"=dword:8
    "SysIntr"=dword:13
    "Prefix"="COM"
    "DeviceArrayIndex"=dword:0
    "Priority"=dword:0

[HKEY_LOCAL_MACHINE\Drivers\CSP\Serial\Unimodem]
    "Tsp"="Unimodem.dll"
    "DeviceType"=dword:0
    "FriendlyName"="Serial Cable on COM1:"
    "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00

[HKEY_LOCAL_MACHINE\Drivers\ISA]
    "Dll"="BusEnum.dll"
    "Order"=dword:3
    "Flags"=dword:1

[HKEY_LOCAL_MACHINE\Drivers\ISA\Serial]
    "Dll"="Com16550.Dll"
    "Order"=dword:0
    "Irq"=dword:4
    "IoBase"=dword:02F8
    "IoLen"=dword:8
    "SysIntr"=dword:14
    "Prefix"="COM"
    "DeviceArrayIndex"=dword:1

[HKEY_LOCAL_MACHINE\Drivers\ISA\Serial\Unimodem]
    "Tsp"="Unimodem.dll"
    "DeviceType"=dword:0
    "FriendlyName"="Serial Cable on COM2:"
    "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00

[HKEY_LOCAL_MACHINE\Drivers\ISA\PCMCIA]
    "Dll"="PCMCIA.dll"
    "Order"=dword:1
    "Irq"=dword:B
    "SysIntr"=dword:1B
    "IoBase"=dword:03e0
    "IoLen"=dword:2

[HKEY_LOCAL_MACHINE\Drivers\PCI]
    "Dll"="PCIbus.dll"
    "Order"=dword:4
    "Flags"=dword:1
    "MemBase"=dword:FFC00000
    "MemLen"=dword:100000
    "IoBase"=dword:D000
    "IoLen"=dword:3000    

[HKEY_LOCAL_MACHINE\Drivers\PCI\Template\Serial]
    "Dll"="Com16550.Dll"
    "Class"=dword:07
    "SubClass"=dword:00
    "ProgIF"=dword:02
    "VendorID"=multi_sz:"0AF0","B320","B320"
    "DeviceID"=multi_sz:"0020","0300","0302"
    "Prefix"="COM"

[HKEY_LOCAL_MACHINE\Drivers\PCI\Template\Serial\Unimodem]
    "Tsp"="Unimodem.dll"
    "DeviceType"=dword:0
    "FriendlyName"="Serial Cable on PCI"
    "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00

[HKEY_LOCAL_MACHINE\Drivers\PCI\Instance\Serial1\Unimodem]
    "FriendlyName"="Serial Cable on COM1:"

[HKEY_LOCAL_MACHINE\Drivers\PCI\Template\NE2000]
    "Dll"="NDIS.dll"
    "ConfigDll"="NE2000cfg.dll"
    "ConfigEntry"="DeviceConfig"
    "Class"=dword:02
    "SubClass"=dword:00
    "ProgIF"=dword:00
    "MiniPort"="NE2000"

; NE2000 common and instance specific information     
[HKEY_LOCAL_MACHINE\Comm\NE2000]
    "DisplayName"="NE2000 Compatible Ethernet Driver"
    "Group"="NDIS"
    "ImagePath"="NE2000.dll"

[HKEY_LOCAL_MACHINE\Comm\NE20001]
    "DisplayName"="NE2000 Compatible Ethernet Driver 1"

[HKEY_LOCAL_MACHINE\Comm\NE20001\Parms]
    "Transceiver"=dword:3

[HKEY_LOCAL_MACHINE\Comm\NE20001\Parms\TcpIp]
    "EnableDHCP"=dword:1
    "DefaultGateway"=""
    "UseZeroBroadcast"=dword:0
    "IpAddress"="0.0.0.0"
    "Subnetmask"="0.0.0.0"

[HKEY_LOCAL_MACHINE\Comm\NE20002]
    "DisplayName"="NE2000 Compatible Ethernet Driver 2"

[HKEY_LOCAL_MACHINE\Comm\NE20002\Parms]
    "Transceiver"=dword:2

[HKEY_LOCAL_MACHINE\Comm\NE20002\Parms\TcpIp]
    "EnableDHCP"=dword:0
    "DefaultGateway"=""
    "UseZeroBroadcast"=dword:0
    "IpAddress"="157.56.148.128"
    "Subnetmask"="255.255.252.0"

See Also

Step 3: Enumerating a PCI Serial Driver | Example: Loading Drivers on the PCI Bus

Send Feedback on this topic to the authors

Feedback FAQs

© 2006 Microsoft Corporation. All rights reserved.