支持 UMDF 驱动程序中的内核模式客户端
本主题介绍从 UMDF 版本 2 开始,User-Mode驱动程序框架 (UMDF) 驱动程序如何支持 内核模式客户端。
内核模式客户端是内核模式驱动程序,用于将 I/O 请求发送到 UMDF 驱动程序。 内核模式驱动程序可能位于 UMDF 驱动程序之上、位于同一设备堆栈中,或者可能位于不同的设备堆栈中。
内核模式驱动程序可以转发从用户模式应用程序收到的 I/O 请求,也可以创建新的 I/O 请求并将其发送到用户模式驱动程序。
如何在 UMDF 驱动程序中支持内核模式客户端
若要启用 UMDF 驱动程序对内核模式客户端的支持,UMDF 驱动程序的 INF 文件必须在其 INF DDInstall 中包含 UmdfKernelModeClientPolicy 指令。WDF 部分。
框架提供了两种对支持内核模式客户端的驱动程序有用的方法。 驱动程序可以调用 WdfRequestGetRequestorMode 方法,以确定 I/O 请求来自内核模式还是用户模式。 如果 I/O 请求来自用户模式,驱动程序可以调用 WdfRequestIsFromUserModeDriver 来确定请求来自应用程序还是来自其他用户模式驱动程序。
内核模式驱动程序的限制
仅当内核模式驱动程序满足以下要求时,UMDF 驱动程序才能处理来自内核模式驱动程序的 I/O 请求:
当内核模式驱动程序发送 I/O 请求时,必须在 IRQL = PASSIVE_LEVEL 运行。
除非驱动程序已将 UmdfFileObjectPolicy INF 指令设置为 AllowNullAndUnknownFileObjects,否则内核模式驱动程序发送到用户模式驱动程序的每个 I/O 请求都必须具有关联的文件对象。 框架之前必须已收到 I/O 管理器创建了文件对象的通知。 (此类通知会导致框架调用用户模式驱动程序的 EvtDeviceFileCreate 回调函数,但该回调函数是可选的。)
I/O 请求不能包含 IRP_MJ_INTERNAL_DEVICE_CONTROL 函数代码。
I/O 请求的缓冲区不得包含指向其他信息的指针,因为用户模式驱动程序无法取消引用指针。
如果 I/O 请求包含指定“两者”缓冲区访问方法的 I/O 控制代码 ,则内核模式驱动程序必须在创建 I/O 请求的应用程序的进程上下文中发送 I/O 请求。 有关如何在 UMDF 驱动程序中支持“既不”方法的详细信息,请参阅 管理 UMDF 驱动程序中的缓冲区访问方法。
UMDF 驱动程序可能会在用户模式下修改 I/O 请求的输出数据。 因此,内核模式驱动程序必须验证它从用户模式驱动程序接收的任何输出数据。
内核模式客户端通常应验证 UMDF 驱动程序传递给 WdfRequestCompleteWithInformation的信息值。 如果客户端是 KMDF 驱动程序,则可以调用 WdfRequestGetCompletionParams 以在IO_STATUS_BLOCK结构中获取此信息。
通常,框架不会验证 UMDF 驱动程序传递给 WdfRequestCompleteWithInformation 的信息值。 (此参数通常指定传输的字节数。) 框架仅验证输出缓冲区和 缓冲 I/O 数据访问方法的信息值。 (例如,如果访问方法是缓冲 I/O.)