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