虚拟 显示器_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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mysql慢查询_mysql并发查询慢

    Mysql慢查询_mysql并发查询慢慢查询日志概念MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数…

    2022年10月9日
  • 模电–运算放大器工作原理

    模电–运算放大器工作原理模电领悟1(关于正负反馈是通过瞬时极性法判断净输入量的增减,与净输入量的正负号无关,与他的量有关,增了就是正反馈;所谓的同相反相输入端是指相位,反相与同相相位差为180°,所以如果同相和反相加的是同一个电压,…

    2022年6月3日
  • vc插件是什么_PE和VC

    vc插件是什么_PE和VC从进大一到现在这么久的时间,用VC软件应该是最熟练的,可是我竟然不知道一些关于它的小插件,每一次看到宿舍小五编程序,偶尔让我看她的有些代码,每次看她的代码,花花绿绿的,而我的,黑压压的一片,顿时心情就不好了。然后问:你用的什么软件答:一个西红柿小插件问:这是干什么用的?答:功能多了去了问:什么功能:答:百度去。。。之后我从百度上查到的结果是:西红柿软件也

    2022年8月12日
  • microsoft visual studio2010 密钥_windows7产品密钥

    microsoft visual studio2010 密钥_windows7产品密钥4D974-9QX42-9Y43G-YJ7JG-JDYBP

    2022年10月14日
  • 云服务器和云虚拟主机的区别、利弊[通俗易懂]

    云服务器和云虚拟主机的区别、利弊[通俗易懂]虚拟主机虚拟主机是利用云技术把一台服务器划分为多个的“虚拟的主机”,划分出来的虚拟主机具有独立域名(能够独立的搭建网站)和完整的Internet服务器的功能,但是带宽和IP是共享服务器的。优势:由于是分享的服务器带宽、IP等所有在价格上分成便宜。虚拟主机一般都是配置好环境的用户能直接使用,客户在购买使用上非常方便。劣势:由于带宽时共享的,虚拟主机的带宽上是没有保障的。IP共享那么安全性…

    2022年6月25日
  • siamfc++代码_siacoin

    siamfc++代码_siacoinSiamFC++:TowardsRobustandAccurateVisualTrackingwithTargetEstimationGuidelines摘要。视觉跟踪问题要求对给定目标进行高效的鲁棒分类和精确的状态估计。以往的方法提出了多种目标状态估计方法,但很少有方法考虑到视觉跟踪问题本身的特殊性。在仔细分析的基础上,为高性能通用目标跟踪器的设计提供了一套实用的目标状态估计指导原则。遵循这些指导原则,我们通过引入分类和目标状态估计分支(G1)、无模糊性分类评分(G2)、无先验知识跟

    2022年10月1日

发表回复

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

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