用户插入设备
在以下方案中,设备节点包括 KMDF 总线驱动程序和支持 PnP 设备的一个或多个 KMDF 函数或筛选器驱动程序。
当用户在系统运行时将设备插入总线时,设备的总线驱动程序和框架将执行以下任务:
设备的总线驱动程序检测设备并调用 WdfChildListAddOrUpdateChildDescriptionAsPresent。 (此过程称为“动态枚举”。)
框架调用总线驱动程序的 EvtChildListCreateDevice 回调函数,因此总线驱动程序可以调用 WdfDeviceCreate 为物理设备创建框架设备对象, (PDO) 。
框架调用总线驱动程序的 EvtDeviceResourcesQuery 和 EvtDeviceResourceRequirementsQuery 回调函数来确定设备所需的系统硬件资源。
有关 KMDF 总线驱动程序的通电序列的详细信息,请参阅 总线驱动程序的通电序列。
接下来,PnP 管理器确定哪些其他驱动程序 (功能驱动程序和筛选器驱动程序) 设备所需的。 如果尚未加载这些驱动程序,PnP 管理器将加载它们并调用其 DriverEntry 例程。 对于每个函数或筛选器驱动程序,将执行以下操作:
框架调用每个附加驱动程序的 EvtDriverDeviceAdd 回调函数,以便驱动程序可以调用 WdfDeviceCreate 来创建表示驱动程序设备的框架设备对象。 函数驱动程序 (FDO) 创建功能设备对象,筛选器驱动程序 (筛选器 DO) 创建筛选器设备对象。
框架调用每个函数和筛选器驱动程序的 EvtDeviceFilterRemoveResourceRequirements 回调函数,然后调用每个驱动程序的 EvtDeviceFilterAddResourceRequirements 回调函数。 在设备启动之前,框架立即调用 EvtDeviceRemoveAddedResources 回调函数。 这三个回调函数允许筛选器和函数驱动程序在 PnP 管理器将资源分配给设备之前修改设备所需的硬件资源列表。 有关详细信息,请参阅 Framework-Based 驱动程序的硬件资源
框架确保设备已达到其工作 (D0) 电源状态。
对于支持设备的每个函数和筛选器驱动程序,框架依次执行以下操作,一次一个驱动程序,从驱动程序堆栈中最低的驱动程序开始:
- 框架 (调用驱动程序的 EvtDevicePrepareHardware 回调函数(如果该函数存在) ),并传递 PnP 管理器分配给设备的硬件资源列表。
- 框架调用驱动程序的 EvtDeviceD0Entry 回调函数 ((如果它存在于) )。
- 框架 (调用驱动程序的 EvtInterruptEnable 回调函数(如果每个中断存在) ),然后调用驱动程序的 EvtDeviceD0EntryPostInterruptsEnabled 回调函数 ((如果) 存在),则调用该驱动程序的 EvtDeviceD0EntryPostEnabled 回调函数(如果它) )。
- 如果硬件和驱动程序支持 DMA,框架将调用驱动程序的 EvtDmaEnablerFill、 EvtDmaEnablerEnable 和 EvtDmaEnablerSelfManagedIoStart 回调函数 (如果它们存在) 创建的每个 DMA 通道。
- 框架调用驱动程序的 EvtChildListScanForChildren 回调函数 ((如果该函数存在于) )。
- 框架启动设备的所有电源托管 I/O 队列。
- 如果驱动程序使用自托管 I/O,框架将调用驱动程序的 EvtDeviceSelfManagedIoInit 回调函数。
有关 KMDF 函数或筛选器驱动程序的通电序列的详细信息,请参阅 函数或筛选器驱动程序的启动序列。