WindowsXP驅(qū)動(dòng)程序編寫(xiě)方法.ppt
《WindowsXP驅(qū)動(dòng)程序編寫(xiě)方法.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《WindowsXP驅(qū)動(dòng)程序編寫(xiě)方法.ppt(109頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1 WindowsXP驅(qū)動(dòng)程序編寫(xiě)方法 StepbyStep 東南大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院楊全勝 VS NET WINXPDDK DriverStudio3 2開(kāi)發(fā)環(huán)境版 2 本電子講義可以作為幾年前本人所寫(xiě)的 驅(qū)動(dòng)開(kāi)發(fā) 上 下電子講義的后續(xù)篇 主要是將開(kāi)發(fā)平臺(tái)從Windows98 2000 DriverStudio2 7升級(jí)到以下環(huán)境 WindowsXPSP2VisualStudio NET VC NET2002 簡(jiǎn)體中文版 WindowsXPDDK DriverStudio3 2 1 驅(qū)動(dòng)程序的開(kāi)發(fā)環(huán)境 以上四項(xiàng)中 前3項(xiàng)為Microsoft公司產(chǎn)品 可以只用2 3來(lái)開(kāi)發(fā)驅(qū)動(dòng)程序 為了方便起見(jiàn) 也可以使用第三方的開(kāi)發(fā)工具DriverStudio 它將DDK的內(nèi)容封裝成類 而且提供一個(gè)快速方便地生成驅(qū)動(dòng)框架的工具 3 2版本可能是Compuware公司推出的最后一個(gè)版本 3 通常 開(kāi)發(fā)不同操作系統(tǒng)下的驅(qū)動(dòng)程序需要不同的DDK做支持 Windows2000DDK適合開(kāi)發(fā)Windows2000 98 Me的WDM驅(qū)動(dòng)程序 Windows2000下NT4型驅(qū)動(dòng)程序 WindowsXPDDK適合開(kāi)發(fā)IA64下的驅(qū)動(dòng)程序或WindowsXP 2000 Me的WDM驅(qū)動(dòng)程序 WindowsXP下NT4型驅(qū)動(dòng)程序 Windows2003DDK適合開(kāi)發(fā)AMD64 IA64下的驅(qū)動(dòng)程序或Windows2003 XP 2000 Me的WDM驅(qū)動(dòng)程序 Windows2003 XP 2000下NT4型驅(qū)動(dòng)程序 本電子講義假設(shè)大家已經(jīng)會(huì)VC 編程及熟悉VSIDE的使用 4 2 驅(qū)動(dòng)程序開(kāi)發(fā)工具包DriverStudio 2 1DriverStudio3 2所包含的工具 VToolsDVToolsD是一個(gè)用來(lái)開(kāi)發(fā)針對(duì)Win9X Windows95和Windows98 操作系統(tǒng)下設(shè)備驅(qū)動(dòng)程序 VxD 的工具 VToolsD中包括生成驅(qū)動(dòng)程序源代碼的工具 run time和interface庫(kù) 以及一些可以用來(lái)作為各種類型的設(shè)備驅(qū)動(dòng)程序基礎(chǔ)的驅(qū)動(dòng)程序樣本 DriverWorksDriverWorks提供針對(duì)WindowsNT4和Win32驅(qū)動(dòng)模型 WDM 的設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)的完全支持 DriverWorks中包含一個(gè)非常完善的源代碼生成工具 DriverWizard 以及相應(yīng)的類庫(kù)和驅(qū)動(dòng)程序樣本 它提供了在C 下進(jìn)行設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)的支持 它可以集成到msvc6和中 還需要最新的WindowsDDK的支持 5 DriverNetworksDriverNetworks是針對(duì)Windows網(wǎng)絡(luò)驅(qū)動(dòng)開(kāi)發(fā)人員的一個(gè)模塊 它的核心部分 是一個(gè)針對(duì)NDISdrivers和TDIclients DriverSockets 的C 的類庫(kù) DriverNetworks中也有QuickMiniportWizard用來(lái)直接開(kāi)始一個(gè)NDISMiniport Intermediate或協(xié)議驅(qū)動(dòng)程序工程 它可以讓你在采用DriverNetworksC 類庫(kù)編寫(xiě)NDIS驅(qū)動(dòng)程序的時(shí)候 快速的生成編譯 安裝和調(diào)試所需要的所有文件 它可以集成到msvc6和中 還需要最新的WindowsDDK的支持 6 SoftICE系列調(diào)試器SoftICE系列調(diào)試器包含了可以調(diào)試各種代碼的多種工具 它可以調(diào)試諸如BIOS代碼 中斷例程以及系統(tǒng)I O 這些工具與強(qiáng)大的硬件調(diào)試板一起支持符號(hào)級(jí)調(diào)試 可以顯示源碼 全局或局部數(shù)據(jù) 其中 SoftICE是單機(jī)調(diào)試器 調(diào)試本機(jī)代碼 VisualSoftICE是雙機(jī)調(diào)試器 支持64位和32位平臺(tái)上的微軟操作系統(tǒng) 7 DriverMonitorDriverMonitor不僅可以顯示W(wǎng)DM和VxD在操作系統(tǒng)核心層次輸出的調(diào)試語(yǔ)句 還可以裝載和卸載VxD驅(qū)動(dòng)和NT4系統(tǒng)的驅(qū)動(dòng)程序 EZDriverInstaller這是一個(gè)無(wú)需經(jīng)過(guò)設(shè)備管理器或 添加新硬件 功能就能為Windows2000 XP動(dòng)態(tài)加載和卸載WDM驅(qū)動(dòng)程序的小實(shí)用程序 SetDDKGo用來(lái)設(shè)置設(shè)備驅(qū)動(dòng)程序創(chuàng)建的環(huán)境 當(dāng)我們用VisualStudio VC 編譯驅(qū)動(dòng)程序源程序的時(shí)候 需要用SetDDKGo來(lái)設(shè)置環(huán)境變量 之后SetDDKGo會(huì)自動(dòng)啟動(dòng)VisualStudio VC 編譯環(huán)境 8 DriverWorkbench這是DriverStudio以及用戶工具的集成環(huán)境和宿主 DS的大多數(shù)工具全部被集成到這個(gè)開(kāi)發(fā)環(huán)境中 BoundsCheckerDriverEdition它提供了參數(shù)驗(yàn)證和系統(tǒng)測(cè)試來(lái)檢測(cè)和跟蹤不同的設(shè)備驅(qū)動(dòng)程序與其他操作系統(tǒng)模塊之間的交互 配置 TrueTimeDriverEdition這是一個(gè)能讓W(xué)indowsNT 2000 XP設(shè)備驅(qū)動(dòng)程序的編寫(xiě)者確定驅(qū)動(dòng)程序性能瓶頸的性能分析工具 對(duì)于編寫(xiě)設(shè)備驅(qū)動(dòng)程序或核心代碼的程序員 這很有用 TrueCoverageDriverEdition它能幫助程序員檢測(cè)其代碼的哪部分被測(cè)試過(guò) 哪部分還需要測(cè)試 可幫助程序員提高程序的穩(wěn)定性 9 2 2DriverStudio3 2的安裝 安裝需要的軟硬件環(huán)境 Intelx86兼容系統(tǒng)或X64系統(tǒng) 包含IA64和AMD64以及Itanium WindowsXP內(nèi)存 最少256MB 推薦使用512MB硬盤(pán) 完全安裝需要大約182MB針對(duì)SoftICE的遠(yuǎn)程調(diào)試 NE2000 兼容網(wǎng)卡或3Com網(wǎng)卡針對(duì)DriverWorks MicrosoftXPDDK VisualC NET 10 安裝步驟 在安裝DriverWorks之前 首先要保證你的計(jì)算機(jī)上已經(jīng)安裝了MicrosoftVisualC NET以及WindowsXPDDK 所有這些包括DriverStudio的安裝都必須以系統(tǒng)管理員身份啟動(dòng)系統(tǒng) 并且要按照下面的順序安裝 11 第二步 安裝WindowsXPDDK DriverDevelopmentKits 注意 1 在安裝DDK的時(shí)候請(qǐng)選擇完全安裝 2 安裝中 不需要安裝64BITIA64Binaries3 安裝好后 對(duì)于XPDDK不需要手動(dòng)配置環(huán)境變量 只需在開(kāi)始菜單中點(diǎn)擊CheckedBuildEnvirment則DDK會(huì)自動(dòng)調(diào)用setenv配置環(huán)境變量 并監(jiān)測(cè)相應(yīng)的SDK以及VisualStudio NETIDE 第一步 安裝VisualStudioC NET 第三步 安裝DriverStudio3 2 按照安裝提示安裝 12 DriverStudio3 2支持單機(jī)調(diào)試或雙機(jī)調(diào)試兩種模式 在安裝的時(shí)候也有Host和Target兩種模式 單機(jī)調(diào)試需要在同一個(gè)機(jī)器中將Host和Target兩種模式都安裝雙機(jī)調(diào)試的時(shí)候需要在一個(gè)機(jī)器上安裝Host模式 在另一個(gè)機(jī)器上安裝Target模式 13 DriverStudio安裝后的設(shè)置 1 使用DDKBuildSetting工具定義BASEDIR環(huán)境變量并啟動(dòng)MSVC NET 14 15 16 17 18 2 打開(kāi)下列地址上的建立庫(kù)文件工程VdwLibs2002 sln如果是VS NET2003 則打開(kāi)VdwLibs2003 sln 19 3 選擇 生成 批生成 打開(kāi)下面的窗口 從中選則需要編譯的配置 Checked是調(diào)試版本 Free是發(fā)布版本 20 4 點(diǎn)擊 重新生成 編譯所選擇的庫(kù)文件 注意 庫(kù)文件只需在安裝完成后第一次使用前編譯一次即可 以后要使用DriverWorks 只需通過(guò)SetDDKGo進(jìn)入MSVC NET即可 或者直接從MSVC NET中啟動(dòng)DriverWorks 21 3 DriverWorks的使用 1 生成簡(jiǎn)單框架 VS NET中啟動(dòng)DriverWizard 22 23 工程文件名 工程文件目錄 24 選擇驅(qū)動(dòng)類型 選擇框架類型 25 創(chuàng)建功能驅(qū)動(dòng)程序 創(chuàng)建過(guò)濾器驅(qū)動(dòng)程序 26 選擇相應(yīng)總線 本例不驅(qū)動(dòng)硬件 27 選擇需要處理的消息句柄 28 添加和應(yīng)用程序之間通信的控制代碼 29 30 31 32 33 34 35 36 37 38 39 驅(qū)動(dòng)類 設(shè)備類 隊(duì)列管理類 40 驅(qū)動(dòng)類文件 設(shè)備類文件 測(cè)試用的控制臺(tái)程序文件 驅(qū)動(dòng)安裝指導(dǎo)文件 隊(duì)列管理類 41 此時(shí)已經(jīng)具備了一個(gè)驅(qū)動(dòng)程序以及做測(cè)試用的應(yīng)用程序的基本框架 我們可以在VC集成環(huán)境下修改有關(guān)程序 增加相關(guān)的具體操作代碼 然后就可以編譯和調(diào)試了 42 該驅(qū)動(dòng)程序框架包含了幾個(gè)最基本的類 這些類是 classSampleDriver publicKDriver 驅(qū)動(dòng)程序類 用于初始化驅(qū)動(dòng)程序 SAFE DESTRUCTORSpublic 以下成員函數(shù)注意和WDM中有關(guān)例程聯(lián)系起來(lái)看virtualNTSTATUSDriverEntry PUNICODE STRINGRegistryPath virtualNTSTATUSAddDevice PDEVICE OBJECTPdo virtualVOIDUnload VOID voidLoadRegistryParameters PUNICODE STRINGRegistryPath protected 成員數(shù)據(jù)intm Unit 43 classSampleDevice publicKPnpDevice 是設(shè)備類KDvice的派生類 用于在WDM環(huán)境下支持即插即用設(shè)備 Constructorspublic SAFE DESTRUCTORS SampleDevice PDEVICE OBJECTPdo ULONGUnit SampleDevice VOIDInvalidate void MemberFunctions注意和PNP的次功能代碼聯(lián)系起來(lái)看DEVMEMBER DISPATCHERSvirtualNTSTATUSOnStartDevice KIrpI virtualNTSTATUSOnStopDevice KIrpI virtualNTSTATUSOnRemoveDevice KIrpI virtualNTSTATUSOnDevicePowerUp KIrpI virtualNTSTATUSOnDeviceSleep KIrpI virtualNTSTATUSDefaultPnp KIrpI virtualNTSTATUSDefaultPower KIrpI voidLoadRegistryParameters 取注冊(cè)表信息 44 voidSerialRead KIrpI voidSerialWrite KIrpI NTSTATUSSAMPLE IOCTL Read Handler KIrpI NTSTATUSSAMPLE IOCTL Write Handler KIrpI NTSTATUSSAMPLE IOCTL ReadWrite Handler KIrpI protected MemberDataKPnpLowerDevicem Lower sampleQueueReadQueue DrivermanagedIRPqueuesampleQueueWriteQueue DrivermanagedIRPqueue ifdef COMMENT ONLYvirtualNTSTATUSCreate KIrpI COMMENT ONLYvirtualNTSTATUSClose KIrpI COMMENT ONLYvirtualNTSTATUSRead KIrpI COMMENT ONLYvirtualNTSTATUSWrite KIrpI COMMENT ONLYvirtualNTSTATUSDeviceControl KIrpI COMMENT ONLYvirtualNTSTATUSSystemControl KIrpI COMMENT ONLY endif COMMENT ONLY 45 由于一個(gè)可能是DriverStudio3 2中的BUG 所以及時(shí)生成的一個(gè)空工程項(xiàng)目也無(wú)法編譯通過(guò) 需要對(duì)生成的工程文件做以下手工修改 把sample項(xiàng)目中的sources文件中的 TARGETLIBS DDK LIB PATH ntstrsafe lib DDK LIB PATH csq lib這一行去掉就可以編譯通過(guò)了 46 先編譯驅(qū)動(dòng)程序工程 在VS2002的集成環(huán)境中 下面我們講解編譯 執(zhí)行和調(diào)試這個(gè)驅(qū)動(dòng)程序 生成目標(biāo)文件 47 確認(rèn)生成的是驅(qū)動(dòng)程序 48 在VS2002的集成環(huán)境中 生成目標(biāo)文件 再編譯測(cè)試應(yīng)用程序工程 49 確認(rèn)生成的是測(cè)試用應(yīng)用程序 50 下面使用DriverStudio帶的工具加載驅(qū)動(dòng)程序和查看調(diào)試信息 驅(qū)動(dòng)程序監(jiān)視 可實(shí)時(shí)看到驅(qū)動(dòng)程序發(fā)出的調(diào)試輸出語(yǔ)句 驅(qū)動(dòng)程序裝載器 可動(dòng)態(tài)調(diào)用驅(qū)動(dòng)程序 51 驅(qū)動(dòng)程序監(jiān)視器界面 52 為了防止其他驅(qū)動(dòng)程序的干擾 在FilterMessage對(duì)話框中設(shè)置消息過(guò)濾規(guī)則 只讓有sample的消息通過(guò) 53 驅(qū)動(dòng)程序裝載器界面 54 55 56 57 驅(qū)動(dòng)程序已經(jīng)加載并且啟動(dòng) 58 YANGQS 59 DriverStudio3 2給出的驅(qū)動(dòng)測(cè)試軟件是一個(gè)Win32的窗口程序 而不是先前版本的控制臺(tái)程序 為了在調(diào)試輸出的時(shí)候有所區(qū)別我們將測(cè)試程序的調(diào)試輸出語(yǔ)句的句頭由原來(lái)的sample 改成sampleAPP 在sampleAPP cpp文件中 VOIDsampleOutputText LPCTSTRFormat TCHARstr MAX STRING LENGTH va listvaList va start vaList Format vstprintf str Format vaList OutputDebugString T sampleAPP OutputDebugString str OutputDebugString T n va end vaList return 60 運(yùn)行編譯好的sampleAPP exe 61 62 如果在執(zhí)行sampleAPP exe之前 驅(qū)動(dòng)程序sample sys還沒(méi)有加載到內(nèi)存中 則在DriverMonitor程序中就可以看到以下信息 63 APP中打開(kāi)與驅(qū)動(dòng)程序聯(lián)系 64 65 結(jié)束后一定要卸載驅(qū)動(dòng)程序 66 驅(qū)動(dòng)程序已經(jīng)卸載 67 下面我們來(lái)修改有關(guān)代碼 以便增加驅(qū)動(dòng)程序和應(yīng)用程序之間相互通信的內(nèi)容 需要增加的內(nèi)容包括 使用Read和Write方式分別從驅(qū)動(dòng)程序讀入字符和向驅(qū)動(dòng)程序?qū)懽址?使用IO控制代碼方式分別從驅(qū)動(dòng)程序讀入字符和向驅(qū)動(dòng)程序?qū)懽址?使用IO控制代碼方式向驅(qū)動(dòng)程序?qū)懽址購(gòu)尿?qū)動(dòng)程序中讀出該字符串 并返回反饋串信息 注意 程序中暗紅色顯示的部分是我們添加或修改過(guò)的語(yǔ)句 其他是DriverWorks自動(dòng)生成的 藍(lán)色顯示的部分是要?jiǎng)h除的語(yǔ)句 省略號(hào)的部分是不變的 語(yǔ)句中T Trace TraceInfo FUNCTION xxxx 這樣的語(yǔ)句是向調(diào)試軟件輸出信息 該信息可在DriverMonitor或其他調(diào)試監(jiān)視器中看到 2 完成應(yīng)用程序和驅(qū)動(dòng)程序之間的信息交換 68 a 1使用Read方式讀SampleDevice cppvoidSampleDevice SerialRead KIrpI T Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS PUCHARpBuffer PUCHAR I BufferedReadDest 取得返回?cái)?shù)據(jù)BUFF的指針ULONGreadSize I ReadSize 獲得應(yīng)用程序希望讀驅(qū)動(dòng)程序信息的字節(jié)數(shù) ULONGbytesRead 0 charbuff 512 intn 512 j n 26 for inti 0 i n i j j 1 26 buff i a j buff readSize 0 指定串尾strcpy char pBuffer buff 把給應(yīng)用程序的數(shù)據(jù)拷貝給返回BUFFT Trace TraceInfo FUNCTION Thestringyouwillreadis s n buff 輸出調(diào)試信息bytesRead strlen buff CountofbytesreadI Information bytesRead 返回給應(yīng)用程序的信息的字節(jié)個(gè)數(shù)I Status status m DriverManagedQueue PnpNextIrp I 69 控件IDC OP TYPE COMBO及其選擇項(xiàng) 我們這次選ReadFile 70 sampleIorw cpp中有關(guān)讀數(shù)據(jù)的代碼 ULONGsampleExecuteIo HWNDhDlg PSAMPLE LIST ITEMioItem 獲得需要讀的字節(jié)數(shù)GetDlgItemText hDlg IDC OUT SIZE EDIT str MAX STRING LENGTH ioItem OutSize ttol str 設(shè)置控件IDC OP TYPE COMBO的句柄hWnd GetDlgItem hDlg IDC OP TYPE COMBO 獲得當(dāng)前被選中項(xiàng)目的索引itemIndex DWORD SendMessage hWnd CB GETCURSEL 0 0 獲得被選中的項(xiàng)目的字符串SendMessage hWnd CB GETLBTEXT WPARAM itemIndex LPARAM str if tcscmp str T ReadFile 71 從驅(qū)動(dòng)程序讀數(shù)據(jù)if ReadFile g hDevice 設(shè)備句柄ioItem OutBuffer 輸入緩沖地址ioItem OutSize 緩沖大小 字節(jié)數(shù) NULL 實(shí)際讀的數(shù)據(jù)字節(jié)數(shù) if tcscmp str T ReadFile 72 VOIDsampleReadCompleteCallback PVOIDContext 讀驅(qū)動(dòng)程序的回調(diào)函數(shù)PSAMPLE LIST ITEMioItem PSAMPLE LIST ITEM Context 因VS net隱含采用Unicode編碼 每個(gè)字符16位 下面做8位到16位字符轉(zhuǎn)換charwstr 1025 for ULONGi 0 iOutSize i wstr i 2 ioItem OutBuffer i wstr i 2 1 0 x0 wstr i 2 wstr i 2 1 0 sampleOutputText T ExecutedReadFile buffersize d returnlength d error d ThestringIreadis s ioItem OutSize ioItem ReturnLength ioItem Error wstr 輸出讀到的字符串sampleOutputBuffer ioItem OutBuffer ioItem ReturnLength 釋放緩沖空間free ioItem OutBuffer 關(guān)閉重疊事件句柄CloseHandle ioItem IoOverlapped hEvent 釋放ioItem空間free ioItem return 73 74 a 2使用Write方式寫(xiě)SampleDevice cppvoidSampleDevice SerialWrite KIrpI T Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS PUCHARpBuffer PUCHAR I BufferedWriteSource 取得存放應(yīng)用程序?qū)懡o驅(qū)動(dòng)程序的數(shù)據(jù)的BUFF的指針ULONGwriteSize I WriteSize 獲得應(yīng)用程序?qū)懡o驅(qū)動(dòng)程序的信息的字節(jié)數(shù) ULONGbytesSent 0 bytesSent writeSize charbuff 512 strcpy buff char pBuffer 應(yīng)用程序?qū)懡o驅(qū)動(dòng)程序的數(shù)據(jù)在I BufferedWriteSource 返回的指針中 buff bytesSent 0 T Trace TraceInfo FUNCTION Writetodriveris s n buff I Information bytesSent 返回用戶實(shí)際寫(xiě)的字節(jié)數(shù)I Status status m DriverManagedQueue PnpNextIrp I 75 控件IDC OP TYPE COMBO及其選擇項(xiàng) 我們這次選WriteFile 76 sampleIorw cpp中有關(guān)寫(xiě)數(shù)據(jù)的代碼 ULONGsampleExecuteIo HWNDhDlg PSAMPLE LIST ITEMioItem 獲得需要寫(xiě)的字節(jié)數(shù) GetDlgItemText hDlg IDC IN SIZE EDIT str MAX STRING LENGTH ioItem InSize ttol str 獲得要寫(xiě)的字符串和要寫(xiě)的字節(jié)數(shù)GetDlgItemText hDlg IDC IN DATA EDIT str MAX STRING LENGTH VOID stscanf str T x 77 Writedatatodriverif tcscmp str T ReadFile if tcscmp str T WriteFile 78 79 b 1使用IO控制代碼方式讀 SampleDevice cpp NTSTATUSsampleDevice SAMPLE IOCTL Read Handler KIrpI T Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS ULONGinputSize I IoctlInputBufferSize ULONGoutputSize I IoctlOutputBufferSize charbuff1 512 ULONGfwLength 0 strcpy buff1 Welcometodriver 這是應(yīng)用程序?qū)⒁x到的字符串fwLength strlen buff1 1 if outputSize fwLength 如果讀入緩沖夠長(zhǎng)strcpy PCHAR I IoctlBuffer buff1 將信息拷給應(yīng)用程序讀入緩沖I Information fwLength 返回信息長(zhǎng)度 else I Information 0 否則信息長(zhǎng)度為0T Trace TraceInfo FUNCTION buffsizetoosmall n 80 Bufferedioctl usingthesamebuffersoreadthebufferbeforewritingthebuffer PVOIDinputBuffer I IoctlBuffer PVOIDoutputBuffer I IoctlBuffer if FALSE status STATUS INVALID PARAMETER I Information 0 else I Information 0 T Trace NT SUCCESS status TraceInfo TraceWarning FUNCTION IRP p STATUS x n I status returnstatus 81 sampleIorw cpp中有關(guān)寫(xiě)數(shù)據(jù)的代碼 ULONGsampleExecuteIo HWNDhDlg PSAMPLE LIST ITEMioItem if tcscmp str T SAMPLE IOCTL Read 82 if DeviceIoControl g hDevice 設(shè)備句柄SAMPLE IOCTL Read IO控制命令ioItem InBuffer 寫(xiě)緩沖ioItem InSize 寫(xiě)緩沖大小ioItem OutBuffer 讀緩沖ioItem OutSize 讀緩沖大小NULL 實(shí)際讀的字節(jié)數(shù) if tcscmp str T SAMPLE IOCTL Read 83 VOIDsampleSAMPLE IOCTL ReadCompleteCallback PVOIDContext PSAMPLE LIST ITEMioItem PSAMPLE LIST ITEM Context charwstr 1025 for ULONGi 0 iOutSize i wstr i 2 ioItem OutBuffer i wstr i 2 1 0 x0 wstr i 2 wstr i 2 1 0 sampleOutputText T ExecutedSAMPLE IOCTL Readrequest inbuffersize d outbuffersize d nreturnlength d error d ThestringIreadedis s ioItem InSize ioItem OutSize ioItem ReturnLength ioItem Error wstr 84 85 b 2使用IO控制代碼方式寫(xiě) SampleDevice cpp NTSTATUSsampleDevice SAMPLE IOCTL Write Handler KIrpI T Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS ULONGinputSize I IoctlInputBufferSize ULONGoutputSize I IoctlOutputBufferSize charbuff 512 strcpy buff char I IoctlBuffer 應(yīng)用程序?qū)懡o驅(qū)動(dòng)程序的數(shù)據(jù)在I BufferedWriteSource 返回的指針中 buff inputSize 0 T Trace TraceInfo FUNCTION Writetodriveris s n buff I Information 0 86 Bufferedioctl usingthesamebuffersoreadthebufferbeforewritingthebuffer PVOIDinputBuffer I IoctlBuffer PVOIDoutputBuffer I IoctlBuffer if FALSE status STATUS INVALID PARAMETER I Information 0 else I Information 0 T Trace NT SUCCESS status TraceInfo TraceWarning FUNCTION IRP p STATUS x n I status returnstatus 87 sampleIorw cpp中有關(guān)寫(xiě)數(shù)據(jù)的代碼 ULONGsampleExecuteIo HWNDhDlg 本頁(yè)的修改實(shí)際上前面Write時(shí)已經(jīng)改好 PSAMPLE LIST ITEMioItem 獲得需要寫(xiě)的字節(jié)數(shù) GetDlgItemText hDlg IDC IN SIZE EDIT str MAX STRING LENGTH ioItem InSize ttol str 獲得要寫(xiě)的字符串和要寫(xiě)的字節(jié)數(shù)GetDlgItemText hDlg IDC IN DATA EDIT str MAX STRING LENGTH VOID stscanf str T x 88 if tcscmp str T SAMPLEIOCTL Write if tcscmp str T SAMPLEIOCTL Write 89 90 c 使用IO控制代碼方式寫(xiě)并且讀 SampleDevice cpp NTSTATUSsampleDevice IOCTL ReadWrite Handler KIrpI Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS ULONGinputSize I IoctlInputBufferSize ULONGoutputSize I IoctlOutputBufferSize Bufferedioctl usingthesamebuffersoreadthebufferbeforewritingthebuffer PVOIDinputBuffer I IoctlBuffer PVOIDoutputBuffer I IoctlBuffer charbuff 512 strcpy buff char I IoctlBuffer 取應(yīng)用程序?qū)懡o驅(qū)動(dòng)程序的數(shù)據(jù)buff inputSize 0 T Trace TraceInfo FUNCTION Applicationwritetodriveris s n buff charbuff1 512 ULONGfwLength 0 strcpy buff1 Thisisfeedbackfromdriver Feedbackstringis strcat buff1 buff strcat buff1 n fwLength strlen buff1 1 91 if outputSize fwLength 如果讀入緩沖夠長(zhǎng)strcpy PCHAR I IoctlBuffer buff1 將信息拷給應(yīng)用程序讀入緩沖I Information fwLength 返回信息長(zhǎng)度 else I Information 0 否則信息長(zhǎng)度為0T Trace TraceInfo FUNCTION buffsizetoosmall n if FALSE status STATUS INVALID PARAMETER I Information 0 else I Information 0 T Trace NT SUCCESS status TraceInfo TraceWarning FUNCTION IRP p STATUS x n I status returnstatus 92 sampleIorw cpp中有關(guān)讀寫(xiě)數(shù)據(jù)的代碼 ULONGsampleExecuteIo HWNDhDlg 本頁(yè)的修改實(shí)際上前面Write時(shí)已經(jīng)改好 PSAMPLE LIST ITEMioItem 獲得需要寫(xiě)的字節(jié)數(shù) GetDlgItemText hDlg IDC IN SIZE EDIT str MAX STRING LENGTH ioItem InSize ttol str 獲得要寫(xiě)的字符串和要寫(xiě)的字節(jié)數(shù)GetDlgItemText hDlg IDC IN DATA EDIT str MAX STRING LENGTH VOID stscanf str T x 93 if tcscmp str T IOCTL ReadWrite if tcscmp str T SAMPLEIOCTL Write 94 VOIDsampleIOCTL ReadWriteCompleteCallback PVOIDContext PSAMPLE LIST ITEMioItem PSAMPLE LIST ITEM Context 因VS net隱含采用Unicode編碼 每個(gè)字符16位 下面做8位到16位字符轉(zhuǎn)換charwstr 1025 for ULONGi 0 iOutSize i wstr i 2 ioItem OutBuffer i wstr i 2 1 0 x0 wstr i 2 wstr i 2 1 0 sampleOutputText T ExecutedIOCTL ReadWriterequest inbuffersize d outbuffersize d nreturnlength d error d ThestringIreadedis s ioItem InSize ioItem OutSize ioItem ReturnLength ioItem Error wstr 95 96 3 直接對(duì)端口寄存器讀寫(xiě) DriverStudio提供了KIoRange類來(lái)將外部總線的I O地址空間范圍映射到處理器總線的地址空間范圍 該類的成員函數(shù)主要有KIoRange構(gòu)造函數(shù) 4種格式 Initialize初始化和重新初始化一個(gè)實(shí)例 3種格式 KIoRange析構(gòu)函數(shù)Invalidate從已初始化狀態(tài)刪除該對(duì)象IsValid測(cè)試該對(duì)象是否已經(jīng)初始化inb讀一個(gè)或多個(gè)字節(jié) 2種形式 Outb寫(xiě)一個(gè)或多個(gè)字節(jié) 2種形式 Inw讀一個(gè)或多個(gè)字 2種形式 Outw寫(xiě)一個(gè)或多個(gè)字 2種形式 ind讀一個(gè)或多個(gè)雙字 2種形式 outd寫(xiě)一個(gè)或多個(gè)雙字 2種形式 97 KIoRange KIoRange 只介紹WDM形式 FORM3 WDM KIoRange ULONGLONGCpuPhysicalAddress 轉(zhuǎn)換成外圍設(shè)備地址的CPU總線上的物理地址BOOLEANInCpuIoSpace 如果IO范圍是在CPU總線的IO空間中為T(mén)RUE 否則為FALSEULONGCount 以字節(jié)計(jì)的區(qū)域的大小BOOLEANMapToSystemVirtual TRUE 指定是否需要構(gòu)造函數(shù)創(chuàng)建一個(gè)非頁(yè)系統(tǒng)空間的地址空間映射 如果驅(qū)動(dòng)程序讀寫(xiě)設(shè)備中的數(shù)據(jù) 就需要這種映射 FORM4 WDM 注意 這種形式不被DriverStudio2 0支持 KIoRange PCM RESOURCE LISTpTranslatedResourceList 指向轉(zhuǎn)換資源表的指針ULONGOrdinal 0 指定pTranslatedResourceList指向的資源列表中的一個(gè)特殊端口資源BOOLEANMapToSystemVirtual TRUE FORM5 WDM KIoRange PCM RESOURCE LISTpTranslatedResourceList 可通過(guò)KIrp TranslatedResources獲得PCM RESOURCE LISTpRawResourceList 指向原始資源表的指針ULONGOrdinal 0 BOOLEANMapToSystemVirtual TRUE 構(gòu)造KIoRange類 98 KIoRange Initialize 只介紹WDM形式 FORM2 WDM NTSTATUSInitialize ULONGLONGCpuPhysicalAddress BOOLEANInCpuIoSpace ULONGCount BOOLEANMapToSystemVirtual TRUE FORM3 WDM 注意 這種形式不被DriverStudio2 0支持 NTSTATUSInitialize PCM RESOURCE LISTpTranslatedResourceList ULONGOrdinal 0 BOOLEANMapToSystemVirtual TRUE FORM4 WDM Initialize PCM RESOURCE LISTpTranslatedResourceList PCM RESOURCE LISTpRawResourceList ULONGOrdinal 0 BOOLEANMapToSystemVirtual TRUE 初始化或重新初始化KIoRange的實(shí)例 99 KIoRange inbFORM1 UCHARinb ULONGByteOffset FORM2 VOIDinb ULONGByteOffset PUCHARBuffer ULONGCount 從映射空間讀一個(gè)或多個(gè)字節(jié) 100 KIoRange outbFORM1 VOIDoutb ULONGByteOffset 以字節(jié)為單位的目標(biāo)位置到IO空間開(kāi)始位置的偏移值UCHARData 要寫(xiě)的一個(gè)字節(jié)數(shù)據(jù) FORM2 VOIDoutb ULONGByteOffset PUCHARBuffer 指向包含要寫(xiě)數(shù)據(jù)的緩沖的指針ULONGCount 緩沖中要寫(xiě)數(shù)據(jù)的字節(jié)數(shù) 寫(xiě)一個(gè)或多個(gè)字節(jié)到映射的IO空間 101 寫(xiě)端口 索引信息 地址70H m ParPortIos outb 0 0 x02 準(zhǔn)備讀分鐘信息讀端口 讀分鐘信息 地址71H UCHARdata m ParPortIos inb 1 下面我們來(lái)訪問(wèn)CMOS的數(shù)據(jù) 首先定義類KIoRange的一個(gè)實(shí)例 以定義相關(guān)地址空間 KIoRangem ParPortIos 初始化實(shí)例 指定CMOS的端口首地址 并映射 status m ParPortIos Initialize 0 x70 CMOS端口首地址是70HTRUE 在CPUI O空間內(nèi)8 設(shè)備讀寫(xiě)數(shù)據(jù)的字節(jié)寬度TRUE 映射到系統(tǒng)空間 102 4 截獲中斷和掛接中斷服務(wù)例程 DriverStudio提供了KInterrupt類來(lái)截獲和掛接中斷 該類的成員函數(shù)主要有KInterrupt構(gòu)造函數(shù) 3種格式 Initialize在無(wú)效狀態(tài)下初始化一個(gè)對(duì)象 3種格式 Connect綁定ISR 中斷服務(wù)例程 到中斷InitializeAndConnect一步完成初始化與綁定工作 要用資源列表作為輸入 KInterrupt析構(gòu)函數(shù)Invalidate在初始化狀態(tài)下刪除對(duì)象IsValid檢查對(duì)象是否初始化Disconnect使中斷和ISR與中斷分離Synchronize當(dāng)?shù)玫揭粋€(gè)中斷自旋鎖時(shí)請(qǐng)求同步功能 103 KInterrupt KInterrupt 只介紹WDM形式 FORM3 WDM KInterrupt KIRQLirql 即插即用設(shè)備提供的IRQL值ULONGvector 即插即用設(shè)備提供的向量值KINTERRUPT MODEMode LevelSensitive或Latched中選一 BOOLEANbShareVector FALSE 該向量是否被幾個(gè)設(shè)備共享KAFFINITYaffinity 1 thisistheprocessoraffinitymask BOOLEANbSaveFloat FALSE 是否需要在中斷到來(lái)使保存浮點(diǎn)處理器上下文 X86平臺(tái)下必須使FALSE 構(gòu)造類Kinterrupt的實(shí)例 104 KInterrupt Initialize 只介紹WDM形式 FORM2 WDM VOIDInitialize KIRQLirql ULONGvector KINTERRUPT MODEMode BOOLEANbShareVector FALSE KAFFINITYaffinity 1 BOOLEANbSaveFloat FALSE 初始化對(duì)象 只在對(duì)象沒(méi)有初始化的時(shí)候使用 105 KInterrupt ConnectFORM1 NTSTATUSConnect PKSERVICE ROUTINEIsr 作為ISR服務(wù)的函數(shù)的地址PVOIDContext 當(dāng)系統(tǒng)調(diào)用ISR的時(shí)候傳遞給他的無(wú)類型的參數(shù) FORM2 NTSTATUSConnect PKSERVICE ROUTINEIsr PVOIDContext PKSPIN LOCKpSpin KIRQLSynchIrql 綁定一個(gè)中斷到ISR 中斷處理程序 106 KInterrupt InitializeAndConnectNTSTATUSInitializeAndConnect PCM RESOURCE LISTpResourceList 指向資源列表的指針PKSERVICE ROUTINEIsr PVOIDIsrContext ULONGOrdinal 0 BOOLEANbSaveFloat FALSE 初始化一個(gè)中斷并綁定到一個(gè)ISR上 對(duì)于WDM驅(qū)動(dòng)程序 pResourceList必須是一個(gè)轉(zhuǎn)換資源表 例如是KIrp TranslatedResources的返回值 107 下面我們來(lái)舉例說(shuō)明 首先定義類KInterrupt的一個(gè)實(shí)例KInterruptm TheInterrupt 在設(shè)備類中聲明一個(gè)成員函數(shù)TheIsr作為中斷服務(wù)例程ISR classSampleDevice publicKPnpDevice public MEMBER ISR SampleDevice TheIsr ifdef COMMENT ONLYBOOLEANTheIsr void returnTRUE endif 108 在OnStartDevice例程中獲取包括中斷的設(shè)備資源并初始化中斷和掛接ISRSampleDevice OnStartDevice KIrpI PCM RESOURCE LISTpResList I TranslatedResources 獲取設(shè)備資源 初始化中斷并掛接中斷服務(wù)例程TheIsrstatus m TheInterrupt InitializeAndConnect pResList LinkTo TheIsr this 109 本講義參考了DriverStudio有關(guān)文檔- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- WindowsXP 驅(qū)動(dòng)程序 編寫(xiě) 方法
鏈接地址:http://m.jqnhouse.com/p-6569653.html