![基于Windows2000開(kāi)發(fā)WDM設(shè)備驅(qū)動(dòng)程序的方法_第1頁(yè)](http://file4.renrendoc.com/view/601641537e8e8a85251ae51dc69dc07c/601641537e8e8a85251ae51dc69dc07c1.gif)
![基于Windows2000開(kāi)發(fā)WDM設(shè)備驅(qū)動(dòng)程序的方法_第2頁(yè)](http://file4.renrendoc.com/view/601641537e8e8a85251ae51dc69dc07c/601641537e8e8a85251ae51dc69dc07c2.gif)
![基于Windows2000開(kāi)發(fā)WDM設(shè)備驅(qū)動(dòng)程序的方法_第3頁(yè)](http://file4.renrendoc.com/view/601641537e8e8a85251ae51dc69dc07c/601641537e8e8a85251ae51dc69dc07c3.gif)
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于Windows2000開(kāi)發(fā)WDM設(shè)備驅(qū)動(dòng)程序的方法
摘要:本文介紹了Windows2000WDM驅(qū)動(dòng)程序結(jié)構(gòu)及其原理,給出一個(gè)驅(qū)動(dòng)程序的例子關(guān)鍵詞:WDM驅(qū)動(dòng)程序1.概述引入了全新的WDM(Win32DriverModel)的驅(qū)動(dòng)程序架構(gòu),說(shuō)是新技術(shù),其實(shí)早在1997年Microsoft就提出了該項(xiàng)技術(shù)并在Windows98中得到了充分的應(yīng)用,換句話說(shuō),Windows98也支持WDM。這樣WDM就成為了一個(gè)跨平臺(tái)的驅(qū)動(dòng)程序模型不僅如此WDM驅(qū)動(dòng)程序還可以在不修改源代碼的情況下經(jīng)過(guò)重新編譯后在非Intel平臺(tái)上運(yùn)行。2.WDM設(shè)備驅(qū)動(dòng)程序的特點(diǎn)和原理2.1通用驅(qū)動(dòng)程序?qū)旧弦粯拥挠布驗(yàn)樗麄児蚕硪粋€(gè)總線或完成類(lèi)似的任務(wù),設(shè)備驅(qū)動(dòng)程序可以使用這些標(biāo)準(zhǔn)的驅(qū)動(dòng)程序功能,使公共總線的共享容易,且更容易寫(xiě)出新的驅(qū)動(dòng)程序,總線驅(qū)動(dòng)程序,如USB、1394,和類(lèi)驅(qū)動(dòng)程序。(1)Win32程序接口:可以使用Win32函數(shù)像訪問(wèn)文件那樣訪問(wèn)設(shè)備CreateFile()、Closehandle()、ReadFile()、WriteFile()、DeviceIoControl()用于發(fā)出特殊請(qǐng)求,可發(fā)送數(shù)據(jù)給驅(qū)動(dòng)和從驅(qū)動(dòng)得到數(shù)據(jù),IOCTL代碼可以是預(yù)先定義的也可是自己定義的。(2)創(chuàng)建設(shè)備大多數(shù)WDM設(shè)備對(duì)象都是在PnP管理器中調(diào)用AddDevice入口時(shí)創(chuàng)建,這個(gè)PnP例程在插入新設(shè)備和安裝Inf文件時(shí)被調(diào)用,此后一系列的PnPIRP被發(fā)送到驅(qū)動(dòng)程序,指示設(shè)備應(yīng)如何啟動(dòng)和查詢(xún)它的功能2.2WDM-的工作原理WDM是在NT4.0驅(qū)動(dòng)程序結(jié)構(gòu)上發(fā)展起來(lái)的,所以它與NT4.0驅(qū)動(dòng)程序極為相似,但是它卻有了本質(zhì)上的提高,比如它支持USB、IEEE1394、ACPI等全新的硬件標(biāo)準(zhǔn)。雖然Windows98與Windows2000都支持WDM,可是并不意味著Windows98下的VxD可以在Windows2000下運(yùn)行,而NT下的WDM卻可以在Windows98下運(yùn)行。不過(guò)原先準(zhǔn)備在兩個(gè)平臺(tái)上同時(shí)運(yùn)行需要編寫(xiě)兩個(gè)截然不同的驅(qū)動(dòng)程序,而現(xiàn)在只需要編寫(xiě)一個(gè)WDM驅(qū)動(dòng)程序就可以了。同NT4.0驅(qū)動(dòng)程序一樣,WDM驅(qū)動(dòng)程序也是分層的,即不同層上的驅(qū)動(dòng)程序有著不同的優(yōu)先權(quán),而Windows9x下的VxD則沒(méi)有此結(jié)構(gòu)。另外,WDM還引入了功能設(shè)備對(duì)象FDO(functionaldeviceobject)與物理設(shè)備對(duì)象PDO(physicaldeviceobject)兩個(gè)新概念來(lái)描述硬件,一個(gè)PDO代表一個(gè)真實(shí)硬件,在驅(qū)動(dòng)程序看來(lái)則是一個(gè)FDO。
另外值得注意的是,一個(gè)硬件只允許有一個(gè)PDO,但卻可以擁有多個(gè)FDO,而在驅(qū)動(dòng)程序中我們不是直接操作硬件而是操作相應(yīng)的PDO與FDO。在Ring-3與Ring-0通訊方面,操作系統(tǒng)為每一個(gè)用戶(hù)請(qǐng)求打包成一個(gè)IRP(IORequestPacket)結(jié)構(gòu),將其發(fā)送至驅(qū)動(dòng)程序并通過(guò)識(shí)別IRP中的PDO來(lái)識(shí)別是發(fā)送給哪一個(gè)設(shè)備的。另外,在驅(qū)動(dòng)程序的加載方面WDM既不靠驅(qū)動(dòng)程序名稱(chēng)也不靠一個(gè)具有某種特殊意義的ID,而是依靠一個(gè)128位的GUID來(lái)識(shí)別驅(qū)動(dòng)程序(Windows下許多東西都是靠此進(jìn)行識(shí)別的)。2.3IRP處理I/O請(qǐng)求包IRP是驅(qū)動(dòng)程序操作的中心,IRP是一個(gè)內(nèi)核對(duì)象,它是預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu),帶有一組對(duì)它進(jìn)行操作的I/O管理器例程,I/O管理器接受一個(gè)I/O請(qǐng)求,然后將它傳送到合適的驅(qū)動(dòng)程序棧中的最高驅(qū)動(dòng)程序之前,分配并處始化一個(gè)IRP,每個(gè)I/O請(qǐng)求有主功能代碼2.4IRP參數(shù)比如一個(gè)寫(xiě)的I/O請(qǐng)求轉(zhuǎn)換成一個(gè)IRP時(shí),I/O管理器填寫(xiě)主要的IRP首部,并構(gòu)造第一個(gè)個(gè)棧單元,對(duì)寫(xiě)請(qǐng)求來(lái)講,首部包含用戶(hù)緩沖區(qū)信息,而棧單元?jiǎng)t包含寫(xiě)的具體參數(shù)。如果調(diào)用另一個(gè)驅(qū)動(dòng)則必須創(chuàng)建下一個(gè)棧單元。一個(gè)IRP到棧頂時(shí),使用PIO_STACK_LOCATIONIoGetCurrentIrpStackLocation(
INPIRPIrp
);IoGetCurrentIrpStackLocationreturnsapointertothecaller'sstacklocationinthegivenIRP。如決定需要把這個(gè)IRP沿設(shè)備棧向下傳遞,使用IoCopyCurrentIrpStackLocationToNextorIoSkipCurrentIrpStackLocation簡(jiǎn)單的將內(nèi)容復(fù)制到下一個(gè)單元,如果要更改下一個(gè)棧單元,要使用LOCATIONIoGetNextIrpStackLocation(INPIRPIrp);IoGetNextIrpStackLocationgivesahigherleveldriveraccesstothenext-lowerdriver'sI/OstacklocationinanIRPsothecallercansetitupforthelowerdriver.可使用IoCallDriver調(diào)用下一個(gè)驅(qū)動(dòng)程序,當(dāng)最低一層的驅(qū)動(dòng)處理玩后調(diào)用IoCompleteRequest,IRP再向上傳遞返回用戶(hù),當(dāng)IRP向上傳遞時(shí)也可以每個(gè)驅(qū)動(dòng)有機(jī)會(huì)再處理它,每個(gè)驅(qū)動(dòng)要設(shè)置IoSetCompletionRoutine掛接一個(gè)例程,一個(gè)驅(qū)動(dòng)不一定要沿著設(shè)備棧向下傳遞IRP,如果自己能處理就就使用IoCompleteRequest完成IrP2.5設(shè)備接口用戶(hù)態(tài)使用Win32CreateFile訪問(wèn)驅(qū)動(dòng)程序,dwShareMode為0時(shí)來(lái)請(qǐng)求獨(dú)占內(nèi)核對(duì)象在設(shè)備對(duì)象DEVICE_OBJECT結(jié)構(gòu)中存儲(chǔ)設(shè)備的信息,對(duì)于與設(shè)備的每個(gè)交互,相關(guān)的DEVICE_OBJECT被傳遞給驅(qū)動(dòng)的回調(diào)例程。,但是開(kāi)發(fā)者可以擴(kuò)展設(shè)備結(jié)構(gòu),稱(chēng)為設(shè)備擴(kuò)展在PnPIRP中我們加載設(shè)備N(xiāo)TSTATUSWdm1AddDevice(
INPDRIVER_OBJECTDriverObject,指向驅(qū)動(dòng)程序的指針
INPDEVICE_OBJECTpdo指向物理設(shè)備的指針){
DebugPrint("AddDevice");status=IoCreateDevice(DriverObject,創(chuàng)建設(shè)備sizeof(WDM1_DEVICE_EXTENSION),NULL,
//NoNameFILE_DEVICE_UNKNOWN,0,F(xiàn)ALSE,
//Notexclusive,TRUE為獨(dú)占&fdo返回的新設(shè)備對(duì)象);
if(!NT_SUCCESS(status)returnstatus;IoAttachDeviceToDeviceStack(fdo,pdo);與設(shè)備棧掛接2.6刪除設(shè)備N(xiāo)TSTATUSWdm1Pnp(
INPDEVICE_OBJECTfdo,
INPIRPIrp)PIO_STACK_LOCATIONIrpStack=IoGetCurrentIrpStackLocation(Irp);
ULONGMinorFunction=IrpStack->MinorFunction;
if(MinorFunction==IRP_MN_REMOVE_DEVICE)
{DebugPrint("PnPRemoveDevice");
//disabledeviceinterfaceIoSetDeviceInterfaceState(&dx->ifSymLinkName,F(xiàn)ALSE);RtlFreeUnicodeString(&dx->ifSymLinkName);//unattachfromstack從設(shè)備棧脫離if(dx->NextStackDevice)IoDetachDevice(dx->NextStackDevice);//deleteourfdo刪除設(shè)備IoDeleteDevice(fdo);
}CreateFileIRP_MJ_CreateWriteFileMJ_WRITECloseHandleMJ_CLOSE
DeviceIoControlMJ_DEVICEIOCONTROLReadFileMJ_CLOSE所有的分發(fā)例程都有相同的函數(shù)原型,均需傳遞一個(gè)設(shè)備對(duì)象的指針和IRP,IRP由IRP首部和一系列的棧單元組成,每個(gè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電商平臺(tái)科技賦能下的創(chuàng)新型物流成本管理探索與實(shí)踐報(bào)告
- 現(xiàn)代辦公環(huán)境中職場(chǎng)的職業(yè)技能
- 湘教版數(shù)學(xué)九年級(jí)上冊(cè)2.2《一元二次方程的解法》聽(tīng)評(píng)課記錄11
- 電商品臺(tái)綠色物流配送模式的推廣與應(yīng)用
- 【培優(yōu)卷】同步分層練習(xí):四年級(jí)下冊(cè)語(yǔ)文第9課《短詩(shī)三首》(含答案)
- 環(huán)保材料與化學(xué)科技的應(yīng)用
- 環(huán)保決策支持系統(tǒng)的大數(shù)據(jù)技術(shù)
- 電商平臺(tái)物流配送的優(yōu)化與改進(jìn)方案
- 人教部編版九年級(jí)歷史下冊(cè)第16課《冷戰(zhàn)》聽(tīng)課評(píng)課記錄
- 2025年度裝配式建筑構(gòu)件制造勞務(wù)分包合同
- 《字體設(shè)計(jì)》模塊五 裝飾性變化設(shè)計(jì)技巧的訓(xùn)練
- 《摔跤吧爸爸》觀后感PPT
- FRENIC 5000G11S、P11S富士變頻器操作說(shuō)明書(shū)
- 機(jī)構(gòu)編制重要事項(xiàng)的報(bào)告范文(5篇)
- DBJ51-T 188-2022 預(yù)拌流態(tài)固化土工程應(yīng)用技術(shù)標(biāo)準(zhǔn)
- 《長(zhǎng)津湖》電影賞析PPT
- Q-GDW 11274-2014 風(fēng)電無(wú)功電壓自動(dòng)控制技術(shù)規(guī)范
- GB/T 18838.3-2008涂覆涂料前鋼材表面處理噴射清理用金屬磨料的技術(shù)要求第3部分:高碳鑄鋼丸和砂
- CPR和AED培訓(xùn)考核試題附答案
- 多維閱讀第10級(jí) who is who 看看都是誰(shuí)
- 滑雪運(yùn)動(dòng)介紹
評(píng)論
0/150
提交評(píng)論