Windows驅(qū)動開發(fā)入門 !
搞Windows驅(qū)動開發(fā)是一件痛苦的事情,特別是初學(xué)Windows驅(qū)動開發(fā)。有的人覺得Windows驅(qū)動開發(fā)就是把開發(fā)包WDK下載下來,然后只要掌握了C/C++語言,接下來無非就是類庫調(diào)來調(diào)去,像調(diào)用MFC、QT之類的庫那樣,看著書和MSDN上的文檔來就行了。等真正接觸以后才發(fā)現(xiàn)根本不是那么一回事,痛苦源于以下幾點:
本文引用地址:http://www.ex-cimer.com/article/201808/384795.htm痛苦一:中文資料太少
講Windows驅(qū)動開發(fā)的,無論是中文書籍還是網(wǎng)上的中文資料,都很少,手把手從零到精通的更是不用說了。僅有的少量中文資料,有的還比較舊,講的是DDK、NT式驅(qū)動,新手拿著WDK8.1、WDK10面對Win8、Win10系統(tǒng)很難跟著學(xué)習(xí),而且現(xiàn)在的WDK,在WDM上又出現(xiàn)了了WDF,而WDF又分KMDF(內(nèi)核模式驅(qū)動)和UMDF(用戶模式驅(qū)動),對于UMDF(用戶模式驅(qū)動)中文資料就更少了。而且驅(qū)動開發(fā)不像應(yīng)用開發(fā),需要先對操作系統(tǒng)原理有一定了解,不然遇到“I/O管理器”、“輸入輸出請求包”、“軟件中斷”、“符號鏈接”、”派遣函數(shù)“等名詞和概念都不知所云,是寸步難行的。
解決方法:
①其實MSDN上已經(jīng)提供了大量的文檔和示例程序,對KMDF、UMDF等進行了詳細的講解,甚至還提供了手把手教你來的視頻教程,可惜它們都是英文的,對于我等英語不好的程序員來說真是坐車不買票——白搭。最近越來越覺得英語不好是阻礙一個程序員進步最大的絆腳石,我們不談什么算法,不談什么數(shù)學(xué)功底了,首先要成為一個合格的碼農(nóng),需要熟練使用各種編程語言和對應(yīng)的各種工具庫,而大部分的庫都只有英文文檔,不能流暢閱讀這些文檔的話,寸步難行。在成為了合格的碼農(nóng),能熟練使用各種現(xiàn)成的工具庫搭積木般的開發(fā)出應(yīng)用程序后,才能去談各種算法,各種數(shù)學(xué)知識的代入,才能去談如何從一個碼農(nóng)升級為軟件工程師。顯然,當前擺在我面前最迫切的問題是如何成為一個合格的碼農(nóng),先養(yǎng)活自己,再去考慮如何為社會主義做貢獻,如何推動人類科技進步。學(xué)習(xí)英語確實應(yīng)該趕快提上日程并立即執(zhí)行、堅持執(zhí)行了。英語好的人真的是把WDK拿來就像用MFC那樣輕松,看著文檔和示例程序,那些個API調(diào)來調(diào)去,一個完整的驅(qū)動程序就出來了。這不是吹牛,我之前在一家公司工作的時候,公司有個項目的一個模塊需要在Ring0上實現(xiàn),需要編寫Windows內(nèi)核驅(qū)動,然而公司里沒有一個人會,于是老大將這個模塊交給了他的一個朋友去做。他的這個朋友是中國人,在美國微軟總部工作,英語水平怎么樣就不用說了,總之人家以前從來沒搞過驅(qū)動開發(fā),看了文檔和示例代碼后,利用3天的業(yè)余時間就完成了這個模塊,拿到了15K RMB的報酬,著實讓人佩服,讓人羨慕。真的,學(xué)好英語,不說“聽說寫”,只要能流暢閱讀各種英文技術(shù)資料,完全是另一個世界,學(xué)什么、做什么都得心應(yīng)手。
MSDN上的驅(qū)動開發(fā)資料入口:https://msdn.microsoft.com/zh-cn/windows/hardware
MSDN上手把手教你來的視頻教程:https://msdn.microsoft.com/zh-cn/windows/hardware/gg454522
②抓住僅有的幾本中文書籍,細細研讀。關(guān)于Windows驅(qū)動開發(fā)的中文書籍大概有那么幾本:
《Windows驅(qū)動開發(fā)技術(shù)詳解》(強烈推薦先看這本)
《WindowsWDM設(shè)備驅(qū)動程序開發(fā)指南》(比較老了,2000年出版的,以win98、win2000為目標系統(tǒng))
《Windows設(shè)備驅(qū)動程序WDF開發(fā)》(為數(shù)不多講WDF的)
《Windows 7設(shè)備驅(qū)動程序開發(fā)》(為數(shù)不多講WDF的,且比較新,這本書的英文版是2010年出版的,中文譯版是2012年出版的)
《竹林蹊徑:深入淺出windows驅(qū)動開發(fā)》
《寒江獨釣:Windows內(nèi)核安全編程》
《天書夜讀:從匯編語言到Windows內(nèi)核編程》
《Windows內(nèi)核安全與驅(qū)動開發(fā)》(是《天書夜讀》和《寒江獨釣》的合訂本以及升級版)
后面的這四本其實不太適合作為入門書籍,而適合作為進階書籍,對一些基礎(chǔ)的概念和原理的講解沒有《Windows驅(qū)動開發(fā)技術(shù)詳解》那么多
痛苦二:開發(fā)工具鏈不好用
對于我等剛學(xué)編程時用的就是VisualStudio以及各種智能提示智能感知的插件,甚至還有代碼生成器的輔助的程序員來說,習(xí)慣了VisualStudio傻瓜化的一切,代碼可以自動生成,窗體應(yīng)用程序可以拖控件,甚至連網(wǎng)頁都能拖控件。很難接受只有文本編輯器和命令行工具的開發(fā)環(huán)境,很多時候連代碼編輯器不能智能提示都無法忍受,更不說手動調(diào)用cl.exe link.exe,寫起代碼來就像有一萬只螞蟻在身上爬。
在之前很長的一段時間里,VC6.0和VisualStudio里是沒有創(chuàng)建驅(qū)動項目的選項的,更沒有直接由IDE生成的HelloWorld,如果不想手動cl.exe link.exe,如果想在IDE中寫代碼,需要自己建一個空項目,然后手動配置編譯器指令、鏈接器指令、包含目錄、庫目錄等等,然后把書上的HelloWorld復(fù)制過來,然后可能還會遇到各種問題。生成好驅(qū)動程序文件后,還要手動拷貝到虛擬機中,借助工具或inf文件手動安裝,然后要改系統(tǒng)配置,進入內(nèi)核調(diào)試模式,然后要設(shè)置調(diào)試接口,比如使用COM串口調(diào)試的話要在虛擬機上設(shè)置,把COM串口映射到主機的命名管道,然后還不能在VC中調(diào)試,只能用Windbg來調(diào)試。總之每修改一下代碼,需要手工進行很多步驟才能開始調(diào)試,非常麻煩。而且即便照著網(wǎng)上或書上的步驟來配置,在不同的環(huán)境下也會遇到各種奇怪的問題,搞起來頗為頭疼。
解決方法:
①有個名為VisualDDK的第三方軟件,使得這個事情方便了很多。VisualDDK裝好后會給VisualStudio安裝一個插件,使得在VisualStudio中可以通過這個插件新建驅(qū)動項目,并且自帶HelloWorld,然后把VisualDDK Monitor裝到虛擬機中,兩邊配置一下,接下來只要在VisualStudio這邊生成驅(qū)動文件,VisualDDK會自動傳給虛擬機中的系統(tǒng)進行安裝,并且可以直接在VisualStudio中下斷點調(diào)試了。不過這個軟件在安裝和配置過程中,也需要不少步驟,有時候也會出現(xiàn)一些配置不對的問題,偶爾也略感頭疼,且穩(wěn)定性和兼容性不是非常好。此方式適用于VisualStudio2010及以下版本,WDK7.1及以下版本。對于更高的版本,不建議用VisualDDK,因為可以繼續(xù)往下看,下面有更激動人心的辦法。
VisualDDK官網(wǎng):http://visualddk.sysprogs.org/
VS2010+VMWare8+VisualDDK1.5.6配置教程:http://techird.blog.163.com/blog/static/1215640362011112385241568/
②激動人心的就是,從VisualStudio2012開始,從WDK8.0開始,微軟在里面整合了一套類似VisualDDK但比VisualDDK好用很多的工具。從那以后,開發(fā)Windows驅(qū)動程序就和開發(fā)Windows應(yīng)用程序一樣方便了,只需在虛擬機中安裝一個EXE,然后在VisualStudio中輸入它的IP、用戶名、密碼就OK了,接下來你只需新建一個WDK項目,點生成,VisualStudio會自動把驅(qū)動文件傳給虛擬機中的系統(tǒng)并自動安裝,然后點調(diào)試,就能在VisualStudio中單步調(diào)試了。是不是爽爆了,而且配置和設(shè)置都不復(fù)雜,MSDN上還有手把手教你配置的高清視頻教程!
具體可以看我寫的另一篇文章:
《Win8.1+VS2013+WDK8.1+VirtualBox or VMware驅(qū)動開發(fā)環(huán)境配置》:http://blog.csdn.net/charlessimonyi/article/details/50904956
痛苦三:沒有庫可用
假如有一天老板叫你開發(fā)一個軟件,允許你使用你擅長的任意一門語言,C/C++/C#/JAVA/Python等。但是附加了一個條件:不能使用任何第三方庫,不能使用標準庫!你有什么感想。What!標準庫都不能用?那還寫個毛。是的,沒錯,開發(fā)Windows驅(qū)動程序,幾乎什么庫都用不了,包括標準庫。因為我們平時常用的第三方庫或標準庫,它的實現(xiàn)其實都是調(diào)用系統(tǒng)API,在Windows上調(diào)用的是Window API,即uer32.dll、kernel32.dll、gdi32.dll等等提供的API函數(shù)。但是這些API函數(shù)屬于應(yīng)用層API,無法在驅(qū)動程序中使用,因為驅(qū)動程序跑在內(nèi)核層。所以只要一個庫的實現(xiàn)上調(diào)用了系統(tǒng)API,就無法在驅(qū)動程序中使用。少數(shù)庫還是可以使用的,比如math.h中的各種數(shù)值計算函數(shù)。不過僅剩的可用的庫太少了,很多時候你都需要從新發(fā)明輪子。甚至連C語言中的malloc、free,C++中的new、delete,你都需要自己去實現(xiàn)。
解決方法:
①自己發(fā)明輪子就自己發(fā)明輪子,雖然沒有現(xiàn)成庫可用,但有內(nèi)核層下的系統(tǒng)API可用,很多和應(yīng)用層的API很相似,你想要的功能基本都可以通過這些API實現(xiàn)。
②咬咬牙,把苦水往肚子里咽。搞驅(qū)動開發(fā)的人很少,苦盡甘(qian)來
評論