• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于Windows的USB驅(qū)動程序開發(fā)

      2010-05-05 02:39:34何麗華梁杰申肖楚海
      微型電腦應(yīng)用 2010年2期
      關(guān)鍵詞:管理器驅(qū)動程序調(diào)用

      何麗華,梁杰申,肖楚海

      0 引言

      Windows已經(jīng)成為PC的主流操作系統(tǒng),要想實現(xiàn)在Windows操作系統(tǒng)下對硬件設(shè)備的操作,必須通過在WDM模型下設(shè)計驅(qū)動程序這個軟接口。USB,是Universal Serial Bus(通用串行總線)的簡稱,為個人電腦與其外圍設(shè)備之間的連接提供了一種標(biāo)準(zhǔn)化、單一化的接口[1]。它的主要優(yōu)點體現(xiàn)在:操作簡單,即插即用;成本低廉,攜帶方便;標(biāo)準(zhǔn)統(tǒng)一;可以連接多個設(shè)備;通信速率快;可靠性高等。鑒于USB的這些特點,它已經(jīng)成為PC的首選接口。

      1 WDM驅(qū)動程序模型簡介

      USB驅(qū)動的設(shè)計基于WDM(Windows Driver Module),即Win32驅(qū)動模型。WDM是Microsoft公司力推的新型驅(qū)動模型[2],旨在通過一種靈活的方式簡化驅(qū)動程序的開發(fā),在實現(xiàn)對新硬件支持的基礎(chǔ)上,減少并降低必須開發(fā)的驅(qū)動程序的數(shù)量和復(fù)雜性。

      WDM有兩種運行模式,即內(nèi)核模式和用戶模式。在內(nèi)核模式下,程序的運行不受操作系統(tǒng)的任何限制,對I/O有完全的訪問權(quán);在用戶模式下,操作系統(tǒng)提供某種機制,可以限制程序的各種I/O操作。

      WDM驅(qū)動程序采用了分層驅(qū)動的方式,不同層之間的驅(qū)動程序完成不同的操作,不同層之間可以互相調(diào)用,在WDM中引入了功能設(shè)備對象(FDO Filter Device Object)和物理設(shè)備對象(PDO Project Device Object)來描述硬件。一個PDO對應(yīng)一個真實的硬件,一個硬件只允許有一個PDO但是卻可以有多個FDO。在驅(qū)動程序中直接操作的不是硬件設(shè)備,而是相應(yīng)的PDO和FDO[3]。在用戶態(tài)和內(nèi)核態(tài)通信方面,系統(tǒng)為每一個用戶請求打包形成一個IRP結(jié)構(gòu),將其發(fā)送至驅(qū)動程序,并通過識別IRP中的PDO來區(qū)分時發(fā)送給哪一個設(shè)備的。

      圖1 WDM驅(qū)動程序模型

      驅(qū)動模型如圖1所示:中總線驅(qū)動程序位于最底層,總線驅(qū)動程序為實際的I/O總線服務(wù),比如USB。微軟已經(jīng)為Windows操作系統(tǒng)提供了總線驅(qū)動程序。一個總線驅(qū)動程序負(fù)責(zé)的工作有:枚舉總線上的設(shè)備;向操作系統(tǒng)報告總線上的動態(tài)事件;響應(yīng)即插即用和電源管理的I/O請求;管理總線上的設(shè)備??偩€驅(qū)動程序創(chuàng)建一個物理設(shè)備對象來代表它發(fā)現(xiàn)的設(shè)備。即發(fā)現(xiàn)總線上的所有設(shè)備和檢測設(shè)備添加或者刪除,創(chuàng)建物理設(shè)備對象PDO;功能驅(qū)動程序處理設(shè)備的I/O請求包(IRP),負(fù)責(zé)創(chuàng)建功能設(shè)備對象FDO;其他層的驅(qū)動程序是一些過濾程序(Filter Driver),對應(yīng)的設(shè)備對象是過濾器設(shè)備。安裝硬件設(shè)備時操作系統(tǒng)的即插即用管理器按照設(shè)備驅(qū)動程序的要求構(gòu)造設(shè)備的對象,首先是最底層的總線驅(qū)動程序檢測到實際的物理設(shè)備,創(chuàng)建物理設(shè)備對象PDO,然后,即插即用管理器查詢注冊表,按注冊表信息依次加載過濾驅(qū)動程序和功能驅(qū)動程序,可生成相應(yīng)的功能設(shè)備對象FDO,并建立設(shè)備對象和驅(qū)動程序的對應(yīng)關(guān)系,這樣一個完整的設(shè)備驅(qū)動程序就建立了[4]。

      2 工具的選擇

      在開發(fā)工具的選擇上本文選擇用Microsoft公司提供的Windows DDK,Win2000DDK。DDK軟件包中包括有關(guān)設(shè)備驅(qū)動程序開發(fā)的文檔、編譯驅(qū)動程序時所需要的頭文件和庫文件、調(diào)試工具和一些設(shè)備驅(qū)動程序范例。但是直接使用DDK開發(fā)比較困難,而且設(shè)備的驅(qū)動程序本身比較復(fù)雜,一旦運行錯誤可能會對整個操作系統(tǒng)產(chǎn)生災(zāi)難性的后果。所以我們選擇配合第三方軟件來實現(xiàn)。DriverStudio是由Numega公司出品的專門用于設(shè)備驅(qū)動程序開發(fā)的軟件包,包含VtoolsD、SoftICE和DriverWorks等開發(fā)工具??梢詫崿F(xiàn)驅(qū)動制作的“自動化”,安裝驅(qū)動向?qū)б徊揭徊降纳沈?qū)動。

      2.1 基于DDK和DriverStudio制作驅(qū)動平臺

      首先在PC機上先安裝Visual C++,然后安裝Win2KDDK,因為在安裝DriverStudio的時候要求指定DDK的路徑。所以安裝順序不能錯,安裝完成后在VC的界面里會有DriverStudio菜單項。

      2.2 編譯WDM驅(qū)動所用的庫[5]

      由于DriverWorks所用的類庫是對DDK的庫函數(shù)的封裝,還必須在Visual C++中編所需要的庫文件。本文用的是DriverStudio2.6,所以先改正它的Bug,然后通過NuMega DriverStudio /Tools/DDK Build Settings 進入到DriverStudio的路徑。選擇Visual C++的BatchBuild工具對DriverStudio安裝目錄下的vdwlibs.dsw庫進行編譯,這里我們只需要選擇WDM的庫就可以了。

      2.3 用DriverStudio開發(fā)驅(qū)動程序

      做好了前面的配置工作,我們就可以按照 DriverStudio的DriverWorks來一步一步的生成驅(qū)動。在利用DriverStudio 2.6 的向?qū)riverWizand 完成驅(qū)動程序的框架時共有10個步驟:(1)選擇路徑并填寫工程名,這里的工程名我們命名為MW70A;(2)選擇驅(qū)動程序類型WDM;(3)選擇USB設(shè)備總線類型,填寫PID(產(chǎn)品識別號)和VID(廠商識別號)。這里根據(jù)我們的固件程序我們填寫為PID7070,VID0707;(4)選擇I/O請求IRP處理的方式,這里用端點2的In和Out用Bulk傳輸。并且將其最大的傳輸值設(shè)為65535,USB的包最大為64個字節(jié),我們這樣設(shè)是為了不讓PC成為限制USB速率的瓶頸;(5)選擇所生成的驅(qū)動程序文件中的類名和驅(qū)動程序文件名,取默認(rèn)值:MW70A;(6)選擇驅(qū)動程序支持的功能項,我們選擇Read、Write、Device Control、Cleanup、install;(7)自動產(chǎn)生端點2的Bulk傳輸讀寫代碼;(8)定義排隊的方式,這里不理會,取默認(rèn)值。(9)定義應(yīng)用程序調(diào)用DeviceIoControl函數(shù)對WDM驅(qū)動程序通信的控制命令,并對應(yīng)不同的數(shù)據(jù)存取方式,取默認(rèn)值;(10)選擇是否生成一個Win32Console應(yīng)用程序以及Debug跟蹤代碼等,并產(chǎn)生了此設(shè)備的GUID、供電方式、等。編譯這個工程,即得到所需的驅(qū)動程序。在sysobjchki386里就有我們的MW70A.sys,在sys文件夾下有我們的MW70A.inf文件。按照LPC2368的固定端點配置(如表1),這里我們使用默認(rèn)的端點0和批量傳輸?shù)臄帱c2實現(xiàn)USB設(shè)備的枚舉和讀寫操作。

      表1 LPC2368的端點配置

      3 USB驅(qū)動程序的調(diào)用

      3.1 訪問設(shè)備

      應(yīng)用程序要訪問我們的驅(qū)動程序,不是通過驅(qū)動程序名稱來訪問的,而是通過一個128位的全局惟一標(biāo)示符(GUID)實現(xiàn)對驅(qū)動程序的識別[6]。這個GUID是我們上面制作驅(qū)動的第10步自動產(chǎn)生的應(yīng)用程序,首先通過調(diào)用GUID來查找驅(qū)動程序。驅(qū)動程序通過安裝文件(.inf)中PID和VID識別USB設(shè)備。通過檢查設(shè)備的連接狀態(tài),來判斷進入下一個環(huán)節(jié)。(詳見圖2.)

      F(!NT_SUCCESS(m_ConstructorStatus))

      {

      Return;

      }

      NTSTATUS DriverEntry(PUNICODE_STRING RegistryPath);

      圖2 驅(qū)動程序調(diào)用過程

      3.2 程序入口

      WDM驅(qū)動都有一個主要的初始化入口點,即一個稱為DriverEntry的例程;它有一個標(biāo)準(zhǔn)的函數(shù)原型,當(dāng)WDM驅(qū)動程序被裝入時,內(nèi)核調(diào)用DriverEntry例程,來設(shè)置主要的回調(diào)例程。在運行中,內(nèi)核會調(diào)用不同的回調(diào)例程來完成不同的任務(wù),主要負(fù)責(zé)驅(qū)動程序的裝載、初始化總線上的設(shè)備、創(chuàng)建FDO、IRP的分類派遣以及卸載本層驅(qū)動程序等操作。

      3.3 添加設(shè)備

      大多數(shù)的WDM設(shè)備對象,都是在調(diào)用即插即用管理器調(diào)用AddDevice例程入口時被創(chuàng)建的[7]。插入新設(shè)備后,當(dāng)系統(tǒng)找到由安裝系統(tǒng)文件所指示的驅(qū)動程序時,這個例程被調(diào)用。在此之后,一系列的即插即用IRP被發(fā)送到驅(qū)動程序,設(shè)備驅(qū)動程序可進行相應(yīng)的功能處理。AddDevice函數(shù)是WDM驅(qū)動程序的一個特殊函數(shù),PnP管理器為每個設(shè)備實例調(diào)用該函數(shù)。virtual NTSTATUS AddDevice(PDEVICE_OBJECT Pdo);

      3.4 IRP處理

      生成的API函數(shù)如下表(表2):

      表2 API應(yīng)用程序和驅(qū)動請求

      應(yīng)用程序使用Win32API函數(shù)來與操作系統(tǒng)通信,驅(qū)動程序彼此間用I/O要求信息包(I/O Request Packet,IRP)來通信。DriverWorks為IRP進行了封裝,IRP是整個驅(qū)動處理的核心,Win32函數(shù)與所生成的IRP對應(yīng)關(guān)系如上表。

      3.5 USB的讀功能

      讀操作是從應(yīng)用程序調(diào)要Win32API函數(shù)ReadFile開始的。當(dāng)應(yīng)用程序調(diào)用ReadFile函數(shù)時,系統(tǒng)通過ntdll.dll調(diào)用ntreadfile向設(shè)備驅(qū)動程序發(fā)送一個IRP[8],驅(qū)動程序接到該IRP后,開辟用以接收數(shù)據(jù)的內(nèi)存區(qū),判斷所讀數(shù)據(jù)是否大于最大信息包規(guī)格,因為每次只讀取最大信息包個字節(jié)。然后建立相應(yīng)端點的URB并向下層驅(qū)動程序提交該URB。此時I/O管理器執(zhí)行Read,把數(shù)據(jù)放到緩沖區(qū)內(nèi)。

      4 驅(qū)動的安裝與調(diào)試

      安裝驅(qū)動程序的時候,最好把MW70A.inf和MW70A.sys放在一個文件夾下面,當(dāng)有對應(yīng)的USB設(shè)備連接到電腦上時,可以手動選擇驅(qū)動程序,找到對應(yīng)的MW70A.inf,根據(jù)里面的PID和VID就可以自動安裝。所以只要固件程序里面的PID和VID和驅(qū)動程序里面的一樣就可以實現(xiàn)安裝。

      驅(qū)動程序工作在內(nèi)核模式下,可以用DriverStudio中的SoftICE測試,測試流程如下:

      使用Symbol Loader加載驅(qū)動程序,然后使用SoftICE跟蹤測試,確認(rèn)驅(qū)動程序正常加載;對核心的中斷響應(yīng)代碼,應(yīng)用SoftICE中的Genint命令產(chǎn)生虛擬中斷,單步跟蹤中斷。USB硬件發(fā)送大量的數(shù)據(jù),可以通過BUS Hound來查看??梢苑奖愕目吹狡鋫鬏?shù)臄?shù)據(jù)和速率。

      在程序的調(diào)試過程中,應(yīng)注意可能因內(nèi)存訪問分頁錯誤、設(shè)備資源和系統(tǒng)資源沖突、I/O使用錯誤、程序中指針使用錯誤等因素造成系統(tǒng)“死機”“藍(lán)屏”等現(xiàn)象。在不同的機器上測試時,要對其他軟件的兼容性做處理。

      5 結(jié)束語

      設(shè)計驅(qū)動程序是一個復(fù)雜繁瑣的過程,而利用DriverWorks工具簡化了開發(fā)過程,加快了開發(fā)周期,提高了開發(fā)效益。Windows已經(jīng)成為PC的主流操作系統(tǒng),基于Windows操作系統(tǒng)的USB設(shè)備驅(qū)動程序的開發(fā),是一個難點也是一個熱點。本文的USB驅(qū)動用在CAN總線數(shù)據(jù)的采集上,完全能夠滿足CAN的最大波特率1Mbps,極大的節(jié)省了開發(fā)時間,提高了開發(fā)效益。

      [1]傅得立.基于 USB2.0的數(shù)據(jù)記錄回放單元設(shè)計[D].中國科學(xué)院廣電研究所,2007.

      [2]張瑾.USB及其設(shè)備開發(fā)[J].現(xiàn)代電子技術(shù),2005,(2):11-22.

      [3]Cant C.Writing Windows WDM Device Drivers[J].R&D Books,1999,35(6):3-8.

      [4]于勇.基于Windows的USB接口WDM驅(qū)動研究和應(yīng)用[D].南京信息工程大學(xué),2008.

      [5]武安河.Windows2000/XP WDM驅(qū)動程序開發(fā)[M].2版.北京:機械工業(yè)出版社,2005:98-99.

      [6]張帆 史彩成.Windows驅(qū)動開發(fā)技術(shù)詳解[M].北京北京:電子工業(yè)出版社,2008:400-456.

      [7]張念淮,江浩.USB總線接口開發(fā)指南[M].北京:國防工業(yè)出版社,2001:56-78.

      [8]Cant C.Windows WDM 設(shè)備驅(qū)動程序開發(fā)指南[M].北京:機械工業(yè)出版社,2000:89-96.

      猜你喜歡
      管理器驅(qū)動程序調(diào)用
      應(yīng)急狀態(tài)啟動磁盤管理器
      核電項目物項調(diào)用管理的應(yīng)用研究
      Windows文件緩沖處理技術(shù)概述
      LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
      基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
      高集成度2.5A備份電源管理器簡化鋰離子電池備份系統(tǒng)
      快速導(dǎo)出QQ群消息
      電腦迷(2014年2期)2014-04-29 19:21:13
      利用RFC技術(shù)實現(xiàn)SAP系統(tǒng)接口通信
      驅(qū)動程序更新與推薦
      驅(qū)動程序更新與推薦
      锡林郭勒盟| 清苑县| 依安县| 耿马| 兴和县| 明星| 广灵县| 齐齐哈尔市| 镇赉县| 栾川县| 富平县| 建宁县| 汽车| 合肥市| 乳山市| 汝阳县| 酒泉市| 华安县| 伊宁县| 什邡市| 南丹县| 霍州市| 三门县| 房山区| 璧山县| 西乡县| 樟树市| 弥勒县| 隆化县| 成武县| 佛山市| 精河县| 水富县| 南雄市| 高平市| 苍溪县| 桐乡市| 五原县| 资中县| 永新县| 涪陵区|