


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
基于Windows2000開發(fā)WDM設(shè)備驅(qū)動程序的方法
摘要:本文介紹了Windows2000WDM驅(qū)動程序結(jié)構(gòu)及其原理,給出一個驅(qū)動程序的例子關(guān)鍵詞:WDM驅(qū)動程序1.概述引入了全新的WDM(Win32DriverModel)的驅(qū)動程序架構(gòu),說是新技術(shù),其實早在1997年Microsoft就提出了該項技術(shù)并在Windows98中得到了充分的應(yīng)用,換句話說,Windows98也支持WDM。這樣WDM就成為了一個跨平臺的驅(qū)動程序模型不僅如此WDM驅(qū)動程序還可以在不修改源代碼的情況下經(jīng)過重新編譯后在非Intel平臺上運行。2.WDM設(shè)備驅(qū)動程序的特點和原理2.1通用驅(qū)動程序?qū)旧弦粯拥挠布?,因為他們共享一個總線或完成類似的任務(wù),設(shè)備驅(qū)動程序可以使用這些標(biāo)準(zhǔn)的驅(qū)動程序功能,使公共總線的共享容易,且更容易寫出新的驅(qū)動程序,總線驅(qū)動程序,如USB、1394,和類驅(qū)動程序。(1)Win32程序接口:可以使用Win32函數(shù)像訪問文件那樣訪問設(shè)備CreateFile()、Closehandle()、ReadFile()、WriteFile()、DeviceIoControl()用于發(fā)出特殊請求,可發(fā)送數(shù)據(jù)給驅(qū)動和從驅(qū)動得到數(shù)據(jù),IOCTL代碼可以是預(yù)先定義的也可是自己定義的。(2)創(chuàng)建設(shè)備大多數(shù)WDM設(shè)備對象都是在PnP管理器中調(diào)用AddDevice入口時創(chuàng)建,這個PnP例程在插入新設(shè)備和安裝Inf文件時被調(diào)用,此后一系列的PnPIRP被發(fā)送到驅(qū)動程序,指示設(shè)備應(yīng)如何啟動和查詢它的功能2.2WDM-的工作原理WDM是在NT4.0驅(qū)動程序結(jié)構(gòu)上發(fā)展起來的,所以它與NT4.0驅(qū)動程序極為相似,但是它卻有了本質(zhì)上的提高,比如它支持USB、IEEE1394、ACPI等全新的硬件標(biāo)準(zhǔn)。雖然Windows98與Windows2000都支持WDM,可是并不意味著Windows98下的VxD可以在Windows2000下運行,而NT下的WDM卻可以在Windows98下運行。不過原先準(zhǔn)備在兩個平臺上同時運行需要編寫兩個截然不同的驅(qū)動程序,而現(xiàn)在只需要編寫一個WDM驅(qū)動程序就可以了。同NT4.0驅(qū)動程序一樣,WDM驅(qū)動程序也是分層的,即不同層上的驅(qū)動程序有著不同的優(yōu)先權(quán),而Windows9x下的VxD則沒有此結(jié)構(gòu)。另外,WDM還引入了功能設(shè)備對象FDO(functionaldeviceobject)與物理設(shè)備對象PDO(physicaldeviceobject)兩個新概念來描述硬件,一個PDO代表一個真實硬件,在驅(qū)動程序看來則是一個FDO。
另外值得注意的是,一個硬件只允許有一個PDO,但卻可以擁有多個FDO,而在驅(qū)動程序中我們不是直接操作硬件而是操作相應(yīng)的PDO與FDO。在Ring-3與Ring-0通訊方面,操作系統(tǒng)為每一個用戶請求打包成一個IRP(IORequestPacket)結(jié)構(gòu),將其發(fā)送至驅(qū)動程序并通過識別IRP中的PDO來識別是發(fā)送給哪一個設(shè)備的。另外,在驅(qū)動程序的加載方面WDM既不靠驅(qū)動程序名稱也不靠一個具有某種特殊意義的ID,而是依靠一個128位的GUID來識別驅(qū)動程序(Windows下許多東西都是靠此進(jìn)行識別的)。2.3IRP處理I/O請求包IRP是驅(qū)動程序操作的中心,IRP是一個內(nèi)核對象,它是預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu),帶有一組對它進(jìn)行操作的I/O管理器例程,I/O管理器接受一個I/O請求,然后將它傳送到合適的驅(qū)動程序棧中的最高驅(qū)動程序之前,分配并處始化一個IRP,每個I/O請求有主功能代碼2.4IRP參數(shù)比如一個寫的I/O請求轉(zhuǎn)換成一個IRP時,I/O管理器填寫主要的IRP首部,并構(gòu)造第一個個棧單元,對寫請求來講,首部包含用戶緩沖區(qū)信息,而棧單元則包含寫的具體參數(shù)。如果調(diào)用另一個驅(qū)動則必須創(chuàng)建下一個棧單元。一個IRP到棧頂時,使用PIO_STACK_LOCATIONIoGetCurrentIrpStackLocation(
INPIRPIrp
);IoGetCurrentIrpStackLocationreturnsapointertothecaller'sstacklocationinthegivenIRP。如決定需要把這個IRP沿設(shè)備棧向下傳遞,使用IoCopyCurrentIrpStackLocationToNextorIoSkipCurrentIrpStackLocation簡單的將內(nèi)容復(fù)制到下一個單元,如果要更改下一個棧單元,要使用LOCATIONIoGetNextIrpStackLocation(INPIRPIrp);IoGetNextIrpStackLocationgivesahigherleveldriveraccesstothenext-lowerdriver'sI/OstacklocationinanIRPsothecallercansetitupforthelowerdriver.可使用IoCallDriver調(diào)用下一個驅(qū)動程序,當(dāng)最低一層的驅(qū)動處理玩后調(diào)用IoCompleteRequest,IRP再向上傳遞返回用戶,當(dāng)IRP向上傳遞時也可以每個驅(qū)動有機(jī)會再處理它,每個驅(qū)動要設(shè)置IoSetCompletionRoutine掛接一個例程,一個驅(qū)動不一定要沿著設(shè)備棧向下傳遞IRP,如果自己能處理就就使用IoCompleteRequest完成IrP2.5設(shè)備接口用戶態(tài)使用Win32CreateFile訪問驅(qū)動程序,dwShareMode為0時來請求獨占內(nèi)核對象在設(shè)備對象DEVICE_OBJECT結(jié)構(gòu)中存儲設(shè)備的信息,對于與設(shè)備的每個交互,相關(guān)的DEVICE_OBJECT被傳遞給驅(qū)動的回調(diào)例程。,但是開發(fā)者可以擴(kuò)展設(shè)備結(jié)構(gòu),稱為設(shè)備擴(kuò)展在PnPIRP中我們加載設(shè)備NTSTATUSWdm1AddDevice(
INPDRIVER_OBJECTDriverObject,指向驅(qū)動程序的指針
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為獨占&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ù)原型,均需傳遞一個設(shè)備對象的指針和IRP,IRP由IRP首部和一系列的棧單元組成,每個
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 駕駛實操模擬考試題及答案
- 在校生實習(xí)勞務(wù)協(xié)議5篇
- 2025江蘇連云港市贛榆區(qū)教育局所屬學(xué)校招聘新教師69人模擬試卷附答案詳解(突破訓(xùn)練)
- 公司信用體系建設(shè)工作承諾函(3篇)
- 場景化任務(wù)管理工具與進(jìn)度協(xié)同更新
- 鋼琴老師的考試題及答案
- 2025年幼兒健康考試試題及答案
- 達(dá)州統(tǒng)考真題數(shù)學(xué)及答案
- 菏澤教資考試試題及答案
- 2025年北京省考行測真題及答案
- 醫(yī)療設(shè)備采購?fù)稑?biāo)違約責(zé)任承諾書范文
- 全國公開課一等獎初中化學(xué)九年級上冊(人教2024年新編)《跨學(xué)科實踐活動-制作模型并展示科學(xué)家探索物質(zhì)組成與結(jié)構(gòu)的歷程》課件
- 科研誠信培訓(xùn)課件
- GB/T 31771-2024家政服務(wù)母嬰護(hù)理服務(wù)質(zhì)量規(guī)范
- 無人機(jī)集群協(xié)同與對抗技術(shù)
- 2024年成人高考成考(高起專)語文試卷與參考答案
- 糖尿病酮癥酸中毒課件
- 壓力性損傷安全警示教育
- 1248國開電大本科《公共部門人力資源管理》自檢自測試題及答案
- 入黨申請書專用紙-A4單面打印
- 蘇科版八年級物理下冊10.4浮力 教學(xué)設(shè)計
評論
0/150
提交評論