![一個(gè)端口訪問(wèn)器的編寫_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-4/3/aef4697e-eaa4-4ab2-8c46-69ba6fb66c70/aef4697e-eaa4-4ab2-8c46-69ba6fb66c701.gif)
![一個(gè)端口訪問(wèn)器的編寫_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-4/3/aef4697e-eaa4-4ab2-8c46-69ba6fb66c70/aef4697e-eaa4-4ab2-8c46-69ba6fb66c702.gif)
![一個(gè)端口訪問(wèn)器的編寫_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-4/3/aef4697e-eaa4-4ab2-8c46-69ba6fb66c70/aef4697e-eaa4-4ab2-8c46-69ba6fb66c703.gif)
![一個(gè)端口訪問(wèn)器的編寫_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-4/3/aef4697e-eaa4-4ab2-8c46-69ba6fb66c70/aef4697e-eaa4-4ab2-8c46-69ba6fb66c704.gif)
![一個(gè)端口訪問(wèn)器的編寫_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-4/3/aef4697e-eaa4-4ab2-8c46-69ba6fb66c70/aef4697e-eaa4-4ab2-8c46-69ba6fb66c705.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一個(gè)端口訪問(wèn)器的編寫, Windows XP驅(qū)動(dòng)程序舉例,東南大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院 楊全勝,VS.NET+WIN XP DDK+DriverStudio3.2開發(fā)環(huán)境版,本講義假設(shè)閱讀者已經(jīng)熟悉VC+.NET和VS.NET(2002)的使用。如果對(duì)Window XP驅(qū)動(dòng)程序的編寫尚不熟悉,請(qǐng)參閱本人所編寫的Windows XP驅(qū)動(dòng)程序編寫方法Step by Step電子講義。,注意:程序中暗紅色顯示的部分是我們添加或修改過(guò)的語(yǔ)句,其他是DriverWorks自動(dòng)生成的。藍(lán)色顯示的部分是要?jiǎng)h除的語(yǔ)句。省略號(hào)的部分是不變的。語(yǔ)句中T.Trace(TraceInfo, _FUNCTION_“xx
2、xx”)這樣的語(yǔ)句是向調(diào)試軟件輸出信息,該信息可在DriverMonitor或其他調(diào)試監(jiān)視器中看到。,2次,由于一個(gè)可能是DriverStudio 3.2中的BUG,所以及時(shí)生成的一個(gè)空工程項(xiàng)目也無(wú)法編譯通過(guò),需要對(duì)生成的工程文件做以下手工修改: 把MyIOPort項(xiàng)目中的sources文件中的:TARGETLIBS=$ (DDK_LIB_PATH)ntstrsafe.lib $ (DDK_LIB_PATH)csq.lib 這一行去掉就可以編譯通過(guò)了,protected: / Member data KIoRangem_ParPortIos;,在“MyIOPortDevice.h”文件的 cl
3、ass MyIOPortDevice : public KPnpDevice定義中添加下面的變量定義。,注意:程序中暗紅色顯示的部分是我們添加或修改過(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)視器中看到。,修改下面函數(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) /來(lái)的時(shí)候有用戶程序的信息,出去的時(shí)候放返回信息 /顯示從應(yīng)用程序得到的要讀的端口號(hào)。 T.Trace(TraceInfo, _FUNCTION_Read port is 0 x%dn, iopt-port );,下面的函數(shù)保留和添加下述語(yǔ)句,其他全部刪除,/ 從端口讀一個(gè)字節(jié)的數(shù)據(jù) iopt-data= (UCHAR)m_ParPortIos.inb(iopt-port); fwLength = 8; if (outputSize = fwLength) / 如果讀入緩沖夠長(zhǎng) I.Information() = fwLength; /
8、 返回信息長(zhǎng)度 T.Trace(TraceInfo, _FUNCTION_Read Data is 0 x%dn, iopt-data); / 顯示從應(yīng)用程序得到的命令串。 else I.Information() = 0;/ 否則信息長(zhǎng)度為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)來(lái)的時(shí)候有用戶程序的信息,出去的時(shí)候放返回信息 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); / 向端口寫一個(gè)字節(jié)的數(shù)據(jù) I.Information() = 0; T.Trace(NT_SUCCESS(status)?TraceInfo:TraceWarning, _FUNCTION_-. IRP %p, STATUS %xn, I, status); return status; ,下面我們來(lái)修改應(yīng)用程序,
11、該程序訪問(wèn)硬件端口來(lái)獲得CMOS中的數(shù)據(jù)以及讓主板小喇叭發(fā)聲。首先要修改一下應(yīng)用程序項(xiàng)目的屬性中的字符集。缺省的字符集是“使用 Unicode 字符集”,把它改成“未設(shè)置”。,右鍵點(diǎn)擊,接下來(lái)我們修改資源文件。下圖是系統(tǒng)自動(dòng)生成的應(yīng)用程序界面,這并不適合我們的需要。刪除這些控件,換上下頁(yè)顯示的控件。,全部刪除,Static Text,List Control,Button,在對(duì)話框中分別建立如圖的三個(gè)按鈕,一個(gè)列表控件(List Control)和一個(gè)靜態(tài)文本框。其中,列表控件和按鈕的屬性如下頁(yè)的圖設(shè)置。,UCHAR ReadOneByte(int port); / 從port讀一個(gè)字節(jié) vo
12、id WriteOneByte(int port, UCHAR value); / 向端口port寫一個(gè)字節(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,錯(cuò)誤, 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,錯(cuò)誤, 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每個(gè)字節(jié)的含義 目前系統(tǒng)時(shí)間的秒, 報(bào)警時(shí)間秒值, 目前系統(tǒng)時(shí)間的分, 報(bào)警時(shí)間分值, 目前系統(tǒng)時(shí)間的小時(shí), 報(bào)警時(shí)間小時(shí)值, 目前星期幾, 目前系統(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ū)動(dòng)器類型: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ū)個(gè)數(shù)00=1個(gè) 01=2個(gè) 10=三個(gè) 11=四個(gè) , 硬盤類型:xxxx. 硬盤驅(qū)動(dòng)器0的類型 1111=使用19h單元 .xxxx 硬盤驅(qū)動(dòng)器1的類型 1111=使用1Ah單元, 字節(jié) x. 1=Anti-Virus 硬盤Boot區(qū)寫保護(hù) 0=disable .xxx. 軟驅(qū)2類型 .xxxx 軟驅(qū)3類型,所安裝設(shè)備的類型:
22、xx. 00=1個(gè)軟驅(qū),01=2個(gè)軟驅(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ū)動(dòng)器0的類型, (海洋板)硬盤驅(qū)動(dòng)器1的類型, (海洋板)顯示卡類型 VGA/monochrome, (海洋板).xxxx 啟動(dòng)順序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. 鍵盤延時(shí)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校驗(yàn)和, 標(biāo)準(zhǔn)CMOS校驗(yàn)和, 擴(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. 口令檢測(cè)方式 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自動(dòng)生成的程序段,需全部刪除 return 1; case WM_COMMA
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融租賃居間合同模板
- 始興縣中醫(yī)院特殊用房設(shè)施設(shè)備采購(gòu)及安裝及醫(yī)療設(shè)備采購(gòu)項(xiàng)目招標(biāo)文件
- 終止合同退款協(xié)議
- 未維修事故車買賣合同協(xié)議書
- 企業(yè)人才培養(yǎng)與發(fā)展作業(yè)指導(dǎo)書
- 質(zhì)押礦產(chǎn)權(quán)收益權(quán)擔(dān)保協(xié)議書
- 養(yǎng)雞業(yè)養(yǎng)殖技術(shù)手冊(cè)
- 庫(kù)房轉(zhuǎn)租合同
- 智能倉(cāng)儲(chǔ)標(biāo)準(zhǔn)化管理與供應(yīng)鏈優(yōu)化項(xiàng)目實(shí)踐
- 焊接結(jié)構(gòu)分析與優(yōu)化作業(yè)指導(dǎo)書
- 信號(hào)與系統(tǒng)復(fù)習(xí)題(答案全)
- ISO∕IEC 23894-2023 信息技術(shù) -人工智能 - 風(fēng)險(xiǎn)管理指南(雷澤佳譯-2024)
- 醫(yī)學(xué)人體美學(xué)的測(cè)量和評(píng)估
- 2024年湖南生物機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案解析
- FZT 51006-2012 膜級(jí)聚己內(nèi)酰胺切片
- 2024年公安部直屬事業(yè)單位招聘筆試參考題庫(kù)附帶答案詳解
- 蘇教版五年級(jí)上冊(cè)數(shù)學(xué)脫式計(jì)算100題及答案
- 2024年全國(guó)初中數(shù)學(xué)聯(lián)賽試題及答案(修正版)
- 采編系統(tǒng)操作手冊(cè)
- 豆制品店鋪策劃方案
- NB-T 47013.15-2021 承壓設(shè)備無(wú)損檢測(cè) 第15部分:相控陣超聲檢測(cè)
評(píng)論
0/150
提交評(píng)論