windows虚拟显示器开发(一)

article/2025/10/11 0:38:50

目录

  • 虚拟显示器概述
  • 虚拟显示器原理方案
    • 多显卡,多显示器
    • 一显卡,多显示器
  • 听听大牛怎么说
  • 展望

虚拟显示器概述

最近因工作需要,需要在物理显卡上虚拟出一个显示器,我用的操作系统是win7,查询了下官方文档和网络资源, 没有现成的框架,所以需要自己研究如何一步步实现。

虚拟显示器用途挺多的,我们其实在一些场景中有用到过,比如displaylink,我们网上买的一些USB转HDMI的连接线,在使用过程中我们需要安装displaylink的驱动,其实该驱动的原理是在电脑上虚拟出一个显示器,然后将显示器图片截获,通过USB再转换成HDMI信号给显示器显示。
USB转HDMI
类似的还有银行经常使用的一些手写板。

银行柜台手写板
还有一些小的场景,虚拟显示器也比较有用了,我们有时候会使用teamviewer远程软件连接电脑进行远程操作,此时连接电脑上物理显示器其实没有什么作用,耗电不说,还比较容易泄露电脑信息,但有些显卡又不得不插上显示器,不插的话teamviewer连接会黑屏,此时如果我们用软件虚拟一个显示器上去,问题就会得到完美解决。

虚拟显示器原理方案

多显卡,多显示器

至于单纯的虚拟显示器的实现,其实原理很简单,只需要编写一个虚拟的显卡驱动(需要有虚拟的显示设备),然后在虚拟显卡驱动上挂载一个显示器,但是这种方式虚拟出来的显示器并未用到实际物理GPU的渲染引擎,所以,基于性能上的考虑,改用其他方式。
多显卡多显示器

一显卡,多显示器

如果虚拟显示器需要用到物理显卡渲染,那么只能采用一显卡多显示器的方式了,我们使用的显卡有几种常用的类型:NV和AMD的独显,intel的集显,他们各自有有各自的显卡驱动,如果要实现一显卡多显示器的方式,那必须要“欺骗”各个厂商的显卡驱动,让他们认为设备上多插了一个显示器。
一显卡多显示器

由于我们不能修改厂商驱动源码,又缺少微软支持的框架,所以只能依靠一些所谓“黑客”的途径来实现,因为各个厂商都使用了微软的WDDM框架开发显卡驱动,所以从WDDM框架入手是个比较好的选择,可以通过注入WDDM框架的方式对操作系统进行“欺骗”,让操作系统误认为设备上多了个显示器。大概的原理图如下:
过滤驱动原理图
我们需要实现两个部分:
(1)内核态WDDM驱动hook;
(2)用户态WDDM驱动hook。

听听大牛怎么说

虽然虚拟显示器这块的资料极少,但是在网络上还是能发现一些蛛丝马迹的,我在OSR上发现有一位大神Marcel Ruedinger,他对WDDM框架及WDDM filter驱动特别精通,以下是他在解答别人问题时的回答:
Assuming you mean “WDDM Hook Driver”, the frame buffer of the additional monitor you are looking for is given in DxgkDdiSetVidPnSourceAddress(). This will only be called for your additional monitor after:

Prerequisite 1: A successful Video Present Network implementation including: DxgkDdiIsSupportedVidPn(), DxgkDdiEnumVidPnCofuncModality(),

DxgkDdiSetVidPnSourceAddress(), DxgkDdiSetVidPnSourceVisibility() etc. The main graphics adapter must not see the additional monitor, but dxgkrnl.sys must see it and all the existing monitors of the main graphics adapter, too. This implementation takes many months of development for all different main graphics adapters.

Prerequisite 2: A successful implementation of managing additional allocations (primary and secondary) for the additional monitor. Allocations can be taken from the main graphics adapter (thus reducing its video memory) or from system memory (must be hidden from main adapter). Performance might be crucial, too. E.g. copying from main graphics adapter video memory tends to be too slow etc. This implementation takes many months of development for all different main graphics adapters.

