问题是这样的,我有三个文件 shell.exe,NetStatistics.dll,keyBd.dll,我使用 shell.exe 将 Netstatistics.dll 远程线程注入到explorer.exe 中,然后,Netstatistics.dll的 Dllmain 会开启多个线程(Dllmain中没有使用 WaitforsingleObject之类的等待函数),在这些线程里面,会执行不同的网络统计任务,其中有一个线程是接受来自远程主机的控制命令并执行,根据这些命令,Netstatistics.dll中的线程会执行不同的任务。其中,有一个命令是要禁用用户的键盘,在命令接受/执行线程里面,我使用了 SetWindowsHookEx去挂载全局勾子,使用的 dll 是keyBd.dll。
问题是,对于 32 位windows系统,我将 shell.exe,NetStatistics.dll,keyBd.dll 这三个文件都编译成32位的程序,是完美运行的。
但对于 64 位系统,我将这三个文件都编译成 64位程序,此时,其它部分也是完美运行的,但只有键盘勾子那块有问题,具体的问题是,虽然成功禁用了键盘,但是,我在任意一个进程里面键入键盘,那个进程就会假死,我卸载键盘勾子没有任意作用,那个进程仍处于假死的状态,任何操作都不予以响应,只要我终止远程线程(使用 unshell.exe,这个文件是用来从 explorer.exe 中卸载远程线程的),则那个假死的进程立即被激活了,而且,我还发现,虽然那个进程之前处于假死,但它还是接受到了键盘消息,因为在远程线程结束后,假死的进程会将我键入的字符显示出来(比如 那个假死的进程是某个文本编辑器)。
我已经排除了是 键盘勾子 dll 的代码问题,我将键盘勾子回调函数里面什么也不写,只简单的返回CallNextHook,此时,之前的64位上的问题依然会重现。
但为什么只有64位windows系统会有这样的问题呢?