在 UMDF 中将 I/O 请求发送到常规 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 入门

UMDF 驱动程序可以同步或异步将 I/O 请求发送到常规 I/O 目标。

如果驱动程序以同步方式发送 I/O 请求,则驱动程序线程一次发送一个请求。 线程在发送下一个请求之前等待每个请求完成。 此过程比异步发送 I/O 请求简单。 如果驱动程序不发送多个请求,并且当驱动程序等待每个 I/O 请求时系统或设备性能未降低,则驱动程序可以同步发送 I/O 请求。

如果驱动程序异步发送 I/O 请求,驱动程序线程会在请求准备好发送后立即发送每个请求,而无需等待以前发送的请求完成。 如果驱动程序必须在短时间内处理许多 I/O 请求,则驱动程序可能无法等待每个请求完成,然后再发送下一个请求。 否则,驱动程序可能会丢失数据或设备的性能,并且可能会降低整个系统的性能。

在 UMDF 驱动程序可以将 I/O 请求发送到 I/O 目标之前,驱动程序必须设置请求的格式。 下表列出了驱动程序可以调用以设置 I/O 请求格式的方法。 驱动程序可以使用这些方法设置驱动程序在其 I/O 队列之一中收到或驱动程序创建的请求的格式。

方法 目的

IWDFIoRequest::FormatUsingCurrentType

设置驱动程序从框架收到的请求的格式,以便驱动程序可以将请求(未经修改)发送到目标

IWDFIoTarget::FormatRequestForIoctl

设置设备控制请求的格式

IWDFIoTarget::FormatRequestForRead

设置读取请求的格式

IWDFIoTarget::FormatRequestForWrite

设置写入请求的格式

IWDFIoTarget2::FormatRequestForFlush

设置刷新缓冲区请求的格式。

IWDFIoTarget2::FormatRequestForQueryInformation

设置请求的格式以获取文件信息。

IWDFIoTarget2::FormatRequestForSetInformation

设置设置文件信息的请求的格式。

若要将 I/O 请求发送到 I/O 目标,驱动程序会调用 IWDFIoRequest::Send 方法。 若要同步发送 I/O 请求,驱动程序会将 WDF_REQUEST_SEND_OPTION_SYNCHRONOUS 标志传递给 Flags 参数。 否则,驱动程序以异步方式发送 I/O 请求。 如果驱动程序以异步方式发送 I/O 请求,则当另一个驱动程序完成请求时,驱动程序通常需要通知。 驱动程序应定义 IRequestCallbackRequestCompletion::OnCompletion 回调函数,并通过调用 IWDFIoRequest::SetCompletionCallback 方法注册它。 有关详细信息,请参阅 完成 I/O 请求

调用 IWDFIoRequest::Send 以发送 I/O 请求的驱动程序可以稍后通过调用 IWDFIoRequest::CancelSentRequest 方法尝试取消请求。 如果驱动程序取消驱动程序从框架接收的 I/O 请求,则驱动程序必须始终通过调用 IWDFIoRequest::CompleteIWDFIoRequest::CompleteWithInformation 方法完成请求,并将 CompletionStatus 参数设置为 STATUS_CANCELLED。 如果驱动程序创建了请求对象,驱动程序将调用 IWDFObject::D eleteWdfObject ,而不是完成请求。