UMDF 驱动程序的初级指南
从 Windows Vista 开始,操作系统在会话 0 中隔离服务和系统进程,而应用程序在后续的编号更高的会话中运行。 由于 UMDF 主机进程 (WUDFHost.exe) 是在会话 0 中运行的系统进程之一,因此 UMDF 驱动程序与应用程序隔离。 因此,在开发驱动程序时,必须遵循以下准则:
请勿 (UI) 元素(如对话框)创建用户界面,也不要依赖于用户输入。 由于用户未在会话 0 中运行,因此他(她)永远不会看到 UI,并且无法响应 UI。
同样,请勿操作任何 UI 元素。 例如,UMDF 驱动程序无法枚举用户会话中的窗口。
如果驱动程序必须与服务通信,请使用客户端/服务器机制,例如远程过程调用 (RPC) 或命名管道。
在 Windows API 中调用函数时要小心。 某些函数可能会操作 UI 元素或尝试访问用户会话中的命名对象。 不要调用你不会从用户模式服务调用的 Windows 函数。 一般情况下,UMDF 驱动程序可以安全地调用在 kernel32.dll 中导出的函数,但不能调用在 user32.dll 中导出的函数。
UMDF 驱动程序可能会调用 Windows 函数来执行以下任务:
驱动程序可能会调用 SetupDiXxx 函数来检索即插即用设备属性。 例如, 适用于 OSR USB Fx2 学习工具包的 UMDF 示例驱动程序 调用 SetupDiGetDeviceRegistryProperty 来检索设备的总线类型的 GUID。 注意 UMDF 驱动程序无法安全地调用许多 SetupDiXxx 函数,但可以安全地调用检索设备节点属性的函数。
从手动队列中检索 I/O 请求的驱动程序可能会创建定期计时器来轮询队列。 例如, WudfVhidmini 示例通过调用 CreateThreadpoolTimer 注册计时器回调例程,然后通过调用 SetThreadpoolTimer 来设置定期计时器。 注意 从版本 1.11 开始,UMDF 提供对工作项的支持。 有关详细信息,请参阅 使用工作项。
有关在框架之外使用系统服务的其他信息,请参阅第 14 章 (“Beyond the Frameworks”) Orwick、Penny 和 Guy Smith。 使用 Windows Driver Foundation 开发驱动程序。 华盛顿州雷德蒙德:Microsoft Press,2007年。
有关会话零隔离的其他信息,请参阅 会话 0 隔离对 Windows 中的服务和驱动程序的影响。