首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数指针- DInput8.dll钩子代码参数的用途

函数指针- DInput8.dll钩子代码参数的用途
EN

Stack Overflow用户
提问于 2015-02-17 07:13:41
回答 1查看 1K关注 0票数 0

我一直在试图找出DirectInput8挂钩项目中一个论点的目的。我在这里生成一些露天矿代码。为了简洁起见,我只发布几个功能。

代码语言:javascript
复制
ULONG oldCreateDevice;
HRESULT WINAPI xCreateDevice(DWORD d1, DWORD d2, DWORD d3, DWORD d4)
{
    HRESULT hr = ((HRESULT(WINAPI*)(DWORD,DWORD,DWORD,DWORD))oldCreateDevice)(d1,d2,d3,d4);

    // hook only if keyboard requested
    if(*(DWORD*)d2 != GUID_SysKeyboard)
        return hr;

    DWORD dwKeybTable = *(DWORD*)(*(DWORD*)d3);

    DWORD oldprot;
    VirtualProtect((LPVOID)dwKeybTable, 0x2C, PAGE_EXECUTE_READWRITE, &oldprot);

    // already hooked?
    if((DWORD)xGetDeviceState == *((DWORD*)(dwKeybTable+0x24))) goto ex1;
    // hook it!
    oldGetDeviceState = *((DWORD*)(dwKeybTable+0x24));
    *((DWORD*)(dwKeybTable+0x24)) = (DWORD)xGetDeviceState;

ex1:
    // already hooked?
    if((DWORD)xGetDeviceData == *((DWORD*)(dwKeybTable+0x28))) goto ex2;
    // hook it!
    oldGetDeviceData = *((DWORD*)(dwKeybTable+0x28));
    *((DWORD*)(dwKeybTable+0x28)) = (DWORD)xGetDeviceData;

ex2:

    return hr;

}


ULONG oldDirectInput8Create;
HRESULT WINAPI xDirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, VOID **ppvOut, LPUNKNOWN punkOuter)
{
    HRESULT ret = ((HRESULT(WINAPI*)(HINSTANCE,DWORD,REFIID,VOID**,LPUNKNOWN))oldDirectInput8Create)(hinst,dwVersion,riidltf,ppvOut,punkOuter);

    DWORD dwFuncTable = (DWORD)*((DWORD*)*ppvOut);

    DWORD oldprot;
    VirtualProtect((LPVOID)dwFuncTable, 0x10, PAGE_EXECUTE_READWRITE, &oldprot);

    //already hooked?
    if((DWORD)xCreateDevice == *((DWORD*)(dwFuncTable + 0x0C))) goto ex;
    //hook it
    oldCreateDevice = *((DWORD*)(dwFuncTable + 0x0C));
    *((DWORD*)(dwFuncTable + 0x0C)) = (DWORD)xCreateDevice;

ex:
    return ret;
}


DWORD WINAPI RemoteMain(LPVOID lpParam)
{

    LoadLibrary("user32.dll");
    LoadLibrary("advapi32.dll");

    Splice_Init();

    Splice((ULONG)GetProcAddress(LoadLibrary("dinput8.dll"),"DirectInput8Create"), xDirectInput8Create, &oldDirectInput8Create);

    ThreadControl(FALSE); // resume all
    return 0;
}

正如您可能注意到的,代码正在用重定向(钩子)函数替换函数。我的问题是对于xCreateDevice函数中用于DirectInput8的第一个参数,根据我理解的文档,CreateDevice函数占用3个参数。但我不知道为什么这里要使用4个参数。它是否指向原始的"oldCreateDevice"?或者是别的什么东西?

我希望有人能在这方面指导我。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-17 07:45:15

它是一个接口(类)非静态方法,所以第一个参数是这个指针(指向类实例的指针)。

这个(维基百科)

这(MSDN)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28556565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档