0

ゲームでキーボードの再マッピングを可能にするプロキシ dinput8.dll を作成しようとしています。いくつかの指示などをまとめて、次のようにしました。

#include <windows.h>
#include <strsafe.h>
#pragma pack(1)

HINSTANCE hLThis = 0;
HINSTANCE hL = 0;
FARPROC p[5] = {0};

BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID) {
    if (reason == DLL_PROCESS_ATTACH) {
        hLThis = hInst;
        hL = LoadLibrary("originaldinput8.dll");
        if (!hL) return false;
        p[0] = GetProcAddress(hL,"DllCanUnloadNow");
        p[1] = GetProcAddress(hL,"DllGetClassObject");
        p[2] = GetProcAddress(hL,"DllRegisterServer");
        p[3] = GetProcAddress(hL,"DllUnregisterServer");
        p[4] = GetProcAddress(hL,"DirectInput8Create");
    } else if (reason == DLL_PROCESS_DETACH) {
        FreeLibrary(hL);
    }

    return 1;
}

extern "C" __declspec(naked) void __stdcall __E__0__()
    {
    __asm
        {
        jmp p[4];
        }
    }

// DllCanUnloadNow
extern "C" __declspec(naked) void __stdcall __E__1__()
    {
    __asm
        {
        jmp p[0];
        }
    }

// DllGetClassObject
extern "C" __declspec(naked) void __stdcall __E__2__()
    {
    __asm
        {
        jmp p[1];
        }
    }

// DllRegisterServer
extern "C" __declspec(naked) void __stdcall __E__3__()
    {
    __asm
        {
        jmp p[2];
        }
    }

// DllUnregisterServer
extern "C" __declspec(naked) void __stdcall __E__4__()
    {
    __asm
        {
        jmp p[3];
        }
    }

リンク先のモジュール定義ファイルは次のとおりです。

EXPORTS
DirectInput8Create=__E__0__ @1
DllCanUnloadNow=__E__1__ @2
DllGetClassObject=__E__2__ @3
DllRegisterServer=__E__3__ @4
DllUnregisterServer=__E__4__ @5

プロジェクトは問題なくビルドされ、DLL が生成されます。これを originaldinput8.dll (C:\Windows\SysWOW64\dinput8.dll の名前を変更したバージョン) と並べて配置し、ゲームを実行します。しかし、すぐにクラッシュします。デバッガーを実行すると、LoadLibrary の呼び出しが発生したときに次のエラーが発生します。

First-chance exception at 0x75ed75f8 in th06e.exe: 0xC0000005: Access violation reading location 0x00000250.

 *** An Access Violation occurred in "C:\Users\Username\Documents\Visual Studio 2010\Projects\dinput8\Debug\th06e.exe" :

The instruction at 00000000775A1221 tried to read from an invalid address, 0000000000000250

 *** enter .exr 000000000008E030 for the exception record
 ***  enter .cxr 000000000008DB40 for the context
 *** then kb to get the faulting stack

Unhandled exception at 0x75ed75f8 in th06e.exe: 0xC000041D: An unhandled exception was encountered during a user callback.
The program '[5704] th06e.exe: Native' has exited with code -1073740771 (0xc000041d).

これは以前は機能していましたが (32 ビットの代わりに 64 ビットの元の DLL を使用していた問題の後)、どういうわけか機能しなくなり、問題の原因がわかりません。

DLL ファイルの検索に問題があるとは思いません。DLL ファイルを削除するか、間違ったファイルを使用すると、LoadLibrary がクラッシュせずにエラー コード 193 で失敗します。

何か案は?

4

0 に答える 0