天天看點

Windows驅動開發如何入門

搞Windows驅動開發是一件痛苦的事情,特别是初學Windows驅動開發。有的人覺得Windows驅動開發就是把開發包WDK下載下傳下來,然後隻要掌握了C/C++語言,接下來無非就是類庫調來調去,像調用MFC、QT之類的庫那樣,看着書和MSDN上的文檔來就行了。等真正接觸以後才發現根本不是那麼一回事,痛苦源于以下幾點:

痛苦一:中文資料太少

講Windows驅動開發的,無論是中文書籍還是網上的中文資料,都很少,手把手從零到精通的更是不用說了。僅有的少量中文資料,有的還比較舊,講的是DDK、NT式驅動,新手拿着WDK8.1、WDK10面對Win8、Win10系統很難跟着學習,而且現在的WDK,在WDM上又出現了了WDF,而WDF又分KMDF(核心模式驅動)和UMDF(使用者模式驅動),對于UMDF(使用者模式驅動)中文資料就更少了。而且驅動開發不像應用開發,需要先對作業系統原理有一定了解,不然遇到“I/O管理器”、“輸入輸出請求包”、“軟體中斷”、“符号連結”、”派遣函數“等名詞和概念都不知所雲,是寸步難行的。

解決方法:

①其實MSDN上已經提供了大量的文檔和示例程式,對KMDF、UMDF等進行了詳細的講解,甚至還提供了手把手教你來的視訊教程,可惜它們都是英文的,對于我等英語不好的程式員來說真是坐車不買票——白搭。最近越來越覺得英語不好是阻礙一個程式員進步最大的絆腳石,我們不談什麼算法,不談什麼數學功底了,首先要成為一個合格的碼農,需要熟練使用各種程式設計語言和對應的各種工具庫,而大部分的庫都隻有英文文檔,不能流暢閱讀這些文檔的話,寸步難行。在成為了合格的碼農,能熟練使用各種現成的工具庫搭積木般的開發出應用程式後,才能去談各種算法,各種數學知識的代入,才能去談如何從一個碼農更新為軟體工程師。顯然,目前擺在我面前最迫切的問題是如何成為一個合格的碼農,先養活自己,再去考慮如何為社會主義做貢獻,如何推動人類科技進步。學習英語确實應該趕快提上日程并立即執行、堅持執行了。英語好的人真的是把WDK拿來就像用MFC那樣輕松,看着文檔和示例程式,那些個API調來調去,一個完整的驅動程式就出來了。這不是吹牛,我之前在一家公司工作的時候,公司有個項目的一個子產品需要在Ring0上實作,需要編寫Windows核心驅動,然而公司裡沒有一個人會,于是老大将這個子產品交給了他的一個朋友去做。他的這個朋友是中國人,在美國微軟總部工作,英語水準怎麼樣就不用說了,總之人家以前從來沒搞過驅動開發,看了文檔和示例代碼後,利用3天的業餘時間就完成了這個子產品,拿到了15K RMB的報酬,着實讓人佩服,讓人羨慕。真的,學好英語,不說“聽說寫”,隻要能流暢閱讀各種英文技術資料,完全是另一個世界,學什麼、做什麼都得心應手。

MSDN上的驅動開發資料入口:https://msdn.microsoft.com/zh-cn/windows/hardware

MSDN上手把手教你來的視訊教程:https://msdn.microsoft.com/zh-cn/windows/hardware/gg454522

②抓住僅有的幾本中文書籍,細細研讀。關于Windows驅動開發的中文書籍大概有那麼幾本:

《Windows驅動開發技術詳解》(強烈推薦先看這本)

《WindowsWDM裝置驅動程式開發指南》(比較老了,2000年出版的,以win98、win2000為目标系統)

《Windows裝置驅動程式WDF開發》(為數不多講WDF的)

《Windows 7裝置驅動程式開發》(為數不多講WDF的,且比較新,這本書的英文版是2010年出版的,中文譯版是2012年出版的)

《竹林蹊徑:深入淺出windows驅動開發》

《寒江獨釣:Windows核心安全程式設計》

《天書夜讀:從彙編語言到Windows核心程式設計》

《Windows核心安全與驅動開發》(是《天書夜讀》和《寒江獨釣》的合訂本以及更新版)

後面的這四本其實不太适合作為入門書籍,而适合作為進階書籍,對一些基礎的概念和原理的講解沒有《Windows驅動開發技術詳解》那麼多

痛苦二:開發工具鍊不好用

