WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作。通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系统的保护机制。

因为需要加载驱动,程序要以管理员权限运行,已经在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放到程序根目录

         
         

winIO介绍的更多相关文章

  1. 利用winIO3.0进行windows10 64bit端口读取

    一.winIO介绍 WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作.通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系统的保 ...

  2. C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码)

    原文:C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码) 自动填密码大家可能都不莫生,最有名的应该是 按键精灵 只要是一个可以输入的地方都可以能过按键精灵来完成输入.我今 ...

  3. WinIo驱动级键盘模拟编程

    转自:http://blog.sina.com.cn/s/blog_455d7a320100vr37.html 前天无聊,翻翻自己的兴趣项目文件夹,发现了这个放下很久的项目!那是大三时候的事了.当时是 ...

  4. 使用WinIO库实现保护模式下的IO和内存读写

    问题已解决: 原因是函数的调用方式与WinIO中不一致,使用的时候漏掉了__stdcall. 函数原定义为: 在实际的GPIO读写中遇到以下问题: SetPortVal可正常写入,但是GetPortV ...

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

    BCB直接访问硬件端口和物理内存 - WinIO的应用 (读硬盘参数和主板BIOS信息, 支持 Win9x/NT/2k/XP/2003) 关于直接访问端口, 有很多网站很多文章都讨论过, 但总找不到非 ...

  6. CSS3 background-image背景图片相关介绍

    这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...

  7. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  8. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

  9. Linux下服务器端开发流程及相关工具介绍(C++)

    去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...

  10. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

随机推荐

  1. mysql表关联更新

    UPDATE enterprise_test t1, enterprise_development_relation t2 SET t1.development_area_id = t2.develo ...

  2. SED fitting

    Using the Robitaille (2017) YSO SED models https://notebook.community/hyperion-rt/paper-2017-sed-mod ...

  3. leetcode 剑指offer小结

    栈与队列 剑指 Offer 09. 用两个栈实现队列 使用两个堆栈,一个输出栈,另一个输入栈.队列入队:直接将元素压入输入栈,队列出队:如果输出栈为空,将输入栈元素压入输出栈,再将输出栈元素出栈. 查 ...

  4. 【小记】golang_map

    map 前言:map 几个操作实现有点复杂,即便之前看懂了没过多久也就忘了,这里简单做下记录.为了便于记忆,将 mapassign 的全过程以流程图的方式展示,其他省略 mapassign 在流程图中 ...

  5. egg开发系列--模板语法

    在这里列一下 nunjucks 常用的模板内容 首先需要在plugin.js 当中引入 exports.nunjucks = { enable: true, package: 'egg-view-nu ...

  6. Centos 7.5 MySql的安装和配置

    一.安装 三个步骤: wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpmyum -y ins ...

  7. python利用xlwings写入一行或一列Excel数据

    注意点:这里的sheet参数默认是已经存在的sheet表,如不存在该sheet,则使用add方法新增即可,示例: wb = xw.Book(r"C:\Users\Desktop\result ...

  8. Unity 纯C# 完成 APK从下载到 自安装

    最简单的就是用androidStudio 进行编辑,打个aar 包,在Unity中调用方法,很便捷以下内容均转载Unity论坛,Android API24版本下可用,android API 24以上版 ...

  9. 关于Windows系统TCP参数修改

    在做压测时,往往会因为TCP连接数较少,导致并发数上不去就报错,下面我们一起看看如何修改Windows的TCP参数 1.本地注册表 打开注册表快捷键:Windows+R建,输入regedit,按下键盘 ...

  10. 045_List view button

    http://www.interactiveties.com/b_execute_javascript_button.php https://developer.salesforce.com/foru ...