I'm doing IPC between an EXE program and a DLL which is injected into another process via SetWindowsHookEx.
The problem is that I want to the DLL to unload when the main EXE quits, I'm doing that in the WM_CLOSE message:
The DLL hook contains a thread that listens for two evetns: mailslot messages and the quit event with WaitForMultipleObjects:Code:LRESULT MsgClose(HWND hwnd) { dprintf(L"Closing."); SetEvent(g_hQuitEvent); WaitForSingleObject(g_thRegNotify, INFINITE); CloseHandle(g_thRegNotify); CloseHandle(g_hQuitEvent); UnhookWinEvent(g_hEvtHook); dprintf(L"Removing mailslot mappings\n"); for (std::map<DWORD,HANDLE>::iterator it = g_mailslotMap.begin(); it != g_mailslotMap.end(); ++it) { CloseHandle(it->second); } dprintf(L"Unhooking processes...\n"); for (std::set<HHOOK>::iterator it = g_hHookSet.begin(); it != g_hHookSet.end(); ++it) { UnhookWindowsHookEx(*it); } if (g_hLib32) FreeLibrary(g_hLib32);
At DLL exit I perform:Code:do { OVERLAPPED ov; ZeroMemory(&ov,sizeof(ov)); hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); ov.hEvent = hEvent; if (!ReadFile(g_hMailSlot, &ipcMsg, sizeof(IPCMESSAGE), 0, &ov)) { if (GetLastError() != ERROR_IO_PENDING) { dprintf(L" ReadFile FAILED with error %d\n",GetLastError()); bContinue = FALSE; rv = GetLastError(); } } HANDLE waitEvents[2] = { hEvent, g_hQuitEvent }; DWORD wo = WaitForMultipleObjects(2, waitEvents, FALSE, INFINITE); if (wo - WAIT_OBJECT_0 == 1) { dprintf(L" (mailslot thread) Quit event signaled.\n"); bContinue = FALSE; } else { // Process mailslot message ... ... ...
If I close the process that the DLL resides in, the g_hQuitEvent is signalled properly. But not when hooking is removed via closing the main EXE.Code:if (g_hMailSlot && g_hMailSlotThread) { SetEvent(&g_hQuitEvent); WaitForSingleObject(g_hMailSlotThread, INFINITE); CloseHandle(g_hMailSlotThread); } dprintf(L" Mailslot thread terminated.\n");
Any idea as where I can look? The thread awaits at the WaitForSingleObject line marked above, halting the hosting EXE.
Thanks in advance.




Reply With Quote