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 }
时间: 2024-08-09 10:38:03

Windows下对硬件端口的操作---WinIo库的使用的相关文章

BCB直接访问硬件端口和物理内存 - WinIO的应用

(读硬盘参数和主板BIOS信息, 支持 Win9x/NT/2k/XP/2003) 关于直接访问端口, 有很多网站很多文章都讨论过, 但总找不到非常理想的办法.我这里用的是 Yariv Kaplan 的 WinIo 2.0.虽然 WinIO 也有缺陷, 但是是我用过的当中最好的了.WinIO 是免费的, 并且是开放源代码的, 可以直接到他的主页下载, 也可以在这里下载.Yariv Kaplan 的主页: http://www.internals.com/ WinIO 的使用非常简单, 在程序的开始

转:windows 下 netsh 实现 端口映射(端口转发)

-----haproxy主要用于负载,如果只是负载一个,那就成为端口映射了,但是毕竟是linux下面的程序. -----windows下也有一个小工具:portforward.exe,图形界面容易操作,个人平常使用可以,但是也没有办法实现与程序交互. 经过在网上搜索,发现windows系统,包括xp  2003,2008等,netsh工具都自带portproxy功能.目前只支持tcp协议的端口转发,前提需要作为portproxy的主机需要安装IPV6,安装可以不启用IPV6. A.配置方法 假定

windows下关闭指定端口服务,解决tomcat端口占用问题

http://blog.aizhet.com/Server/640.html 在windows下做java EE的开发时:搭建 Eclipse+tomcat的java web开发环境:在应用之中经常遇到 tomcat在重新启动服务时,端口占用问题:导致无法启动服务: 错误提示: Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The server ma

Windows下MemCache多端口安装配置

Windows下MemCache环境安装配置的文章很多,但大部分都是用的默认端口11211,如何修改默认端口.如何在一台服务器上配置多个MemCache端口?这正式本文要解决的问题. 1.从微软官网下载rktools.exe (安装只为得到两个exe程序,可以先检查步骤2中的程序文件是否存在.如果不存在,也可以从其它服务器上复制相应的文件到相应目录下.可以直接跳过此步),然后进行安装.     下载地址:http://www.microsoft.com/downloads/details.asp

在windows下配置对github的操作--基本操作

一.下载安装 git for widows软件 git for widows 是专门用来在windows下操作 github的软件,提供bash(命令行) 和 gui两种方式. 在bash下,其实就是类似操作一个linux系统,类似于Cygwin软件. 下载地址是 https://git-for-windows.github.io/ ,下载后直接安装后即可. 二.创建ssh公钥 打开 git bash,可以在windos资源管理器中的任何目录下,右键点击,在弹出的菜单选择"Git Bash He

linux和windows下如何知道端口是被那个程序监听占用?

背景 这个问题对运维人员来说很基础,而且此题几乎是技术面试当中的常见题,故而单独列出. linux下 方法一: netstat -lntp | grep -v grep | grep ":3306" | awk -F"/" '{print $2}' 方法二: lsof -i:3306 | grep -v grep | grep "LISTEN" | awk -F[:\(] '{print $2}' windows下 1. 先获取端口的Pid值 n

windows下查找指定端口被哪个程序占用

在Windows环境下,用netstat命令查看某个端口号是否占用,为哪个进程所占用. eg.查看端口号为61078被哪个程序占用 1.查看端口号为61079被哪个PID所占用:Netstat –ano|findstr "<端口号>" 从结果中可以找到端口61078被PID为5576的进程占用 2.通过该PID查找对应的进程名称 从结果中可以判断PID为5576的进程名为YoukuMediaCenter.exe 3.通过用任务管理器查看找到该进程的安装目录

windows下如何查看端口占用情况?

开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选"查看"-"选择列" 经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口,很多人都比较头疼,下面就介绍一种非常简单的方法,希望对大家有用 假如我们需要确定谁占用了我们的9050端口 1.Windows平台 在windows命令行窗口下执

windows下限制Redis端口只能由本机访问

在使用redis的时候,我只想要本机能够访问,这时可通过防火墙会阻止外界的访问 1.找到防火墙,选择高级设置2.点击"入站规则",再点击"新建规则" 3.点击"端口"及设置端口号 4.下一步选择"阻止链接" 5.然后下一步选择勾选"公用"后,下一步填写下名称即可完成 这样就应该配置成功了,最后在入站规则列表中可以看到!