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