一個(gè)端口訪問(wèn)器的編寫(xiě)_第1頁(yè)
一個(gè)端口訪問(wèn)器的編寫(xiě)_第2頁(yè)
一個(gè)端口訪問(wèn)器的編寫(xiě)_第3頁(yè)
一個(gè)端口訪問(wèn)器的編寫(xiě)_第4頁(yè)
一個(gè)端口訪問(wèn)器的編寫(xiě)_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)器的編寫(xiě), Windows XP驅(qū)動(dòng)程序舉例,東南大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院 楊全勝,VS.NET+WIN XP DDK+DriverStudio3.2開(kāi)發(fā)環(huán)境版,本講義假設(shè)閱讀者已經(jīng)熟悉VC+.NET和VS.NET(2002)的使用。如果對(duì)Window XP驅(qū)動(dòng)程序的編寫(xiě)尚不熟悉,請(qǐng)參閱本人所編寫(xiě)的Windows XP驅(qū)動(dòng)程序編寫(xiě)方法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è)備讀寫(xiě)數(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); / 向端口寫(xiě)一個(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寫(xiě)一個(gè)字節(jié) BOOL OpenMyDevice(); / 打開(kāi)設(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é), 磁盤(pán)驅(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. 硬盤(pán)0Translate 1=Yes 0=No .x. 硬盤(pán)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è) , 硬盤(pán)類型:xxxx. 硬盤(pán)驅(qū)動(dòng)器0的類型 1111=使用19h單元 .xxxx 硬盤(pán)驅(qū)動(dòng)器1的類型 1111=使用1Ah單元, 字節(jié) x. 1=Anti-Virus 硬盤(pán)Boot區(qū)寫(xiě)保護(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,后四位高到低是顯示、鍵盤(pán)、協(xié)處理器與軟件機(jī)使能(=1), 基本內(nèi)存容量低字節(jié),單位KB, 基本內(nèi)存容量高字節(jié),單位KB, 擴(kuò)充內(nèi)存容量低字節(jié),單位KB, 擴(kuò)充內(nèi)存容量高字節(jié),單位KB, (海洋板)硬盤(pán)驅(qū)動(dòng)器0的類型, (海洋板)硬盤(pán)驅(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=鍵盤(pán)使用缺省參數(shù) 0=使用本單元值 .xx. 鍵盤(pán)延時(shí)00=0.25秒01=0.5秒10=0.75秒11=1秒 .xxxxx 鍵盤(pán)重發(fā)速率,單位cps,(海洋板)硬盤(pán)1的柱面數(shù), (海洋板)硬盤(pán)1的柱面數(shù), (海洋板)硬盤(pán)1的磁頭數(shù), (海洋板)硬盤(pán)1的扇區(qū)數(shù), (海洋板)硬盤(pán)0的柱面數(shù), (海洋板)硬盤(pán)0的柱面數(shù), (海洋板)硬盤(pán)0的磁頭數(shù), (海洋板)硬盤(pán)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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論