1

我不会绕道 Minesweeper 中的 PlaySoundW 功能。游戏一调用 PlaySoundW 函数就会崩溃。如果我在我的代码中取消注释 Beep,游戏会发出哔哔声,然后崩溃。

现在代码正在从挂钩函数调用原始函数,所以它不应该做任何事情。但无论如何它都在崩溃。

你能告诉我有什么问题吗?

在 Olly 中调试应用程序后,我发现当 detour 处于活动状态时,并非所有垃圾都会从堆栈中弹出。如何解决?

这是我的代码:

#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

HookPlaySoundW尝试设置to的调用约定__stdcall(因为 CCPlaySoundW也是__stdcall(from Windows.h): WINMMAPI BOOL WINAPI PlaySoundW( __in_opt LPCWSTR pszSound, __in_opt HMODULE hmod, __in DWORD fdwSound);)。

除了我上面提到的之外,我在随便一瞥之前和之后都曾绕过弯路。如果这不能解决您的问题,我很乐意做一些进一步的调查。

Visual C++ 的默认设置是__cdeclcall* er * 清理堆栈,但在__stdcallcall* ee * 中清理堆栈。这可能是(可能是)所有“垃圾从堆栈中弹出”的原因。

于 2011-06-05T21:31:44.210 回答