在功能驱动程序中创建设备对象
每个 函数驱动程序 都会为其系统上存在的每个受支持的设备创建一个框架设备对象。 由于这些设备对象由函数驱动程序创建,因此它们称为功能设备对象 (FDO) 。 每个 FDO 都是设备的函数驱动程序表示形式。
每次框架调用驱动程序的 EvtDriverDeviceAdd 回调函数时,函数驱动程序都必须创建框架设备对象。 框架调用此回调函数以通知驱动程序其支持的某个设备存在于系统上。
驱动程序的 EvtDriverDeviceAdd 回调函数接收指向 WDFDEVICE_INIT 结构的指针。 驱动程序可以调用一组 框架设备对象初始化方法,这些方法将信息存储在WDFDEVICE_INIT结构中。 此外,函数驱动程序可以调用 框架 FDO 初始化方法。
在函数驱动程序中创建框架设备对象通常包括以下步骤:
注册 PnP、电源和电源策略回调函数。
大多数函数驱动程序调用 WdfDeviceInitSetPnpPowerEventCallbacks 来注册 PnP 和电源回调函数。 有关这些回调函数的详细信息,请参阅 支持函数驱动程序中的 PnP 和电源管理。
如果设备支持低功耗空闲或具有唤醒功能,则函数驱动程序通常还会调用 WdfDeviceInitSetPowerPolicyEventCallbacks 来注册电源策略回调函数。 有关这些回调函数的详细信息,请参阅 Power Policy 所有权。
注册特定于函数驱动程序的回调函数。
某些函数驱动程序调用 WdfFdoInitSetEventCallbacks(如果它们必须参与指定设备所需的系统硬件资源)。 有关硬件资源的详细信息,请参阅 Framework-Based驱动程序的硬件资源。
注册文件事件回调函数。
如果驱动程序在应用程序打开或关闭设备上的文件时必须响应,则驱动程序必须调用 WdfDeviceInitSetFileObjectConfig 来为框架文件对象注册回调函数。 有关详细信息,请参阅 使用框架文件对象。
设置 I/O 请求属性。
如果驱动程序将从框架队列对象接收 I/O 请求,驱动程序可以调用 WdfDeviceInitSetRequestAttributes 来设置框架将分配给设备请求对象的上下文内存。 有关详细信息,请参阅 使用请求对象上下文。
设置设备特征。
通常,函数驱动程序调用以下一些方法来指定设备的特征:
- WdfDeviceInitSetDeviceType,用于标识驱动程序支持的硬件类型。
- WdfDeviceInitSetIoType,用于标识用于访问数据缓冲区的方法(如果驱动程序处理来自应用程序的 I/O 请求)。
- WdfDeviceInitSetCharacteristics,用于设置设备特征,例如设备是只读的还是支持可移动媒体。
- WdfDeviceInitSetExclusive(如果设备一次需要一个应用程序独占访问)。
- WdfDeviceInitSetPowerInrush,如果设备在从低功耗状态转换到其工作状态时需要当前 (D0) 状态。
- WdfDeviceInitSetPowerPageable 或 WdfDeviceInitSetPowerNotPageable,以指示当系统在睡眠状态与工作 (S0) 状态之间转换时,驱动程序是否必须访问可分页数据。
- WdfDeviceInitAssignName,用于将名称分配给设备对象。
- WdfDeviceInitAssignSDDLString,用于向设备对象分配安全描述符。
- WdfDeviceInitSetDeviceClass,用于标识设备的安装程序类。
获取设备属性。
有时,函数驱动程序必须获取有关设备总线的驱动程序或其他较低级别驱动程序设置的设备属性的信息。 驱动程序可以调用 WdfFdoInitQueryProperty 或 WdfFdoInitAllocAndQueryProperty 来获取此信息。 面向 Windows 8.1 及更高版本的新驱动程序可以调用 WdfFdoInitQueryPropertyEx 和 WdfFdoInitAllocAndQueryPropertyEx。
访问设备的注册表项。
某些函数驱动程序必须获取有关另一个驱动程序、用户或安装包放置在注册表中的设备或驱动程序的信息。 驱动程序可以调用 WdfFdoInitOpenRegistryKey 以打开设备或驱动程序的注册表项。 有关详细信息,请参阅 在Framework-Based驱动程序中使用注册表。
创建用于动态枚举的默认子列表配置。
如果要为总线编写函数驱动程序,并且驱动程序将执行连接到总线的子设备的动态枚举,则驱动程序必须调用 WdfFdoInitSetDefaultChildListConfig。 有关详细信息,请参阅 枚举总线上的设备。
创建设备对象。
创建设备对象的最后一步是调用 WdfDeviceCreate。