我们常用的显示器接口有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下的虚拟显示器效果

windows虚拟显示器开发(三)USB显示器相关推荐

  1. LINUX驱动开发(三)USB虚拟网卡

    1. 简述 之前见过其他项目组的开发板,发现他们没有网口,但是可以通过IP进行ssh连接和scp文件传输到开发板,百度发现他们用的是USB虚拟网卡,于是我在我的开发板进行测试. 主机:windows ...

  2. windows xp 驱动开发(三)DDK与WDK WDM的区别

    转自: http://www.cnblogs.com/hyddd/archive/2009/03/15/1412684.html 最近尝试去了解WINDOWS下的驱动开发,现在总结一下最近看到的资料. ...

  3. windows xp 驱动开发(五) USB驱动程序、应用软件概述

    转载请标明是引用于 http://blog.csdn.net/chenyujing1234 欢迎大家提出意见,一起讨论! 1.USB设备驱动程序(WDM模型) 1.1  分类 USB设备驱动程序的设计 ...

  4. XDISPLAY:将IPAD或安卓平板,变成WINDOWS(MAC)系统的显示器副屏

    最新小编方包收到很多人反馈:duet display账号被锁了!这里跟大家说一声抱歉!账号用不了.但是方包最近又找到一款免费的可以实现ipad做显示器副屏的软件:xdisplay 原文地址: 免费软件 ...

  5. Windows下用Python获取电脑显示器物理尺寸和PPI

    Windows下用Python获取电脑显示器物理尺寸和PPI 背景 PPI 和 DPI Python获取PPI 方法一(WMI) 方法二(WINREG) 方法三(WMI+WINREG) 总结 背景 最 ...

  6. Mac-Mini 外接三个显示器教程

    一.引言 Mac-mini 官方只支持连接2个显示器,ctrl cv 复制粘贴代码和写博客的时候十分不方便,这时候需要外接第三个显示器,下面看看如何操作. Tips: 第三个显示器的连接器需要有外置显 ...

  7. 笔记本投屏连接三个显示器,连接三个显示器最终办法

    因为工作需要,在办公室需要经常连接三个显示器,后来经过探索,现阶段已经找到一条合适的办法. 我的笔记本自带一个雷电接口,这样就意味着可以用扩展坞接上HDMI. 接上第一个显示器. 另外就是笔记本自带一 ...

  8. USB虚拟串口实验_STM32F1开发指南——USB学习笔记

    前言 STM32F103系列芯片都自带USB接口,不过STM32F103的USB都只能用来做设备,而不能用作主机. 目录: 53.1 USB简介 USBF103自带的USB符合USB2.0规范.   ...

  9. 电脑显示器尺寸对照表_三分钟带你了解五花八门的显示器参数,买显示器不在跳坑...

    显示器已经成为我们生活中必不可少的一个交互窗口,工作.娱乐.甚至交流. 我们每天都要长时间盯着电脑屏幕,这时一款适合自己的显示器就显得尤为重要了. 好的电脑屏幕,可以保护视力,提升游戏体验. 但是,仔 ...

  10. 【Windows 应用程序开发详解】三.Windows开发工具配置与使用(一)

    [Windows 应用程序开发详解]三.Windows开发工具配置与使用 一.Visual C/C++ 我们都知道在应用程序开发的时候都是要依赖于开发工具的,Windows主机应用程序绝大多数都是使用 ...

最新文章

  1. python使用列表推导式(list comprehension)和itertools生成浮点数列表
  2. 专访香港大学罗平:师从汤晓鸥、王晓刚,最早将深度学习应用于计算机视觉的「先行者」
  3. 微软Connect(); 2017大会梳理:Azure、数据、AI开发工具
  4. 计算机网络【1】物理层
  5. java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
  6. 谈谈Tensorflow的Batch Normalization
  7. 嘉年华回顾丨房晓乐带你解密TiDB 的技术演进及生态发展​
  8. 如何保护网页按钮不被XSS自动点击
  9. 尝试用LoadRunner录制单机程序--未生成录制脚本
  10. tensorflow中协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners
  11. (15) 常用管理类软件需求征集 -- 通用菜单模块管理
  12. 公众号推送长图最佳尺寸_微信公众平台图片尺寸是多少
  13. CentOS Install Passenger for ROR
  14. 凭什么CTO、技术总监、架构师都不写代码,还一天天牛逼哄哄的?
  15. Nvidia jetson tx2 ubuntu16.04插入128GB内存卡报错:Unable to access/mount “128 GB Volume”
  16. C语言实战篇-----调试关键参数+printf输出_文件名_函数名_执行数!!!
  17. mysql怎么输出列表的次序_MySQL metalock的一些技巧(写大于读的案例,以及获得锁的顺序)...
  18. RocksDB 架构
  19. 三洋服务器显示F6,三洋空调故障代码有哪些?
  20. 因为一句话,爱上一部电影

热门文章

  1. 花生壳配置内网穿透,ssh远程登录
  2. DNF单机从服务器获取信息,dnf单机云服务器
  3. elasticjob disable JOB
  4. 在线文档转word文档
  5. Python通过SSH下载远程服务器文件
  6. modbus rtu功能码理解
  7. python json解析工具选择_推荐几个开发必备的JSON工具
  8. Echarts3里的地图标记点事件效果实现
  9. python制作通讯录
  10. C语言编程100题(基础知识、基本结构、数组)