winIO介绍
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.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放到程序根目录
winIO介绍的更多相关文章
- 利用winIO3.0进行windows10 64bit端口读取
一.winIO介绍 WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作.通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系统的保 ...
- C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码)
原文:C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码) 自动填密码大家可能都不莫生,最有名的应该是 按键精灵 只要是一个可以输入的地方都可以能过按键精灵来完成输入.我今 ...
- WinIo驱动级键盘模拟编程
转自:http://blog.sina.com.cn/s/blog_455d7a320100vr37.html 前天无聊,翻翻自己的兴趣项目文件夹,发现了这个放下很久的项目!那是大三时候的事了.当时是 ...
- 使用WinIO库实现保护模式下的IO和内存读写
问题已解决: 原因是函数的调用方式与WinIO中不一致,使用的时候漏掉了__stdcall. 函数原定义为: 在实际的GPIO读写中遇到以下问题: SetPortVal可正常写入,但是GetPortV ...
- BCB直接访问硬件端口和物理内存 - WinIO的应用
BCB直接访问硬件端口和物理内存 - WinIO的应用 (读硬盘参数和主板BIOS信息, 支持 Win9x/NT/2k/XP/2003) 关于直接访问端口, 有很多网站很多文章都讨论过, 但总找不到非 ...
- CSS3 background-image背景图片相关介绍
这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- Windows Server 2012 NIC Teaming介绍及注意事项
Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...
- Linux下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
- JavaScript var关键字、变量的状态、异常处理、命名规范等介绍
本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...
随机推荐
- 使用@RequestBody注解接收的实体类中的某些参数为null
原因 postman调试接口 为null的参数命名不符合"驼峰法",类似实体类A的属性 cEnterpriseId ,这种命名是不规范的 和lombook的@Data注解有关 用p ...
- webpackHotMiddleware改造成koa支持的中间件
const stream = require('stream'); const webpackHot = require('webpack-hot-middleware'); const PassTh ...
- 互联网公司IT系统架构进化之路
一日,与一高手在茶馆聊天.他问道:在鞋厂剑派这两年,可习的什么高深的剑法?我不由一愣,细细想来,这两年每日练习的都是简单的劈砍动作和一些简练的套路.并没有去练什么高深的剑法.不过鞋厂剑派在江湖上也算小 ...
- 摩托罗拉IP PBX9000配置指南
400通话时,按数字键进行选择无效 打开IPB通信板界面,SIP终端参数--应用设置--点击RFC2833数值,默认禁用变更为101,(如有多个勾选批量,填写批量数值)--提交--保存修改 未完待续
- RTT笔记-分析自动初始化机制转
首先全局搜索一个任意的自启动宏,便能找到在rtdef.h中由如下定义 1 #define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1") 2 ...
- K8S informer机制
一.informer介绍 Kubernetes基于声明式API的设计理念,所谓声明式API,即告诉Kubernetes Controller资源对象的期望状态,这样为Kubernetes在事件通知后, ...
- golang常见编程错误集
一.append是深拷贝, func main() { a := []int{7, 8, 9} fmt.Printf("%+v\n", a) ap(a) fmt.Println(& ...
- 2022-3-18内部群每日三题-清辉PMP
1.在评估项目活动现状的会议中,团队发现存在一些影响可交付成果的风险.项目经理应该怎么做? A.跟踪已发现的风险,识别和分析新风险,并评估整个项目的风险过程有效性 B.记录风险管理信息用于经验教训 C ...
- jQuery 获取鼠标点击的元素ID
$(function(){ $(document).click(function(e) { // 在页面任意位置点击而触发此事件 var v_id = $(e.target).attr('id'); ...
- uniapp滚动组件scroll-view
//scroll-x="true" || scroll-y="true" <view class="scroll-view"> ...