對于我等剛學程式設計時用的就是VisualStudio以及各種智能提示智能感覺的插件,甚至還有代碼生成器的輔助的程式員來說,習慣了VisualStudio傻瓜化的一切,代碼可以自動生成,窗體應用程式可以拖控件,甚至連網頁都能拖控件。很難接受隻有文本編輯器和指令行工具的開發環境,很多時候連代碼編輯器不能智能提示都無法忍受,更不說手動調用cl.exe link.exe,寫起代碼來就像有一萬隻螞蟻在身上爬。

在之前很長的一段時間裡,VC6.0和VisualStudio裡是沒有建立驅動項目的選項的,更沒有直接由IDE生成的HelloWorld,如果不想手動cl.exe link.exe,如果想在IDE中寫代碼,需要自己建一個空項目,然後手動配置編譯器指令、連結器指令、包含目錄、庫目錄等等,然後把書上的HelloWorld複制過來,然後可能還會遇到各種問題。生成好驅動程式檔案後,還要手動拷貝到虛拟機中,借助工具或inf檔案手動安裝,然後要改系統配置,進入核心調試模式,然後要設定調試接口,比如使用COM序列槽調試的話要在虛拟機上設定,把COM序列槽映射到主機的命名管道,然後還不能在VC中調試,隻能用Windbg來調試。總之每修改一下代碼,需要手工進行很多步驟才能開始調試,非常麻煩。而且即便照着網上或書上的步驟來配置,在不同的環境下也會遇到各種奇怪的問題,搞起來頗為頭疼。

解決方法:

①有個名為VisualDDK的第三方軟體,使得這個事情友善了很多。VisualDDK裝好後會給VisualStudio安裝一個插件,使得在VisualStudio中可以通過這個插件建立驅動項目,并且自帶HelloWorld,然後把VisualDDK Monitor裝到虛拟機中,兩邊配置一下,接下來隻要在VisualStudio這邊生成驅動檔案,VisualDDK會自動傳給虛拟機中的系統進行安裝,并且可以直接在VisualStudio中下斷點調試了。不過這個軟體在安裝和配置過程中,也需要不少步驟,有時候也會出現一些配置不對的問題,偶爾也略感頭疼,且穩定性和相容性不是非常好。此方式适用于VisualStudio2010及以下版本,WDK7.1及以下版本。對于更高的版本,不建議用VisualDDK,因為可以繼續往下看,下面有更激動人心的辦法。

VisualDDK官網:http://visualddk.sysprogs.org/

VS2010+VMWare8+VisualDDK1.5.6配置教程:http://techird.blog.163.com/blog/static/1215640362011112385241568/

②激動人心的就是,從VisualStudio2012開始,從WDK8.0開始,微軟在裡面整合了一套類似VisualDDK但比VisualDDK好用很多的工具。從那以後,開發Windows驅動程式就和開發Windows應用程式一樣友善了,隻需在虛拟機中安裝一個EXE,然後在VisualStudio中輸入它的IP、使用者名、密碼就OK了,接下來你隻需建立一個WDK項目,點生成,VisualStudio會自動把驅動檔案傳給虛拟機中的系統并自動安裝,然後點調試,就能在VisualStudio中單步調試了。是不是爽爆了,而且配置和設定都不複雜,MSDN上還有手把手教你配置的高清視訊教程!

具體可以看我寫的另一篇文章:

《Win8.1+VS2013+WDK8.1+VirtualBox or VMware驅動開發環境配置》:http://blog.csdn.net/charlessimonyi/article/details/50904956

痛苦三:沒有庫可用

假如有一天老闆叫你開發一個軟體,允許你使用你擅長的任意一門語言,C/C++/C#/JAVA/Python等。但是附加了一個條件:不能使用任何第三方庫,不能使用标準庫!你有什麼感想。What!标準庫都不能用?那還寫個毛。是的,沒錯,開發Windows驅動程式,幾乎什麼庫都用不了,包括标準庫。因為我們平時常用的第三方庫或标準庫,它的實作其實都是調用系統API,在Windows上調用的是Window API,即uer32.dll、kernel32.dll、gdi32.dll等等提供的API函數。但是這些API函數屬于應用層API,無法在驅動程式中使用,因為驅動程式跑在核心層。是以隻要一個庫的實作上調用了系統API,就無法在驅動程式中使用。少數庫還是可以使用的,比如math.h中的各種數值計算函數。不過僅剩的可用的庫太少了,很多時候你都需要從新發明輪子。甚至連C語言中的malloc、free,C++中的new、delete,你都需要自己去實作。

解決方法:

①自己發明輪子就自己發明輪子,雖然沒有現成庫可用,但有核心層下的系統API可用,很多和應用層的API很相似,你想要的功能基本都可以通過這些API實作。

②咬咬牙,把苦水往肚子裡咽。搞驅動開發的人很少,苦盡甘(qian)來

繼續閱讀