一、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:(输入以下命令开启测试模式)
bcdedit.exe /set TESTSIGNING ON
 
    • 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.sys

      3.提取头文件

      C:\Users\pc\Desktop\WinIo\Source\Dll\winio.h
      C:\Users\pc\Desktop\WinIo\Source\Drv\winio_nt.h
      1. C:\Users\pc\Desktop\WinIo\Source\Dll\winio.h
      2. #ifndef WINIO_H
      3. #define WINIO_H
      4. <span style="background-color: rgb(255, 255, 255);">//#include "..\drv\winio_nt.h"//修改如下,然后把winio_nt.h跟winio.h放到一起
      5. #include "winio_nt.h"</span>
      6. #ifndef WINIO_DLL
      7. #define WINIO_API _declspec(dllimport)
      8. #else
      9. #define WINIO_API
      10. #endif
      11. extern "C"
      12. {
      13. WINIO_API bool _stdcall InitializeWinIo();
      14. WINIO_API void _stdcall ShutdownWinIo();
      15. WINIO_API PBYTE _stdcall MapPhysToLin(tagPhysStruct &PhysStruct);
      16. WINIO_API bool _stdcall UnmapPhysicalMemory(tagPhysStruct &PhysStruct);
      17. WINIO_API bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal);
      18. WINIO_API bool _stdcall SetPhysLong(PBYTE pbPhysAddr, DWORD dwPhysVal);
      19. WINIO_API bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
      20. WINIO_API bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
      21. WINIO_API bool _stdcall InstallWinIoDriver(PWSTR pszWinIoDriverPath, bool IsDemandLoaded = false);
      22. WINIO_API bool _stdcall RemoveWinIoDriver();
      23. }
      24. extern HANDLE hDriver;
      25. extern bool IsWinIoInitialized;
      26. extern bool g_Is64BitOS;
      27. bool _stdcall StartWinIoDriver();
      28. bool _stdcall StopWinIoDriver();
      29. #endif

      四、案例

      1.源代码,管理员模式

      WinIo32.dll,WinIo32.lib,winio.h,winio_nt.h放到编译根目录
      1. #include "stdafx.h"
      2. #include <windows.h>
      3. #include "winio.h"               //winio头文件
      4. #pragma comment(lib,"winio32.lib")  //包含winio库
      5. void main(void)
      6. {
      7. unsigned short BASE = 0x71;
      8. int iPort = 2;
      9. // 初始化WinIo
      10. if (!InitializeWinIo())
      11. {
      12. printf( "Error In InitializeWinIo!\n");
      13. exit(1);
      14. }
      15. int DI_data;
      16. DWORD *p=new DWORD;
      17. DI_data = GetPortVal(BASE+iPort,p,4);
      18. printf("return value= %d\n", DI_data);
      19. printf("receives the value obtained from the port= %x\n", *p);
      20. 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端口读取的更多相关文章

  1. Java利用内存映射文件实现按行读取文件

    我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ...

  2. x64系统下,InpOutx64有数字签名而WinIO3.0无数字签名

    参考文档 http://www.highrez.co.uk/Downloads/InpOut32/ //可以下载InpOutx64的驱动程序及DLL,还有驱动主板硬件IO的例程 https://www ...

  3. centos 7.0防火墙导致vagrant端口映射失败

    在vagrant上部署了centos7.0后,Vagrantfile端口转发设置后,宿主机访问客户机站点还是无法访问,问题出在:centos7.0以上版本默认会安装firewalld防火墙, fire ...

  4. 利用 netsh 给 mysql 开启多端口监听

    利用 netsh 给 mysql 开启多端口监听 标题党,实际并不是真的多端口监听,只是端口转发而已. 由于某种特殊原因需要 mysql 服务器多个端口监听. mysql 服务器本身是不支持的,但可以 ...

  5. mysql timestamp为0值时,python读取后的对象为None

    MySQL数据表中,如果timestamp类型的字段,值为0, python从数据库读取数据后,得到对象是什么类型,是否为None呢? 下面来测试下. 创建数据表 首先创建数据表,其中字段pr_rul ...

  6. Windows10 + VS2015 环境下对gdal2.0.1进行64bit编译小结

    这是官方给出的编译指导,但是在实践过程中有几点仍然需要特别注意. Tip 1:不要使用默认的"VS开发人员命令提示"工具,使用该工具会遭遇如下的错误: 正在创建库 gdal_i.l ...

  7. (九)串行口方式0 拓展并行输入端口 74LS165 芯片

    74LS165芯片讲解: 外接一个同步移位寄存器 74LS165芯片,拓展一个 8 位 并行输入端口的电路, 可将接在74LS165芯片的8个开关 S0——S7 的状态 通过 串行口方式 0 读到 单 ...

  8. 利用poi包装一个简单的Excel读取器.一(适配一个Reader并提供readLine方法)

    通常,读文本我们会使用BufferedReader,它装饰或者说管理了InputStreamReader,同时提供readLine()简化了我们对文本行的读取.就像从流水线上获取产品一样,每当取完一件 ...

  9. svc6 控制台程序利用SoapToolkit3.0调用WebService

    1. 首先要安装SoapToolkit3.0安装包并安装(我的安装目录为:C:\Program Files\Common Files) 2. 新建vc控制台程序(空项目),项目名称:WinConsol ...

随机推荐

  1. Qt on Android: http下载与Json解析

    百度提供有查询 ip 归属地的开放接口,当你在搜索框中输入一个 ip 地址进行搜索,就会打开由 ip138 提供的百度框应用,你能够在框内直接输入 ip 地址查询.我查看了页面请求,提取出查询 ip ...

  2. http500:服务器内部错误案例详解(服务器代码语法错误或者逻辑错误)

    http500:服务器内部错误案例详解(服务器代码语法错误或者逻辑错误) 一.总结 服务器内部错误可能是服务器中代码运行的时候的语法错误或者逻辑错误 二.http500:服务器内部错误案例详解 只是一 ...

  3. Android 带文字的图片分享

    这里也记录下上下文,因为做了一个失物招领的App,当有人上交了失物之后,可以将这个消息分享出去,这个消息内容有物品的信息和图片,而微信SDK始终无法做到,就想着把物品信息嵌入到图片中分享出去,先放一个 ...

  4. asp.net中,&lt;%#%&gt;,&lt;%=%&gt;和&lt;%%&gt;各自是什么意思,有什么差别

    在asp.net中经常出现包括这样的形式<%%>的html代码,总的来说包括以下这样几种格式: 一. <%%> 这样的格式实际上就是和asp的使用方法一样的,仅仅是asp中里面 ...

  5. thinkphp5多级控制器是什么?怎么使用?

    thinkphp5多级控制器是什么?怎么使用? 一.总结 1.多级控制器是让控制器的级数变成多级,也就是controller目录下可以新建其它目录. 2.使用的话注意目录下的控制的的命名空间(加上目录 ...

  6. 【hdu 1846】Brave Game

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  7. 76个值得你注意的erlang编程习惯

    http://www.tuicool.com/articles/ZNzuyu 前言 学习Erlang的时候在书的留白处随手记录了一些东西,还有一些记录在了demo的注释里面,今天抽时间整理出来了一部分 ...

  8. NOIP模拟 - 树

    题目描述 给出一张n个点,m条边的无向图,摧毁每条边都需要一定的体力,并且花费的体力值各不相同,给定图中两个点x,y(x≠y),每当(x,y)之间存在路径,就需要不断摧毁当前图中花费体力最少的一条边, ...

  9. Qt的paint函数重写,以及QPaint给一条线绘制箭头

    直接代码: QPainter *painter; static const double Pi = 3.14159265358979323846264338327950288419717; stati ...

  10. 关于java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccessible

    <span style="font-size:18px;"> java.lang.NoSuchMethodError: org.springframework.util ...