etc.etc.etc.

After a successful implementation of all the above (very unlikely - explaining the 100+ substantial obstacles would by far exceed the scope of this forum) the whole thing only works in NON-AERO mode with “Glass Look” turned off…

While AERO “Glass Look” is ON, everything is completely different. You need to hook the WDDM User Mode Driver DLL, too. You need to understand Direct3D in depth and you need to deal with constantly changing (flipped) framebuffers of Direct3D Swap Chains.
大致意思是做一个完整的WDDM过滤驱动,虚拟出一个显示器,需要做到如下三步:

(1)需要处理好VIDPN,包括DxgkDdiIsSupportedVidPn(), DxgkDdiEnumVidPnCofuncModality(),
DxgkDdiSetVidPnSourceAddress(), DxgkDdiSetVidPnSourceVisibility() 等函数,并且做到对于真实的显卡驱动,该虚拟显示器是透明的,他们不知道有这个显示器存在,对于dxgkrnl.sys,需要给他报一个显示器。我把这步理解为“欺上瞒下”,这步的主要作用是在系统里面能够识别出虚拟显示器。

(2)需要处理好虚拟显示器的内存分配。
这步的主要作用是如何获取虚拟显示器上显示的图像信息,这步需要对WDDM的GPU调度及内存管理要相当熟悉,如何映射GPU内存到CPU内存,如何给虚拟显示器分配显存,将显存图片拷贝到CPU内存速度是相当慢的,怎么取解决这个问题?

(3)毛玻璃效果开启后,情况就大不一样了,除了内核态的过滤驱动外,我们还需要hook用户态驱动,并且需要深入理解D3D,需要处理好Direct3D Swap Chains导致的FrameBuffer随时变化情况。我觉得这部是最为关键的,否则做出来的虚拟显示器是不完整的,不能支持毛玻璃效果,这步难度也是最大的,需要对D3D有着较为深入的理解,同时对WDDM框架甚是精通。

展望

这是我在未来几个月奋斗的目标,凭借多年的显卡驱动开发和D3D开发经验,相信不久就会出来成果,敬请期待!

微信
在这里插入图片描述

QQ:3505459047

欢迎交流!


http://chatgpt.dhexx.cn/article/KOYXEoY7.shtml

相关文章

Qt源码分析--QAction

定义: 在应用程序中,可以通过菜单、工具栏按钮和键盘快捷键调用许多常用命令。 由于用户希望每个命令都以相同的方式执行,而不管使用的用户界面如何,将每个命令表示为一个动作(QAction)是很有用的。 调用…

皮肤切换QAction的使用

/* 显示菜单 */ QMenu * menu ui->menuButton->getmenu(); //把几种皮肤加进来 //前面加图片后面加文字 b1 new QAction(QIcon(":/images/menu.png"), tr("&星球皮肤"), this); b2 new QAction(QIcon(":/images/menu.png"), tr(&qu…

Qt creator中操作QAction加入QToolBar

背景: 个人笔记。 我之前没有系统化学习过任何资料,使用很多工具都是按需出发,直接上手,遇到问题再研究的。所以会有一些弯路。本文言语中难免有对个人情绪的生动描述,希望不要影响读者心情,这只是我学习过…

Qt学习:QAction系列详解

一、QAction类详解 【详细描述】 QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。 应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的…

QAction、QWidgetAction、QActionGroup

QAction 一、描述 在应用程序中,可以通过菜单、工具栏按钮和键盘快捷键调用许多常用命令。由于用户希望每个命令都以相同的方式执行,因此无论使用何种用户界面,将每个命令表示为一个动作是很有用的。 二、类型成员 1、enum QAction::Acti…

QAction类详解

QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。 应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面, 这…

Qt 动作(QAction)

Qt 使用QAction类作为动作,QAction包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息,Qt自己选择使用哪个属性来显示,无需我们关心。同时,Qt 能够保证把QAction对象添加到不同的菜单、工具栏时,显示内容是同步的。也就是说&#xff…

