windows虚拟显示器开发(三)USB显示器

article/2025/10/11 0:12:49

        我们常用的显示器接口有HDMI、VGA等接口,这些接口是直接在显卡上的,当显示器插在显卡上,显卡就直接可以将显示信号输出到显示器了。

        关于USB显示器跟HDMI之类的显示器有本质区别,我们需要实现的有两个:

  1. 在USB上插入一个显示器,怎么让windows系统能识别到显示器
  2. 如何让USB显示器显示对应的屏幕内容。

WDDM驱动框架

        WDDM(Windows Display Driver Model)是微软最新的显卡驱动模型,最先被运用在Vista系统中,它提供了一系列函数原型,显卡驱动需要实现其中的函数,在系统运行过程中,Windows操作系统会根据程序的请求调用对应的函数。

        WDDM驱动的框架主要如图1所示。由图可知,WDDM中的显卡驱动主要分成两部分:用户态驱动(User-Mode Display Driver)和内核态驱动(Display MiniportDriver)。其中用户态驱动以动态链接库的形式存放在system32文件夹中,当程序调用D3D函数时,系统会自动加载用户态驱动到自己的运行空间中。用户态驱动中的函数大致和Direct3D中的API是一一对应的关系,因此每次程序调用显卡相关的函数(如3D函数),一般会被D3D Runtime转换到用户态驱动中对应的函数中,由用户态驱动完成实际的功能。而内核态驱动则在系统启动时由系统自动加载到内核态内存空间中,它主要用于实现与显卡硬件之间交互,如显存的分配、显卡中断处理等。

图1 WDDM框架示意图

WDDM与Dxgknrl的交互分析

        关于WDDM框架的分析,我们需要从入口函数分析,我们就拿我们比较熟悉的win10 QXL驱动来进行底层逆向分析,win10的QXL驱动是WDDM Displayonly的驱动,其与Dxgknrl的通信方式及获取入口地址的原理与常规WDDM是一致的,我们逆向的到的原理如图2所示。

图2 WDDM与Dxgkrnl交互原理

步骤

操作

备注

1

WDDM驱动向Dxgkrnl发送DeviceIOControl,请求入口函数地址

2

Dxgkrnl返回入口函数地址给WDDM驱动

3

驱动实现各个miniport回调函数,复制给结构体

4

驱动调用入口函数,将miniport的回调函数传递进去

5

Dxgkrnl开始调用miniport的回调函数,驱动开始工作

WDDM 内核态hook原理

        从上述原理,我们可以对内核态WDDM进行过滤,编写过滤驱动DisplayProxy挂载在Dxgkrnl上层,此时WDDM驱动在将IO码发送给Dxgkrnl之前先经过DisplayProxy,Dxgkrnl返回的入口函数地址也先经过DisplayProxy,DisplayProxy就可以对该入口函数进行替换,替换成自己的,然后再在函数内部调用原始的入口函数。

步骤

操作

备注

1

WDDM驱动向Dxgkrnl发送DeviceIOControl,请求入口函数地址

2-3-4

Dxgkrnl返回入口函数地址DpiInitialize给WDDM驱动,被DisplayProxy拦截,替换成自己的函数proxyDpiInitialize

5

驱动实现各个miniport回调函数,复制给结构体

6

驱动调用入口函数proxyDpiInitialize,将miniport的回调函数传递进去

7-8

displayproxy将wddm传递进来的回调函数拦截,替换成自己的回调函数,然后调用原始的入口函数DpiInitialize

9

Dxgkrnl调用proxy的回调

10-11

走到了我们定义的回调函数中,我们做一些自定义操作,比如增加显示器等,然后再调用原生的miniport回调

WDDM过滤驱动指责划分

        WDDM驱动框架分用户态驱动和内核态驱动,对WDDM过滤驱动我们要对其用户态驱动和内核态驱动都要进行过滤,两个模式的过滤驱动分别实现不同的功能:

  1. WDDM内核态过滤驱动用来实现虚拟显示器、普通类型图片(无需进行GPU硬件加速或渲染的图片,如桌面、文件窗口等)、鼠标位置、鼠标形状的捕获。
  2. WDDM用户态过滤驱动用来实现3D全屏、Aero、GPU硬件加速或渲染类型图片(如窗口化3D、视频等)的捕获。

增加过滤驱动后,整个WDDM显示框架变成了如图4所示。

图4 wddm过滤驱动框架

windows7下的虚拟显示器效果


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

相关文章

远程服务器虚拟显示器(Ubuntu 20.04 LTS)

远程服务器虚拟显示器(Ubuntu 20.04 LTS) 1. 准备工作2. 安装软件包3. 修改配置文件4. 卸载虚拟显示器5. 异常处理 1. 准备工作 安装 ssh sever 并开启,确保虚拟显示器配置失败后,无法正常显示,仍可以通过ssh连接至服…

windows7/windows10 虚拟显示器部署(Virtual monitor)

最近有些网友看了我之前的博客之后,向我要虚拟显示器的bin文件,由于之前代码是绑定在VDI下的,没有单独的虚拟显示器代码,所以抽空提取了下相关代码,单独编译。 百度网盘地址:虚拟显示器下载地址 安装与卸…

Ubuntu 20.04 虚拟显示器 1080P 配置

Ubuntu 20.04 虚拟显示器 1080P 配置 一、背景二、配置方法1)安装软件2)添加配置文件3)重启 三、效果Reference !!!说明,必看 Σ(⊙▽⊙"a !!! 1.完成配…

windows虚拟显示器开发(一)

目录 虚拟显示器概述虚拟显示器原理方案多显卡,多显示器一显卡,多显示器 听听大牛怎么说展望 虚拟显示器概述 最近因工作需要,需要在物理显卡上虚拟出一个显示器,我用的操作系统是win7,查询了下官方文档和网络资源&am…

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爬虫实战:如何快速获取网站数据?

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