我試圖掛鉤StartDocW通過mhook截獲打印。我使用AppInit_DLLs來加載我的庫。通過mook的Winapi掛鉤導致程序崩潰或掛起
DLL的代碼很簡單:
#include <windows.h>
#include "mhook/mhook-lib/mhook.h"
using StartDocPtr = int(*)(HDC, const DOCINFO*);
StartDocPtr orig;
int HookedStartDocW(HDC hdc, const DOCINFO* lpdi) {
return orig(hdc, lpdi);
}
BOOL WINAPI DllMain(__in HINSTANCE, __in DWORD Reason, __in LPVOID) {
orig = (StartDocPtr)GetProcAddress(GetModuleHandle("gdi32"), "StartDocW");
switch (Reason)
{
case DLL_PROCESS_ATTACH:
Mhook_SetHook((PVOID*)&orig, &HookedStartDocW);
break;
case DLL_PROCESS_DETACH:
Mhook_Unhook((PVOID*)&orig);
break;
}
}
掛鉤工作和打印完成確定。但是,如果我將HookStartDocW更改爲以下內容:
int HookedStartDocW(HDC hdc, const DOCINFO* lpdi) {
char buf[40];
GetModuleFileName(NULL, buf, 40);
return orig(hdc, lpdi);
}
打印程序將立即崩潰。即使我只是離開char buf[40]
和評論GetModuleHandle
- 程序將掛起。這是爲什麼發生?如果程序崩潰\掛在打印上(如果我添加除return orig(hdc, lpdi)
之外的任何東西) - PC開始行爲非常怪異,拒絕運行程序等等。如果我重新啓動它 - Windows只是無休止地在啓動屏幕上旋轉,只有將它恢復生活的方法 - 是通過liveCD啓動並重命名\刪除我的鉤子DLL。
打印程序:Excel 2016,記事本。
編譯器 - MSVC 2015,x64發佈DLL編譯,使用MBCS而不是unicode。
你忽略了從'StartDocW'簽名'WINAPI'調用約定(無論是在其更換,並指向舊功能的typedef) ,所以堆棧正在被消除。 –