目录

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

虚拟显示器概述

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

虚拟显示器用途挺多的,我们其实在一些场景中有用到过,比如displaylink,我们网上买的一些USB转HDMI的连接线,在使用过程中我们需要安装displaylink的驱动,其实该驱动的原理是在电脑上虚拟出一个显示器,然后将显示器图片截获,通过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

欢迎交流!

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

  1. Windows多屏开发小记

    这些天研究了下Windows系统下的多屏开发,这里做一个小分享. Windows系统下多屏模式原理 微软从Windows98后的操作系统就提供了多屏模式,并且在Windows7版本后微软对多屏模式从性 ...

  2. WIN7以上系统WDDM虚拟显卡开发

    这里讨论的都是win7以上平台的WDDM模型的显卡驱动,而不是WINXP之前的XPDM模型的显卡驱动. 实际上没有"显卡过滤驱动"一说,  windows 10 1607之前的平台 ...

  3. WIN7以上系统WDDM虚拟显卡开发(WDDM Filter/Hook Driver 显卡过滤驱动开发之一)

    by fanxiushu 2018-09-16 转载或引用请注明原始作者. 这里讨论的都是win7以上平台的WDDM模型的显卡驱动,而不是WINXP之前的XPDM模型的显卡驱动. 实际上没有" ...

  4. 入门WP7 - 1.搭建Windows Phone 7开发环境

    WP的开发套件其实很早就已经发布了,相关开发资料也有了很多,不过最近才开始关注这个平台,有朋友已经拿到了WP7的真机,HTC的,到处宣扬这牛机强悍的触控体验,绝对是IP4的重量级对手.不过鉴于国内的环 ...

  5. WWF(Windows Workflow Foundation)开发环境的建立。 .NET 技术前瞻,WWF,Windows,Workflow,Foundation...

    1.安装WindowsSDK for Vista,有1.14G之巨,可以从MS的网站上下载,不过需要验证WINDOWS,可以去讯雷区用WindowsSDK为关键字搜索下载. 2.安装Virsul St ...

  6. Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用...

    概述 Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行,这也会是国内举办的最后一届 Tech Summit,2019 年开始会以 Mi ...

  7. 闲话虚拟仪器开发历史

    上世纪90年代,北京中科泛华技术有限公司成为了NI公司的联盟合作伙伴,那时NI公司的技术支持走到哪,都会带上一个中科泛华的技术支持,我认识的最早的CP是NI的周志祥加上泛华的霍文雄.中科泛华在高校中力 ...

  8. windows虚拟桌面_在Windows中使用虚拟桌面的最佳免费程序

    windows虚拟桌面 If you often open a lot of applications at once, a virtual desktop program can help you ...

  9. Linux虚拟主机与Windows虚拟主机之间有什么区别

    我们知道,在购买主机时,根据我们的需求来选择虚拟主机.独立主机或者VPS云主机.或者为了免除备案的麻烦,选择美国虚拟主机.香港虚拟主机或者其他海外主机.但往往会忽略了Linux虚拟主机与Windows ...

  10. windows虚拟主机控制面板哪个比较好用?

    相对于Linux发行版本的系统,大多人都比较习惯使用windows系统,同时windows虚拟主机对于ASP.NET,PHP等热门程序也有了广泛的友好支持.因此,很多新手站长比较倾向于使用window ...

最新文章

  1. 【深度学习】深度学习模型训练全流程!
  2. struts-config.xml 简述
  3. 最简单的打造淘宝商品爆款步骤
  4. 取多补少C语言,leetcode题目: 数字的补数 的C语言解法
  5. CSS 普通流 和 行格式化上下文 IFC
  6. 【Flink】FLink checkpont 界面显示的含义
  7. 机试题:地图定位、拍照并显示、录制视频并播放
  8. [tensorflow]tensorflw2.1.0张量和变量介绍
  9. We7务实性电子政务与‘云’
  10. 带你走进P2P平台网站推广
  11. PYTHON爬虫——谷歌(Google)图片关键词爬取
  12. 程序员博客是否应该晒代码(由摄影而感)
  13. openGL绘制带纹理地球,并实现鼠标键盘控制
  14. Javaweb15==mysql+mybatis+servlet+axios+fasetjson+vue+elementUI前后端分离,实现列表后端分页、模糊查询后分页、新增、单一/批量删除、修改
  15. shmget - 共享内存
  16. 网络对抗技术—实验报告一
  17. 中国中医医院竞争力排行榜500强:绵竹市中医医院
  18. PS素材挖掘七式(留学 个人陈述 personal statement)
  19. stuts2 技术内幕 2、3章
  20. matlab中怎么灰色关联度,五种灰色关联度分析matlab代码

热门文章

  1. java生成微信小程序二维码,前台扫描识别
  2. android代码设置digits,andorid editext android:digits=abcdefghijklmnopqrstuvwxyz用代码写来控制规则该怎么写呢?...
  3. dex2jar官网和jdgui官网链接
  4. 360bpsvc.exe 流氓进程,莫名恶意弹窗
  5. 《终极算法》读书笔记(二)终极算法
  6. 算法导论第三版详细答案
  7. 微信小程序搜索关键字高亮和ctrl+f搜索定位实现
  8. 什么是Servlet
  9. 高通工具QXDM,QCAT和QPST
  10. 计算机组成原理累加器实验a r0,计算机组成原理实验箱 介绍.ppt