The devnode tree is constructed after entering protected mode, and after VXDLDR.VXD's early Device_Init. (VXDLDR is very early in the load order.) The root enumerator (which is part of Configuration Manager) creates device nodes for every device it can enumerate. Any static VxD that was loaded for a given device node is then sent a system control call with the following parameters:
EAX = PNP_NEW_DEVNODE EBX = DEVNODE EDX = LOAD_DLVXD_DEVLOADER
At this point, most VxDs return CR_DEVLOADER_NOT_READY. When a static VxD reaches the device initialization stage, it should call the CONFIGMG_Register_DevLoader function. The system will make another PNP_NEW_DEVNODE system control call, at which point the VxD can load the device driver or enumerator. (Often, the device driver and enumerator are in the same binary file, as in the case of ISAPNP.386.) A typical driver must call CONFIGMG_Register_Device_Driver, and an enumerator must additionally call CONFIGMG_Register_Enumerator. Some VxDs will also register arbitrators at this point, using the CONFIGMG_Register_Arbitrator function. Arbitrators should be loaded at SYS_CRITICAL_INIT if they are global.
Configuration Manager will then call any enumerator that has been registered to further enumerate devices. All devices that were enumerated in real mode will have been allocated a complete device node by the end of this process, and any VxD that was loaded for a particular device will have been notified through the new Plug and Play system control call.
Once all device nodes have been created, Configuration Manager will assign resources to each device and call the driver entry point to inform it of its new configuration.
Plug and Play processing early in the system's entry to protected mode might follow a series of steps like this: