


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于Windows2000開發(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),說是新技術(shù),其實(shí)早在1997年Microsoft就提出了該項(xiàng)技術(shù)并在Windows98中得到了充分的應(yīng)用,換句話說,Windows98也支持WDM。這樣WDM就成為了一個(gè)跨平臺的驅(qū)動(dòng)程序模型不僅如此WDM驅(qū)動(dòng)程序還可以在不修改源代碼的情況下經(jīng)過重新編譯后在非Intel平臺上運(yùn)行。2.WDM設(shè)備驅(qū)動(dòng)程序的特點(diǎn)和原理2.1通用驅(qū)動(dòng)程序?qū)旧弦粯拥挠布?,因?yàn)樗麄児蚕硪粋€(gè)總線或完成類似的任務(wù),設(shè)備驅(qū)動(dòng)程序可以使用這些標(biāo)準(zhǔn)的驅(qū)動(dòng)程序功能,使公共總線的共享容易,且更容易寫出新的驅(qū)動(dòng)程序,總線驅(qū)動(dòng)程序,如USB、1394,和類驅(qū)動(dòng)程序。(1)Win32程序接口:可以使用Win32函數(shù)像訪問文件那樣訪問設(shè)備CreateFile()、Closehandle()、ReadFile()、WriteFile()、DeviceIoControl()用于發(fā)出特殊請求,可發(fā)送數(shù)據(jù)給驅(qū)動(dòng)和從驅(qū)動(dòng)得到數(shù)據(jù),IOCTL代碼可以是預(yù)先定義的也可是自己定義的。(2)創(chuàng)建設(shè)備大多數(shù)WDM設(shè)備對象都是在PnP管理器中調(diào)用AddDevice入口時(shí)創(chuàng)建,這個(gè)PnP例程在插入新設(shè)備和安裝Inf文件時(shí)被調(diào)用,此后一系列的PnPIRP被發(fā)送到驅(qū)動(dòng)程序,指示設(shè)備應(yīng)如何啟動(dòng)和查詢它的功能2.2WDM-的工作原理WDM是在NT4.0驅(qū)動(dòng)程序結(jié)構(gòu)上發(fā)展起來的,所以它與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)行。不過原先準(zhǔn)備在兩個(gè)平臺上同時(shí)運(yùn)行需要編寫兩個(gè)截然不同的驅(qū)動(dòng)程序,而現(xiàn)在只需要編寫一個(gè)WDM驅(qū)動(dòng)程序就可以了。同NT4.0驅(qū)動(dòng)程序一樣,WDM驅(qū)動(dòng)程序也是分層的,即不同層上的驅(qū)動(dòng)程序有著不同的優(yōu)先權(quán),而Windows9x下的VxD則沒有此結(jié)構(gòu)。另外,WDM還引入了功能設(shè)備對象FDO(functionaldeviceobject)與物理設(shè)備對象PDO(physicaldeviceobject)兩個(gè)新概念來描述硬件,一個(gè)PDO代表一個(gè)真實(shí)硬件,在驅(qū)動(dòng)程序看來則是一個(gè)FDO。
另外值得注意的是,一個(gè)硬件只允許有一個(gè)PDO,但卻可以擁有多個(gè)FDO,而在驅(qū)動(dòng)程序中我們不是直接操作硬件而是操作相應(yīng)的PDO與FDO。在Ring-3與Ring-0通訊方面,操作系統(tǒng)為每一個(gè)用戶請求打包成一個(gè)IRP(IORequestPacket)結(jié)構(gòu),將其發(fā)送至驅(qū)動(dòng)程序并通過識別IRP中的PDO來識別是發(fā)送給哪一個(gè)設(shè)備的。另外,在驅(qū)動(dòng)程序的加載方面WDM既不靠驅(qū)動(dòng)程序名稱也不靠一個(gè)具有某種特殊意義的ID,而是依靠一個(gè)128位的GUID來識別驅(qū)動(dòng)程序(Windows下許多東西都是靠此進(jìn)行識別的)。2.3IRP處理I/O請求包IRP是驅(qū)動(dòng)程序操作的中心,IRP是一個(gè)內(nèi)核對象,它是預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu),帶有一組對它進(jìn)行操作的I/O管理器例程,I/O管理器接受一個(gè)I/O請求,然后將它傳送到合適的驅(qū)動(dòng)程序棧中的最高驅(qū)動(dòng)程序之前,分配并處始化一個(gè)IRP,每個(gè)I/O請求有主功能代碼2.4IRP參數(shù)比如一個(gè)寫的I/O請求轉(zhuǎn)換成一個(gè)IRP時(shí),I/O管理器填寫主要的IRP首部,并構(gòu)造第一個(gè)個(gè)棧單元,對寫請求來講,首部包含用戶緩沖區(qū)信息,而棧單元?jiǎng)t包含寫的具體參數(shù)。如果調(diào)用另一個(gè)驅(qū)動(dòng)則必須創(chuàng)建下一個(gè)棧單元。一個(gè)IRP到棧頂時(shí),使用PIO_STACK_LOCATIONIoGetCurrentIrpStackLocation(
INPIRPIrp
);IoGetCurrentIrpStackLocationreturnsapointertothecaller'sstacklocationinthegivenIRP。如決定需要把這個(gè)IRP沿設(shè)備棧向下傳遞,使用IoCopyCurrentIrpStackLocationToNextorIoSkipCurrentIrpStackLocation簡單的將內(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再向上傳遞返回用戶,當(dāng)IRP向上傳遞時(shí)也可以每個(gè)驅(qū)動(dòng)有機(jī)會再處理它,每個(gè)驅(qū)動(dòng)要設(shè)置IoSetCompletionRoutine掛接一個(gè)例程,一個(gè)驅(qū)動(dòng)不一定要沿著設(shè)備棧向下傳遞IRP,如果自己能處理就就使用IoCompleteRequest完成IrP2.5設(shè)備接口用戶態(tài)使用Win32CreateFile訪問驅(qū)動(dòng)程序,dwShareMode為0時(shí)來請求獨(dú)占內(nèi)核對象在設(shè)備對象DEVICE_OBJECT結(jié)構(gòu)中存儲設(shè)備的信息,對于與設(shè)備的每個(gè)交互,相關(guān)的DEVICE_OBJECT被傳遞給驅(qū)動(dòng)的回調(diào)例程。,但是開發(fā)者可以擴(kuò)展設(shè)備結(jié)構(gòu),稱為設(shè)備擴(kuò)展在PnPIRP中我們加載設(shè)備NTSTATUSWdm1AddDevice(
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è)備對象);
if(!NT_SUCCESS(status)returnstatus;IoAttachDeviceToDeviceStack(fdo,pdo);與設(shè)備棧掛接2.6刪除設(shè)備NTSTATUSWdm1Pnp(
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è)備對象的指針和IRP,IRP由IRP首部和一系列的棧單元組成,每個(gè)
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)安全培訓(xùn)考試試題附參考答案(培優(yōu))
- 江西省南昌市東湖區(qū)第十中學(xué)2025年高三考前熱身物理試卷含解析
- 25年公司項(xiàng)目負(fù)責(zé)人安全培訓(xùn)考試試題含完整答案【名校卷】
- 2024-2025學(xué)年浙江省嘉興市高中名校高考壓軸卷物理試卷含解析
- 2025年海洋潛標(biāo)系統(tǒng)合作協(xié)議書
- 2025年文具及類似用品合作協(xié)議書
- 無縫墻布基礎(chǔ)知識培訓(xùn)
- 國際健康促進(jìn)學(xué)校聯(lián)盟計(jì)劃2025
- 審核員須知培訓(xùn)
- 初三化學(xué)在線學(xué)習(xí)平臺使用計(jì)劃
- 《我不是藥神》劇本
- JJF 1101-2019《環(huán)境試驗(yàn)設(shè)備溫度、濕度校準(zhǔn)規(guī)范》規(guī)程
- GB/T 6451-2023油浸式電力變壓器技術(shù)參數(shù)和要求
- 幼兒園中班繪本《城市里最漂亮的巨人》課件
- 醫(yī)院廉潔行醫(yī)廉政教育專題課件
- 醫(yī)務(wù)人員職業(yè)健康安全健康-課件
- 安全組織機(jī)構(gòu)圖
- 舊石器時(shí)代考古-基礎(chǔ)知識課件
- 江蘇省建設(shè)工程現(xiàn)場安全文明施工措施費(fèi)計(jì)價(jià)管理辦法
- 病區(qū)藥品規(guī)范化管理與問題對策黃池桃
- 螺紋塞規(guī)操作規(guī)程
評論
0/150
提交評論