Qt扫盲-QAction理论总结

QAction理论总结 一、概述二、使用 一、概述 在应用程序中,许多常用命令可以通过 菜单、工具栏按钮 和 键盘快捷键 调用。由于用户希望以相同的方式执行每个命令,而不管使用什么用户界面,因此将每个命令表示为一个Action操作是有效的。可以将…

QAction系列详解

【详细描述】 QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。 应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面&#xff…

Python爬虫js处理

一、jquery发送ajax请求格式 """ 形式:$.ajax({name:val, name:val,...}); 可选字段: 1)url:链接地址,字符串表示 2)data:需发送到服务器的数据,GET与POST都可以&am…

爬虫中遇到的js反爬技术

现在的网页代码搞得越来越复杂,除了使用vue等前端框架让开发变得容易外,主要就是为了防爬虫,所以写爬虫下的功夫就越来越多。攻和防在互相厮杀中结下孽缘却又相互提升着彼此。 本文就JS反爬虫的策略展开讨论,看看这中间都有着怎样…

Python爬虫之路-JS的解析

JS的解析 学习目标: 了解 定位js的方法了解 添加断点观察js的执行过程的方法应用 js2py获取js的方法 1 确定js的位置 对于前面人人网的案例,我们知道了url地址中有部分参数,但是参数是如何生成的呢? 毫无疑问,参数肯…

nodejs 爬虫

目标:爬取百度搜索到的女生头像(百度图片通用) 1. 下载node 可以去官网下载最新版node.js安装程序。(地址:node官网) 2. 下载需要的依赖(模块) 这里需要用到superagent模块和nod…

JS逆向爬虫(一)

目录 需要做的事情 一、安装与配置文档 1、node.js安装与配置 2、VSCode安装 3、在VSCode中运行 二、JS常用算法 1、md5 线性散列算法 2、DES/AES对称加密算法 3、RSA 非对称加密算法 4、base64 伪加密算法 三、js逆向案例 1、有道笔记翻译(MD5) 进行js代码调试的流…

爬虫中js的解析

每日分享: 做人要狠 任何关系,合得来就合,合不来就散,没有什么大不了的,理解多了,迁就多了,顾忌多了,痛苦自然就多了,完全没这个必要。别说我狠,以前我比谁…

Node.js爬虫实战:如何快速获取网站数据?

思考🤔 假设你正在为公司做市场调研,你需要获得一些能够提供关于你的目标受众的信息以进行研究,但是你发现这些信息并不能直接获取。你人工地搜索每个网站是不现实的,所以你需要一种更高效、更自动化、更快速的方式来获取这些信息…

Python爬虫:抓取js生成的数据

之前的NLP课程作业要求爬取一些科技新闻来训练语言模型,本文就简单来说一说用Python来爬取新闻的过程。虽然以前写过简单的爬虫,但是没有处理过浏览器动态加载数据的情况,这次碰到了就记录一下。 这次爬取的新闻来源是 新浪科技滚动新闻&…

js爬虫

互联网 Web 就是一个巨大无比的数据库,但是这个数据库没有一个像 SQL 语言可以直接获取里面的数据,因为更多时候 Web 是供肉眼阅读和操作的。如果要让机器在 Web 取得数据,那往往就是我们所说的“爬虫”了。现在项目需要,所以研究…

爬虫JS逆向思路 --(几千块钱都学不到的思路)

网络上几千块都学不到的JS逆向思路这里全都有👏🏻👏🏻👏🏻 本系列持续更新中,三连关注不迷路👌🏻 干货满满不看后悔👍👍👍 &…

手把手操作JS逆向爬虫入门(一)

本文爬取的网站如下(可以找解密工具解码) aHR0cHM6Ly9uZXdyYW5rLmNuLw 爬取的内容为网站的资讯情报版块的新闻资讯 鼠标点击翻页,在开发者工具中查看请求包,很容看出请求地址和参数, 其中post请求的参数如图&#x…