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

警告

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

有关详细信息,请参阅使用 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 方法的调用。

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