<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 模塊化的設備驅動(dòng)程序設計方法

模塊化的設備驅動(dòng)程序設計方法

作者: 時(shí)間:2012-05-15 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:介紹了WindowsNT下程序的開(kāi)發(fā)環(huán)境,一種的設計,應用程序與驅動(dòng)程序之間的同步以及驅動(dòng)程序的安裝。

本文引用地址:http://dyxdggzs.com/article/149060.htm

關(guān)鍵詞:WindowsNT;程序;Event對象

1引言

WindowsNT/2K以其形象直觀(guān)的界面、簡(jiǎn)單方便的操作,基本上已經(jīng)取代DOS成為測控軟件的操作平臺。又因為WindowsNT/2K出于安全性、穩定性的考慮,為了防止用戶(hù)應用程序訪(fǎng)問(wèn)和更改重要的操作系統數據,WindowsNT/2K使用兩種“處理器訪(fǎng)問(wèn)模式”:用戶(hù)態(tài)和核心態(tài)。在用戶(hù)態(tài),應用程序不能直接對硬件進(jìn)行訪(fǎng)問(wèn)和操作;而在核心態(tài)中,程序對任何I/O設備有全部的訪(fǎng)問(wèn)權,還能訪(fǎng)問(wèn)任何虛地址和控制虛擬內存硬件。為了使用戶(hù)態(tài)的程序訪(fǎng)問(wèn)和操作硬件,必須通過(guò)某種機制,也就是使用程序跨越操作系統的邊界對物理硬件進(jìn)行訪(fǎng)問(wèn)操作。同時(shí)提供一些控制接口,進(jìn)而用戶(hù)態(tài)的應用程序利用設備驅動(dòng)程序提供的接口間接地對物理硬件進(jìn)行訪(fǎng)問(wèn)操作。

2設備驅動(dòng)程序的開(kāi)發(fā)環(huán)境

安裝4種軟件:MicrosoftVisualC++6.0、PlatformSDK(SoftwareDevelopKit)forWindowsNT、DDK(DeviceDevelopKit)forWindowsNT、DriverStudio2.0。然后進(jìn)行一些系統環(huán)境變量的設置:

(1)變量名:MSTOOLS,值:SDK在操作系統中的安裝路徑(如:C:mstools);

(2)變量名:CPU,值:i386;

(3)變量名:BASEDIR,值:DDK在操作系統中的安裝路徑(如:C:NTDDK)。

在開(kāi)發(fā)驅動(dòng)程序時(shí),首先要生成DriverStudio需要的庫文件vdw.lib(通過(guò)編譯DriverStudio安裝目錄下\DriverWorks\Source\vdw.dsw)。然后運用DriverStudio2.0生成一個(gè)編程框架,并刪除DriverStudio所生成的編程框架中的所有文件,就可以在這個(gè)框架中編寫(xiě)自己的設備驅動(dòng)程序;編寫(xiě)完以后可以直接在VisualC++6.0下Build生成設備驅動(dòng)程序*.sys。

3驅動(dòng)程序的編寫(xiě)

3.1設備驅動(dòng)程序包括的幾大模塊

設備驅動(dòng)程序管理實(shí)際數據傳輸和控制物理設備的操作,包括開(kāi)始和完成I/O操作、處理中斷和執行設備要求的任何操作。

一般通用的設備驅動(dòng)程序可以分為主要4個(gè)模塊:初始化例程、卸載例程、驅動(dòng)程序和應用程序之間的數據交換例程、中斷服務(wù)例程。

3.1.1初始化例程(DrvierEntry)

是驅動(dòng)程序的入口。在這個(gè)例程中主要包括以下步驟:

(1)初始化Driver對象;

(2)調用IoCreateDevice創(chuàng )建一個(gè)Device對象,并通過(guò)調用IoCreateSymbolicLinks使設備對Win32子系統可見(jiàn);

(3)初始化Device對象的DeviceExtension;

(4)查找和分配驅動(dòng)程序要管理的任何硬件;

(5)把一個(gè)設備連接到一個(gè)Interrupt對象,如果需要并初始化驅動(dòng)程序的DPC對象。

3.1.2卸載例程(DriverUnload)

它與驅動(dòng)程序的初始化例程剛好相反。

(1)把與設備連接的Interrupt對象斷開(kāi)。一旦Interrupt對象消失,設備不產(chǎn)生任何中斷請求,這是最重要的;

