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. 监听 view 初始化时

    new ViewTreeObserverRegister().observe(getContentView(), new ViewTreeObserver.OnGlobalLayoutListener ...

  2. AVL tree rotate

    AVL tree single rotate /** * Rotate binary tree node with left child. * For AVL trees, this is a sin ...

  3. ABAP链接FTP把txt文件数据获取到内表

    啥都不说,直接上代码 ******* 如果无法链接FTP,可能需要往表SAPFTP_SERVERS加入IP地址和端口(21)即可 DATA:p_host TYPE char64 VALUE 'IP', ...

  4. fastapi loguru

    使用loguru记录日志 安装 pip install loguru 基本使用 那么这个库怎么来用呢?我们先用一个实例感受下: In [1]: from loguru import logger .. ...

  5. CF513F2 题解

    题意 传送门 有 \(a+b+1\) 个会动的棋子,在一个大小为 \(n\times m\) 的棋盘上,棋盘上有一些点有障碍.棋子中,有 \(a\) 个红色棋子,\(b\) 个蓝色棋子,和 \(1\) ...

  6. 前端实现HTML转PDF下载的两种方式

    原文链接:https://www.jianshu.com/p/56680ce1cc97 方式一:使用html2canvas和jspdf插件实现 该方式是通过html2canvas将HTML页面转换成图 ...

  7. vue 页面嵌入pdf文件

    1.pdf分页显示 2.没有分页

  8. mysql8.0修改密码

    把密码设置为空:UPDATE mysql.user SET authentication_string='' WHERE user='root' and host='localhost'; 查看USE ...

  9. java8 stream流的使用

    List<Paper> list = new ArrayList<>();list.add(new Paper("m",2L));list.add(new ...

  10. JAVA根据时间增加1天

    String time = "2021-12-1"; //指定时间 int day = 30;//指定增加天数 SimpleDateFormat sf = new SimpleDa ...