Hook DirectInput->CreateDevice->GetDeviceData解决方案

2023-11-20

 

已解决,来人散分了,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;
                }
                else
                    didod[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;
    };
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hook DirectInput->CreateDevice->GetDeviceData解决方案 的相关文章

  • C++ 包管理器

    C 包管理器 Vcpkg Vcpkg 可帮助您在 Windows Linux 和 MacOS 上管理 C 和 C 库 相关资料 Vcpkg 管理 C 和 C 库 vcpkg github conan Conan是分布式跨平台开源的C C 软
  • 释放内存总结

    1 用new malloc显式分配在堆上的内存才需要用delete free释放 而在栈上分配的如int array 80 在子程序结束时自动释放 分配与释放都和数据类型无关 2 delete一个指针的时候 一定要检查是否为null 否则是
  • 自定义C++异常处理

    例1 自定义一个继承自excepton的异常类myException C 标准中 定义在
  • VC++ 教程

    基本概念 对象 面向对象编程2 定义实体后 可以不知道此实体的功能是怎样实现的 也能使用它们 核心概念 1 数据封装 将一个数据与这个数据有关的操作集合封装在一起 形成一个能动的实体 称为对象 2 继承 在面向对象语言中 类功能支持层次机制
  • 如何读懂别人写的vc++代码

    每个人的编程习惯各异规范程度 命名规则 使用习惯也不尽相同 有人爱用Timer 有的人用线程 有的人用PostMessage有的人用SetEvent或回调或直接调用 所以别人的程序也是良莠不齐 所以要求你对编程基础 程序构架 业务规则都要有
  • vc++ 如何使radio button ,checkbox初始为已选状态?

    CheckDlgButton IDC CHECK1 BST UNCHECKED 0 CheckDlgButton IDC CHECK2 BST CHECKED 1 CButton GetDlgItem IDC RADIO 1 gt SetC
  • VC6.0 MFC点击编辑框弹出对话框

    在写界面的用于触屏时 往往需要编辑框弹出盘来进行输入 下面就将我思路写一下吧 1 刚开始在网让找一些这方面的资料 结果在论坛中有发现这样一个帖子 见面的链接 http topic csdn net u 20100630 15 728f2d7
  • 程序计算精确圆周率Pai的方法

    一些参考资料 http www guokr com blog 444081 大家都知道 3 1415926 无穷多位 历史上很多人都在计算这个数 一直认为是一个非常复杂的问题 现在有了电脑计算机 这个问题就简单了 最简单高效用Python
  • 线程破解程序死循环

    最近用opencv mfc做了一个简单的程序 点击button后 打开视频 另一个button关闭视频 问题来了 读视频的程序是个死循环 怎么解 因此 应该考虑线程的问题了 让视频程序在线程里跑 何为线程 线程 有时被称为轻量级进程 Lig
  • LNK2005: _DllMain@12 already defined in LIBCMTD.lib(dllmain.obj)

    今天使用VS2003创建一个MFC 的dll工程时 出现以下错误 VPR error LNK2005 DllMain 12 already defined in LIBCMTD lib dllmain obj VPR error LNK20
  • 微软正式提供Visual Studio 2013正式版下载(附直接链接汇总)

    转自 http www iruanmi com visual studio 2013 微软已经向MSDN订阅用户提供了Visual Studio 2013正式版镜像下载 不过非MSDN用户可以在微软的Visual Studio 2013官方
  • VS2010 LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 的解决方法

    因为同一个电脑上安装多个VS 有多个cvtres exe 按照下面的操作如果还是不行就在C盘搜索cvtres exe 然后挨个重命名 看看是调用的哪个 然后修改就可以了 用VS2010编译C 项目时出现这样的错误 LNK1123 转换到 C
  • C++学习日记和心得(一)(新手帖,高手勿笑)

    前言 我之前三年也学过其他语言 VB pascal 都不是非常主流 但有一定程序学习的基础 没学过程序的孩子也不要伤心 只要认认真真的学习还是可以学会的 我也是刚开始学C 所以希望大家跟我一同从0开始学习C 如果对我有一些疑问和批评欢迎提出
  • 选择正确的C/C++ Runtime Library

    解决下面的编译 链接问题过程中 有一些新的认识 warning LNK4049 locally defined symbol error LNK2001 unresolved external symbol 本文意在总结 讨论的中心自然也正
  • MFC窗口销毁过程

    MFC窗口销毁过程 考虑单窗口情况 假设自己通过new创建了一个窗口对象pWnd 然后pWnd gt Create 则销毁窗口的调用次序 1 手工调用pWnd gt DestroyWindow 2 DestroyWin
  • CWnd和HWND的区别

    所有控件类都是CWnd类的派生类 CWnd的所有成员函数在控件类中都可以使用 在MFC中 CWnd类是一个很重要的类 它封装了Windows的窗口句柄HWND 在Windows编程中 每一个窗口都是有窗口句柄标识的 但是 类CWnd的对象和
  • win7安装了vc++6.0打开已保存文件项目就会崩溃

    我用win7安装了vc 6 0的英文完整版 绿色中文版 发现当运行程序时 要打开已保存文件项目就会崩溃 系统对话筐就说 Microsoft R Developer Studio已停止工作 选择调试或者关闭 office 2010 与vc 6
  • C语言函数操作大全----(超详细)

    fopen 打开文件 相关函数 open fclose 表头文件 include
  • VC6.0向工程中添加文件和打开文件出错“"0x5003eaed"指令引用的"0x00000000"内存”解

    据说这个错误是因为和微软的其他软件相冲突了 下面就看看如何解决这个问题 第一步 下载一个FileTool插件 下载的地址 http download microsoft com download vc60ent s1 6 0 w9xnt4
  • VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题...

    VC9编译的程序在没有装过VC9 确切的说是 Net Framework3 5 的机器上运行时 如果提示 由于应用程序配置不正确 应用程序未能启动 重新安装应用程序可能会纠正这个问题 这个错误 那么就说明该程序动态链接了VC9的运行时库 如

