驱动程序创建的文件对象与应用程序创建的文件对象

警告

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 入门

当应用程序打开设备的句柄时,框架会调用驱动程序的 IQueueCallbackCreate::OnCreateFile 方法,并为与设备关联的文件对象提供指向 IWDFFile 接口的指针。 应用程序发送到打开的句柄的任何 I/O 请求都与创建的文件对象相关联。 当此类请求到达时,框架会从驱动程序提供的 UMDF 队列对象接口之一调用相应的方法。 然后,驱动程序可以调用 IWDFIoRequest::GetFileObject 来确定与请求关联的文件对象。 驱动程序可以对文件对象调用 AssignContext ,以关联特定于 I/O 会话的上下文。

下表显示了应用程序发出的调用以及驱动程序接收的结果通知。

应用程序启动 驱动程序接收

对 Microsoft Win32 CreateFile 函数的 调用。

对其 IQueueCallbackCreate::OnCreateFile 方法的 调用。

调用 Win32 ReadFileExWriteFileExDeviceIoControl 函数。

对其 IQueueCallbackRead::OnReadIQueueCallbackWrite::OnWriteIQueueCallbackDeviceIoControl::OnDeviceIoControl 方法的 调用。

对文件对象最后一个打开句柄的 Win32 CloseHandle 函数的调用。

对其 IFileCallbackCleanup::OnCleanupFile 方法的 调用。

驱动程序取消或完成与文件对象关联的所有 I/O 请求。

驱动程序从清理通知返回后,UMDF 将取消任何挂起的 I/O 请求。

清理完成后,UMDF 取消挂起的 I/O 请求后,驱动程序将收到对其 IFileCallbackClose::OnCloseFile 方法的 调用。

系统组件可以代表通用 Windows 应用发出创建请求。 如果驱动程序需要确定发出创建请求的应用的进程 ID,它可以调用 IWDFFile3::GetInitiatorProcessId 方法。

驱动程序创建的文件对象

如果驱动程序需要创建独立于应用程序的 I/O 请求并将其发送到堆栈中的下一个驱动程序 (默认 I/O 目标) ,则驱动程序必须调用 IWDFDevice::CreateWdfFile 来检索指向 IWDFDriverCreatedFile 接口的指针。 在这种情况下,下一个驱动程序接收的通知与应用程序生成请求时驱动程序收到的通知相同。

下表显示了驱动程序发出的调用,以及对堆栈中下一个驱动程序的结果通知。

驱动程序启动 堆栈中的下一个驱动程序接收

IWDFDevice::CreateWdfFile 方法的 调用。

UMDF 创建的文件对象表示设备与堆栈中下一个设备之间的 I/O 会话。

对其 IQueueCallbackCreate::OnCreateFile 方法的 调用。

IWDFDevice::CreateRequest 方法的 调用。

调用格式化请求 (例如,对 IWDFIoTarget::FormatRequestForIoctl 方法的调用) 。

IWDFIoRequest::Send 方法的调用。

对其 IQueueCallbackRead::OnReadIQueueCallbackWrite::OnWriteIQueueCallbackDeviceIoControl::OnDeviceIoControl 方法的 调用。

IWDFDriverCreatedFile::Close 方法的调用。

对其 IFileCallbackCleanup::OnCleanupFile 方法的 调用。

驱动程序取消或完成与文件对象关联的所有 I/O 请求。

驱动程序从清理通知返回后,UMDF 将取消任何挂起的 I/O 请求。

清理完成后,UMDF 取消挂起的 I/O 请求后,驱动程序将收到对其 IFileCallbackClose::OnCloseFile 方法的 调用。

对于堆栈中的下一个设备,应用程序创建的文件对象与较高层设备创建的文件对象之间不存在任何差异。