SetWindowsHook时的dll映射问题
原文如下
“进程A(类似Microsoft Spy++的一个实用程序)安装了一个挂钩W N _ G E T M E S S A G E,以便查看系统中的各个窗口处理的消息。该挂钩是通过调用下面的SetWindowsHookEx函数来安装的:
HHOOK hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc,
hinstDll, 0);
现在让我们来看一看将会发生什么情况:
1) 进程B中的一个线程准备将一条消息发送到一个窗口。
2) 系统查看该线程上是否已经安装了W H _ G E T M E S S A G E挂钩。
3) 系统查看包含G e t M s g P r o c函数的D L L是否被映射到进程B的地址空间中。
4) 如果该D L L尚未被映射,系统将强制该D L L映射到进程B的地址空间,并且将进程B中的D L L映像的自动跟踪计数递增1。
5) 当D L L的h i n s t D l l用于进程B时,系统查看该函数,并检查该D L L的h i n s t D l l是否与它用于进程A时所处的位置相同。
如果两个h i n s t D l l是在相同的位置上,那么G e t M s g P r o c函数的内存地址在两个进程的地址空间中的位置也是相同的。在这种情况下,系统只需要调用进程A的地址空间中的G e t M s g P r o c函数即可。
如果h i n s t D l l的位置不同,那么系统必须确定进程B的地址空间中G e t M s g P r o c函数的虚拟内存地址。这个地址可以使用下面的公式来确定:
GetMsgProc B = hinstDll B + (GetMsgProc A - hinstDll A)
将GetMsgProc A的地址减去hinstDll A的地址,就可以得到G e t M s g P r o c函数的地址位移(以字节为计量单位)。将这个位移与hinstDll B的地址相加,就得出G e t M s g P r o c函数在用于进程B的地址空间中该D L L的映像时它的位置。
6) 系统将进程B中的D L L映像的自动跟踪计数递增1。
7) 系统调用进程B的地址空间中的G e t M s g P r o c函数。
8) 当G e t M s g P r o c函数返回时,系统将进程B中的D L L映像的自动跟踪计数递减1。
注意,当系统插入或者映射包含挂钩过滤器函数的D L L时,整个D L L均被映射,而不只是挂钩过滤器函数被映射。这意味着D L L中包含的任何一个函数或所有函数现在都存在,并且可以从进程B的环境下运行的线程中调用。”(原文结束)
问题是如果说进程A调用SetWindowsHookEx,使得进程B发送消息时会触发钩子从而将dll文件映射到B的进程空间,这没问题,但是我不理解为什么进程A中同样会将dll映射进来呢?(如上面原文5所说)。进程A不需要dll文件中的函数啊,那些函数不提供给进程B触发钩子后调用的吗,A无非是设置下钩子顺带着告诉下触发后调用什么函数以及这个函数所在的dll不就ok了吗,干嘛要把dll弄进自己的进程空间呢?是我哪理解错了吗?望指教