随机推荐

  • vscode的Document This插件

    Document This插件 主要针对JavaScript 和 TypeScript 语言生成注释 光标放在函数名上 连续按 两下 Ctrl Alt D description param number x param number y
  • 【分库分表】sharding-jdbc—分片策略

    目录 StandardShardingStrategy ComplexShardingStrategy InlineShardingStrategy HintShardingStrategy NoneShardingStrategy 标准分
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • 线上问题排查----------ORG.APACHE.CATALINA.CONNECTOR.CLIENTABORTEXCEPTION: JAVA.IO.IOEXCEPTION: BROKEN PIPE

    今天公司技术支持的童鞋报告一个客户的服务不工作了 紧急求助 于是远程登陆上服务器排查问题 查看采集数据的tomcat日志 习惯性的先翻到日志的最后去查看有没有异常的打印 果然发现了好几种异常信息 但是最多还是这个 24 Nov 2016 0
  • Golang-使用 goroutine 运行闭包的“坑”

    介绍 在 Go 语言中 函数支持匿名函数 闭包就是一种特殊的匿名函数 它可以用于访问函数体外部的变量 需要注意的是 在 for range 中 使用 goroutine 执行闭包时 经常会掉 坑 因为匿名函数可以访问函数体外部的变量 而 f
  • 【Android】从零搭建组件化项目

    组件化系列文章介绍的内容稍微多了点 本着研究透这玩意的精神 从组件化的简介开始说起 目录 简介 组件化 模块化与插件化 开始 创建配置共享文件 打包模式配置 APT与JavaPoet 简介 什么是组件化 将多个功能模板拆分 重组的过程 为什
  • VM安装windows7 32位

    首先你电脑必须安装了 VMware 推荐版本 VMware12 或者 VMware 11 版本 然后你还需要一个系统镜像 可以通过下面链接下载 Win7 的镜像 复制链接 打开迅雷新建任务即可下载 Windows7 64位 ed2k fil
  • ubuntu换源为阿里云源

    切换目录到 etc apt 目录下 备份sources list文件 sudo cp sources list sources list bak 然后执行换源脚本 在当前路径下 sudo sources sh 脚本下载路径 http dow
  • BFS遍历树和DFS遍历树

    遍历树 按照遍历的顺序 如不清楚图的遍历 请先阅读图的遍历 绘制成树型结构 DFS遍历树 以下为图到遍历树的转化 如果不清楚图的遍历 请先阅读笔者的另一篇文章 图的遍历 动图 按照DFS遍历的顺序 绘制成一棵树 途中红色的边就是遍历过程中没
  • 软件测试题目

    一 判断题 每题2分 20 1 软件测试就是为了验证软件功能实现的是否正确 是否完成既定目标的活动 所以软件测试在软件工程的后期才开始具体的工作 初级 2 发现错误多的模块 残留在模块中的错误也多 初级 3 测试人员在测试过程中发现一处问题
  • Linux CentOS 7.5安装JDK1.8

    CentOS 7 5安装JDK1 8 Linux系统版本 CentOS 7 5 64位 下载JDK1 8 JDK 1 8官方下载地址 https www oracle com technetwork java javase download
  • tomcat 将详细日志写入mysql数据库

    http tomcat apache org tomcat 6 0 doc api org apache catalina valves JDBCAccessLogValve html conf server xml
  • 基础教学丨UiBot主界面、可视化、源代码视图操作

    基础教学丨UiBot主界面 可视化 源代码视图操作 今天主要讲解UiBot软件主界面 可视化视图 源代码视图的相关操作 目录 1 软件主界面操作 2 可视化视图操作 3 源代码视图操作 1 软件主界面操作 UiBot主界面布局如下 1 菜单
  • 【Java必修课】判断String是否包含子串的四种方法及性能对比

    1 简介 判断一个字符串是否包含某个特定子串是常见的场景 比如判断一篇文章是否包含敏感词汇 判断日志是否有ERROR信息等 本文将介绍四种方法并进行性能测试 2 四种方法 2 1 JDK原生方法String indexOf 在String的
  • QT画扇形和椭圆

    void MainWindow paintEvent QPaintEvent QPainter painter this painter setRenderHint QPainter Antialiasing true int radius
  • DTC status 为0x23的原因分析

    正常情况下dtc状态不可能出现0x23 当出现0x23可能是达芬奇中如下配置所致 1 PendingDtcProcessing设置为storeonly 此设置会导致没有分配快照空间的dtc无法set pending位 而且被displace
  • Python中的def函数

    概念 Python中的def语句用于定义一个函数 函数是一个代码块 它可以被重复调用 并且可以接收输入参数和返回值 在Python中 函数是由def关键字 函数名和圆括号内的参数列表组成的 场景 以下是几个函数使用场景的示例 阶乘计算 在计
  • Syntax Error: Error: Node Sass does not yet support your current environment...报错解决

    报错 Syntax Error Error Node Sass does not yet support your current environment Windows 64 bit with Unsupported runtime 93
  • Lambda表达式、std::function、和std::bind函数

    Lambda表达式 std function 和std bind函数 Lambda表达式 capture parameters mutable exception gt return type statement 1 capture 捕获外
  • Hook DirectInput->CreateDevice->GetDeviceData解决方案

    已解决 来人散分了 Hook DirectInput gt CreateDevice gt GetDeviceData 在一款使用DirectInput的3D游戏里面 通过Hook DirectInput8Create函数 CreateDe