



下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、接觸windows驅(qū)動(dòng)開(kāi)發(fā)有一個(gè)月了, 感覺(jué)Windows驅(qū)動(dòng)編程并不像傳說(shuō)中的那么神秘。 為了更好地為以后的學(xué)習(xí)打下基礎(chǔ), 記錄下來(lái)這些學(xué)習(xí)心得,也為像跟我一樣致力于驅(qū)動(dòng)開(kāi) 發(fā)卻苦于沒(méi)有門(mén)路的菜鳥(niǎo)朋友們拋個(gè)磚,引個(gè)玉。我的開(kāi)發(fā)環(huán)境: Windows xp主機(jī)+ VMWARE虛擬機(jī)(windows 2003 server系統(tǒng))。編 譯環(huán)境: WinDDK6001.18002。代碼編輯工具: Sourcelnsight。IDE : VS2005/VC6.0。調(diào)試工 具:Win DBG,DbgView.exe, SRVINSTW.EXE上面所有工具均來(lái)自互聯(lián)網(wǎng)。對(duì)于初學(xué)者,DbgView.exe和
2、SRVINSTW.EXE是非常簡(jiǎn)單有用的兩個(gè)工具,一定要裝 上。前者用于查看日志信息,后者用于加載驅(qū)動(dòng)。下面從最簡(jiǎn)單的 helloworld說(shuō)起吧。Follow me。驅(qū)動(dòng)程 序 的 入 口 函 數(shù) 叫 做DriverE ntry(PDRIVER_OBJECTpDriverObj,PUNICODE_STRING pRegisgryString)。兩個(gè)參數(shù),一個(gè)是驅(qū)動(dòng)對(duì)象,代表該驅(qū) 動(dòng)程序;另一個(gè)跟注冊(cè)表相關(guān),是驅(qū)動(dòng)程序在注冊(cè)表中的服務(wù)名,暫時(shí)不用管它。DriverEntry類似于C語(yǔ)言中的main函數(shù)。它跟main的差別就是,main完全按照順序調(diào)用的方法執(zhí)行, 所有東西都按照程序員預(yù)先設(shè)定的
3、順序依次發(fā)生;而DriverEntry則有它自己的規(guī)則,程序員只需要填寫(xiě)各個(gè)子例程,至于何時(shí)調(diào)用,誰(shuí)先調(diào),由操作系統(tǒng)決定。我想這主要是因?yàn)轵?qū)動(dòng)偏底層,而底層與硬件打交道,硬件很多都是通過(guò)中斷來(lái)與操作系統(tǒng)通信,中斷的話就比較隨機(jī)了。但到了上層應(yīng)用程序,我們是看不到中斷的影子的。說(shuō)到中斷,驅(qū)動(dòng)程序中可以人為添加軟中斷,_asm int 3或者Int_3();前者是32位操作系統(tǒng)用的,后者是64位用的。64位驅(qū)動(dòng)不允許內(nèi)嵌匯編。下面是我的一個(gè)helloworld的源碼:00 0 10tnsTATus DriverEntry(iNPDRiviL objectpDiivei-obj. ibrpunico
4、de sitingpr甲護(hù)肝伽衛(wèi)1£)oonn< 0 012NTSTATUS00 0 13UNICODE STRING NaineStiuiS.Link.Stidii?;00014DbgriiitCTliLs 祚 hello|0 0 0 15|0 0016-ifdtf DRIVERAPPCOMMUNICATE0D0L7RtllnitUnico dtString(&br ameS tn唱 IAYDeincelVhello world J;oooiestatus = IoCre ateDevic e (plhivei- (Jbj J/逢 設(shè)備對(duì) 接 0019NULL,000
5、23String, 0031FILE DEVICE UNKNOWN,00 022FILE DEVICE SECURE OPEN.00D23FALSE,0002400025);UUU26rf(l NT SUCCESS(itatus)DD027(00 023DbgPrint(1oCreatffDffvice0Q03Pretum status;O0U3O0 0031RjtikitUnwod卅站鵡(&1減3噸匸叫?畑cllo曙制dLmk"),0003200033ii( !NT SUCCESS(Etatus)00034| 0035DbgPriritnoCrtateSymbolicLin
6、k failW);00036IoDclelt eDevice (DeviceOhject);00037retmn status;0003B00035pDriveiObj->Maj0rFunctionIRP_MJ_CREATE = Diivei Create,0 004(pDiivei Obj- >MajorFunction IRP_b/J_CLOSE' =Dh ci<?i ?nre;100 0 41pDiivrOhj- >MajorFuncti0n IBP_biJ_DEVICE_C ONTROL = lJiiveiX Tpihp;|00042鈕 ndif|000
7、4300044pDriverObj- >DrwerUnload = DiivM-Uiiload;/期卸裁擁程00 0 4iehun STATUS.SUCCESS;0 0046 ? end DriverEntry ?注意第16行的宏。目前我們的驅(qū)動(dòng)程序暫時(shí)不需要和應(yīng)用程序通信,所以用Macro注釋掉。從這里也可以看出來(lái),想要實(shí)現(xiàn)sys和exe的通信,就要編寫(xiě)相應(yīng)的派遣函數(shù),在本例就是各種MajorFunction。這個(gè)驅(qū)動(dòng)完成的功能很簡(jiǎn)單,加載時(shí),打印一句話"This is helloworld ”u u u«00003:PDEVICE_OBTECT DenceObje
8、ct = NULL;000D4:OOOOS:VOID0 0 0 0 6:DriverUnload(iNPDRivER object pihi化00007:00006:DbgPnntfDnver Unloaded');nnnn:卸載時(shí)打印另外一句話"Driver Un loaded ”。DbgPrint跟c語(yǔ)言中的printf類似,也是在終端上輸出調(diào)試信息。我們可以利用前面介 紹的DbgView來(lái)觀察輸出信息。這個(gè)小東西只有四百多k,不過(guò)功能一點(diǎn)都不弱。它能查看所有的內(nèi)核日志,前提是要把capture里面的capture kernel選項(xiàng)打上勾。氣 DebugVieT on W
9、UAJVWZLQPI4CN4 (local)File Edit £aptur & Opti &ns Ccinputer Htlp& B* ®21621721821 y22 u221222Time12:37:21 12:37:21 12:37:2112:37:3512:37:3512:37:3512:37:3622312:37:3622422522622712:37:3612:37:4212:37:4212:37:42Debug Print260826032608:2608:2S08:2603 26034IParan 二 2883585, wParam
10、 = 90, nCode =0Get IMEComposit ionSt r incLensthImuGetComposit ionSt ringIParan = 1900545j 屮Far am = 17, nCode =0Get IMECoinposit ionSt r inLengthI mmG st Comp os it icnSt r ingIParan = 3口8(110尋 屮Param.三 迢 nCgdE 二026082S0826082608ImuifGetComposit ionSt ringlParam = 22216705 wParam = 46jnCode =0 Get
11、IMECoinposit ionSt rinsLengthImGetCojuposit ionSt上面這個(gè)圖是我debug 一個(gè)驅(qū)動(dòng)時(shí)候的輸出信息。對(duì)了,忘了說(shuō)怎么加載驅(qū)動(dòng)程序了。Windows驅(qū)動(dòng)多種多樣,加載方式也各不相同。可以編寫(xiě)應(yīng)用程序加載,不過(guò)這就麻煩了,還需要編寫(xiě)exe。如果僅僅是想做驅(qū)動(dòng),那么我建議用上面提到的 srvinstw工具來(lái)加載。具體可以參考寒江獨(dú)釣windows內(nèi)核安全編程一書(shū)。這這本書(shū)寫(xiě)的非常精彩,圖文并茂,尤其是譚文寫(xiě)的那幾章,深入淺出。到這里,一個(gè)簡(jiǎn)單的windows驅(qū)動(dòng)程序就完成了。不過(guò)這個(gè)helloworld沒(méi)干任何有意義的事,僅供演示用。接下來(lái)探討一下驅(qū)動(dòng)
12、層和應(yīng)用層的交互問(wèn)題。驅(qū)動(dòng)說(shuō)到底,還是為上層服務(wù)。它們之間一般用dll動(dòng)態(tài)鏈接庫(kù)來(lái)聯(lián)系。Dll其實(shí)也應(yīng)該屬于應(yīng)用層的東西。它將驅(qū)動(dòng)提供的功能進(jìn)一步封裝,然后暴露接口給應(yīng)用程序,應(yīng)用程序利用這些接口 api,來(lái)完成驅(qū)動(dòng)程序預(yù)先設(shè)定好的各項(xiàng)功能。Dll的編寫(xiě)不是本文討論的內(nèi)容,各位可以去網(wǎng)上搜一下dll的知識(shí),很簡(jiǎn)單,按照標(biāo)準(zhǔn)格式填寫(xiě)就好了,只不過(guò)編譯的時(shí)候,VC+或者VisualStudio要選擇編譯目標(biāo)是動(dòng)態(tài)鏈接庫(kù)。這里重點(diǎn)說(shuō)下dll如何來(lái)調(diào)用驅(qū)動(dòng)程序的各個(gè)功能。也許你已經(jīng)猜到了,對(duì),我們現(xiàn)在把 DriverEntry 中 16 行的DRIVER_APP_COMMUNICA TE打開(kāi)。打開(kāi)后大
13、家會(huì)發(fā)現(xiàn),多了5個(gè)重要的東西。1. 創(chuàng)建設(shè)備對(duì)象2. 創(chuàng)建連接符號(hào)3. 填充 IRP_MJ_CREATE4. 填充 IRP_MJ_CLOSE5. 填充 IRP_MJ_DEVICE_CONTROL第一個(gè)和第二個(gè)是為了讓?xiě)?yīng)用程序找到我編寫(xiě)的驅(qū)動(dòng)。把應(yīng)用程序領(lǐng)進(jìn)門(mén)。那么這里的門(mén)牌號(hào)就是符號(hào)鏈接 LinkString。要是就是 IRP_MJ_CREATE (上層使用 CreateFile調(diào)到 DriverCreate )?;叵胍幌?CreateFile 的參數(shù):HANDLE CreateFile( LPCTSTR IpFileName,DVJORD dwDesiredAccess,DWORD dwSh
14、areMode,/ file namej-象路徑名/ access mode制模式H share modUt享模式LPSECURrRP_ATTRIBUTES IpSecurityAttributes, /' SD 安空屬性(也艮踐肖毀方式)/ how to create/ file attributes/ handle to template fileDWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);這里的lpFileName,其實(shí)對(duì)應(yīng)于驅(qū)動(dòng)中的LinkName。只不過(guò)需要做個(gè)小轉(zhuǎn)換。驅(qū)動(dòng)中這個(gè)字段一般是 ”?helloworldLink ” 有些地方也寫(xiě)成 WDosDevicesWhelloworldLink,一個(gè) 意思。應(yīng)用程序中一般寫(xiě)作.helloworldLi nk,具體為啥這樣,我還沒(méi)弄清楚。對(duì)了,設(shè)備對(duì)象名稱也有規(guī)定,Devicehelloworld,前面這個(gè) Device也不是隨便寫(xiě)的,讀者可以用 winobj查看,凡是 winobj上面顯示的有的,就可以用,否則不可以用。那么好,現(xiàn)在你通過(guò) CreateFile打開(kāi)了驅(qū)動(dòng),打開(kāi)了門(mén),那么我怎么跟門(mén)里面
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZSM 0049-2024“領(lǐng)跑者”評(píng)價(jià)技術(shù)要求 機(jī)織兒童服裝
- 二零二五年度高效節(jié)能大棚租賃及能源管理協(xié)議
- 二零二五年度個(gè)人環(huán)保項(xiàng)目貸款抵押擔(dān)保合同
- 二零二五年度汽車銷售區(qū)域代理退出協(xié)議
- 二零二五年度街道辦事處社區(qū)工作者績(jī)效激勵(lì)聘用合同
- 二零二五年度智能交通管理系統(tǒng)知識(shí)產(chǎn)權(quán)授權(quán)協(xié)議
- 2025年度車輛質(zhì)押融資服務(wù)協(xié)議
- 二零二五年度高新技術(shù)園區(qū)建設(shè)資金委托墊資合同
- 2025年度終止供貨協(xié)議函模板與合同終止后的利益平衡
- 企業(yè)采購(gòu)管理流程改進(jìn)調(diào)研報(bào)告
- 腹部外傷護(hù)理查房記錄
- 橋面鋪裝三維激光攤鋪施工工法
- 優(yōu)質(zhì)課一等獎(jiǎng)小學(xué)綜合實(shí)踐《我也能發(fā)明》課件
- 部編人教版三年級(jí)下冊(cè)語(yǔ)文:荷花課件
- 螺紋牙強(qiáng)度校核計(jì)算
- 關(guān)于在生產(chǎn)過(guò)程中物料流轉(zhuǎn)的交接和管理規(guī)定
- 浮針療法的學(xué)習(xí)課件
- XX學(xué)院社團(tuán)指導(dǎo)老師學(xué)期考核表
- 獸醫(yī)外科手術(shù)學(xué)與獸醫(yī)外科學(xué)章節(jié)測(cè)試及答案
- 德能勤績(jī)量化考核表
- GB/T 6545-1998瓦楞紙板耐破強(qiáng)度的測(cè)定法
評(píng)論
0/150
提交評(píng)論