windows虚拟显示器开发(二)WDDM hook(USB转HDMI驱动、USB手写屏开发)
很久沒有繼續研究wddm hook了,最后一次研究還在3年前,不得不說雖然應用的少,但是wddm hook卻是很有技術含量的一項技術,而且實用性很高,我們除了做虛擬顯示器還能做很多的東西,比如高效的截屏(因為直接從驅動層面截屏,所以效率和實現效果秒殺mirror driver和DXGI)、視頻重定向(視頻硬件加速的時候可以直接獲取原始碼流)、修改原始的顯示器廠商信息、修改顯示器支持分辨率,等等騷操作wddm hook都可以實現。
去年,深圳某硬件公司找到我,他們正在做usb轉HDMI或者USB轉VGA的硬件連接線,這種線市面上很常見,當然也比較實用,但是芯片卻一直被少數幾個廠商壟斷著,比較有名的兩個,displaylink和fresco logic。我們知道顯示器一般是直接插在顯卡的HDMI或VGA等輸出上,但是我們現在要做的是顯示器插在電腦的USB上,并非由顯卡直接輸出,如何做到顯示器接收顯卡的輸出?
其實芯片的實現難度還好,主要就是將圖片信息轉換成HDMI或VGA信號,關鍵在于如何在windows層面做到查到USB上跟插在顯卡的VGA或者HDMI輸出上一樣的效果,display link類的實現原理如下:
芯片受制于人畢竟不是好事,畢竟大部分利潤都被芯片公司賺走了,所以該硬件公司找到我,他們已經可以做出將圖片轉換成VGA和HDMI信號的芯片了,萬事俱備,只欠東風,現在就需要有個人幫他們做一個驅動,該公司的劉總尋了很多年,終于找到了我,很是興奮,跟我初步聊完,第二天就從深圳飛到我所在的城市,聊完技術細節,很快的就簽了開發協議,協議的需求就是要兼容市面上win7及以上Windows系統,并輸出屏幕圖片,由于公司芯片采用usb2.0傳輸,帶寬有限,需要圖片的變化區域而不是整屏數據。
需要支持win7、win8及win10,不用多說,wddm hook肯定是跑不掉了,看來我又要重抄舊業,說起wddm hook,在兼容性這塊我真的有點后怕, 我在2017年到2018年間做過一個win7的虛擬顯示器采用的便是wddm hook技術,當時解決了公司VDI顯卡透傳上的幾個難題,年底還拿了公司的技術突破獎。因為公司的顯卡場景比較少,當時我們用的是AMD的消費級顯卡,只需兼容這一款就夠了,對其他顯卡的兼容性沒有做過多的測試,所以如果使用在usb轉HDMI這種個人用戶,需要市場上各種類型的顯卡,我是很沒有底氣的,是什么讓我有這么大的勇氣來簽這個協議,是對技術的追求還是喜歡有挑戰性的工作?都不是,是因為窮!
關于調試和逆向
說來慚愧,我剛開始在做wddm hook的時候還不會基本的內核態windbg調試,當時的調試還是采用最原始的打日志方式,舉個很簡單的例子,有條分支走錯了,可能我需要把每條可能走到這條分支的點都需要加上日志,要是分支多的話就需要打很多了,如果我會內核態windbg調試,我直接給函數加個斷點,然后單步調試,看下哪部邏輯錯了,順便能看下每個變量是什么,程序為什么出錯很快就能一清二楚了。
其次,我曾經遇到一個問題,系統在安裝我的驅動后,在關機的時候卡死了,這時候怎么辦呢?當初使用的方法是一點點屏蔽代碼,用排除法的方法來看下是哪段代碼出問題,簡直是弱爆了。
還有一點是自己研究還不如借鑒友商的實現,我曾經在osr論壇上看到有位大佬說,wddm hook他們從開始做到穩定使用,花費了10人年,可想而知這個的難度,所以我一個人自己去閉門造車的話肯定不行,再花個10年,等我做穩定了技術早就被淘汰了,那么你又沒有源碼怎么借鑒呢?經過這幾年在公司修電腦的歷練,已經熟練的學會了逆向技術,對一個工程進行逆向,有兩個必不可少的條件:1.你需要對整個工程的實現原理有個大概的了解;2.你需要熟練的使用逆向工具。所以我完全可以憑借以前的wddm hook經驗再加最近幾年的IDA逆向經驗,成功的把市面上成熟的技術給逆向出來,事實證明,我用了不到2個月就把代碼逆的七七八八了,至于逆的哪個我就不說了,肯定是那個兼容性最好的,誰兼容性最好我就借鑒誰的。
實現的USB手寫屏的效果如下:
usb顯示器
總結
以上是生活随笔為你收集整理的windows虚拟显示器开发(二)WDDM hook(USB转HDMI驱动、USB手写屏开发)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Hadoop] Install Had
- 下一篇: java信息管理系统总结_java实现科