虚拟 显示器_win7检测不到第二个显示器

虚拟 显示器_win7检测不到第二个显示器这里写自定义目录标题虚拟显示器概述虚拟显示器原理方案虚拟显示器概述最近因工作需要,需要在物理显卡上虚拟出一个显示器,我是用的操作系统是win7,查询了下官方文档和网络资源,没有现成的框架,所以需要自己研究如何一步步实现。虚拟显示器用途挺多的,我们其实在一些场景中有用到过,比如displaylink,我们网上买的一些USB转HDMI的连接线,在使用过程中我们需要安装displaylink的驱…

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

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

虚拟显示器概述

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

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

欢迎交流!

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

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

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


相关推荐

  • 控制误差_自动控制原理校正

    控制误差_自动控制原理校正计算机实时控制加工误差的时滞问题.pdf第18卷薯4月J.Hu中azho理ngUU工nniv杰·ofSS学cci.·&TechhVAOpIr.i18IN19o9.021990档计算机实时控制加工误差的时滞问题薯宾鸿赞(机械工程一系)提要本文从计算机控制的原理分析八手…

    2022年10月1日
    3
  • 【Spark】Spark基础教程

    【Spark】Spark基础教程Spark最初由美国加州伯克利大学的AMP实验室于2009年开发,是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。Spark特点Spark具有如下几个主要特点:运行速度快:Spark使用先进的DAG(DirectedAcyclicGraph,有向无环图)执行引擎,以支持循环数据流与内存计算,基于内存的执行速度可比HadoopMapReduce快上百倍,…

    2022年5月4日
    49
  • 简单实现微信扫码支付开发

    @文末附有开发案例代码的地址微信支付开发官方地址:https://pay.weixin.qq.com/wiki/doc/api/index.html 1. appid, 微信公众账号或开放平台APP的唯一标识 2. mch_id, 微信支付系统中的商户收款账号 3. partner, 财付通平台的商户账号 4. partnerkey, 财…

    2021年11月30日
    40
  • python安装库的方法「建议收藏」

    python安装库的方法「建议收藏」目录前言:??python安装库方法大全(以安装pygame库为例)?方法一、在pycharm内部直接安装【最简单的方法(直接上图)】?方法二、(在终端安装库)安装:✨1、使用pipinstall+(库的名称)直接安装✨2、使用国内镜像安装(加了镜像地址速度杠杠滴快??)​​​?​​​​​​​?方法二报以下错怎么办?​​​​​​​?小结方法一和方法二结语前言:对于新手来说,库的安装是遇到的第一个挑战,我也入了很多坑,所以想出一期安装库的步骤作者希望:.

    2022年10月2日
    3
  • 国税总局发票查验平台验证码识别方案,识别率达98%「建议收藏」

    国税总局发票查验平台验证码识别方案,识别率达98%「建议收藏」这是一篇含金量很高的干货文章,国家税务总局全国增值税发票查验平台验证码识别方案和具体思路,实验结果测试了200+次,识别率达到98%以上,识别速度的话,CPU大概5-8毫秒左右,模型大概3mb。

    2022年7月17日
    25
  • 程序员必备:变量命名神器 CODELF

    程序员必备:变量命名神器 CODELF大部分开发者都或多或少遇到过变量命名的烦恼,如果命名不规范,不仅会影响开发的效率,而且对后面维护的同学来说也是一个不小的挑战。那么接下来就给大家介绍个命名神器

    2022年5月4日
    1.3K

发表回复

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

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