OSDN Git Service

nvdaHelperRemote: Make sure that minhook.dll really gets unloaded properly when apiHo...
authorMichael Curran <mick@kulgan.net>
Thu, 19 Apr 2012 23:00:51 +0000 (09:00 +1000)
committerMichael Curran <mick@kulgan.net>
Thu, 19 Apr 2012 23:00:51 +0000 (09:00 +1000)
nvdaHelper/remote/apiHook.cpp
nvdaHelper/remote/sconscript

index 9a95a24..4f946cf 100644 (file)
@@ -16,6 +16,7 @@ http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 #include <set>\r
 #define WIN32_LEAN_AND_MEAN \r
 #include <windows.h>\r
+#include <delayimp.h>\r
 #include <minHook/newMinHook.h>\r
 #include "nvdaControllerInternal.h"\r
 #include <common/log.h>\r
@@ -29,13 +30,17 @@ typedef set<void*> functionSet_t;
 \r
 moduleSet_t g_hookedModules;\r
 functionSet_t g_hookedFunctions;\r
+HMODULE minhookLibHandle=NULL;\r
  \r
 bool apiHook_initialize() {\r
        LOG_DEBUG("calling MH_Initialize");\r
        int res;\r
        wstring dllPath=dllDirectory;\r
        dllPath+=L"\\minhook.dll";\r
-       LoadLibrary(dllPath.c_str());\r
+       if((minhookLibHandle=LoadLibrary(dllPath.c_str()))==NULL) {\r
+               LOG_ERROR(L"LoadLibrary failed to load "<<dllPath);\r
+               return false;\r
+       }\r
        if ((res=MH_Initialize())!=MH_OK) {\r
                LOG_ERROR("MH_CreateHook failed with " << res);\r
                return false;\r
@@ -89,5 +94,9 @@ bool apiHook_terminate() {
                FreeLibrary(*i);\r
        }\r
        g_hookedModules.clear();\r
+       if(minhookLibHandle) FreeLibrary(minhookLibHandle);\r
+       if(!__FUnloadDelayLoadedDLL2("minHook.DLL")) {\r
+               LOG_ERROR(L"__FUnloadDelayLoadedDLL2 failed to unload minhook.dll");\r
+       }\r
        return TRUE;\r
 }\r
index 4523425..140250c 100644 (file)
@@ -99,7 +99,7 @@ remoteLib=env.SharedLibrary(
                nvdaInProcUtilsRPCServerSource,\r
                "nvdaHelperRemote.def",\r
        ],\r
-       LINKFLAGS="${LINKFLAGS} /delayload:minhook.dll",\r
+       LINKFLAGS="${LINKFLAGS} /delayload:minhook.dll /delay:unload /delay:nobind",\r
        LIBS=[\r
                minHookLib[1 if 'symbols' not in env['nvdaHelperDebugFlags'] else 2],\r
                "delayimp.lib",\r