




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、驅(qū)動程序設(shè)計基礎(chǔ)本文檔又看雪軟件安全論壇提供專題負(fù)責(zé)人:CCDeath參與人員:sislcb、vbcs、qqeleven、xhackx、火影、豬頭三開題目前還沒有獨(dú)立驅(qū)動專業(yè),很多人都是自學(xué)。寫專題可以使所學(xué)知識系統(tǒng)化,規(guī)范化,運(yùn)用起來思路清晰。寫代碼,剛開始盡量多寫。代碼能看懂并不能代表就能寫,就像有看過windows部分源代碼,不一定就能寫出一個windows出來。代碼有時候看比較簡單的,但還需在鍵盤敲一下:-)。編碼使要越寫越深入,越寫越規(guī)范。是個量變達(dá)到質(zhì)變的過程。經(jīng)歷我有幸能在trw2000劉濤濤那邊工作過二十幾天,以下都是只從技術(shù)角度去看一切的。代碼要寫的漂亮,不能隨便浪費(fèi)一個字節(jié)
2、。精確的是到字節(jié),不是隨便定義int類型。個人感覺劉濤濤很有勤奮精神。他挖第一桶金的時候,可以連續(xù)工作一個月,賺了十萬,頭酸背痛的。是個善于學(xué)習(xí)的人,也能快速移植別人的想法,會做筆記,會思考。雖然現(xiàn)在離開,出來到其他公司一直深受到他的影響。結(jié)尾其實(shí)IT行業(yè),不是很幸苦,就是有時候覺得工資不高而已。驅(qū)動有時候可以用IDA逆微軟dll,看一下微軟寫的。驅(qū)動專題還有很多不完善的地方,需要每個人動起手來,寫寫。相信你,你會越寫越漂亮的:-) 思路先用三個小專題介紹驅(qū)動流程,再用三個小專題介紹驅(qū)動程序是如何與應(yīng)用程序進(jìn)行通信的。然后分析一個經(jīng)典驅(qū)動源碼,最后再寫監(jiān)控程序。CCDeath目錄由此開始1真正
3、的驅(qū)動入門(一)5驅(qū)動開發(fā)和調(diào)試的環(huán)境設(shè)置11inf文件的編寫17驅(qū)動動態(tài)加載20WDM驅(qū)動中使用DeviceIoControl,CreateFile29WDM驅(qū)動程序使用Buffer I/O,Direct,Neither模式傳遞數(shù)據(jù)(修正版)38驅(qū)動和應(yīng)用層的異步通信51真正的驅(qū)動入門(二)56filedisk源碼分析67偶寫的Ring0監(jiān)控程序PRMonitor源代碼(ddk+sdk)71驅(qū)動程序中幾個常見例程(讀書筆記)72過濾驅(qū)動中創(chuàng)建IRP時IO堆棧單元的細(xì)節(jié)處理76由此開始一、三個專題驅(qū)動整個入門流程 內(nèi)容列表流程一.配置VC+、不同操作系統(tǒng)對應(yīng)的
4、DDK、虛擬機(jī)VMWare,安裝調(diào)試器Softice or WinDbg;流程二.編譯第一個最簡單的Hello程序(DDK環(huán)境、VC+DDK環(huán)境都可),并用監(jiān)視器觀察輸出結(jié)果.流程三.編寫*.inf 文件,進(jìn)行手工安裝到電腦上,并設(shè)備管理器進(jìn)行觀察.單獨(dú)出來專題,可使用流程六流程四.編寫一個自動加載驅(qū)動程序、卸載驅(qū)動程序的應(yīng)用程序。單獨(dú)出來專題,可使用流程六流程五.設(shè)置好調(diào)試器,特別是WinDbg雙機(jī)調(diào)試通過com1端口。下載好符號表,轉(zhuǎn)換格式,進(jìn)行源碼調(diào)試。 Softice調(diào)試器,
5、如果是XP系統(tǒng),請下載補(bǔ)丁.流程六.提供一個快捷方式解決流程三.四途徑,不夠建議多多使用上面,多多了解計算機(jī)。裝一個DirverStudio3.2,只是用里面的快捷工具,如EzDriverIntaller、DriverMonitor。任務(wù):通過流程一、二、六、五可以直接完成任務(wù)。但是如果你想知道更多就按照流程一、二、三、四、五、六.來完成??偝晒?心中有整個流程思想,編寫第一個HelloWorld驅(qū)動程序,踏進(jìn)驅(qū)動之門。課題3.1驅(qū)動整個入門流程之流程一、二、六、五課題要求:配置VC+、不同操作系統(tǒng)對應(yīng)的DDK、虛擬機(jī)VMWare,安裝調(diào)試器Softice or WinDb
6、g;成果3.1:編寫得到第一個HelloWorld驅(qū)動程序相關(guān)解決方案:驅(qū)動開發(fā)和調(diào)試環(huán)境的設(shè)置(由qqeleven完成)真正的驅(qū)動入門()附小程序代碼(由ccdeath完成)課題3.2驅(qū)動整個入門流程之流程三課題要求:相信你3.1課題沒問題吧,編譯好驅(qū)動為*.sys。安裝*.inf,接著用設(shè)備管理器進(jìn)行觀察。介紹*inf格式及如何編寫成果3.2:編寫得到一個簡單HelloWorld的*.inf相關(guān)解決方案:inf文件的編寫(由sislcb完成)課題3.3驅(qū)動整個入門流程之流程四課題要求:相信你3.1課題沒問題吧,這個應(yīng)用程序可以是控制臺 或者 是Win32程序,打開服務(wù)管
7、理之類,創(chuàng)建服務(wù)。能夠把編譯好的驅(qū)動程序,加載、卸載測試一下,在監(jiān)視器進(jìn)行觀察.成果3.3: 編寫得到一個快捷加載、卸載驅(qū)動程序的應(yīng)用程序相關(guān)解決方案:驅(qū)動整個入門流程之流程四-驅(qū)動動態(tài)加載(由sislcb完成)二三個專題WDM驅(qū)動程序與應(yīng)用程序之間的通信通信一.理解驅(qū)動程序基本框架,特別同步、IRP請求包這部分.通信二.應(yīng)用程序可以分為:古老控制臺main()、win32 SDK 程序、win32MFC框架,只需完成其中一個即可。通信三.驅(qū)動程序獲取數(shù)據(jù)緩沖區(qū)三種方式:METHOD_BUFFERED,METHOD_IN(OUT)_DIRECT,METHOD_NE
8、ITHER;通信四.通信方式DeviceIoControl、事件通知(針對win32)等.通信五.調(diào)試、運(yùn)行、觀察結(jié)果任務(wù):這個是在驅(qū)動整個入門流程基礎(chǔ)上進(jìn)行深化??偝晒?從一到二是一個跨越式進(jìn)步,通信實(shí)例程序。Fight!課題3.4 WDM驅(qū)動程序與應(yīng)用程序之間的通信二課題要求:會使用DeviceIoControl訪問,解決CreateFile問題,尋找橋梁-設(shè)備接口GUID。古老控制臺main()、win32 SDK 程序、win32MFC框架,只需完成其中一個即可。成果3.4:編寫得到一個測試程序框架,main()、win32 SDK 、
9、win32MFC相關(guān)解決方案:WDM驅(qū)動中使用DeviceIoControl,CreateFile(由火影完成)課題3.5 WDM驅(qū)動程序與應(yīng)用程序之間的通信三課題要求:對控制命令,還有文件包含路徑不要出錯。驅(qū)動程序獲取數(shù)據(jù)緩沖區(qū)三種方式:METHOD_BUFFERED,METHOD_IN(OUT)_DIRECT,METHOD_NEITHER;成果3.5:編寫得到一個驅(qū)動程序,能夠分別把這三中獲取數(shù)據(jù)方法。相關(guān)解決方案:WDM驅(qū)動程序使用Buffer I/O,Direct,Neither模式傳遞數(shù)據(jù)(由火影完成)課題3.6 WDM驅(qū)動程序與應(yīng)用程序之間的通信四課題
10、要求:通信方式DeviceIoControl異步、事件通知(針對win32)等,有可能還需要用到自旋鎖.成果3.6:編寫得到一個驅(qū)動程序,能夠滿足其中一種方式就可以了。相關(guān)解決方案:驅(qū)動和應(yīng)用層的異步通信(由sislcb完成)真正的驅(qū)動入門(二)附2個源代碼(由CCDeath完成)三filedisk源碼分析課題3.7filedisk源碼分析課題要求:分析出應(yīng)用層和核心層的整體框架思路成果3.7:filedisk源碼分析相關(guān)解決方案:filedisk源碼分析(由ccdeath完成)四Ring0級監(jiān)控程序課題3.8Ring0監(jiān)控程序PRMonitor源代碼(ddk+sdk)課題要求:通過ssdt&
11、#160;hook實(shí)現(xiàn) 對進(jìn)程創(chuàng)建,注冊表修改和內(nèi)核模塊加載的監(jiān)控相關(guān)解決方案:偶寫的Ring0監(jiān)控程序PRMonitor源代碼(ddk+sdk)( 由xhackx完成)五學(xué)習(xí)驅(qū)動碰到難題解決經(jīng)驗(yàn)與學(xué)習(xí)筆記分享課題3.* 總結(jié) 課題要求:親身感受相關(guān)解決方案:驅(qū)動程序中幾個常見例程讀書筆記(由vbcs完成)過濾驅(qū)動中創(chuàng)建IRP時IO堆棧單元的細(xì)節(jié)處理(由豬頭三完成)六.經(jīng)典驅(qū)動代碼發(fā)布區(qū)課題要求:注明版權(quán)信息,還有鏈接信息相關(guān)解決方案:一份虛擬光驅(qū)的源碼(由vbcs提供)七.驅(qū)動資源發(fā)布區(qū)codeproject驅(qū)動教程謝謝jingru提供待續(xù)
12、.可以涉及網(wǎng)絡(luò)驅(qū)動、文件系統(tǒng)過濾驅(qū)動、*驅(qū)動等領(lǐng)域是不是越來越有趣了.注:大家可以一起把上面的專題完成,挑自己感興趣課題來完成,看看有什么不同的解決方案,即使出現(xiàn)相同的解決方案,也可以貼出你自己的想法.讓看雪見證我們一起進(jìn)步.祝大家新春快樂,好運(yùn)連連.真正的驅(qū)動入門(一)作 者: CCDeath時 間: 2007-12-07,23:13鏈 接:【文章標(biāo)題】: 真正的驅(qū)動入門()附小程序代碼【文章作者】: CCDeath 【下載地址】: 自己搜索下載【作者聲明】: 只是感興趣
13、,沒有其他目的。失誤之處敬請諸位大俠賜教!【附件下載】: down-【詳細(xì)過程】很多初學(xué)驅(qū)動入門比較難.最后發(fā)現(xiàn)“難”是難在配置方面和WDM型幾個比較抽象的概念。偶學(xué)了有半個月吧,很多網(wǎng)上寫的不全,終于了解比較簡單的整個流程了. 1.書籍推薦 有個大俠推薦的.這些書籍可以從看雪、電騾、迅雷、驅(qū)網(wǎng)、得益網(wǎng)下得到. 前提必須會點(diǎn)c語言、MFC框架測試的時候,弄一個比較漂亮的截面:-) windows 2000 內(nèi)部揭密>>-這里面可以學(xué)到什么是I
14、RP、內(nèi)存管理、文件系統(tǒng)之類 驅(qū)動模型設(shè)計>>-好詳細(xì)的一本書. windows 2000xp wdm 設(shè)備驅(qū)動程序設(shè)計>>-使用DS開發(fā),無論如何使用里面的工具會更帥.說真的. DDK文檔及DDK里面的例子>>DDK開發(fā)包-安裝的時候要注意,一定把她及所在例子鉤起來,不然你找不到DDK文檔的.人氣有點(diǎn)低,不夠還很很不錯.,專業(yè)人士較多人氣很高,很熱情,各個領(lǐng)域人的都有. 2.
15、60;虛擬機(jī)(VMWare等):建議裝Windows 2000.iso 不然配置會出現(xiàn)很多的錯誤,同時候用softice或者windbg,避免OS藍(lán)屏,把時間浪費(fèi)在開機(jī)上.DriverStudio3.2:開發(fā)工具包.如果喜歡在DDK環(huán)境下,也可以利用這個開發(fā)包里面的一些工具:DriverMonitor、EAZDriverInstaller、softice、Windbg:中文教程較少.但是跟微軟走,比較有保障.就怕他最后要收錢.雙機(jī)調(diào)試. VC6.0+:這個要先安裝,然后才安裝DDK,這個順序可不能亂. DDK:沒得說.
16、VC開發(fā)工具包含這個目錄,才能彈出提示符號比如 this->點(diǎn)這邊才能彈出。 在工具->選項->目錄->H:WINDDK2600INCDDKWXP.有時候H:WINDDK2600INCDDK不能識別,不能this-> VC助手:這個工具一定要裝,很好用的。很快捷,掉渣. 注意:如果配置上還有問題的話,百度將會是你最后的歸宿. 3.先解決簡單概念問題后解決WDM模型的概念 a.OS:時間分片,但是記得給每個線程的時間CPU不一定相同.#include "windows.h"#includ
17、e "iostream.h"void main()HANDLE hThread;hThread=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);/不寫ThreadProc了.懶CloseHandle(hThread);/當(dāng)執(zhí)行CreateThread() n+1;hThread=CreateThread() n+1+1/所以現(xiàn)在計數(shù)可是n(n=0)+2=2;當(dāng)關(guān)閉CloseHandle(hThread)n=n-1;還有線程結(jié)束時n=n-1;/最后n=0,系統(tǒng)檢測為,才會釋放線程 順便提一下
18、Sleep()函數(shù):貌似很簡單一個問題,睡覺誰不會呀.卻十分體現(xiàn)出CPU分片的問題. Sleep(400),比如我們的hThread的時間是運(yùn)行600毫秒,突然運(yùn)行到300秒,來了個Sleep(400),過了之后,清醒過來,請問現(xiàn)在 hThread還可以運(yùn)行多少毫秒?是300秒?還是0秒? 應(yīng)該是0秒.在Sleep睡眠期間,CPU干什么呢?趕快從隊列找一個優(yōu)先級 高線程的來玩玩 b.有異步的地方,肯定需要同步的存在.宏觀上是異步,但是執(zhí)行同一種,同一時間,資源,就需要同步 &
19、#160;有很多種具體書籍<<win32多線程設(shè)計>>-侯捷譯。不知道是誰寫的.:-)。這時候什么信號量、互斥對象、事件將會是你的最愛 void main()HANDLE hMutext=CreateMutex(NULL,truefalse,"ccdeath");/true表示調(diào)用CreateMutex線程擁有所有權(quán),即main()主線程擁有,/其他線稱不可以CloseHanle(hMutex),只能創(chuàng)建之后都是設(shè)為已通知狀態(tài). /擁有者釋放 直接理解:事件為鑰匙和要訪問的資源為房間
20、,更為簡便. 有信號(已通知狀態(tài)):就是告訴線程,說偶(事件)這邊有錢,大家(線程)快來搶錢. c.類型轉(zhuǎn)換 PVOID& IoctlBuffer (void); ULONG RegWord; (ULONG)IocltBuffer()=?RegWord;-1.先PVOID=指針+void。先解決void轉(zhuǎn)化 (ULONG *)Ioc
21、ltBuffer()=RegWord;-2.接著解決指針轉(zhuǎn)化 -3.轉(zhuǎn)化完之后.再進(jìn)行一般化處理 |-| |int *p;-ULONG * IocltBuffer() | |int i=5;-ULONG RegWord; | |*p=i;-*IoCltBuffer()=RegWord; |
22、 |-| *(ULONG *)IocltBuffer()=RegWord-4.這才是是正確的. 我們看IocltBuffer()是個指針. d.類型定義,雖然看似簡單. typedef NTSTATUS (*R)(KIrp I);-5 NTSTATUS wo(Krp I)-6 R=&wo;-7
23、什么情況下成立,就是5和6參數(shù)和返回值要相同.有時候在DDK編程中出現(xiàn)NTSTATUS *AddDevice(PDRIVER_OBJCET DriverObject,PDEVICE_OBJECT fdo); DriverEntry() DriverObject->MarjorFunctionIRP_MJ_XX=*AddDevice;/我們是怎么判斷為什么她的原形是上面那個呢?用VC助手 /go一下,跑到MajorFunction就明白。原來用了typedef,從根據(jù)根
24、據(jù)上面7就知道了,類型與返回值要相同. 規(guī)律總結(jié)typedef int p; p i=5; 就是把變量(在int p時候,p為變量)當(dāng)成類型(typedef int p,p為類型)來用。 5.接下來我們繼續(xù)看實(shí)際例子,從武安河稍微改裝了一個,一個是基于DS+main(),另為一個是基
25、于DS+MFC測試程序。 a.我的DS是3.2。好象沒有main和MFC框架只有win32sdk。不知道你們是不是.碰到好多人跟偶是一樣的. *.inf:配置文件,怎么安裝驅(qū)動,提供這個驅(qū)動的擁有者的信息之類的等. *.sys:我們要的驅(qū)動.驅(qū)動大業(yè),蒸蒸日上;看學(xué)學(xué)院,蒸蒸日上。 首先點(diǎn)"DDK Build Settings"->Luanch Program.接著啟動VC,工具欄
26、就看見DriverStudio工具欄了.點(diǎn)設(shè)置,開始. 在設(shè)置中,反正沒有console測試程序,干脆測試程序就不要集成到驅(qū)動程序里面去。把設(shè)置中的"集成測試程序"打勾 給去掉.自己在寫一個集成測試程序,再集合到驅(qū)動程序也一樣. 1.文件打開空間(*dsw) ,去到C:Program FilesCompuwareDriverStudioDriverWorkssource下重新編譯一下, 選擇批(最后兩個)組建.
27、; Build Environment Variables BASEDIR=H:WINDDK2600 vdw_wdm.lib - 0 error(s), 0 warning(s) 就OK了. 2.然后再編譯,靠,還出現(xiàn)問題.不怕,偶已經(jīng)從win2003 ddk中把需要的文件都拷貝過來了。缺什么,偶們就補(bǔ)什么. cs
28、q.lib csq.h ntstrsafe.lib 在附件里,偶會上傳的. 3.基本OK了。開始寫驅(qū)動,接著寫驅(qū)動程序,接著調(diào)試驅(qū)動程序,接著安裝驅(qū)動程序,打開監(jiān)視器觀察是否有錯誤發(fā)生,再 返回來修改驅(qū)動程序。好了,一步步來了. 先在DriverEntry() DbgPrint("驅(qū)動加載了."); 編譯一下,生成*.sys. 用監(jiān)視器(DS里
29、面的工具M(jìn)oniter)打開這個 *.sys.接著按go.是不是看到驅(qū)動加載了. 122.734 Default CCDeath: CCDeathDriver:DriverEntry+. Compiled at 21:33:07 on Dec 7 2007 122.734
30、60; Default CCDeath: 驅(qū)動加載了. 122.734 Default CCDeath: CCDeathDriver:DriverEntry-. STATUS 0 122.734 Def
31、ault CCDeath: CCDeathDriver:Unload+. 122.734 Default CCDeath: CCDeathDriver:Unload-. Monitor
32、; - end - 高興吧. 要寫一個通信程序.驅(qū)動程序和應(yīng)用程序是兩個不同世界的人.想溝通是需要橋梁的. 按照上面方法創(chuàng)建一個驅(qū)動程序?yàn)镃CDeath.溝通的橋梁就是CCDeathInterface.h和CCDeathIoctl.h,自己手動添加.具體 要里面的內(nèi)容要看書籍才行。具體函數(shù)就是DeviceControl()這個東西。
33、160; CCDeathIoctl.h:/控制命令,請注意存放了如何ruan 沖區(qū)的方式是METHOD_BUFFEREDMETHOD_IN_DIRECTMETHOD_NEITHER CCDeathInterface.h/設(shè)備的接口,我們可以用的. 從新打開一個工程新建一個consle測試程序.為TestCCDeath;也包含CCDeathInterface.h和CCDeathIoctl.h這兩個頭文件才 能溝通."./CCDeathInte
34、rface.h" "./CCDeathIoctl". 把TestCCDeath放入到CCDeath目錄下,接著打開CCDeath工程,選擇“工程”->"插入工程到工作空間"。 添加頭文件和變量 /添加頭文件:#include ".CCDeathInterface.h"#include ".CCDeathIoctl.h"/添加變量:GUID CCDeathClassGuid=CCDeathDevice_CLASS_GUID;/
35、要修改下面一個函數(shù)哦/在DeviceControl()函數(shù)中對中方式進(jìn)行處理.NTSTATUS CCDeathDevice:DeviceControl(KIrp I)NTSTATUS status = STATUS_SUCCESS;switch (I.IoctlCode()case READ_DWORD:status=CCDeath_DWORD_Hander(I); break;case READ_STRING:status=CCDeath_STRING_Hander(I);break;case READ_BOOLEAN:status=CCDeath_BOOLEAN_Hander(I);bre
36、ak;default:status = STATUS_INVALID_DEVICE_REQUEST;break;return status;NTSTATUS CCDeathDevice:CCDeath_DWORD_Hander(KIrp I)/ ./ 處理 三個處理共同點(diǎn): I.information()=sizeof(ULONG);/成功的時候 I.information()=0;/失敗的時候 三個處理不同點(diǎn):
37、寫測試程序: 碰到第一個問題:Cannot open include file: 'devintf.h': No such file or directory 解決方法:在TestCCDeath.dsp加這么一行 # ADD CPP /I "$(DRIVERWORKS)include" 碰到第二個
38、問題: OpenByInterface.obj : error LNK2001: unresolved external symbol _imp_SetupDiDestroyDeviceInfoList4 OpenByInterface.obj : error LNK2001: unresolved external symbol _imp_SetupDiGetClassDevsA16 Op
39、enByInterface.obj : error LNK2001: unresolved external symbol _imp_SetupDiGetDeviceInterfaceDetailA24 OpenByInterface.obj : error LNK2001: unresolved external symbol _imp_SetupDiEnumDeviceInterfaces20 Release
40、/TestCCDeath.exe : fatal error LNK1120: 4 unresolved externals 執(zhí)行 link.exe 時出錯. TestCCDeath.exe - 1 error(s), 0 warning(s) 解決方法:#pragma comment(lib,"setupapi")
41、;一切OK 了,運(yùn)行一下測試程序結(jié)果。 開始要測試CCDeath驅(qū)動程序了: 錯誤碼ERROR opening device: (0) returned from CreateFile 退出測試程序. Press any key to continue 碰到問題三:上面的運(yùn)行失敗了。
42、解決辦法那是我們還沒安裝驅(qū)動了. b.安裝驅(qū)動:有2種方法,個人比較喜歡下面這種.因?yàn)楹唵危韵矚g. 1.先打開DS中的工具M(jìn)onitor開始監(jiān)視 2.打開DS中的工具EZDriverInstaller(快速安裝驅(qū)動),選擇*.inf。在Add New Device,加載*.sys. OK 3.運(yùn)行我們的測試程序. 4.觀察監(jiān)視機(jī),再反復(fù)調(diào)試.softice . 下次見了.&
43、#160; 運(yùn)行結(jié)果: 開始要測試CCDeath驅(qū)動程序了: 設(shè)備已經(jīng)被發(fā)現(xiàn),打開句柄成功. READ_DWORD:0x1e240 Press any key to continue -【經(jīng)驗(yàn)總結(jié)】 下一次繼續(xù)哦.覺得有幫助.頂頂哦. Press any key to&
44、#160;continue. -【版權(quán)聲明】: 本文原創(chuàng)于看雪技術(shù)論壇, 轉(zhuǎn)載請注明作者并保持文章的完整, 謝謝! &
45、#160; 2007年12月07日 23:06:35驅(qū)動開發(fā)和調(diào)試的環(huán)境設(shè)置作 者: qqeleven時 間: 2007-07-19,01:11鏈 接:【文章標(biāo)題】: 驅(qū)動開發(fā)和調(diào)試的環(huán)境設(shè)置【文章作者】: qqeleven【使用工具】: VC2003,VMware,Visual SoftICE【操作平臺】: xp
46、;sp2【作者聲明】: 只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!-【詳細(xì)過程】 介紹一下如何用VC2003開發(fā)驅(qū)動,并且介紹在虛擬機(jī)VMware中用Visual SoftICE調(diào)試驅(qū)動。 先安裝好VC2003,再安裝Visual Assist X(VC的一個插件,高亮、查錯、)。VC安裝好后就要安裝驅(qū)動開發(fā)包DDK2003了,建議完全安裝。之后就安裝DriverStudio,我用的是3.2,如圖: 打開VC2003,工具>DriverS
47、tudio>DDK Build Settings,設(shè)置編譯環(huán)境: 然后設(shè)置Visual Assist X: 開發(fā)環(huán)境設(shè)置完成了?,F(xiàn)在編譯一個驅(qū)動,拿DDK目錄下的一個有現(xiàn)成代碼的例子ioctl講解。用DriverStudio 提供的一個工具DDK sources to vcproj Converter建立工程文件。打開ioctl目錄下的dirs文件(其實(shí)是打開sources文件),Convert-> Convert&
48、#160;DDK dirs/sources,按下Convert生成工程文件。用VC2003打開ioctl.sln,現(xiàn)在你可以修改或者編譯驅(qū)動了,因?yàn)檫@個是現(xiàn)成的例子不用修改,那就直接編譯吧。用Win32 Checked方式編譯,編譯工程:工具>DriverStudio>Build Solution with DDK Build.exe。如果有錯誤產(chǎn)生可以參考log文件來修復(fù)錯誤,編譯成功后會產(chǎn)生ioctlapp.exe和sioctl.sys文件。下面建立調(diào)試環(huán)境來調(diào)試剛生成的驅(qū)動文件。 先安裝好VMw
49、are,再在虛擬機(jī)中安裝好xp sp2,然后在xp中安裝好DriverStudio的Visual SoftICE(Target)。之后設(shè)置Visual SoftICE,Startup中把Visual SoftICE設(shè)置成Boot,Settings中選中所有,Connections中選用COM1連接,Keep Alive設(shè)定為6000,完成。關(guān)閉虛擬機(jī)電源設(shè)置VMware,為虛擬機(jī)添加一個COM口,如圖: 設(shè)置完成,下面開始調(diào)試。 啟動虛擬機(jī)把ioctlapp.exe和sioctl.sys兩
50、個文件復(fù)制到虛擬機(jī)中,主機(jī)打開Visual SoftICE,Debug->Connect->Named Pipe,填入com_1,連接到虛擬機(jī)。Debug->Symbol Settings->Symbol Paths,設(shè)置好MS的符號下載路徑和本地路徑,下載調(diào)試符號,如圖: 一定要下載系統(tǒng)的調(diào)試符號文件,這一步不能省。最后,還要把編譯驅(qū)動的符號路徑ioctlsysobjchk_wxp_x86i386和驅(qū)動的原代碼路徑ioctlsys分別加入到User Symbol Search
51、 Paths和Source Search Paths中去。然后,在命令行SI>中下斷點(diǎn)bpload sioctl.sys,當(dāng)系統(tǒng)加載驅(qū)動sioctl.sys時斷下。回到虛擬機(jī)中雙擊ioctlapp.exe,斷下,如圖: 繼續(xù),點(diǎn)擊標(biāo)簽sioctl.c在DriverEntry例程開始處下斷點(diǎn),取消剛才那個斷點(diǎn),Go,如圖: 可以進(jìn)行源碼調(diào)試了,方法和WinDbg差不多,在這里不再說明了,祝大家好運(yùn)!-【版權(quán)聲明】: 本文原創(chuàng)于看雪技術(shù)論壇, 轉(zhuǎn)載請注明作者并保持文章的完整, 謝
52、謝!把文章放到我的Blog上去了:inf文件的編寫作 者: sislcb時 間: 2008-01-02,15:19鏈 接:這部分主要講解inf文件的編寫,其實(shí)inf文件不僅僅可以用來做為安裝驅(qū)動使用,還有很多其他用法,這里就不涉及了,先講下inf的語法,這些語法都是google上有的。inf文件其實(shí)是一種純文本文件,可以用任意一款文本編輯軟件來打開進(jìn)行編輯。inf是不區(qū)分大小寫的。inf中包含各節(jié)的含義:1、 Version節(jié) 每一個INF文件都包含一個這樣的節(jié),該節(jié)中的條目主要是描述此INF文件支持的設(shè)備類型和適用的操作系統(tǒng)。在該節(jié)中如果出現(xiàn)"sig
53、nature=" CHICAGO""這樣的條目則表示該INF文件適用于Windows 98之后的所有操作系統(tǒng),如果包含"signature="Windows NT""這樣的條目則表示該INF文件適用于Windows 2000/XP/2003操作系統(tǒng),而且兩者必具其一。包含在version中class說明了設(shè)備的類型,常見的類型有: Display(顯示設(shè)備,如顯卡)、Media(多媒體設(shè)備,如聲卡)、Net(網(wǎng)絡(luò)設(shè)備,通常是網(wǎng)卡)、Modem(調(diào)制解調(diào)器)、Printer
54、160;(打印設(shè)備)、Image(圖像捕獲設(shè)備,如攝像頭)。2Manufacturer節(jié) 該節(jié)中的條目主要是描述INF文件可以識別的所有硬件設(shè)備,其中包含有設(shè)備的生產(chǎn)廠家,以便設(shè)備的正確安裝。如"%ATi%=ATi"指明設(shè)備的生產(chǎn)商為"ATi",這個大家都不會陌生吧,是顯卡的生產(chǎn)商。3SourceDisksNames節(jié) 該節(jié)主要指明安裝文件所在的介質(zhì)。如:"1="ATi Drivers Release CD""表明所有驅(qū)動程序都在零售版的CD
55、盤上。4SourceDiskFiles節(jié)驅(qū)動程序文件列表及被安裝的位置,該節(jié)必須結(jié)合SourceDisksNames節(jié)才能知道具體的位置。如"atinbtxx.sys=1",則你必須到DestinationDirs節(jié)去查看"1"具體代表那個位置。5DestinationDirs節(jié)INF文件會指示安裝程序在安裝的過程中,將一些文件復(fù)制到硬盤上,或者將硬盤上的一些文件刪除、重命名等。該節(jié)即指定了為實(shí)現(xiàn)上述目的的文件所在的目的路徑。6DefaultInstall節(jié)和Install節(jié)在這一節(jié)中描述了設(shè)備驅(qū)動程序與硬件設(shè)備的實(shí)際屬性。默認(rèn)情況下,首先執(zhí)行Defau
56、ltInstall節(jié),該節(jié)指定了要復(fù)制或刪除的文件,注冊表的更新,INF文件的更新等等信息,同時又包含指向其他節(jié)的指針。7String節(jié)這一節(jié)中定義了字符串變量,當(dāng)某些字符串頻繁地出現(xiàn)在INF文件中,為簡化輸入,可以在該節(jié)中定義一個字符串變量,代表該字符串出現(xiàn)在INF文件中。 (以上解釋內(nèi)容來自)這是inf文件的基本語法了?,F(xiàn)在來看具體的inf文件的寫法,我在這里寫了一個最簡單的helloworld驅(qū)動,其功能就是打印了一句“hello world”。可以通過dbgview觀察。這個inf就是為了安裝helloworld這個驅(qū)動。下面是inf文件:代碼:; Hel
57、loWorld;Versionsignature = "$Chicago$" 這個是必須的,也可以換成WIndows95 和nT,但是這個最好,它表示windowsClass = NULL
58、0; 屬于什么類型,這里是沒有ClassGuid = 00000000-0000-0000-0000-000000000000 該類型的類型id,這里全填0Provider = %PEDIY%
59、 提供商的名稱DriverVer = 01/02/2008,.1 驅(qū)
60、動的版本號DestinationDirsHelloWorld.DriverFiles = 12 %windir%system32drivers;12代表%windir%system32drivers這個目錄,意思就是將HelloWorld.DriverFiles中的內(nèi)容拷貝到%windir%system32drivers中; Default install sections;DefaultInstallCopyFiles
61、0; = HelloWorld.DriverFiles;CopyFiles是內(nèi)建命令,表示拷貝將等號右邊的節(jié)里面的文件拷貝到目的地DefaultInstall.ServicesAddService = %HelloWorldServiceName%,HelloWorld.Service;AddService是內(nèi)建命令,表示找右邊來新建服務(wù).;
62、%HelloWorldServiceName%這個是服務(wù)的名稱,加%表示在string section中,HelloWorld.Service代表下面的節(jié)點(diǎn)名稱; Default uninstall sections;DefaultUninstallDelFiles = HelloWorld.DriverFiles;DelFiles表示卸載時刪除文件DefaultUninstall.ServicesDelService = HelloWorld,0x200
63、 Flags note to stop service first;刪除服務(wù),在刪除服務(wù)前,先停止服務(wù); Services Section;HelloWorld.ServiceDisplayName = %HelloWorldServiceName% 系統(tǒng)服務(wù)中顯示的名稱Description
64、160;= %HelloWorldServiceDesc% 系統(tǒng)服務(wù)中描述的名稱ServiceBinary = %12%helloworld.sys %windir%system32driversfilespy.sysServiceType = 1 SERVICE_KERNEL_DRIVER
65、StartType = 3 SERVICE_DEMAND_START,手動啟動ErrorControl = 1 SERVICE_ERROR_NORMAL; Copy Files;HelloWorld.DriverFileshelloworld.sys; St
66、ring Section;StringsPEDIY = "看雪論壇"HelloWorldServiceDesc = "看雪論壇-HelloWorld.Inf 演示"HelloWorldServiceName = "HelloWorld"HelloWorldRegistry = "sys
67、temcurrentcontrolsetservicesHelloWorld"這是一個簡單的inf,沒有包括所有的inf節(jié)名,但是已經(jīng)能夠正常安裝了。只需要右鍵該文件,然后點(diǎn)擊“安裝”,就可以安裝成功了,由于需要手動啟動,所以需要在cmd下運(yùn)行net start helloworld,helloworld是我們服務(wù)的名稱,就可以看到啟動成功了。在啟動服務(wù)前,先打開dbgview,就可以看到如下信息:可以看到服務(wù)已經(jīng)啟動成功了,也就是說,驅(qū)動已經(jīng)成功加載了!最后附帶helloworld.sys,helloworld.inf,simple helloworl
68、d.inf代碼。helloworld.inf是比較詳細(xì)的inf文件。大家可以參考下。驅(qū)動動態(tài)加載作 者: sislcb時 間: 2007-12-28,18:18鏈 接:這個課題主要是講如何動態(tài)加載驅(qū)動,雖然現(xiàn)在已經(jīng)存在很多的動態(tài)驅(qū)動加載器,但是使用自己編寫的東西,還是有不同的感覺的。當(dāng)是科普吧。在這里,主要使用SCM來進(jìn)行驅(qū)動的動態(tài)加載和卸載。先介紹下SCM,服務(wù)控制管理器(Service Control Manager , SCM )。服務(wù)(Service)是在后臺運(yùn)行配套的程序,并且不需要用戶交互(也就是說沒有常見的用戶界面或者控制臺)。換
69、句話說,一個服務(wù)就是一個始終運(yùn)行于系統(tǒng)中的 Win32 進(jìn)程,即使沒有用戶登陸進(jìn)來也如此。SC 管理器(即服務(wù)控制管理器)可以控制服務(wù)和驅(qū)動程序。主要涉及的函數(shù)如下:名 稱 描 述 CloseServiceHandle 關(guān)閉來自 OpenSCManager() 、 CreateService() 或 OpenService() 的句柄ControlService 停止、暫停、繼續(xù)、查詢或
70、通知已加載的服務(wù) / 驅(qū)動程序CreateService 加載一個服務(wù) / 驅(qū)動程序DeleteService 卸載一個服務(wù) / 驅(qū)動程序OpenSCManager 獲取 SC 管理器的句柄OpenService 獲取一個已加載的服務(wù) / 驅(qū)動程序的句柄QueryServiceStatus 查詢一個服務(wù) / 驅(qū)動程序的屬性和當(dāng)前狀態(tài)StartService 啟動一個已加載的服務(wù) / 驅(qū)動程序加載和運(yùn)行一個服務(wù)需要執(zhí)行的典型操作步驟: 1. 調(diào)用 OpenSCManager() 以獲取一個管理器句柄 2. 調(diào)用 CreateService() 來向系統(tǒng)中添加一個服務(wù) 3.&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年閉式冷卻塔合作協(xié)議書
- 2025年力與變形檢測儀合作協(xié)議書
- 2025年離子風(fēng)棒合作協(xié)議書
- 2025年靜脈注射丙種球蛋白合作協(xié)議書
- 2025年氯氟氰菊酯項目合作計劃書
- 2025年粉體無篩分離設(shè)備合作協(xié)議書
- 電商物流領(lǐng)域工作背景證明(7篇)
- 2025年新鄉(xiāng)危險品考試模擬試題
- 商業(yè)合作補(bǔ)充條款協(xié)議
- 月度收入及年終獎金詳細(xì)證明(8篇)
- CSC-300系列數(shù)字式發(fā)變組保護(hù)裝置的調(diào)試說明
- 硫酸應(yīng)急預(yù)案-硫酸泄漏應(yīng)急預(yù)案演練總結(jié)
- 2025年中考英語復(fù)習(xí)1600詞背誦單-按字母排序
- 線路安規(guī)培訓(xùn)
- 比亞迪秦EV新能源汽車電機(jī)驅(qū)動系統(tǒng)
- 大風(fēng)天氣下的物流運(yùn)輸安全措施
- 老舊小區(qū)加裝電梯使用公約協(xié)議
- 新生兒護(hù)理安全用藥
- 2025年湖北省新華書店集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 西醫(yī)骨科發(fā)展簡史
- 醫(yī)療護(hù)理醫(yī)學(xué)培訓(xùn) 臨時起搏器的使用及參數(shù)調(diào)整課件
評論
0/150
提交評論