基于Windows2000開發(fā)WDM設(shè)備驅(qū)動程序的方法_第1頁
基于Windows2000開發(fā)WDM設(shè)備驅(qū)動程序的方法_第2頁
基于Windows2000開發(fā)WDM設(shè)備驅(qū)動程序的方法_第3頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(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ù),其實(shí)早在1997年Microsoft就提出了該項(xiàng)技術(shù)并在Windows98中得到了充分的應(yīng)用,換句話說,Windows98也支持WDM。這樣WDM就成為了一個跨平臺的驅(qū)動程序模型不僅如此WDM驅(qū)動程序還可以在不修改源代碼的情況下經(jīng)過重新編譯后在非Intel平臺上運(yùn)行。2.WDM設(shè)備驅(qū)動程序的特點(diǎn)和原理2.1通用驅(qū)動程序?qū)旧弦粯拥挠布?,因?yàn)樗麄児蚕硪粋€總線或完成類似的任務(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下運(yùn)行,而NT下的WDM卻可以在Windows98下運(yùn)行。不過原先準(zhǔn)備在兩個平臺上同時運(yù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代表一個真實(shí)硬件,在驅(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時來請求獨(dú)占內(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為獨(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ù)原型,均需傳遞一個設(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論