基于WinIO 3.0实现驱动级键盘模拟输入
基于WinIO 3.0实现驱动级键盘模拟输入
一个业务场景需要使用驱动级的键盘模拟,折腾了2天,总结一下,为后人节省时间。
限制条件:
1.需要真实PC机,虚拟机不行
2.仅支持PS/2 键盘(指外接键盘,笔记本直接使用是没问题的)
实现:
关于WinIO没啥好说的,自行查阅吧。
直接上可执行代码,注意红色注释部分,网上很多资料这几个不对导致不能有正确结果
测试程序里扣出来的,请先行初始化调用InitializeWinIo();
#define KBC_CMD 0x64
#define KBC_DATA 0x60
void KBCWait4IBE()
{
DWORD dwVal=0;
do
{
GetPortVal(KBC_CMD,&dwVal,1);
}
while(dwVal & 0x00000002); //其他条件均不正确
}
void KEY_DOWN(int vk_in)
{
bool bRet = false;
unsigned int myscancode;
myscancode=MapVirtualKey(BYTE(vk_in),0);
KBCWait4IBE();
bRet = SetPortVal(KBC_CMD,0xD2,1);
KBCWait4IBE();
bRet = SetPortVal(KBC_DATA,0xE2,1);
KBCWait4IBE();
bRet = SetPortVal(KBC_CMD,0xD2,1);
KBCWait4IBE();
bRet = SetPortVal(KBC_DATA,myscancode,1);
}
void KEY_UP(int vk_in)
{
bool bRet = false;
unsigned myscancode;
myscancode=MapVirtualKey(BYTE(vk_in),0);
KBCWait4IBE();
bRet = SetPortVal(KBC_CMD,0xD2,1);
KBCWait4IBE();
bRet = SetPortVal(KBC_DATA,0xE0,1);
KBCWait4IBE();
bRet = SetPortVal(KBC_CMD,0xD2,1);
KBCWait4IBE();
bRet = SetPortVal(KBC_DATA,(myscancode|0x80),1); //此处需要与上0x80
}
void Key_Press(int vk_in)
{
// sti() ;
KEY_DOWN(vk_in);
Sleep(150);
KEY_UP(vk_in);
Sleep(150);
}
void InputString(CString &strInput)
{
int nLen = strInput.GetLength();
for (int i = 0; i < nLen; i++)
{
short nKey = VkKeyScan(strInput.GetAt(i)); //注:由ASCII码转成按键码
bool bShift = (nKey & 0x100); //shift键是否按下检查
long n = GetKeyState(VK_CAPITAL); //Caps键是否按下检查
Key_Press(nKey);
}
}
void CWinIOTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString strInput;
CWnd* pWnd =
GetDlgItem( IDC_EDIT1 );
pWnd->GetWindowText(strInput);
Sleep(4000); //可以不用,我测试时留时间给自己切换窗口用的
InputString(strInput);
}
void CWinIOTestDlg::OnCancel()
{
// TODO: Add extra cleanup here
ShutdownWinIo();
CDialog::OnCancel();
}
另WinIO 3.0的32位系统代码有点问题,在某些密码输入控件下输入会抛特权指令异常(privileged instruction)
解决方法也很简单(自己找解决办法搞了一天),修改WinIO代码为如下所示,重新编译生成DLL即可
Port32.cpp
// ---------------------------------------------------- //
// WinIo v3.0 //
// Direct Hardware Access Under Windows //
// Copyright 1998-2010 Yariv Kaplan //
// http://www.internals.com //
// ---------------------------------------------------- //
#include <windows.h>
#include <winioctl.h>
#include <conio.h>
#include "port32.h"
#include "..\drv\winio_nt.h"
#include "winio.h"
bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize)
{
if (!IsWinIoInitialized)
{
return false;
}
#ifdef _WIN64
tagPortStruct PortStruct;
DWORD dwBytesReturned;
PortStruct.bSize = bSize;
PortStruct.wPortAddr = wPortAddr;
return DeviceIoControl(hDriver, IOCTL_WINIO_READPORT, &PortStruct, sizeof(PortStruct),
pdwPortVal, sizeof(DWORD), &dwBytesReturned, NULL);
#elif _WIN32
// If this is a 64 bit OS, we must use the driver to access I/O ports even if the application is 32 bit
//if (g_Is64BitOS)
{
tagPortStruct PortStruct;
DWORD dwBytesReturned;
PortStruct.bSize = bSize;
PortStruct.wPortAddr = wPortAddr;
return DeviceIoControl(hDriver, IOCTL_WINIO_READPORT, &PortStruct, sizeof(PortStruct),
pdwPortVal, sizeof(DWORD), &dwBytesReturned, NULL);
}
#endif
return true;
}
bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize)
{
if (!IsWinIoInitialized)
{
return false;
}
#ifdef _WIN64
tagPortStruct PortStruct;
DWORD dwBytesReturned;
PortStruct.bSize = bSize;
PortStruct.dwPortVal = dwPortVal;
PortStruct.wPortAddr = wPortAddr;
return DeviceIoControl(hDriver, IOCTL_WINIO_WRITEPORT, &PortStruct, sizeof(PortStruct),
NULL, 0, &dwBytesReturned, NULL);
#elif _WIN32
// If this is a 64 bit OS, we must use the driver to access I/O ports even if the application is 32 bit
//if (g_Is64BitOS)
{
tagPortStruct PortStruct;
DWORD dwBytesReturned;
PortStruct.bSize = bSize;
PortStruct.dwPortVal = dwPortVal;
PortStruct.wPortAddr = wPortAddr;
return DeviceIoControl(hDriver, IOCTL_WINIO_WRITEPORT, &PortStruct, sizeof(PortStruct),
NULL, 0, &dwBytesReturned, NULL);
}
#endif
return true;
}
基于WinIO 3.0实现驱动级键盘模拟输入的更多相关文章
- 谈谈基于OAuth 2.0的第三方认证 [下篇]
从安全的角度来讲,<中篇>介绍的Implicit类型的Authorization Grant存在这样的两个问题:其一,授权服务器没有对客户端应用进行认证,因为获取Access Token的 ...
- 谈谈基于OAuth 2.0的第三方认证 [中篇]
虽然我们在<上篇>分别讨论了4种预定义的Authorization Grant类型以及它们各自的适用场景的获取Access Token的方式,我想很多之前没有接触过OAuth 2.0的读者 ...
- 谈谈基于OAuth 2.0的第三方认证 [上篇]
对于目前大部分Web应用来说,用户认证基本上都由应用自身来完成.具体来说,Web应用利用自身存储的用户凭证(基本上是用户名/密码)与用户提供的凭证进行比较进而确认其真实身份.但是这种由Web应用全权负 ...
- 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...
- 基于Qt5.5.0的sql,C++备忘录软件的编写
我的第一个软件. 基于Qt5.5.0的 sql ,C++备忘录软件version1.0的编写 我用的Qt版本是5.5.0免配置编译器的版本,这里附上我使用的软件下载地址:http://download ...
- 基于Spark1.3.0的Spark sql三个核心部分
基于Spark1.3.0的Spark sql三个核心部分: 1.可以架子啊各种结构化数据源(JSON,Hive,and Parquet) 2.可以让你通过SQL,saprk内部程序或者外部攻击,通过标 ...
- WebDriver基本API使用(基于Java)V1.0
WebDriver基本API使用(基于Java)V1.0http://www.docin.com/p-803032877.html
- 自己编写的基于VC++6.0的串口调试软件,并贡献源程序!
自己编写的基于VC++6.0的串口调试软件源程序! 程序下载链接: 点击打开链接
- 基于MyEclipse+9.0+++Tomcat+7.0的SSH+平台搭建
基于MyEclipse+9.0+++Tomcat+7.0的SSH+平台搭建 http://wenku.baidu.com/view/96fbfe0f581b6bd97f19ea1d.html 用MyE ...
随机推荐
- [转]wordpress安装插件的3种方式
WordPress插件安装方法有几种?WordPress是一种使用PHP语言开发的博客平台,有些用户不知道怎么安装WordPress插件和主题的,所以今天小编就为大家介绍几种WordPress插件安装 ...
- HBase学习笔记——Java API操作
1.1. 配置 HBaseConfiguration 包:org.apache.hadoop.hbase.HBaseConfiguration 作用:通过此类可以对HBase进行配置 用法实例: C ...
- JQ实现小火箭效果
点击返回顶部以动画方式返回 $(function(){ $(window).scroll(function(){ //当滚动距离超过50后,显示按钮: ...
- 图像处理之优化---任意半径局部直方图类算法在PC中快速实现的框架
在图像处理中,局部算法一般来说,在很大程度上会获得比全局算法更为好的效果,因为他考虑到了图像领域像素的信息,而很多局部算法可以借助于直方图获得加速.同时,一些常规的算法,比如中值滤波.最大值滤波.最小 ...
- 【BZOJ】1687: [Usaco2005 Open]Navigating the City 城市交通(bfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=1687 bfs后然后逆向找图即可.因为题目保证最短路唯一 #include <cstdio> ...
- 华为OJ平台试题 —— 数组:输入n个整数,输出当中最小的k个
输入n个整数.输出当中最小的k个: 代码: /* * 输入n个整数,输出当中最小的k个. * 输入说明:1.输入两个整数:2.输入一个整数数组 * 输出说明:输出一个整数数组 */ <p ...
- 利用jsonrpc技术包装uiautomator
昨天一天在网上搜索解决上一篇文章中的exception: monkeyrunner内置uiautomator出错的原因 尽管没找到解决办法.可是让我无意中发现了一个好工具,比sl4a更好用的工具.直接 ...
- (转)Unity笔记之编辑器(BeginFadeGroup、BeginHorizontal、BeginScrollView) ... ...
1. BeginFadeGroup(float value) 这是EditorGUILayout中的一个函数,用来隐藏/显示在它包含的组中的内容.value则是显示内容的量,范围是0-1 . 比较下未 ...
- css3 box
一.box-shadow介绍 box-shadow属性向box添加一个或多个阴影. 语法: box-shadow: offset-x offset-y blur spread color inset; ...
- 【BZOJ4503】两个串 FFT
[BZOJ4503]两个串 Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字 ...