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