新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 模塊化的設備驅動程序設計方法

        模塊化的設備驅動程序設計方法

        作者: 時間:2012-05-15 來源:網絡 收藏

        摘要:介紹了WindowsNT下程序的開發環境,一種的設計,應用程序與驅動程序之間的同步以及驅動程序的安裝。

        本文引用地址:http://www.104case.com/article/149060.htm

        關鍵詞:WindowsNT;程序;Event對象

        1引言

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

        2設備驅動程序的開發環境

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

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

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

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

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

        3驅動程序的編寫

        3.1設備驅動程序包括的幾大模塊

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

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

        3.1.1初始化例程(DrvierEntry)

        是驅動程序的入口。在這個例程中主要包括以下步驟:

        (1)初始化Driver對象;

        (2)調用IoCreateDevice創建一個Device對象,并通過調用IoCreateSymbolicLinks使設備對Win32子系統可見;

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

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

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

        3.1.2卸載例程(DriverUnload)

        它與驅動程序的初始化例程剛好相反。

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

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

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

        3.1.3驅動程序與應用程序之間的數據交換例程

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

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

        3.1.4中斷服務例程

        中斷服務例程主要是進行直接的任何設備的操作。驅動程序與應用程序之間的數據交換例程只完成了數據從用戶空間到核心空間的傳遞,而中斷服務例程根據傳遞過來的數據,直接對I/O端口進行訪問操作。

        3.2設備驅動程序的實現

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

        一些函數聲明:

        ∥初始化Driver對象

        VOIDInitializeDriverObject(INPDRIVER_OBJECTDriverObject);

        ∥創建一個Device對象和使設備對Win32子系統可見

        NTSTATUSCreateDevice(INPWSTRDriverName,

        INDRIVER_TYPEDriverType,

        INPDRIVER_OBJECTDriverObject,

        OUTPDEVICE_OBJECT*DeviceObject);

        ∥初始化DeviceExtension

        VOIDInitializeDeviceExtension(INPDEVICE_OBJECTDeviceObject,

        INPDEVICE_EXTENSIONDeviceExtension);

        ∥查找并給設備分配資源

        NTSTATUSQueryAndAllocateHardware(INPUNICODE--STRINGpath,

        INPDEVICE_OBJECTDeviceObject);

        ∥連接一個中斷

        NTSTATUSDriverConnectInterrupt(

        INPDEVICE_EXTENSIONDeviceExtension);

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


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 浑源县| 大余县| 绥江县| 新竹市| 东乡县| 巴青县| 军事| 绥化市| 衡阳市| 封开县| 安龙县| 万州区| 城固县| 定日县| 宁城县| 九龙城区| 玛沁县| 清镇市| 吉安市| 新河县| 梁河县| 潮州市| 乐清市| 辽宁省| 屯留县| 博罗县| 中阳县| 射洪县| 额尔古纳市| 四子王旗| 綦江县| 景谷| 萝北县| 灵川县| 墨竹工卡县| 锡林浩特市| 张家界市| 浪卡子县| 延边| 宁城县| 房山区|