当每个 总线驱动程序 发现子设备连接到父设备时,都必须创建一个框架设备对象。 父设备通常是总线,但它也可以是多功能设备,每个功能都需要一组单独的驱动程序 (,例如支持数字音频的声卡和 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 的详细信息,请参阅 在函数驱动程序中创建设备对象。