999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

VC 2010下WinIo 3.0直接訪問I/O端口

2015-06-29 02:06:51付笑宇張線媚
科技資訊 2015年13期

付笑宇 張線媚

摘 要:WinIo 3.0軟件包只提供了在C#使用WinIo的用例,且沒有提供WinIo.lib文件,使得VC 2010下無法直接使用WinIo。在VC 2010下對WinIo 3.0的源碼重新進行編譯生成WinIo.lib,修改WinIo.h文件后VC 2010下即可直接使用WinIo。給出了一個應用樣例,實驗結果表明該方法安全、簡潔、高效。

關鍵詞:內核態 WDF 驅動程序 I/O端口

中圖分類號:TP311 文獻標志碼:A 文章編號:1672-3791(2015)05(a)-0020-02

在電網實時測控系統研發過程中,需要使用in和out指令對測控單元的端口直接進行讀寫,但X86CPU的硬件保護機制將I/O指令指定為特權指令,禁止用戶態的應用程序訪問I/O端口。用戶態的應用程序只能通過運行于核心態的設備驅動程序提供的API間接地訪問I/O端口,實時性較差。

Windows操作系統為用戶提供了WDM (Windows Driver Model)[1]架構,用于編寫設備驅動程序。WDM架構異常復雜,要求開發人員對Windows系統內部的管理機制非常熟悉,有豐富的系統級應用開發的經驗,驅動程序的調試相對困難,其安全性與效率無法保障。

Yariv Kaplan在2010年發布開源軟件WinIo 3.0[2],它采用了非文檔化的Windows API(native API)和其它一些底層編程技巧繞過Windows安全保護機制,Windows下的應用程序程序可直接對I/O端口進行操作、

1 WinIo 3.0簡介

WinIo 3.0支持32位和64位版的Windows 7/8,它提供了10個庫函數,用于對I/O端口和內存物理存儲單元的直接讀寫。WinIo軟件包由WinIo.sys、winio_nt.h、Winio.h、WinIo.dll、WinIo.lib(未提供,需要用戶在VC2010下生成)等5個核心文件組成。與I/O端口操作相關的4個函數如下:

(1)WinIo庫函數初始化。

WINIO_API bool -stdcall InitializeWinIo();

(2)卸載WinIo庫函數。

WINIO_API void -stdcall ShutdownWinIo();

(3)I/O端口讀操作函數。

WINIO_API bool _stdcall GetPortVal(WORD wPortAddr,PDWORD pdwPortVal,BYTE bSize);

參數wPortAddr為端口地址,16位整型變量或常量;參數pdwPortVal為指向一存放讀取端口內容的32位整型變量指針;參數bSize為實際讀取的字節數,8位整型變量或常量,取值范圍為1、2或4,表示讀操作的對象為8位、16位或32位端口。

(4)I/O端口寫操作函數。

WINIO_API bool _stdcall SetPortVal(WORD wPortAddr,DWORD dwPortVal, BYTE bSize);

參數wPortAddr為端口地址,16位位整型變量或常量;參數dwPortVal為要寫入端口的32位整型變量或常量;參數bSize為實際寫出的字節數,取值范圍為1、2或4,表示寫操作的對象為8位、16位或32位端口。

2 VC 2010下WinIo 3.0的應用

2.1 VC 2010下WinIo.lib的生成

WinIo 3.0軟件包的Source文件夾下包含了WinIo的源文件及其所需的資源,其下的DLL文件夾為VC 2010的WinIo項目文件夾。生成WinIo.lib文件的步驟如下。

(1)雙擊“WinIo.sln”啟動WinIo項目。

(2)在VC 2010 IDE下打開“生成”菜單,單擊“生成WinIo”。

生成的WinIo.lib文件它存放于“.\Suorce\DLL\Debug”文件夾。注意:VC 2010學習版不能生成WinIo.lib文件。

2.2 VC 2010下WinIo應用環境配置

(1)創建一個Win32控制臺應用項目。

啟動VC 2010,創建一個“Win32控制臺應用程序”的WinIoDemo項目,在VC2010 IDE下打開“生成”菜單,單擊“生成WinIoDemo”。

(2)復制WinIo核心文件到制定的文件夾。

將WinIo 3.0軟件包的Source文件夾下的winio_nt.h、Winio.h與WinIo.lib復制到WinIoDemo項目文件夾下,WinIo.sys與WinIo.dll復制到WinIoDemo項目文件夾下的Debug文件夾。

(3)修改Winio.h文件。

將Winio.h中的“#include"..\drv\winio_nt.h"”,修改為“#include "winio_nt.h"”;

(4)配置鏈接器附加依賴項。

在VC 2010 IDE下打開“項目”菜單,單擊“屬性”,打開項目屬性頁對話框,打開“配置屬性”目錄樹,選擇“鏈接器”下的“輸入”子項,在“附加依賴項”中添加“WinIo.lib”,如圖1所示。WinIo應用環境配置完成,用戶可以編寫自己的源代碼進行調試。

2.3 CMOS RAM讀寫實例

PC機的主板上集成有CMOS實時時鐘,為操作系統提供時間信息:年、月、日與時、分、秒。它附有128或256個字節的RAM,用于存放時間與硬盤、內存、顯示卡等最基本的硬件配置信息。操作系統啟動時,從CMOS實時時鐘中讀取時間信息作為系統的基準時間。系統斷電后由后備的鋰電池供電,以保障信息不丟失。

PC機為CMOS實時時鐘分配了70H和71H兩個8端口,用于訪問CMOS RAM,在進行讀寫操作時,需要先向70H端口寫入CMOS RAM單元的地址,然后通過71H端口進行讀寫操作。

