大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
我们常用的显示器接口有HDMI、VGA等接口,这些接口是直接在显卡上的,当显示器插在显卡上,显卡就直接可以将显示信号输出到显示器了。
关于USB显示器跟HDMI之类的显示器有本质区别,我们需要实现的有两个:
- 在USB上插入一个显示器,怎么让windows系统能识别到显示器
- 如何让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过滤驱动我们要对其用户态驱动和内核态驱动都要进行过滤,两个模式的过滤驱动分别实现不同的功能:
- WDDM内核态过滤驱动用来实现虚拟显示器、普通类型图片(无需进行GPU硬件加速或渲染的图片,如桌面、文件窗口等)、鼠标位置、鼠标形状的捕获。
- WDDM用户态过滤驱动用来实现3D全屏、Aero、GPU硬件加速或渲染类型图片(如窗口化3D、视频等)的捕获。
增加过滤驱动后,整个WDDM显示框架变成了如图4所示。
图4 wddm过滤驱动框架
windows7下的虚拟显示器效果
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/171797.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...