我的目标是在概念上很简单:我想设置一个GetMessage全局钩子函数,它利用共享文件句柄。问题出现是因为根据我的理解,包含挂钩函数的DLL会为每个进程加载多次,每个进程都有自己的“地址空间”。出于这个原因,我导致我不能简单地处理DllMain的DLL_PROCESS_ATTACH来创建所需的文件,因为将使用不同的句柄创建多个文件。全局钩子DLL的应用程序
一个引起我注意的解决方案是命名管道。基本上,应用程序将充当服务器端;它会创建文件一次,然后将文件句柄提供给DLL客户端,因此每个全局钩子将使用相同的文件。
我似乎无法让它从我收集的代码工作。在应用中,我创建了文件,设置全局钩子函数,然后让它通过这个循环:
while(1)
{
HANDLE hPipe = CreateNamedPipe("\\\\.\\pipe\\pipename", PIPE_ACCESS_OUTBOUND,
PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 32, 32, 5000, NULL);
if(hPipe == INVALID_HANDLE_VALUE)
return 42;
if(!ConnectNamedPipe(hPipe, NULL))
return 43;
DWORD dwWritten;
WriteFile(hPipe, logFile, sizeof(logFile), &dwWritten, NULL);
FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
}
然后我处理的DllMain的DLL_PROCESS_ATTACH像这样:
case DLL_PROCESS_ATTACH:
{
HANDLE hPipe;
while(1)
{
hPipe = CreateFile("\\\\.\\pipe\\pipename", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if(hPipe != INVALID_HANDLE_VALUE)
break;
WaitNamedPipe("\\\\.\\pipe\\pipename", NMPWAIT_USE_DEFAULT_WAIT);
}
DWORD dwRead;
ReadFile(hPipe, logFile, sizeof(logFile), &dwRead, NULL);
CloseHandle(hPipe);
break;
}
简单地说,它不起作用,我似乎无法弄清楚为什么。有什么我失踪或在我的代码中做错了吗?
另一个我无法弄清楚的问题是,应用程序被困在一个持续服务的无限循环中。我想设置一个事件,DLL将在某些情况下设置并导致主应用程序解除全局钩子,关闭文件并退出,但ConnectNamedPipe是一个阻塞函数。什么是确定什么时候所有客户端都被服务的方法,以便服务环路可以中断?
感谢您的任何帮助。
你有任何建议,有什么其他方法我可以使用,不涉及的DllMain? – kaykun 2010-07-12 01:39:18
我不知道你想通过命名管道发送的消息来完成什么。你有什么更大的目标呢? – 2010-07-12 02:12:35
主应用程序使用SetWindowsHookEx创建一个文件并设置一个GetMessage全局钩子。每个进程(或线程,我真的不知道哪个)被注入了DLL中的钩子函数。钩子函数应该写入在主应用程序中创建的文件。因此我需要一些方法将应用程序中的文件句柄传递给hook函数的所有实例。 – kaykun 2010-07-12 02:48:11