MS Detours 2.1-弹出堆栈

MS Detours 2.1 - Popping out of stack

本文关键字:堆栈 Detours MS      更新时间:2023-10-16

我习惯在扫雷器内部绕过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;
}

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

我在随意浏览之前和之后都走了弯路,除了上面提到的之外,一切看起来都是正确的。如果这不能解决你的问题,我很乐意做一些进一步的调查。

Visual C++的默认设置是__cdecl,其中调用*er*会清理堆栈,但在__stdcall中,调用*ee*会清理堆栈。这可能是(,即可能是)所有"垃圾从堆栈中弹出"的原因。