CMOS RAM的0、2、4單元分別存放秒、分、小時信息,7、8、9單元依次存放日、月、年信息,這些數據均采用壓縮的BCD碼表示。下面的代碼是一個完整的利用WinIo實現對I/O端口直接進行讀寫操作的樣例,它先讀取CMOS RAM的9號單元的年份信息并顯示,然后再向9號單元寫入新的年份信息。重新啟動PC后,Windows系統則采用新的年份。該樣例源代碼在32位版的Windows 7/8操作系統平臺上,使用VC 2010調試通過。

#include "stdafx.h"

#include "stdio.h"

#include "conio.h"

#include

#include "winio.h"

int _tmain(int argc, _TCHAR* argv[])

{

DWORD dwPortVal;

bool bResult;

bResult = InitializeWinIo();

if (bResult)

{

// write CMOS ram addr=9

SetPortVal(0x70, 9, 1);

// read CMOS ram addr=9,year,BCD code

GetPortVal(0x71, &dwPortVal, 1);

printf("Current Year:%4x\n",dwPortVal);

printf("Enter new year:");

scanf("%x",&dwPortVal);

SetPortVal(0x70, 9, 1);

SetPortVal(0x71,dwPortVal , 1); //write new year

SetPortVal(0x70, 9, 1);

GetPortVal(0x71, &dwPortVal, 1); //read new year

printf(" new Year:%4x\n",dwPortVal);

// When you're done using WinIo, call ShutdownWinIo

ShutdownWinIo();

}

else

{

printf("Error during initialization of WinIo.\n");

exit(1);

}

printf("\nPress anyke to continue …");

_getch();

return 0;

}

3 結語

該文給出了一種在VC 2010下使用WinIo 3.0的簡潔方法,已有的采用使用WinIo 2.0開發的應用系統,無需修改源代碼,在VC 2010下重新編譯后即可遷移到安全性更好的WinIo 3.0平臺。在實時測控系統的開發中,使用WinIo 3.0,省去了設備驅動程序的開發環節,可以極大的縮短系統的開發周期,降低開發成本,系統的安全性和可靠性也得到了保障。

參考文獻

[1] 邰銘 ,武安河,于洪濤.Windows 2000/XP WDM設備驅動程序開發[M].北京:電子工業出版社,2003.

[2] Yariv Kaplan.WinIo[DB/OL].http://www.internals.com,2014-11-02.

[3] 孫穎.隨機波浪數據采集與處理技術的研究[D].天津:天津理工大學,2014.

[4] 萬振凱,郭建民.大型自動化三維編織復合材料編織機的開發[J].紡織導報,2013(9):64-66,68.

[5] 袁軍,譚永東,任俊.利用WinIo實現并口數據通信[J].計算機與現代化,2009(8):49-53.

[6] 馮曉偉,李正生,吳寧.XP系統下CB對ISA總線的讀寫方法及應用研究[J].自動化與儀器儀表,2011(5):17-19.

[7] 王元強,朱為.一種通過PCI總線配置FPGA的設計方法[J].現代電子技術,2010(2):90-92,95.

主站蜘蛛池模板: 国产美女一级毛片| 91无码视频在线观看| 国产精品hd在线播放| 亚洲无码视频图片| 精品国产成人av免费| 日韩毛片在线视频| 风韵丰满熟妇啪啪区老熟熟女| 国产一区二区福利| 欧美中出一区二区| 精品福利视频导航| 国产成人亚洲精品无码电影| 不卡无码h在线观看| 欧美高清三区| 97视频免费在线观看| 欧美日韩专区| av在线无码浏览| 精品国产一区91在线| 四虎精品国产永久在线观看| 亚洲国产看片基地久久1024| 欧美成人精品一级在线观看| 亚洲无码91视频| 午夜日b视频| 永久在线播放| 欧美成人精品在线| 美女被躁出白浆视频播放| 日韩无码真实干出血视频| 中文字幕亚洲电影| 手机精品福利在线观看| 青青草原国产av福利网站| 日韩第一页在线| 国产男女免费视频| 欧美亚洲一二三区| 久久久久久久97| 午夜三级在线| 亚洲精品午夜天堂网页| 精品福利一区二区免费视频| 国产精品污视频| 国产黄视频网站| 老司国产精品视频91| 99久久精品国产麻豆婷婷| 白丝美女办公室高潮喷水视频| 高清无码不卡视频| 99精品国产高清一区二区| 亚洲一区无码在线| 亚洲va视频| 无码人妻热线精品视频| 日本久久网站| 久久人妻xunleige无码| 又粗又硬又大又爽免费视频播放| 亚洲精品你懂的| 欧美日本二区| 欧美亚洲国产精品久久蜜芽| 婷婷色中文| 日韩123欧美字幕| 不卡午夜视频| 欧美日韩国产在线人成app| 精品国产自| 青青操视频免费观看| 国产成人亚洲精品无码电影| 国产小视频a在线观看| 91亚洲视频下载| 干中文字幕| 欧美成人综合在线| 经典三级久久| 欧美一区福利| 国产青榴视频| 国产精品成人一区二区| 婷婷色一区二区三区| 国内精品久久人妻无码大片高| 57pao国产成视频免费播放| 欧美在线国产| 国产尤物在线播放| 久久精品嫩草研究院| 亚洲天天更新| 精品撒尿视频一区二区三区| 亚洲欧美激情小说另类| 九九视频免费看| 亚洲第一区在线| 国产高清不卡| 久久精品无码一区二区日韩免费| 色综合激情网| 国产尤物视频在线|