全局 WH_CBT 和 Wireshark ?

z4none 2009-03-11 01:18:43
我需要在我的程序里面监控另外一个程序的运行状态,
我现在的方法是用 SetWindowsHookEx 捕获窗口的创建消息 ,像这样(dll中):


extern "C" __declspec(dllexport) HRESULT __stdcall
InstallrnHook()
{
old_hook = SetWindowsHookEx(WH_CBT , (HOOKPROC)CBTProc , hinstance , NULL); // hinstance 是在 DllEntryPoint 里面读取到的

if(old_hook == NULL)
{
// print err msg
return E_FAIL;
}

return S_OK;
}


然后 CBTProc 我只写了最简单的:


LRESULT CALLBACK CBTProc(int ncode, WPARAM wparam, LPARAM lparam)
{
switch(ncode)
{
case HCBT_ACTIVATE:
break;
}
ret = CallNextHookEx(NULL, ncode, wparam, lparam);
return ret;
}


程序运行了以后,一般的窗口的创建消息 都可以正确检测到。
但是我发现打开 Wireshark 这个程序,开始抓包的时候,我的dll让它崩掉了。。。,
如果不开我的程序直接用 Wireshark 抓包就没问题。

我实在看不出来我这么写有什么问题,我只是注册了一个全局钩子,在回调函数中直接调用下一个钩子而已。

现在只发现和 Wireshark 有冲突。

BTW :程序是BCB下编译的。

...全文
298 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
z4none 2009-03-12
  • 打赏
  • 举报
回复
cnzdgs 你是对的。

我把 dll 改成 vc 的就没有这个问题了

。。真是诡异

结贴了。


BTW:
我很想知道为啥BCB会有这个问题。
要是有哪位高手了解 pls let me konw.
z4none 2009-03-11
  • 打赏
  • 举报
回复
ok . I'll try that.
thx a lot.
cnzdgs 2009-03-11
  • 打赏
  • 举报
回复
我能想到的可能原因还有最后一种,就是BCB的问题,建议你用VC创建一个Win32 DLL项目来试试,如果还是有问题,我就没办法了。
z4none 2009-03-11
  • 打赏
  • 举报
回复
Dll入口函数:


int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
hinstance = hinst;
return 1;
}


这个 hinstance 是全局变量,只在 exe 装载钩子时 作为 SetWindowsHookEx 的参数3

exe 里面是通过 LoadLibrary 来调用安装钩子函数的。
cnzdgs 2009-03-11
  • 打赏
  • 举报
回复
DllMain中做了哪些处理?
z4none 2009-03-11
  • 打赏
  • 举报
回复
cnzdgs 谢谢回复!

按照你所说的 我改成

ret = CallNextHookEx(old_hook, ncode, wparam, lparam);
return ret;

然后把 old_hook 存到共享数据段,经过跟踪 CallNextHookEx 中的参数1是old_hook ,
但是 Wireshark 还是崩溃。

MSDN里面也说
LRESULT CallNextHookEx(
HHOOK hhk,
int nCode,
WPARAM wParam,
LPARAM lParam
);
Parameters

hhk
[in] Windows 95/98/ME: Handle to the current hook. An application receives this handle as a result of a previous call to the SetWindowsHookEx function.

Windows NT/XP/2003: Ignored.


所以我想应该不是这里的问题。。
cnzdgs 2009-03-11
  • 打赏
  • 举报
回复
CallNextHookEx的第1参数要给old_hook,并且old_hook必须是共享变量。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