已解决,来人散分了,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解决方案相关推荐

  1. 使用DirectInput进行交互(2)

    设置数据格式 每种设备都有一种用于读取数据的特定数据格式,需要考虑的东西也很多,包括键.鼠标按键.轴等.因此要使程序从设备读取数据,首先必须告诉DirectInput读取这种数据所采用的格式.通过 I ...

  2. 源码解析 React Hook 构建过程

    2018 年的 React Conf 上 Dan Abramov 正式对外介绍了React Hook,这是一种让函数组件支持状态和其他 React 特性的全新方式,并被官方解读为这是下一个 5 年 R ...

  3. Hook DirectX 在War3 魔兽争霸界面写屏

    由于经常玩Dota,11平台出来以后,发现War3界面上有一行字,"游戏正在进入....".就想到了它的实现方式,HOOKAPI.<Windows核心编程>中有关于ho ...

  4. hook(2)Activity启动流程,涨知识

    Field sCurrentActivityThreadField = ActivityThreadClz.getDeclaredField("sCurrentActivityThread& ...

  5. hook(2)Activity启动流程,安卓开发实战

    如何使用: 在MainActivity的onCreate中加入一行ActivityHookHelper.hook(this) public class MainActivity extends App ...

  6. hook(2)Activity启动流程,2021年大厂Android岗面试必问

    } 效果:跳转依然正常,并且logcat中可以发现下面的日志. #####ok,插入自己的逻辑,成功 ##三. 第二种启动方式的hook方案 创建ApplicationContextHookHelpe ...

  7. Java基础知识点面试题,安卓程序员必备hook技术之进阶篇

    方式1:使用Activity自带的startActivity 示例代码 private void startActivityByActivity() {Intent i = new Intent(Ma ...

  8. 大佬教你怎样防止同事用 QQ 邮箱提交公司代码?

    事情是这样的,最近组里新建了一个代码仓库来开发一个新的产品,再加上今天北京下大雨很多同事选择在家工作,于是我就选择用自己的个人电脑来工作. 但我的个人电脑里面的 Git 信息是用的我自己的个人邮箱: ...

  9. WIN7自定义管理员账户无法创建或使用设备

    主题:   拥有管理权限,不一定等同于管理员, 都是安全策略捣的乱 出现问题的条件: 1)自定义属于Administrators组的用户登录win7 2)安装了一台USB 数据采集器,且驱动程序正常 ...

  10. 手把手讲解 Android Hook-Activity的启动流程

    前言 手把手讲解系列文章,是我写给各位看官,也是写给我自己的. 文章可能过分详细,但是这是为了帮助到尽量多的人,毕竟工作5,6年,不能老吸血,也到了回馈开源的时候. 这个系列的文章: 1.用通俗易懂的 ...

最新文章

  1. react-webpack-express
  2. python第9周小测验答案_智慧树_Python程序设计基础_章节测验答案
  3. linux 带缓存的fwrite,文件IO编程之(六):基于流缓冲 fopen,fwrite,fput
  4. Spring RabbitMQ教程
  5. Linux性能分析之网络篇
  6. c语言中栈堆,全程剖析C语言中堆和栈的区别
  7. 案例29-购物车提交订单
  8. concurrenthashmap获取不到_面试必问的ConcurrentHashMap
  9. 面试疑点:几道题答了一个小时,应该是等答案
  10. 如何制作一个计算机病毒,怎样制作一个简单的电脑病毒
  11. 简谈几种常用的库函数
  12. 服务器装win7没有硬盘模式,联想电脑BIOS里硬盘的SATA,AHCI模式里面怎么没有I...-联想p310工作站装win7,联想电脑工作站...
  13. 家庭网络拓扑结构示意图
  14. element-ui 时间日期选择器格式调整(yyyy-mm-dd)
  15. abp过滤规则android,ABP的数据过滤器(Data Filters)
  16. 编译安装Memcached
  17. 逻辑思维强的人适合学计算机不,逻辑思维强的人适合做什么工作?
  18. 最新开源IDC代理PHP源码IDC平源码
  19. 在vue项目中千分位展示输入金额,获取金额千分位,金额大写的方法
  20. 【SAP PO】X-DOC:SAP PO 接口配置 REST 服务对接填坑记

热门文章

  1. 服务器的丢包率一般与什么有关
  2. csgo国服文件转国际服务器,CSGO国服怎样转国际服 1个打开项搞定
  3. 鲸探发布点评:7月22日发售观德亭、全家福、龙凤呈祥熏数字藏品
  4. Linux下core文件介绍与使用方法
  5. ❤女朋友生日❤ HTML+css3+js 实现抖音炫酷樱花3D相册 (含背景音乐)程序员表白必备
  6. oracle 索引快速全扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景
  7. win10照片文件夹里面图片,突然不显示缩略图
  8. 【超简易】网站ioc图标添加【超详细】
  9. abortonerror_DCB结构
  10. Linux 5.19 迎来首个候选版本,Linus:多平台 Linux 内核“差不多完成了”