我试图挂钩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) ,所以堆栈正在被消除。 –