The first driver to claim a device obtains ownership of that device, either shared or exclusive.
Driver load order is determined by entries in the \Machine\System\CurrentControlSet key in the registry. This key has a Control subkey containing system-wide information and a Services subkey containing driver-specific information.
During system initialization, when a driver is loaded depends on the following characteristics:
A driver can have one of the following values in \Machine\System\CurrentControlSet\Services\DriverName\Start:
Start Value |
When Started |
SERVICE_BOOT_START (0x0) |
By OS loader (Phase 2) |
SERVICE_SYSTEM_START (0x01) |
During OS initialization (Phase 5) |
SERVICE_AUTO_START (0x02) |
By Service Control Manager during startup (Phase 8) |
SERVICE_DEMAND_START (0x03) |
On demand, by Service Control Manager |
SERVICE_DISABLED (0x04) |
Not started |
Drivers with start values of SERVICE_BOOT_START and SERVICE_SYSTEM_START can be organized into groups to further structure the order in which they are loaded.
\Machine\System\CurrentControlSet\Control\ServiceGroupOrder contains a list of the driver load service groups. The list is scanned twice. First, all drivers with start value SERVICE_BOOT_START are loaded; then all drivers with start value SERVICE_SYSTEM_START are loaded.
System Bus Extender Scsi miniport port Primary disk SCSI class SCSI CDROM class filter boot file system Base Pointer Port Keyboard Port Pointer Class Keyboard Class Video Init Video Video Save file system Event log Streams Drivers PNP_TDI NDIS TDI NetBIOSGroup SpoolerGroup NetDDEGroup Parallel Arbitrator extended base RemoteValidation PCI Configuration
If a driver is a member of a load service group, the group name is listed in
the driver’s services subkey in the registry (\Machine\Hardware\System\
CurrentControlSet\Services\DriverName\Group).
After all ServiceGroupOrder groups of a given Start value have been loaded, the system loads all groups not in the list and then all drivers without a group.
Drivers that are in a load group and have a start value of SERVICE_BOOT_START or SERVICE_SYSTEM_START can use tags to indicate their load order within the group.
\Machine\Hardware\System\CurrentControlSet\Services\Disk DependOnGroup:REG_MULTI_SZ:SCSI miniport ErrorControl:REG_DWORD:0 // = SERVICE_ERROR_IGNORE Group:REG_SZ:SCSI class Start:REG_DWORD:0 // = SERVICE_BOOT_START Type:REG_DWORD:0x1 // = SERVICE_KERNEL_DRIVER Tag:REG_DWORD:0x2 :
The disk class driver is in the SCSI class group and its group tag is 2.
\Machine\Hardware\System\CurrentControlSet\Control\GroupOrderList : SCSI CDROM Class:REG_BINARY:02 00 00 00 01 00 00 00 02 00 00 00 SCSI Class:REG_BINARY:03 00 00 00 01 00 00 00 02 00 00 00 03... SCSI miniport:REG_BINARY:24 00 00 00 00 01 00 00 01 ... :
Within the SCSI class group, drivers with tag 1 are loaded first, then drivers with tag 2, and then drivers with tag 3. Drivers without a tag are loaded last in their group.
Not every group is included in the GroupOrderList. When a group is not in the GroupOrderList, the order in which the drivers load within the group cannot be guaranteed.
Prerequisite drivers are listed in a driver’s services subkey in the DependOnGroup and DependOnService entries. The services subkey for the disk class driver shown above indicates that this driver cannot be loaded until at least one driver from the SCSI miniport group has been loaded.
To define the load order for a new driver, assign the driver a start value, a service group (optional), a group tag (optional), and prerequisite drivers (optional).
The start value must be one of the system-defined SERVICE_xxx values.
The service group can be an existing system-defined group or a new group. If
you define a new group, add it to \Machine\System\CurrentControlSet
\Control\ServiceGroupOrder. Note that ServiceGroupOrder is reset
during a system upgrade, so drivers that modify this registry key may need to
be reinstalled after an upgrade.
Use an existing group tag, or define a new one in \Machine\System
\CurrentControlSet\Control\GroupOrderList.
List prerequisite drivers in DependOnGroup and DependOnService in the driver’s services key.
A driver writer can modify the registry using routines, INF files, or the Windows NT registry editor (regedt32). During driver development it may be convenient to edit the registry manually with the registry editor. When the driver is nearing completion, it is best for the driver to make any necessary registry changes using routines (RtlCreateRegistryKey and RtlWriteRegistryValue) or through the driver’s INF file. For more information on runtime library routines, see the Kernel-Mode Driver Reference. For more information on INF files, see Chapter 2.