在总线驱动程序中创建设备对象
当每个 总线驱动程序 发现子设备连接到父设备时,都必须创建一个框架设备对象。 父设备通常是总线,但它也可以是多功能设备,每个功能都需要一组单独的驱动程序 (,例如支持数字音频的声卡和 MIDI) 。 总线驱动程序创建的设备对象称为物理设备对象 (PDO) ,因为每个对象都表示一个硬件块的实际连接, (子) 到另一个 (父) 。
标识和报告连接到总线的设备的过程称为 总线枚举。
如果总线驱动程序执行 动态总线枚举,则其 EvtChildListCreateDevice 回调函数接收 WDFDEVICE_INIT 结构的句柄。
如果总线驱动程序执行 静态总线枚举,则必须调用 WdfPdoInitAllocate 以获取WDFDEVICE_INIT结构的句柄。
有关总线枚举的详细信息,请参阅 枚举总线上的设备。
总线驱动程序可以调用一组 框架设备对象初始化方法,这些方法将信息存储在 WDFDEVICE_INIT 结构中。 此外,总线驱动程序可以调用 框架 PDO 初始化方法。
为枚举的子设备创建框架设备对象通常包括以下步骤:
注册特定于总线驱动程序的回调函数。
大多数总线驱动程序调用 WdfPdoInitSetEventCallbacks,因为它们必须指定设备所需的系统硬件资源。 有关指定硬件资源的详细信息,请参阅 Framework-Based 驱动程序的硬件资源。 如果设备和驱动程序支持弹出,则可以注册其他回调函数。
报告 设备标识字符串。
总线驱动程序必须通过为设备支持的每种字符串类型调用 WdfPdoInitAssignDeviceID、 WdfPdoInitAssignInstanceID、 WdfPdoInitAddCompatibleID 和 WdfPdoInitAddHardwareID 来报告设备的标识字符串。 此外,使用框架版本 1.9 或更高版本的总线驱动程序可以调用 WdfPdoInitAssignContainerID。
报告总线驱动程序是否可以在原始模式下支持设备。
如果总线驱动程序支持设备的原始模式,则必须调用 WdfPdoInitAssignRawDevice。
提供描述设备的可显示文本。
总线驱动程序调用 WdfPdoInitAddDeviceText 和 WdfPdoInitSetDefaultLocale ,以多种语言向用户提供描述设备的文本。
创建设备对象。
创建设备对象的最后一步是调用 WdfDeviceCreate。
如果驱动程序在初始化从 WdfPdoInitAllocate 获取的 WDFDEVICE_INIT 结构时遇到错误,则驱动程序必须调用 WdfDeviceInitFree 而不是 WdfDeviceCreate。
总线驱动程序创建设备对象后,通常调用 WdfDeviceSetPnpCapabilities 和 WdfDeviceSetPowerCapabilities 来报告设备的即插即用和电源功能。
每个总线驱动程序也是总线适配器的函数驱动程序。 因此,驱动程序还必须提供 EvtDriverDeviceAdd 回调函数。 此回调函数为系统上的每个总线适配器创建一个功能设备对象 (FDO) 。 有关创建 FDO 的详细信息,请参阅 在函数驱动程序中创建设备对象。