在 UMDF 中控制常规 I/O 目标的状态

警告

UMDF 2 是 UMDF 的最新版本,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 不会向 UMDF 1 添加任何新功能,并且较新版本的 Windows 10 上对 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。

存档的 UMDF 1 示例可在 Windows 11 版本 22H2 - 2022 年 5 月驱动程序示例更新中找到。

有关详细信息,请参阅使用 UMDF 入门

框架为常规 I/O 目标定义了以下状态:

开始
I/O 目标处于打开状态, (即 UMDF 驱动程序) 可用,驱动程序可以向其发送 I/O 请求。 框架将请求传递给相应的驱动程序。

停止
I/O 目标处于打开状态,但 UMDF 驱动程序无法向 I/O 目标发送 I/O 请求,除非驱动程序在调用 IWDFIoRequest::Send 方法时将 WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE 标志传递给 Flags 参数。

框架停止向相应的驱动程序传递请求。

对于 Query-Remove 关闭
I/O 目标暂时关闭,因为其设备可能很快被删除。

关闭
I/O 目标已关闭,无法启动或停止。

删除
I/O 目标的设备已被删除。

WDF_IO_TARGET_STATE枚举定义表示这些状态的值。

本地 I/O 目标状态

框架会自动打开并启动本地 I/O 目标。

如有必要,驱动程序可以调用 IWDFIoTargetStateManagement::Stop 来暂时停止本地 I/O 目标,并调用 IWDFIoTargetStateManagement::Start 来重启它。 例如,如果驱动程序检测到临时错误条件,则驱动程序可能会停止本地 I/O 目标,如果错误条件得到更正,则重启 I/O 目标。

如果删除了本地 I/O 目标的设备,框架会自动停止并关闭 I/O 目标,并 取消 目标队列中的所有 I/O 请求。 框架通过调用设备对象事件回调函数通知驱动程序设备不再可用。 有关这些回调函数的详细信息,请参阅 UMDF 中的 PnP 和电源管理方案

驱动程序可以调用 IWDFIoTargetStateManagement::GetState 以获取本地 I/O 目标的当前状态。

远程 I/O 目标状态

驱动程序必须调用 IWDFRemoteTarget::OpenFileByNameIWDFRemoteTarget::OpenRemoteInterface 才能打开远程 I/O 目标。 当驱动程序打开远程 I/O 目标时,框架会自动启动 I/O 目标。

如有必要,驱动程序可以调用 IWDFRemoteTarget::Stop 来暂时停止远程 I/O 目标,并调用 IWDFRemoteTarget::Start 来重启它。

如果删除远程 I/O 目标的设备,框架会自动停止并关闭 I/O 目标,并取消目标队列中的所有 I/O 请求,除非驱动程序注册以下事件回调函数:

IRemoteTargetCallbackRemoval::OnRemoteTargetQueryRemove
通知驱动程序远程 I/O 目标的设备可能被删除。 如果希望驱动程序允许删除设备,驱动程序必须调用 IWDFRemoteTarget::CloseForQueryRemove

IRemoteTargetCallbackRemoval::OnRemoteTargetRemoveComplete
通知驱动程序远程 I/O 目标的设备已删除。 此回调函数必须调用 IWDFRemoteTarget::Close

IRemoteTargetCallbackRemoval::OnRemoteTargetRemoveCanceled
通知驱动程序删除远程 I/O 目标的设备的尝试已被取消。 如果希望驱动程序继续使用目标,驱动程序必须调用 IWDFRemoteTarget::Reopen。 通常, 驱动程序从OnRemoteTargetRemoveCanceled 回调函数中调用 重新打开 ,但可以在 OnRemoteTargetRemoveCanceled 返回后调用重新打开。

驱动程序可以调用 IWDFRemoteTarget::GetState 以获取远程 I/O 目标的当前状态。