利用winIO3.0进行windows10 64bit端口读取
一、winIO介绍
WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作。通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系统的保护机制。
WinIo可以到官方网站:http://www.internals.com/utilities_main.htm去下载,里面包含了帮助文档和源码。
因为需要加载驱动,程序要以管理员权限运行,已经在win10 64验证成功
为了省去动态加载DLL,再动态获取函数地址去调用的麻烦,用官方的DLL源码,编译生成WinIo.lib
现在介绍64bit平台32位应用程序IO操作
二、WinIo64.sys签名
官方有说到:64位版本的Windows只加载设备驱动程序,这些驱动程序由一个公共CA签发的代码签名证书签署,如Verisign、Thawte等。WinIo64 除非获得了代码签名证书,否则系统不能部署在生产机器上。
1.开启测试模式
- Open an elevated command window by right-clicking the icon and clicking "Run as Administrator".(管理员模式运行CMD)
- Type the following command to enable test-signing:(输入以下命令开启测试模式)
- Reboot the machine (重启)
从以上可知,winIO对64bit平台支持并不好。必须要在测试模式下才能用。现在都win10了还没改善,显得特别鸡肋。对端口的读取可以尝试内联汇编。
2.安装winIO64.sys
简单点就是开启测试模式,然后安装WinIo64.sys的测试签名
1.打开 WinIO64.sys的属性框,翻到“数字签名”选项卡,点击“详细信息”
2.在新出来的对话框中点击“查看证书”
3.在又新出来的对话框中点击“安装证书”
4.点击“下一步”,然后选择“将所有的证书放入下列存储”
5.点击浏览,选择“受信任的根证书发布机构”三、编译winIO.lib
1.由于winIO源代码用到了_inp等函数,而这些函数在VS2015后又不支持了,所以用VS2013以下去编译
2.得到WinIo32.dll,WinIo32.lib,WinIo64.dll,WinIo64.lib
如果是64bit平台32应用程序,就用WinIo32.dll,WinIo32.lib,WinIo64.sys3.提取头文件
C:\Users\pc\Desktop\WinIo\Source\Dll\winio.hC:\Users\pc\Desktop\WinIo\Source\Drv\winio_nt.h- C:\Users\pc\Desktop\WinIo\Source\Dll\winio.h
- #ifndef WINIO_H
- #define WINIO_H
- <span style="background-color: rgb(255, 255, 255);">//#include "..\drv\winio_nt.h"//修改如下,然后把winio_nt.h跟winio.h放到一起
- #include "winio_nt.h"</span>
- #ifndef WINIO_DLL
- #define WINIO_API _declspec(dllimport)
- #else
- #define WINIO_API
- #endif
- extern "C"
- {
- WINIO_API bool _stdcall InitializeWinIo();
- WINIO_API void _stdcall ShutdownWinIo();
- WINIO_API PBYTE _stdcall MapPhysToLin(tagPhysStruct &PhysStruct);
- WINIO_API bool _stdcall UnmapPhysicalMemory(tagPhysStruct &PhysStruct);
- WINIO_API bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal);
- WINIO_API bool _stdcall SetPhysLong(PBYTE pbPhysAddr, DWORD dwPhysVal);
- WINIO_API bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
- WINIO_API bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
- WINIO_API bool _stdcall InstallWinIoDriver(PWSTR pszWinIoDriverPath, bool IsDemandLoaded = false);
- WINIO_API bool _stdcall RemoveWinIoDriver();
- }
- extern HANDLE hDriver;
- extern bool IsWinIoInitialized;
- extern bool g_Is64BitOS;
- bool _stdcall StartWinIoDriver();
- bool _stdcall StopWinIoDriver();
- #endif
四、案例
1.源代码,管理员模式
WinIo32.dll,WinIo32.lib,winio.h,winio_nt.h放到编译根目录- #include "stdafx.h"
- #include <windows.h>
- #include "winio.h" //winio头文件
- #pragma comment(lib,"winio32.lib") //包含winio库
- void main(void)
- {
- unsigned short BASE = 0x71;
- int iPort = 2;
- // 初始化WinIo
- if (!InitializeWinIo())
- {
- printf( "Error In InitializeWinIo!\n");
- exit(1);
- }
- int DI_data;
- DWORD *p=new DWORD;
- DI_data = GetPortVal(BASE+iPort,p,4);
- printf("return value= %d\n", DI_data);
- printf("receives the value obtained from the port= %x\n", *p);
- ShutdownWinIo(); //关闭WinIo
}
2.运行
WinIo32.dll,WinIo64.sys放到程序根目录现在提供编译好的lib库和案例:http://download.csdn.net/detail/greless/9856752
http://blog.csdn.net/greless/article/details/72821876
利用winIO3.0进行windows10 64bit端口读取的更多相关文章
- Java利用内存映射文件实现按行读取文件
我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ...
- x64系统下,InpOutx64有数字签名而WinIO3.0无数字签名
参考文档 http://www.highrez.co.uk/Downloads/InpOut32/ //可以下载InpOutx64的驱动程序及DLL,还有驱动主板硬件IO的例程 https://www ...
- centos 7.0防火墙导致vagrant端口映射失败
在vagrant上部署了centos7.0后,Vagrantfile端口转发设置后,宿主机访问客户机站点还是无法访问,问题出在:centos7.0以上版本默认会安装firewalld防火墙, fire ...
- 利用 netsh 给 mysql 开启多端口监听
利用 netsh 给 mysql 开启多端口监听 标题党,实际并不是真的多端口监听,只是端口转发而已. 由于某种特殊原因需要 mysql 服务器多个端口监听. mysql 服务器本身是不支持的,但可以 ...
- mysql timestamp为0值时,python读取后的对象为None
MySQL数据表中,如果timestamp类型的字段,值为0, python从数据库读取数据后,得到对象是什么类型,是否为None呢? 下面来测试下. 创建数据表 首先创建数据表,其中字段pr_rul ...
- Windows10 + VS2015 环境下对gdal2.0.1进行64bit编译小结
这是官方给出的编译指导,但是在实践过程中有几点仍然需要特别注意. Tip 1:不要使用默认的"VS开发人员命令提示"工具,使用该工具会遭遇如下的错误: 正在创建库 gdal_i.l ...
- (九)串行口方式0 拓展并行输入端口 74LS165 芯片
74LS165芯片讲解: 外接一个同步移位寄存器 74LS165芯片,拓展一个 8 位 并行输入端口的电路, 可将接在74LS165芯片的8个开关 S0——S7 的状态 通过 串行口方式 0 读到 单 ...
- 利用poi包装一个简单的Excel读取器.一(适配一个Reader并提供readLine方法)
通常,读文本我们会使用BufferedReader,它装饰或者说管理了InputStreamReader,同时提供readLine()简化了我们对文本行的读取.就像从流水线上获取产品一样,每当取完一件 ...
- svc6 控制台程序利用SoapToolkit3.0调用WebService
1. 首先要安装SoapToolkit3.0安装包并安装(我的安装目录为:C:\Program Files\Common Files) 2. 新建vc控制台程序(空项目),项目名称:WinConsol ...
随机推荐
- Android自己主动检測版本号及自己主动升级
步骤: 1.检測当前版本号的信息AndroidManifest.xml-->manifest-->android:versionName. 2.从server获取版本号号(版本号号存在于x ...
- React Native 开发环境安装和配置使用报错: -bash: react-native: command not found
[React Native 开发环境安装和配置:-bash: react-native: command not found 报错: 前提是安装homebrew,node.js ,npm ,watc ...
- 一小时内破解16位强password
password能够用来保护你的金融交易.你的社交网络站点,和其它貌似安全的在线站点的主机.人们常常说:"不要把字典里的单词用来做password.它们超级不安全". 但是,要是黑 ...
- js如何实现点击显示和隐藏表格
js如何实现点击显示和隐藏表格 一.总结 一句话总结: 1.给table或者table里面的元素添加点击事件, 2.然后判断当前表格的数据显示或者隐藏, 3.然后通过display属性显示(非none ...
- java-线程-生产者-消费者
概述 在Java中有四种方法支持同步,其中前三个是同步方法,一个是管道方法. wait() / notify()方法 await() / signal()方法 BlockingQueue阻塞队列方法 ...
- 【bzoj2733】永无乡(无旋treap启发式合并 + 并查集)
传送门 题目分析 起初每个岛都是一个平衡树, 并查集的祖先都是自己.合并两岛时,pri较小的祖先会被作为合并后的祖先, 而两颗平衡树采用启发式合并.查询k值就是基本操作. code #include& ...
- Android app 第三方微信支付接入详解
微信支付做了好几遍了,都没有出现什么棘手的问题,下面一一为大家分享一下,欢迎吐槽. 还是老样子,接入微信的支付要第一步添加微信支付官方的包libammsdk.jar 首先就处理略坑的一个问题,app应 ...
- linux的开机启动过程:
简单视图 按下电源开关 开机自检(BIOS)弹笔记本logo的时候,检查cpu 硬盘 这些硬件问题 MBR引导 一般是通过硬盘启动系统 GRUB的菜单 黑底白字有个倒数计时 可以选择内核 yum命令可 ...
- 五笔字根--good
https://gss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/4b90f603738da977b1b5ce57b251f8198 ...
- Java获取URL对应的资源
Java获取URL对应的资源 认识IP.认识URL是进行网络编程的第一步.java.net.URL提供了丰富的URL构建方式,并可以通过java.net.URL来获取资源. 一.认识URL ...