日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows虚拟显示器开发(一)

發布時間:2023/12/10 windows 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows虚拟显示器开发(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 虛擬顯示器概述
  • 虛擬顯示器原理方案
    • 多顯卡,多顯示器
    • 一顯卡,多顯示器
  • 聽聽大牛怎么說
  • 展望

虛擬顯示器概述

最近因工作需要,需要在物理顯卡上虛擬出一個顯示器,我用的操作系統是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虚拟显示器开发(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。