(2)釋放驅動(dòng)程序所占用的任何系統資源;

(3)使用IoDeleteSymbolicLink從Win32名字空間刪除設備,并用IoDeleteDevice刪除Device對象自身。

3.1.3驅動(dòng)程序與應用程序之間的數據交換例程

首先簡(jiǎn)單介紹一下I/0請求包(IRP):IRP是I/O系統用來(lái)存儲I/O請求信息的地方。IRP由兩部分組成:固定部分(稱(chēng)作標題)和一個(gè)或多個(gè)堆棧單元。固定部分信息包括:請求的類(lèi)型和大小、同步請求還是異步請求,用于緩沖I/O的指向緩沖區的指針和由于請求的進(jìn)展而變化的狀態(tài)信息;IRP的堆棧單元包括一個(gè)功能碼、功能特定參數和一個(gè)指向調用者文件對象的指針。

應用程序與驅動(dòng)程序交換數據主要是由Win32CreateFile、CloseHandle、ReadFile、WriteFile和DeviceIoControl函數發(fā)出請求,接著(zhù)I/O管理器把這些請求轉化為叫做I/O請求包(IRP)的數據結構形式,再由I/O管理器把這些I/O請求包發(fā)送到驅動(dòng)程序。數據交換例程的主要作用是接收I/O管理器所發(fā)出的IRP,然后解析這些IRP,從而得知IRP從應用程序傳遞過(guò)來(lái)的數據。解析IRP主要是運用C語(yǔ)言的switch語(yǔ)句,根據IRP的堆棧單元中的參數(如IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_DEVICE_CONTROL等)進(jìn)行不同的處理。最后IRP的完成處理也非常重要,它要做的是返回系統,完成一個(gè)I/O請求的信息,系統根據返回的信息釋放IRP,以便使系統順利進(jìn)行下一個(gè)IRP的處理。這里需要說(shuō)明的是這個(gè)例程只是完成了數據從應用程序到驅動(dòng)程序的傳遞,而沒(méi)有進(jìn)行任何實(shí)際的設備操作。

3.1.4中斷服務(wù)例程

中斷服務(wù)例程主要是進(jìn)行直接的任何設備的操作。驅動(dòng)程序與應用程序之間的數據交換例程只完成了數據從用戶(hù)空間到核心空間的傳遞,而中斷服務(wù)例程根據傳遞過(guò)來(lái)的數據,直接對I/O端口進(jìn)行訪(fǎng)問(wèn)操作。

3.2設備驅動(dòng)程序的實(shí)現

每個(gè)NT內核模式驅動(dòng)程序,不管它的用途是什么,都必須顯露一個(gè)叫做DriverEntry的例程,也就是設備驅動(dòng)程序的初始化例程。它是驅動(dòng)程序的入口點(diǎn),DriverEntry是一個(gè)公認的名字(任何內核驅動(dòng)程序的入口點(diǎn)必須用這個(gè)名字,不能改變),有了這個(gè)公認的名字,I/O管理器就能順利地為每個(gè)驅動(dòng)程序找到入口點(diǎn)并對其進(jìn)行初始化。

一些函數聲明:

∥初始化Driver對象

VOIDInitializeDriverObject(INPDRIVER_OBJECTDriverObject);

∥創(chuàng )建一個(gè)Device對象和使設備對Win32子系統可見(jiàn)

NTSTATUSCreateDevice(INPWSTRDriverName,

INDRIVER_TYPEDriverType,

INPDRIVER_OBJECTDriverObject,

OUTPDEVICE_OBJECT*DeviceObject);

∥初始化DeviceExtension

VOIDInitializeDeviceExtension(INPDEVICE_OBJECTDeviceObject,

INPDEVICE_EXTENSIONDeviceExtension);

∥查找并給設備分配資源

NTSTATUSQueryAndAllocateHardware(INPUNICODE--STRINGpath,

INPDEVICE_OBJECTDeviceObject);

∥連接一個(gè)中斷

NTSTATUSDriverConnectInterrupt(

INPDEVICE_EXTENSIONDeviceExtension);

如果以上幾個(gè)函數中,有函數返回不成功的狀態(tài)值時(shí),一定要刪除在調用這個(gè)函數之前創(chuàng )建成功的,可能是以下3個(gè)中的1個(gè)和多個(gè):創(chuàng )建的Device對象、Win32名字空間的設備和給設備分配的系統資源。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>