1

マインスイーパ内の PlaySoundW 関数を迂回することはありません。PlaySoundW 関数を呼び出すとすぐにゲームがクラッシュします。コード内の Beep のコメントを外すと、ゲームのビープ音が鳴り、クラッシュします。

現在、コードはフックされた関数から元の関数を呼び出しているため、何もしないでください。しかし、とにかくクラッシュしています。

何が悪いのか教えていただけますか?

Olly でアプリをデバッグした後、回り道がアクティブな場合、すべてのゴミがスタックから飛び出すわけではないことがわかりました。修正方法は?

これは私のコードです:

#include <Windows.h>
#include <tchar.h>
#include <detours.h>

namespace Hooks
{
    BOOL(__stdcall *OrgPlaySoundW)(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound) = &PlaySoundW;

    BOOL HookPlaySoundW(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound)
    {
        //Beep(1000, 250);
        //return TRUE;
        return OrgPlaySoundW(pszSound, hmod, fdwSound);
    }

    void DetourPlaySoundW(BOOL disable)
    {
        if(!disable)
        {
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourAttach(&(PVOID&)OrgPlaySoundW, &HookPlaySoundW);
            DetourTransactionCommit();
        } else 
        {
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourDetach(&(PVOID&)OrgPlaySoundW, &HookPlaySoundW);
            DetourTransactionCommit();
        }
    }
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch(fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        Hooks::DetourPlaySoundW(FALSE);
        break;
    case DLL_PROCESS_DETACH:
        Hooks::DetourPlaySoundW(TRUE);
        break;
    }
    return TRUE;
}
4

1 に答える 1

2

HookPlaySoundWtoの呼び出し規約を設定してみてください__stdcall(の CCPlaySoundW__stdcall(from Windows.h):であるためWINMMAPI BOOL WINAPI PlaySoundW( __in_opt LPCWSTR pszSound, __in_opt HMODULE hmod, __in DWORD fdwSound);)。

さりげなく一瞥する前後に迂回して作業しましたが、上で述べたことを除いて、すべてが正しく見えます。これで問題が解決しない場合は、さらに調査させていただきます。

Visual C++ のデフォルト設定では__cdecl、call* er * はスタックをクリーンアップしますが__stdcall、call* ee * ではスタックをクリーンアップします。これがおそらく (おそらくそうである可能性があります) すべての「ゴミがスタックから取り除かれる」理由です。

于 2011-06-05T21:31:44.210 に答える