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. 使用@RequestBody注解接收的实体类中的某些参数为null

    原因 postman调试接口 为null的参数命名不符合"驼峰法",类似实体类A的属性 cEnterpriseId ,这种命名是不规范的 和lombook的@Data注解有关 用p ...

  2. webpackHotMiddleware改造成koa支持的中间件

    const stream = require('stream'); const webpackHot = require('webpack-hot-middleware'); const PassTh ...

  3. 互联网公司IT系统架构进化之路

    一日,与一高手在茶馆聊天.他问道:在鞋厂剑派这两年,可习的什么高深的剑法?我不由一愣,细细想来,这两年每日练习的都是简单的劈砍动作和一些简练的套路.并没有去练什么高深的剑法.不过鞋厂剑派在江湖上也算小 ...

  4. 摩托罗拉IP PBX9000配置指南

    400通话时,按数字键进行选择无效 打开IPB通信板界面,SIP终端参数--应用设置--点击RFC2833数值,默认禁用变更为101,(如有多个勾选批量,填写批量数值)--提交--保存修改 未完待续

  5. RTT笔记-分析自动初始化机制转

    首先全局搜索一个任意的自启动宏,便能找到在rtdef.h中由如下定义 1 #define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1") 2 ...

  6. K8S informer机制

    一.informer介绍 Kubernetes基于声明式API的设计理念,所谓声明式API,即告诉Kubernetes Controller资源对象的期望状态,这样为Kubernetes在事件通知后, ...

  7. golang常见编程错误集

    一.append是深拷贝, func main() { a := []int{7, 8, 9} fmt.Printf("%+v\n", a) ap(a) fmt.Println(& ...

  8. 2022-3-18内部群每日三题-清辉PMP

    1.在评估项目活动现状的会议中,团队发现存在一些影响可交付成果的风险.项目经理应该怎么做? A.跟踪已发现的风险,识别和分析新风险,并评估整个项目的风险过程有效性 B.记录风险管理信息用于经验教训 C ...

  9. jQuery 获取鼠标点击的元素ID

    $(function(){ $(document).click(function(e) { // 在页面任意位置点击而触发此事件 var v_id = $(e.target).attr('id'); ...

  10. uniapp滚动组件scroll-view

    //scroll-x="true"  || scroll-y="true" <view class="scroll-view"> ...