我不会绕过Minesweeper中的PlaySoundW函数。
调用PlaySoundW函数后,游戏便崩溃了。
如果我在代码中未注释Beep,则游戏会发出蜂鸣声,然后崩溃。
现在,代码正在从钩子(Hook)函数中调用原始函数,因此它不应执行任何操作。但是它还是崩溃了。
你能告诉我怎么了吗?
在Olly中调试应用程序后,我发现当绕行处于 Activity 状态时,并非所有垃圾都会弹出堆栈。
如何解决?
这是我的代码:
#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 *清理堆栈。这可能是(也可能是)所有“垃圾从堆栈中弹出”的原因。