虚拟机usb控制器_显示器上的USB接口

虚拟机usb控制器_显示器上的USB接口windows下usb显示器的实现及效果

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

        我们常用的显示器接口有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转换到用户态驱动中对应的函数中,由用户态驱动完成实际的功能。而内核态驱动则在系统启动时由系统自动加载到内核态内存空间中,它主要用于实现与显卡硬件之间交互,如显存的分配、显卡中断处理等。

虚拟机usb控制器_显示器上的USB接口

图1 WDDM框架示意图

WDDM与Dxgknrl的交互分析

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

虚拟机usb控制器_显示器上的USB接口

图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就可以对该入口函数进行替换,替换成自己的,然后再在函数内部调用原始的入口函数。

虚拟机usb控制器_显示器上的USB接口

步骤

操作

备注

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所示。

虚拟机usb控制器_显示器上的USB接口

图4 wddm过滤驱动框架

windows7下的虚拟显示器效果

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171797.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • f stream_fstream

    f stream_fstreamofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:1、插入器(  向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout2、析取器(>>)  从流中输入数据

    2022年9月15日
    5
  • 解决sql server批量插入时出现“来自数据源的String类型的给定值不能转换为指定目标列的类型nvarchar。”问题

    解决sql server批量插入时出现“来自数据源的String类型的给定值不能转换为指定目标列的类型nvarchar。”问题问题的原因:源的一个字段值长度超过了目标数据库字段的最大长度解决方法:扩大目标数据库对应字段的长度一般原因是源的字段会用空字符串填充,导致字符串长度很大,可以使用rtrim去除…

    2022年7月20日
    15
  • python menuconfig_make menuconfig详解

    python menuconfig_make menuconfig详解makemenuconfig图形化的内核配置makemrproper—–删除不必要的文件和目录.1#makeconfig(基于文本的最为传统的配置界面,不推荐使用)2#makemenuconfig(基于文本选单的配置界面,字符终端下推荐使用)注意:使用makemenuconfig需要安装ncurses(sudoapt-getinstallncurses-dev…

    2022年6月14日
    52
  • 首批共享单车死于2019

    首批共享单车死于2019作者|周晶晶本文经授权转自燃财经(ID:rancaijing)共享单车换车潮正在上演。最近,微博上陆续有网友晒出车身为黄色、印有“美团单车”字样的共享单车,地点多集中在北京、太原等地。日前,燃财经来到人流量较大的五环外立水桥生活圈,以及四环内的望京CBD办公圈,发现确实有不少黄色美团单车。在立水桥地铁站出口,长约800米的单车停放区域,数量明显较多的美团单车、摩拜单…

    2022年5月26日
    44
  • pycharm调试debug入门PDF_pycharm中debug无法单步调试

    pycharm调试debug入门PDF_pycharm中debug无法单步调试为了摈弃print的暴力调试法,在mentor的耳濡目染下,我开始了PyCharm的Debug。例程:defhelloworld():print(‘helloworld’)a=1b=2c=3foriinrange(5):print(i)a=3b=4c=5helloworld()print(‘end’)1.先设置红…

    2022年8月29日
    4
  • 第一范式、第二范式和第三范式「建议收藏」

    第一范式、第二范式和第三范式「建议收藏」数据库的范式概念:设计数据库是,需要遵循的一些规范,要遵循后边的范式要求,必须遵循前边的所有范式要求设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈梯次规范,越高的范式数据库冗余越小目前关系型数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC范式、第四范式(4NF)、第五范式(5NF)。…

    2022年5月23日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号