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解决方案 的相关文章

  • VC++ CString Find函数的用法说明

    名称 CString Find 在一个较大的 字符 串中查找字符或子字符串 int Find TCHAR ch const int Find LPCTSTR lpszSub const int Find TCHAR ch int nStar
  • EL900音色编辑之‘包络(Envelope)简单释义’

    包络其实是一个听的见却并不好具象的去理解的声 音物理特征 我们往往会通过反应速度 音头 延音等 等词汇来形容 但是系统的通过ADSR来描绘可能会更 加的清晰 声音的传播活动是一个动态的过程 一种 乐器的音色之所以悦耳 丰满 是由于它的波 形
  • 使用窗函数设计FIR滤波器

    首先 先明白几个概念 通带 阻带 过渡带 通带纹波和阻带纹波分别是什么 看下图 范围称为通带 对于允许误差而言 这个范围 称为通带纹波 同样的 对于范围则是阻带 这个范围 称为阻带纹波 中间的黑色部分是过度带 角频率称为通带边缘频率 角频率
  • C++ 包管理器

    C 包管理器 Vcpkg Vcpkg 可帮助您在 Windows Linux 和 MacOS 上管理 C 和 C 库 相关资料 Vcpkg 管理 C 和 C 库 vcpkg github conan Conan是分布式跨平台开源的C C 软
  • VC6添加自定义消息(主窗口向子窗口发送消息)

    从主窗口向子窗口发送消息 可以在子窗口中添加自定义的消息 然后在主窗口中需要地方呼叫该消息 呼叫方法 1 将子窗口添加为主窗口的成员变量 2 主窗口呼叫该消息 成员变量名 SendMessage UM PROGRESS 子窗口添加自定义消息
  • error C2872: “Font”: 不明确的符号

    在VS2010中调用GDI 时 Font font fontFamily 24 FontStyleRegular UnitPixel 会提示提示 Font 不明确的符号的问题 1 gt 可能是 c program files microso
  • VC ini配置文件常用操作

    A 读写ini文件 ini文件 即Initialization file 这种类型的文件中通常存放的是一个程序的初始化信息 ini文件由若干个节 Section 组成 每个Section由若干键 Key 组成 每个Key可以赋相应的值 读写
  • 在Windows上使用clang编译器

    在Stackoverflow等网站上 经常出现各种编译器的对比的结果 其中clang是很常见的 那么 怎样在Windows上使用clang呢 没那么直观 直接去llvm官网上下载clang的发行包 解压 到bin下面 看到应该是我们想要的工
  • VC++ 获取文件版本号

    源码实现 pragma comment lib Version lib typedef struct VS VERSIONINFO WORD wLength WORD wValueLength WORD wType WCHAR szKey
  • VC++6.0 IDE的工程用Code::Blocks来打开、编译、调试终极配置方案

    引子 竟然可以用Code Blocks来打开 编译 调试VC 6 0的项目 感觉很神奇 通过配置也让我们更进一步了解VC 6 0的编译器 连接器 调试器 好多兄弟问到要是能支持最新的VS2008和VS2010就好了 其实Code Block
  • 蓝桥杯 马虎的算式

    标题 马虎的算式 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 495 396 45 17820 类
  • 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官方
  • git clone指定分支拉代码、版本回退、log/reflog对比

    指定分支clone代码 1 git clone 不指定分支 默认就是master git clone http 10 1 1 11 service tmall service git 2 git clone 指定分支 git clone b
  • 免费C/C++编译器

    不好意思 等到现在才想到要写这篇文章 怎么说呢 情况是这样的 刚开始我学习C语言时 是想在机器上安装visual c 的 因为Turbo C太古老了 用起来不方便 所以很自然地想安装vc 不过不知道大家有没有发现vc很大 而且有些机子就是安
  • VC++实现视频压缩编码标准 MPEG-4

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 需要源码的请与我联系 参考书籍 lt
  • 泛谈HWND和CWnd

    一 略析 HWND Windows系统中对所有窗口的一种标识 即窗口句柄 一个SDK概念而已 并没有实际对象操作的地址空间 它只是一个32位的无符号整型数值 代表了句柄号handle CWnd MFC类库中所有窗口类的基类 MFC中所有窗口
  • VC++设置与取得系统音量

    MMRESULT rc 多媒体函数返回结果变量 HMIXER hMixer 混合器设备句柄 MIXERLINE mxl 音频线路标准状态信息结构体 MIXERLINECONTROLS mxlc 音频线路控制器集合信息结构体 MIXERCON
  • VC6.0向工程中添加文件和打开文件出错“"0x5003eaed"指令引用的"0x00000000"内存”解

    据说这个错误是因为和微软的其他软件相冲突了 下面就看看如何解决这个问题 第一步 下载一个FileTool插件 下载的地址 http download microsoft com download vc60ent s1 6 0 w9xnt4
  • Vc/MFC中自定义消息及其PostMessage触发使用

    http blog csdn net ztz0223 article details 2058402 http blog csdn net a8082649 article details 7733527 http bbs csdn net

随机推荐

  • 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