Hook DirectInput-CreateDevice-GetDeviceData解决方案
已解决,来人散分了,Hook DirectInput->CreateDevice->GetDeviceData
在一款使用DirectInput的3D游戏里面,通过Hook DirectInput8Create函数,CreateDevice方法,取得了GetDeviceData函数指针,在GetDeviceData里面已经可以取得键盘输入的数据(程序未使用GetDeviceState获得数据)
C/C++ code
HRESULT CHook::MyGetDeviceData(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags) {HRESULT hr = CGetDeviceData::Real(ppvOut, cbObjectData, didod, pdwInOut, dwFlags);if(SUCCEEDED(hr)){for(DWORD i = 0; i < *pdwInOut; i++){if(didod[i].dwOfs == DIK_CAPSLOCK){if(didod[i].dwData & 0x80){m_TurnLeft = !m_TurnLeft;didod[i].dwOfs = m_TurnLeft ? DIK_A : DIK_D;}elsedidod[i].dwOfs = m_TurnLeft ? DIK_A : DIK_D;}}}return hr; }
函数是通过定义的基类CGetDeviceData的纯虚函数MyGetDeviceData进入的,现在的问题是:
只有部分键可以修改,例如DIK_I键,打开物品栏,直接写成
C/C++ code
HRESULT CHook::MyGetDeviceData(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags) {HRESULT hr = CGetDeviceData::Real(ppvOut, cbObjectData, didod, pdwInOut, dwFlags);if(SUCCEEDED(hr)){for(DWORD i = 0; i < *pdwInOut; i++){if(didod[i].dwOfs == DIK_I){didod[i].dwOfs = DIK_L;}}}return hr; }
并不能打开L键的功能,仍然打开I对应的功能(关于这一点不能理解,例如我修改A=D,D=A可以倒转A、D键位),还有我键盘没有SCROLL键,这个键在这个游戏中是录像的功能,我修改HOME键指向SCROLL也没有效果(断点确实修改了)。
在X64 win7系统,不能写驱动实现。
还有如何在MyGetDeviceData添加按键?
附上基类CGetDeviceData代码
C/C++ code
// CGetDeviceData typedef HRESULT (WINAPI *lpGetDeviceData)(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags); class CGetDeviceData { private:static CGetDeviceData* m_this;static HRESULT WINAPI _MyGetDeviceData(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags){return m_this->MyGetDeviceData(ppvOut, cbObjectData, didod, pdwInOut, dwFlags);}; public:lpGetDeviceData Real;virtual HRESULT MyGetDeviceData(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags) = 0;void Init(LPVOID *lplpDirectInputDevice){ULONG* vptr = *(*(ULONG***)lplpDirectInputDevice);Real = (lpGetDeviceData)vptr[10];vptr[10] = (ULONG)_MyGetDeviceData;};CGetDeviceData(){m_this = this;Real = NULL;}; };
Hook DirectInput-CreateDevice-GetDeviceData解决方案相关推荐
- 使用DirectInput进行交互(2)
设置数据格式 每种设备都有一种用于读取数据的特定数据格式,需要考虑的东西也很多,包括键.鼠标按键.轴等.因此要使程序从设备读取数据,首先必须告诉DirectInput读取这种数据所采用的格式.通过 I ...
- 源码解析 React Hook 构建过程
2018 年的 React Conf 上 Dan Abramov 正式对外介绍了React Hook,这是一种让函数组件支持状态和其他 React 特性的全新方式,并被官方解读为这是下一个 5 年 R ...
- Hook DirectX 在War3 魔兽争霸界面写屏
由于经常玩Dota,11平台出来以后,发现War3界面上有一行字,"游戏正在进入....".就想到了它的实现方式,HOOKAPI.<Windows核心编程>中有关于ho ...
- hook(2)Activity启动流程,涨知识
Field sCurrentActivityThreadField = ActivityThreadClz.getDeclaredField("sCurrentActivityThread& ...
- hook(2)Activity启动流程,安卓开发实战
如何使用: 在MainActivity的onCreate中加入一行ActivityHookHelper.hook(this) public class MainActivity extends App ...
- hook(2)Activity启动流程,2021年大厂Android岗面试必问
} 效果:跳转依然正常,并且logcat中可以发现下面的日志. #####ok,插入自己的逻辑,成功 ##三. 第二种启动方式的hook方案 创建ApplicationContextHookHelpe ...
- Java基础知识点面试题,安卓程序员必备hook技术之进阶篇
方式1:使用Activity自带的startActivity 示例代码 private void startActivityByActivity() {Intent i = new Intent(Ma ...
- 大佬教你怎样防止同事用 QQ 邮箱提交公司代码?
事情是这样的,最近组里新建了一个代码仓库来开发一个新的产品,再加上今天北京下大雨很多同事选择在家工作,于是我就选择用自己的个人电脑来工作. 但我的个人电脑里面的 Git 信息是用的我自己的个人邮箱: ...
- WIN7自定义管理员账户无法创建或使用设备
主题: 拥有管理权限,不一定等同于管理员, 都是安全策略捣的乱 出现问题的条件: 1)自定义属于Administrators组的用户登录win7 2)安装了一台USB 数据采集器,且驱动程序正常 ...
- 手把手讲解 Android Hook-Activity的启动流程
前言 手把手讲解系列文章,是我写给各位看官,也是写给我自己的. 文章可能过分详细,但是这是为了帮助到尽量多的人,毕竟工作5,6年,不能老吸血,也到了回馈开源的时候. 这个系列的文章: 1.用通俗易懂的 ...
最新文章
- react-webpack-express
- python第9周小测验答案_智慧树_Python程序设计基础_章节测验答案
- linux 带缓存的fwrite,文件IO编程之(六):基于流缓冲 fopen,fwrite,fput
- Spring RabbitMQ教程
- Linux性能分析之网络篇
- c语言中栈堆,全程剖析C语言中堆和栈的区别
- 案例29-购物车提交订单
- concurrenthashmap获取不到_面试必问的ConcurrentHashMap
- 面试疑点:几道题答了一个小时,应该是等答案
- 如何制作一个计算机病毒,怎样制作一个简单的电脑病毒
- 简谈几种常用的库函数
- 服务器装win7没有硬盘模式,联想电脑BIOS里硬盘的SATA,AHCI模式里面怎么没有I...-联想p310工作站装win7,联想电脑工作站...
- 家庭网络拓扑结构示意图
- element-ui 时间日期选择器格式调整(yyyy-mm-dd)
- abp过滤规则android,ABP的数据过滤器(Data Filters)
- 编译安装Memcached
- 逻辑思维强的人适合学计算机不,逻辑思维强的人适合做什么工作?
- 最新开源IDC代理PHP源码IDC平源码
- 在vue项目中千分位展示输入金额,获取金额千分位,金额大写的方法
- 【SAP PO】X-DOC:SAP PO 接口配置 REST 服务对接填坑记
热门文章
- 服务器的丢包率一般与什么有关
- csgo国服文件转国际服务器,CSGO国服怎样转国际服 1个打开项搞定
- 鲸探发布点评:7月22日发售观德亭、全家福、龙凤呈祥熏数字藏品
- Linux下core文件介绍与使用方法
- ❤女朋友生日❤ HTML+css3+js 实现抖音炫酷樱花3D相册 (含背景音乐)程序员表白必备
- oracle 索引快速全扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景
- win10照片文件夹里面图片,突然不显示缩略图
- 【超简易】网站ioc图标添加【超详细】
- abortonerror_DCB结构
- Linux 5.19 迎来首个候选版本,Linus:多平台 Linux 内核“差不多完成了”