




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、一個端口訪問器的編寫, Windows XP驅(qū)動程序舉例,東南大學(xué)計算機(jī)科學(xué)與工程學(xué)院 楊全勝,VS.NET+WIN XP DDK+DriverStudio3.2開發(fā)環(huán)境版,本講義假設(shè)閱讀者已經(jīng)熟悉VC+.NET和VS.NET(2002)的使用。如果對Window XP驅(qū)動程序的編寫尚不熟悉,請參閱本人所編寫的Windows XP驅(qū)動程序編寫方法Step by Step電子講義。,注意:程序中暗紅色顯示的部分是我們添加或修改過的語句,其他是DriverWorks自動生成的。藍(lán)色顯示的部分是要刪除的語句。省略號的部分是不變的。語句中T.Trace(TraceInfo, _FUNCTION_“xx
2、xx”)這樣的語句是向調(diào)試軟件輸出信息,該信息可在DriverMonitor或其他調(diào)試監(jiān)視器中看到。,2次,由于一個可能是DriverStudio 3.2中的BUG,所以及時生成的一個空工程項目也無法編譯通過,需要對生成的工程文件做以下手工修改: 把MyIOPort項目中的sources文件中的:TARGETLIBS=$ (DDK_LIB_PATH)ntstrsafe.lib $ (DDK_LIB_PATH)csq.lib 這一行去掉就可以編譯通過了,protected: / Member data KIoRangem_ParPortIos;,在“MyIOPortDevice.h”文件的 cl
3、ass MyIOPortDevice : public KPnpDevice定義中添加下面的變量定義。,注意:程序中暗紅色顯示的部分是我們添加或修改過的語句,其他是DriverWorks自動生成的。藍(lán)色顯示的部分是要刪除的語句。省略號的部分是不變的。語句中T.Trace(TraceInfo, _FUNCTION_“xxxx”)這樣的語句是向調(diào)試軟件輸出信息,該信息可在DriverMonitor或其他調(diào)試監(jiān)視器中看到。,修改下面函數(shù)代碼:,NTSTATUS MyIOPortDevice:OnStartDevice(KIrp I) T.Trace(TraceInfo, _FUNCTION_+. I
4、RP %pn, I); NTSTATUS status = STATUS_SUCCESS; I.Information() = 0; / Get the list of raw resources from the IRP PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources(); / Get the list of translated resources from the IRP PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources(); / TODO: Add devi
5、ce-specific code to initialize/start your hardware device. / The base class will handle completion of the IRP status = m_ParPortIos.Initialize( 0 x00, / PC機(jī)I/O地址空間的首地址是00H TRUE, / 在CPU I/O空間內(nèi) 8, / 設(shè)備讀寫數(shù)據(jù)的字節(jié)寬度 TRUE / 映射到系統(tǒng)空間 ); T.Trace(TraceInfo, _FUNCTION_-. IRP %p, STATUS %xn, I, status); return st
6、atus; ,NTSTATUS MyIOPortDevice:MYIOPORT_IOCTL_Read_Handler(KIrp I) T.Trace(TraceInfo, _FUNCTION_+. IRP %pn, I); NTSTATUS status = STATUS_SUCCESS; ULONG outputSize = I.IoctlOutputBufferSize(); char buff150,buff250; struct ioport int port; UCHAR data; *iopt; ULONG fwLength=0; iopt=(ioport *)I.IoctlBuf
7、fer(); / 指針直接指向IRP的BUFF區(qū)域這里進(jìn) /來的時候有用戶程序的信息,出去的時候放返回信息 /顯示從應(yīng)用程序得到的要讀的端口號。 T.Trace(TraceInfo, _FUNCTION_Read port is 0 x%dn, iopt-port );,下面的函數(shù)保留和添加下述語句,其他全部刪除,/ 從端口讀一個字節(jié)的數(shù)據(jù) iopt-data= (UCHAR)m_ParPortIos.inb(iopt-port); fwLength = 8; if (outputSize = fwLength) / 如果讀入緩沖夠長 I.Information() = fwLength; /
8、 返回信息長度 T.Trace(TraceInfo, _FUNCTION_Read Data is 0 x%dn, iopt-data); / 顯示從應(yīng)用程序得到的命令串。 else I.Information() = 0;/ 否則信息長度為0 T.Trace(TraceInfo, _FUNCTION_buff size too smalln); T.Trace(NT_SUCCESS(status)?TraceInfo:TraceWarning, _FUNCTION_-. IRP %p, STATUS %xn, I, status); return status; ,NTSTATUS MyIO
9、PortDevice:MYIOPORT_IOCTL_Write_Handler(KIrp I) T.Trace(TraceInfo, _FUNCTION_+. IRP %pn, I); NTSTATUS status = STATUS_SUCCESS; char buff150,buff250; struct ioport int port; UCHAR data; *iopt; ULONG fwLength=0; iopt=(ioport *)I.IoctlBuffer(); / 指針直接指向IRP的BUFF區(qū)域這里進(jìn)來的時候有用戶程序的信息,出去的時候放返回信息 T.Trace(Trace
10、Info, _FUNCTION_Write port is 0 x%d, Write data is 0 x%dn, iopt-port , iopt-data ); / 顯示從應(yīng)用程序得到的命令串。 m_ParPortIos.outb(iopt-port,iopt-data); / 向端口寫一個字節(jié)的數(shù)據(jù) I.Information() = 0; T.Trace(NT_SUCCESS(status)?TraceInfo:TraceWarning, _FUNCTION_-. IRP %p, STATUS %xn, I, status); return status; ,下面我們來修改應(yīng)用程序,
11、該程序訪問硬件端口來獲得CMOS中的數(shù)據(jù)以及讓主板小喇叭發(fā)聲。首先要修改一下應(yīng)用程序項目的屬性中的字符集。缺省的字符集是“使用 Unicode 字符集”,把它改成“未設(shè)置”。,右鍵點擊,接下來我們修改資源文件。下圖是系統(tǒng)自動生成的應(yīng)用程序界面,這并不適合我們的需要。刪除這些控件,換上下頁顯示的控件。,全部刪除,Static Text,List Control,Button,在對話框中分別建立如圖的三個按鈕,一個列表控件(List Control)和一個靜態(tài)文本框。其中,列表控件和按鈕的屬性如下頁的圖設(shè)置。,UCHAR ReadOneByte(int port); / 從port讀一個字節(jié) vo
12、id WriteOneByte(int port, UCHAR value); / 向端口port寫一個字節(jié) BOOL OpenMyDevice(); / 打開設(shè)備 void Silence( void ); / 靜音 void Sound(DWORD freq ); / 發(fā)頻率為freq的聲音 void OnReadcmos(HWND hDlg); / 讀CMOS,在“MyIOPortApp.h”文件中增加下列函數(shù)聲明,在“MyIOPortApp.cpp”文件中增加下列函數(shù):,UCHAR ReadOneByte(int port) charbuff200; ULONGnOutput; / C
13、ount written to bufOutput struct ioport int port; UCHAR data; iopt,iopt2; iopt.port=port; if (!DeviceIoControl(g_hDevice, MYIOPORT_IOCTL_Read, :MessageBox(NULL,buff,錯誤, MB_OK|MB_ICONSTOP); return 0; else return iopt2.data; ,void WriteOneByte(int port, UCHAR value) charbuff200; ULONGnOutput;struct io
14、port int port; UCHAR data; iopt,iopt2; iopt.port=port; iopt.data=value; if (!DeviceIoControl(g_hDevice, MYIOPORT_IOCTL_Write, :MessageBox(NULL,buff,錯誤, MB_OK|MB_ICONSTOP); return ; ,BOOL OpenMyDevice() DWORD lastError; HDEVINFO hDeviceInfo; DWORD bufferSize; SP_DEVICE_INTERFACE_DATA interfaceData; P
15、SP_DEVICE_INTERFACE_DETAIL_DATA deviceDetail; / Find devices that have our interface hDeviceInfo = SetupDiGetClassDevs( (LPGUID),if (hDeviceInfo = INVALID_HANDLE_VALUE) lastError = GetLastError(); MyIOPortOutputText(_T(SetupDiGetClassDevs failed, GetLastError() = %d), lastError); return FALSE; / Set
16、up the interface data struct interfaceData.cbSize = sizeof(interfaceData); if(SetupDiEnumDeviceInterfaces(hDeviceInfo,NULL, (LPGUID) return FALSE; / Allocate a big enough buffer to get detail data deviceDetail= (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(bufferSize); if (deviceDetail = NULL) MyIOPortOu
17、tputText(_T(Error: Buffer allocation failed); return FALSE; / Setup the device interface struct deviceDetail-cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);,/ Try again to get the device interface detail info if (!SetupDiGetDeviceInterfaceDetail( hDeviceInfo, ,g_hDevice = CreateFile( (LPCTSTR)devi
18、ceDetail-DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,0); if (g_hDevice = INVALID_HANDLE_VALUE) MyIOPortOutputText(_T(Error: CreateFile failed for device %s (%d)n), deviceDetail-DevicePath, GetLastError(); return FALSE; MyIOP
19、ortOutputText(_T(Opened device %s), deviceDetail-DevicePath); return TRUE; MyIOPortOutputText(_T(No devices found); return FALSE; ,void Sound(DWORD freq ) UCHAR data; if(freq=20 ,void Silence( void ) UCHAR data; data = ReadOneByte(0 x61); WriteOneByte(0 x61, data ,void OnReadcmos(HWND hDlg) / TODO:
20、Add your control notification handler code here int i,it; char buff23; char cmosram128200= / CMOS每個字節(jié)的含義 目前系統(tǒng)時間的秒, 報警時間秒值, 目前系統(tǒng)時間的分, 報警時間分值, 目前系統(tǒng)時間的小時, 報警時間小時值, 目前星期幾, 目前系統(tǒng)日期, 目前系統(tǒng)月份, 目前系統(tǒng)年的后兩位,狀態(tài)寄存器A, 狀態(tài)寄存器B, 狀態(tài)寄存器C, 狀態(tài)寄存器D, 診斷狀態(tài)記錄值, 當(dāng)機(jī)復(fù)位指示字節(jié), 磁盤驅(qū)動器類型:xxxx. 軟驅(qū)0類型 0001=360K 0010=1.2M .xxxx 軟驅(qū)1類型 001
21、1=720K 0100=1.44M 0110=2.88M, (海洋板).x. 硬盤0Translate 1=Yes 0=No .x. 硬盤1Translate 1=Yes 0=No .x. 1=Step rate fast 0=Step rate slow .xx 軟驅(qū)個數(shù)00=1個 01=2個 10=三個 11=四個 , 硬盤類型:xxxx. 硬盤驅(qū)動器0的類型 1111=使用19h單元 .xxxx 硬盤驅(qū)動器1的類型 1111=使用1Ah單元, 字節(jié) x. 1=Anti-Virus 硬盤Boot區(qū)寫保護(hù) 0=disable .xxx. 軟驅(qū)2類型 .xxxx 軟驅(qū)3類型,所安裝設(shè)備的類型:
22、xx. 00=1個軟驅(qū),01=2個軟驅(qū),.xx. 00=單顯 01=CGA 10=CGA 11=VGA/EGA,后四位高到低是顯示、鍵盤、協(xié)處理器與軟件機(jī)使能(=1), 基本內(nèi)存容量低字節(jié),單位KB, 基本內(nèi)存容量高字節(jié),單位KB, 擴(kuò)充內(nèi)存容量低字節(jié),單位KB, 擴(kuò)充內(nèi)存容量高字節(jié),單位KB, (海洋板)硬盤驅(qū)動器0的類型, (海洋板)硬盤驅(qū)動器1的類型, (海洋板)顯示卡類型 VGA/monochrome, (海洋板).xxxx 啟動順序0=A:C: 1=C:A: 2=Screen prompt 3=Auto search 4=Network .x. 486-CPU Cache 0=dis
23、able 1= enable , (海洋板)x. 1=鍵盤使用缺省參數(shù) 0=使用本單元值 .xx. 鍵盤延時00=0.25秒01=0.5秒10=0.75秒11=1秒 .xxxxx 鍵盤重發(fā)速率,單位cps,(海洋板)硬盤1的柱面數(shù), (海洋板)硬盤1的柱面數(shù), (海洋板)硬盤1的磁頭數(shù), (海洋板)硬盤1的扇區(qū)數(shù), (海洋板)硬盤0的柱面數(shù), (海洋板)硬盤0的柱面數(shù), (海洋板)硬盤0的磁頭數(shù), (海洋板)硬盤0的扇區(qū)數(shù), (海洋板)AT-Bus clock 0=16.7Mhz 1=13.3Mhz 2=11.1Mhz 3=8.3Mhz 4=6.7Mhz 5=5.6Mhz 6=4.2Mhz,
24、(海洋板)memory type 00h=60nS 20h=70nS, 串口配置, 并口配置, 未使用, 未使用, 未使用, 未使用,標(biāo)準(zhǔn)CMOS校驗和, 標(biāo)準(zhǔn)CMOS校驗和, 擴(kuò)充內(nèi)存容量低字節(jié),單位KB, 擴(kuò)充內(nèi)存容量低字節(jié),單位KB, BCD碼的世紀(jì)值(年的高2位,如19,20等), 信息標(biāo)志, xxxx. Shadow of D000 0=Vacant .xxxx Shadow of C000 0=ROM , xxxx. Shadow of F000 0=ROM .xxxx Shadow of E000 0=Vacant , xxxx. Shadow of D000 1=WP 0=Re
25、ad/Write .xxxx Shadow of C000 1=WP 0=Read/Write , xxxx. Shadow of F000 1=WP 0=Read/Write .xxxx Shadow of E000 1=WP 0=Read/Write , 內(nèi)存大小,單位兆, (內(nèi)存大小有關(guān)=160/前一單元 ), 口令代碼Security Code, 口令代碼Security Code,xx. 口令檢測方式 0=Disable 1=Setup only 2=Powerup LVITEM lvitem; HWND hWnd; hWnd = GetDlgItem(hDlg, IDC_CMOSL
26、IST); BOOL qu; UCHAR index,value,tmp; for(i=0;i128;i+) lvitem.mask = LVIF_TEXT|LVIF_STATE; lvitem.iItem = i; lvitem.iSubItem = 0; sprintf(buff,%02XH,i); lvitem.pszText = buff;,SendMessage(hWnd,LVM_INSERTITEM,0,(LPARAM) ,下面增加關(guān)鍵的消息處理:,LRESULT CALLBACK MyIOPortMainDlgProc( HWND hDlg, UINT uMsg, WPARAM
27、wParam, LPARAM lParam ) switch (uMsg) case WM_INITDIALOG: g_hDevice = INVALID_HANDLE_VALUE; / 初始化List Control hWnd = GetDlgItem(hDlg, IDC_CMOSLIST); RECT rect; GetWindowRect(hWnd,strcpy(lvm.pszText,偏移); lvm.cx = (rect.right - rect.left)/10; lvm.iSubItem = 0; lvm.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBI
28、TEM; lvm.fmt = LVCFMT_CENTER; SendMessage(hWnd,LVM_INSERTCOLUMN,0,(LPARAM),if(OpenMyDevice() EnableWindow(GetDlgItem(hDlg, IDC_READCMOS), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_SPEAKER), TRUE); else EnableWindow(GetDlgItem(hDlg, IDC_READCMOS), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_SPEAKER), FALSE); / 此處還有DS自動生成的程序段,需全部刪除 return 1; case WM_COMMA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2.2社會主義制度在中國的確立 課件 統(tǒng)編版高中思想政治必修1中國特色社會主義
- 納稅評估工作總結(jié)十篇
- 老年日??祻?fù)護(hù)理課件
- 老年護(hù)理課件題目
- 老年人慢性病課件
- 老年中醫(yī)課件制作
- 通信設(shè)備車間使用權(quán)及技術(shù)轉(zhuǎn)讓合同模板
- 保險理賠責(zé)任限制條件合同
- 大學(xué)國家安全教育考試試題及答案
- 輔警培訓(xùn)課件
- 《產(chǎn)科危急重癥早期識別中國專家共識(2024年版)》解讀課件
- 中醫(yī)外科一般護(hù)理常規(guī)
- 2025至2030中國礦用卡車行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 氟骨癥課件教學(xué)課件
- 腳手架知識試題集及答案
- 2025年河南省中考數(shù)學(xué)試題卷(含官方答案)
- SL631水利水電工程單元工程施工質(zhì)量驗收標(biāo)準(zhǔn)第1部分:土石方工程
- (正式版)HGT 22820-2024 化工安全儀表系統(tǒng)工程設(shè)計規(guī)范
- 第3課 象外之境-中國傳統(tǒng)山水畫 說課稿- 高中美術(shù)人教版(2019)美術(shù)鑒賞
- 第2課《說和做》課件(共30張ppt) 部編版語文七年級下冊
- 數(shù)獨題目大全及答案
評論
0/150
提交評論