<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 模塊化的設(shè)備驅(qū)動程序設(shè)計(jì)方法

          模塊化的設(shè)備驅(qū)動程序設(shè)計(jì)方法

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

          摘要:介紹了WindowsNT下程序的開發(fā)環(huán)境,一種的設(shè)計(jì),應(yīng)用程序與驅(qū)動程序之間的同步以及驅(qū)動程序的安裝。

          本文引用地址:http://www.ex-cimer.com/article/149060.htm

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

          1引言

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

          2設(shè)備驅(qū)動程序的開發(fā)環(huán)境

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

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

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

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

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

          3驅(qū)動程序的編寫

          3.1設(shè)備驅(qū)動程序包括的幾大模塊

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

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

          3.1.1初始化例程(DrvierEntry)

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

          (1)初始化Driver對象;

          (2)調(diào)用IoCreateDevice創(chuàng)建一個(gè)Device對象,并通過調(diào)用IoCreateSymbolicLinks使設(shè)備對Win32子系統(tǒng)可見;

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

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

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

          3.1.2卸載例程(DriverUnload)

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

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

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

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

          3.1.3驅(qū)動程序與應(yīng)用程序之間的數(shù)據(jù)交換例程

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

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

          3.1.4中斷服務(wù)例程

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

          3.2設(shè)備驅(qū)動程序的實(shí)現(xiàn)

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

          一些函數(shù)聲明:

          ∥初始化Driver對象

          VOIDInitializeDriverObject(INPDRIVER_OBJECTDriverObject);

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

          NTSTATUSCreateDevice(INPWSTRDriverName,

          INDRIVER_TYPEDriverType,

          INPDRIVER_OBJECTDriverObject,

          OUTPDEVICE_OBJECT*DeviceObject);

          ∥初始化DeviceExtension

          VOIDInitializeDeviceExtension(INPDEVICE_OBJECTDeviceObject,

          INPDEVICE_EXTENSIONDeviceExtension);

          ∥查找并給設(shè)備分配資源

          NTSTATUSQueryAndAllocateHardware(INPUNICODE--STRINGpath,

          INPDEVICE_OBJECTDeviceObject);

          ∥連接一個(gè)中斷

          NTSTATUSDriverConnectInterrupt(

          INPDEVICE_EXTENSIONDeviceExtension);

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


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();