2011-06-05 123 views
1

我不想繞過掃雷裏面的PlaySoundW功能。 一旦它調用PlaySoundW函數,遊戲就會崩潰。 如果我在我的代碼中取消註釋嘟嘟聲,遊戲會發出嘟嘟聲而不是崩潰。MS Detours 2.1 - 彈出堆棧

現在代碼正在從掛鉤函數調用原始函數,所以它不應該做任何事情。但無論如何它正在崩潰。

你能告訴我什麼是錯的嗎?

在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; 
} 
+0

Detours是否真的需要所有可怕的強制轉換(函數指針)? – 2011-06-05 21:43:52

+1

@是的,和horrid是一個觀點,就像Lisp的括號一樣。 – 2011-06-05 21:44:27

+0

@Seth:*未定義的行爲*不是一個觀點。在函數指針和'void *'之間進行轉換是未定義的行爲。該代碼是無效的C++。他們至少應該使用'FARPROC'(例如'GetProcAddress'返回),它保證了函數指針的大小。 – 2011-06-05 21:45:22

回答

2

嘗試的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在通話* *清理堆棧,但在__stdcall通話* EE *清理堆棧。這可能是(,即可能是)所有「垃圾從堆棧中彈出」的原因。