Windows下對硬件端口的操作---WinIo庫的使用


本文參考了網上的一篇文章“VC 2010下WinIo 3.0直接訪問I/O端口”;

由於Windows的內核保護機制,我們無法直接對通過內核操作硬件,通過使用WinIo可以繞過這一限制,實現對Windows硬件端口或者地址的直接操作。實際操作中發現WinIo庫既可以對普通的I/O端口進行操作,也可以對GPIO進行操作。

關於WinIO的相關內容網絡上的參考資料很多,這里只記錄我自己遇到的問題(使用中需要注意的點):

1.64位操作系統下需要將WinIo.sys驅動文件添加數字簽名。

2.注意WinIo.sys和WinIo.dll這兩個文件的存放路徑,如果路徑不對,會導致初始化失敗。

3.下載下來的WinIo文件中有一個DLL文件夾,如果發現初始化失敗,我們可以打斷點跟蹤到dll里面去查看是哪里出了問題。例如,我在win8.1下使用的時候發現初始化失敗,跟進去發現是OpenSCManager()函數返回了false,則是由於win8.1的用戶權限設置導致的,通過查找響應的注冊表位置即可初始化成功(參考網上的解決辦法)。

 4.使用WinIo的函數之前我們需要知道具體想要操作的是哪個端口,或者地址位置才行。

5.需要先將將DLL根據響應的版本進行編譯(32位/64位)。

6.操作端口需要調用GetPortVal()/SetPortVal()函數,如果是操作具體的物理地址則需要調用GetPhyLong()/SetPhyLong()函數

下面是一個簡單是實例

 1 // WinIoDemo.cpp : 定義控制台應用程序的入口點。
4 #include "stdafx.h" 5 #include <Windows.h> 6 #include <iostream> 7 #include "winio.h" 8 #include <conio.h> 9 #include "GPIO_DLL.h" 10 using namespace std; 11 12 #define GPIO_PORT 0xFED10000 //假定的某個特定的物地址 17 int _tmain(int argc, _TCHAR* argv[]) 18 { 19 bool bResult; 20 21 bResult = InitializeWinIo(); 22 23 if (!bResult) 24 { 25 cout<<"error to initialize winio..."<<endl; 26 27 return -1; 28 } 29 else 30 { 32 unsigned long val;
33 unsigned long Data;
34 GetPhysLong((PBYTE)GPIO_PORT,&val);
35 printf("Current Value: %4x \n",val); 36 43 Data = val | 0x02; //對bit1進行設定 45 46 printf("Current Value: %4x \n",Data); 47 48 bool br = SetPhysLong((PBYTE)GPIO_PORT,Data); 49 66 ShutdownWinIo(); 67 } 68 printf("\nPress anykey to continue...");
69 _getch();
70 return 0; 71 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM