我的目標是在概念上很簡單:我想設置一個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