Many Windows 95 driver models, such as IOS and the network driver models, support dynamically loaded device drivers. These VxDs are not loaded by the MS-DOS real mode loader. In the case of IOS, some drivers are true dynamically loaded VxDs, and others are mini-port SCSI drivers that are Windows NT-binary compatible. IOS loads all drivers dynamically. The process used to load these drivers is identical to the process used to dynamically load the same drivers at run-time, except that the sequence of events that starts the load process is slightly different.
Dynamically loaded drivers are required to have a device loader. A device loader is responsible for loading the drivers at the correct time and in the correct order, and for making the proper initialization calls. In the case of SCSI adapter miniport drivers this device loader is IOS. A typical registry driver section for a SCSI adapter looks something like this:
Enum\ISAPNP\*ABC0507\0A35BF46
DeviceDesc=ABC SCSI Vendor ISA Adapter
Class="SCSIAdapter"
Driver="SCSIAdapter\0000"
System\CurrentControlSet\Services\Class\ScsiAdapter\0000
DevLoader=*IOS
MiniPortDriver=ABC.MPD
Since there is no StaticVxD=xxx line in this registry entry, the VMM32 real mode loader will do nothing when the ISAPNP enumerator identifies this device. IOS is a statically loaded base driver; it receives a Device_Init system control message. During this message, IOS calls Configuration Manager to load any drivers that have a DevLoader=IOS entry by calling CONFIGMG_Register_DevLoader with the following parameters:
CM_Register_DevLoader(IOS_DDB, 0);
From within this function, Configuration Manager walks the devnode tree and attempts to find any device node that has a DevLoader=IOS entry in the registry. In this example, it would find the ABC adapter. This causes Configuration Manager to call back to IOS with a system control call to load the driver.
DirectedSysControl("IOS", PNP_NEW_DEVNODE, DLVXD_LOAD_DEVLOADER, LoadDevNode)
IOS then examines the registry and finds the MiniPortDriver=ABC.MPT, loads the driver and any associated support drivers, initializes the adapter, and returns from the function.