Windows 2000內(nèi)核模式驅(qū)動程序設(shè)計
在Windows2000和Windows98中,通過使用總線驅(qū)動程序,PnP管理器能夠自動檢測硬件和分配I/O資源。在WDM驅(qū)動程序中PnP管理器使用主功能代碼為IRP-MJ-PNP的I/O請求包與設(shè)備驅(qū)動程序交換信息和請求,完成對硬件設(shè)備的檢測和配置工作。PnP請求包完成2種功能:指示驅(qū)動程序何時又如何配置和取消硬件及驅(qū)動程序本身的設(shè)置;指導(dǎo)驅(qū)動程序完成一系列的狀態(tài)轉(zhuǎn)換。PnP請求可以包含二十多個次功能代碼,部分功能代碼(如IRP-READ-CONFIG,IRP-MN-QUERY-RE-SOURCE-REQUIREMENTS等)只能由總線驅(qū)動程序處理,功能驅(qū)動程序和過濾驅(qū)動程序只是將該IRP請求下傳到總線驅(qū)動程序。對功能驅(qū)動程序和過濾驅(qū)動程序中比較重要的IRP-MN-START-DEVICE用來通知功能驅(qū)動程序其硬件被賦予了什么的I/O資源,以及指導(dǎo)功能驅(qū)動程序做任何必要的硬件或軟件設(shè)置,以便設(shè)備能正常工作。IRP-MN-REMOVE-DEVICE告訴功能驅(qū)動程序關(guān)閉設(shè)備并釋放與之關(guān)聯(lián)的設(shè)備對象。
驅(qū)動程序的ISR和DpcForIsr在設(shè)備產(chǎn)生中斷時共同向設(shè)備提供服務(wù)。當(dāng)設(shè)備產(chǎn)生中斷時,驅(qū)動程序的ISR將被調(diào)用,ISR通過詢問設(shè)備硬件收集有關(guān)的硬件設(shè)備信息,并盡可能地處理,如果不可能完全處理該中斷請求,就將中斷信息傳遞給Dpc-ForIsr進(jìn)行處理。ISR是運(yùn)行在DIRQL中斷請求級的,在運(yùn)行時,會阻止在同一處理器上的所有設(shè)備發(fā)出的具有更低的DIRQL的中斷,因此在驅(qū)動程序的編寫時,ISR應(yīng)盡可能快地返回控制。另外,ISR可以與驅(qū)動程序的其它部分共享數(shù)據(jù)和硬件資源,因此需要注意同步問題的處理。
3WDM驅(qū)動程序開發(fā)環(huán)境及編譯
Windows2000下編寫驅(qū)動程序的環(huán)境被稱為DDKForMicrosoftWindows2000或Windows2000DDK,DDK是一個命令行下的工作環(huán)境。在安裝DDK前需要先安裝Micro-softVisualC++和Win32SDK(可選)。對驅(qū)動程序的編譯可以通過設(shè)置VC++的項目設(shè)置,在VC++中直接編譯驅(qū)動程序,但改變設(shè)置的工作較繁且易出錯,因此DDKbuild.exe編譯聯(lián)接器是構(gòu)造驅(qū)動程序的主要工具。它從配置文件Sources中讀出待編譯的程序的配置,包括源文件、目標(biāo)文件等,從環(huán)境變量Include中得到引用文件的地址,然后調(diào)用VisualC++的編譯聯(lián)接器Nmake.exe進(jìn)行實際的編譯聯(lián)接工作。
另外,build編譯聯(lián)接器還可以通過查看DIRS文件中的偽指令,確定要編譯的驅(qū)動程序目錄列表。日志文件build.log、build.wrn,build.err中分別記錄了編譯聯(lián)接中執(zhí)行的命令行、遇到的錯誤和警告。編譯完成后的文件后綴為.sys。
驅(qū)動程序的調(diào)試是在原代碼級進(jìn)行的,可以用微軟公司提供的WinDbg調(diào)試工具,但需要在兩臺以串口聯(lián)接的計算機(jī)上進(jìn)行。而NUMEGA公司的SOFTICE比較方便地在一臺計算機(jī)上進(jìn)行核心代碼的調(diào)試。
4ATM信令接口卡的驅(qū)動例程分析
我們開發(fā)的ATM信令接口卡硬件符合PCI2.1標(biāo)準(zhǔn),其與應(yīng)用程序的數(shù)據(jù)傳輸為DMA方式。主要部分代碼如下。
在該驅(qū)動程序入口部分中我們完成了各個分發(fā)例程入口的設(shè)置工作。
AtmPnp例程中完成對硬件資源的的檢測和配置工作,并且初始化請求隊列,獲得完成DMA傳輸?shù)腄MA適配器對象,掛接中斷處理對象等功能。
在AddDevice函數(shù)調(diào)用IoCreateDevice函數(shù)中創(chuàng)建一個設(shè)備對象,并通過調(diào)用IoAttachDe-viceToDeviceStack把它聯(lián)接到以PDO為底的設(shè)備堆棧中。
在PnP例程中對IRP-MN-START-DEVICE的處理代碼如下。
在處理中斷資源時給出的IoConnectInterrupt函數(shù)掛接了中斷處理函數(shù)AtmHandlerInter-rupt。
其他函數(shù)實現(xiàn)不再一一介紹。在具體實現(xiàn)的數(shù)據(jù)的傳輸、工作模式的設(shè)置等功能與所使用的硬件的寄存器的工作模式有關(guān)。在設(shè)計的過程中,應(yīng)該注意每個例程的運(yùn)行中斷級。在處理I/O請求時,應(yīng)根據(jù)硬件的特性和API的要求決定IRP隊列的方式及取消IRP的例程的編寫。
在編寫驅(qū)動程序前,應(yīng)該盡量了解硬件本身。這包括硬件的總線結(jié)構(gòu)、控制寄存器的訪問方式、中斷行為、數(shù)據(jù)傳輸機(jī)制和設(shè)備內(nèi)存等。
5小結(jié)
驅(qū)動程序的編寫是較復(fù)雜的過程,因驅(qū)動程序是操作系統(tǒng)信任的組件,任何細(xì)小的錯誤可能引起操作系統(tǒng)的崩潰,在驅(qū)動程序編寫過程中,應(yīng)該反復(fù)測試所寫的代碼,并遵循驅(qū)動程序的規(guī)則??傊?,開發(fā)驅(qū)動程序的工作與開發(fā)Windows應(yīng)用程序開發(fā)是完全不同的,且與驅(qū)動程序緊密相連的硬件都有自己的硬件和軟件規(guī)范,本文從一般驅(qū)動程序概念出發(fā),給出了驅(qū)動程序的總體描述和組成部分,并以部分例程代碼為例給出了驅(qū)動程序的基本組成結(jié)構(gòu)和注意問題。要想能夠很好掌握驅(qū)動程序開發(fā),最根本是閱讀DDK文檔并實踐編寫驅(qū)動程序。
c++相關(guān)文章:c++教程
評論