管理 PDEV

本主题仅适用于 Windows 2000 及更高版本。

调用显示驱动程序的线程数取决于设备上现有 PDEV 的数量。 每个设备每个适配器输出最多有一个已启用的 PDEV,以及无限数量的已禁用 PDEV。 通过调用驱动程序的 DrvAssertMode 函数禁用或启用 PDEV。 当显示驱动程序管理已禁用和已启用 PDEV 的混合时,操作系统允许单个线程调用启用了 PDEV 的驱动程序函数,同时允许多个线程调用具有已禁用 PDEV 的驱动程序函数。 例如, DrvBitBlt 可能在启用的 PDEV 上运行,而 DrvDisableSurface 正在销毁另一个已禁用的 PDEV。 即使单个显示驱动程序管理多个已启用的 PDEV, (例如,在多监视器方案中) ,操作系统仍然只允许单个线程调用具有其中任何已启用 PDEV 的驱动程序代码。

如果显示驱动程序必须管理 PDEV 之间共享的任何全局资源和硬件状态,则显示驱动程序还必须处理任何必要的同步。 显示驱动程序映射到会话空间,因此每个会话都有自己的一组全局变量。 因此,不得使用显示驱动程序全局变量来保存互斥体等同步对象。 而是将互斥存储在视频微型端口驱动程序的设备扩展中,该扩展映射到全局空间而不是会话空间。 可以在视频微型端口驱动程序的 HwVidInitialize 函数中初始化互斥体。 然后,显示驱动程序的 DrvEnablePDEV 函数可以通过向视频微型端口驱动程序发送自定义 IOCTL 来获取指向互斥体的指针。 属于不同会话的显示驱动程序线程将具有指针的单独副本,但所有这些副本都将指向同一互斥对象。

不允许显示驱动程序直接调用获取和释放互斥体的内核例程,因此显示驱动程序必须依赖视频微型端口驱动程序来执行这些任务。 视频微型端口驱动程序可以实现获取和释放互斥体的函数,并且显示驱动程序可以在用于获取指向互斥体的指针的同一自定义 IOCTL 中获取指向该函数的指针。

只有以下有限数量的驱动程序函数可以使用禁用的 PDEV 调用: