static void LoadRealLibrary(void) { static const char GetClassObject[] = "DllGetClassObject"; static const char CanUnloadNow[] = "DllCanUnloadNow"; WCHAR ModuleName[MAX_PATH] = {0}; DWORD Len = 0; HINSTANCE hUseInst = hInst; if (hTortoiseGit) return; if (!WantRealVersion()) { TRACE(_T("LoadRealLibrary() - Bypass\n")); hTortoiseGit = NIL; return; } // if HKCU\Software\TortoiseGit\DebugShell is set, load the dlls from the location of the current process // which is for our debug purposes an instance of usually TortoiseProc. That way we can force the load // of the debug dlls. if (DebugActive()) hUseInst = nullptr; Len = GetModuleFileName(hUseInst, ModuleName, _countof(ModuleName)); if (!Len) { TRACE(_T("LoadRealLibrary() - Fail\n")); hTortoiseGit = NIL; return; } // truncate the string at the last '\' char while(Len > 0) { --Len; if (ModuleName[Len] == '\\') { ModuleName[Len] = '\0'; break; } } if (Len == 0) { TRACE(_T("LoadRealLibrary() - Fail\n")); hTortoiseGit = NIL; return; } #ifdef _WIN64 lstrcat(ModuleName, _T("\\TortoiseGit.dll")); #else lstrcat(ModuleName, _T("\\TortoiseGit32.dll")); #endif TRACE(_T("LoadRealLibrary() - Load %s\n"), ModuleName); hTortoiseGit = LoadLibraryEx(ModuleName, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH); if (!hTortoiseGit) { TRACE(_T("LoadRealLibrary() - Fail\n")); hTortoiseGit = NIL; return; } TRACE(_T("LoadRealLibrary() - Success\n")); pDllGetClassObject = nullptr; pDllCanUnloadNow = nullptr; pDllGetClassObject = (LPFNGETCLASSOBJECT)GetProcAddress(hTortoiseGit, GetClassObject); if (!pDllGetClassObject) { TRACE(_T("LoadRealLibrary() - Fail\n")); FreeLibrary(hTortoiseGit); hTortoiseGit = NIL; return; } pDllCanUnloadNow = (LPFNCANUNLOADNOW)GetProcAddress(hTortoiseGit, CanUnloadNow); if (!pDllCanUnloadNow) { TRACE(_T("LoadRealLibrary() - Fail\n")); FreeLibrary(hTortoiseGit); hTortoiseGit = NIL; return; } }
static void LoadRealLibrary(void) { static const char GetClassObject[] = "DllGetClassObject"; static const char CanUnloadNow[] = "DllCanUnloadNow"; WCHAR ModuleName[MAX_PATH] = {0}; DWORD Len = 0; if (hTortoiseSVN) return; if (!WantRealVersion()) { TRACE(_T("LoadRealLibrary() - Bypass\n")); hTortoiseSVN = NIL; return; } Len = GetModuleFileName(hInst, ModuleName, sizeof(ModuleName)); if (!Len) { TRACE(_T("LoadRealLibrary() - Fail\n")); hTortoiseSVN = NIL; return; } // truncate the string at the last '\' char while(Len > 0) { --Len; if (ModuleName[Len] == '\\') { ModuleName[Len] = '\0'; break; } } if (Len == 0) { TRACE(_T("LoadRealLibrary() - Fail\n")); hTortoiseSVN = NIL; return; } lstrcat(ModuleName, _T("\\TortoiseSVN.dll")); TRACE(_T("LoadRealLibrary() - Load %s\n"), ModuleName); hTortoiseSVN = LoadLibraryEx(ModuleName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (!hTortoiseSVN) { TRACE(_T("LoadRealLibrary() - Fail\n")); hTortoiseSVN = NIL; return; } TRACE(_T("LoadRealLibrary() - Success\n")); pDllGetClassObject = NULL; pDllCanUnloadNow = NULL; pDllGetClassObject = (LPFNGETCLASSOBJECT)GetProcAddress(hTortoiseSVN, GetClassObject); if (pDllGetClassObject == NULL) { TRACE(_T("LoadRealLibrary() - Fail\n")); FreeLibrary(hTortoiseSVN); hTortoiseSVN = NIL; return; } pDllCanUnloadNow = (LPFNCANUNLOADNOW)GetProcAddress(hTortoiseSVN, CanUnloadNow); if (pDllCanUnloadNow == NULL) { TRACE(_T("LoadRealLibrary() - Fail\n")); FreeLibrary(hTortoiseSVN); hTortoiseSVN = NIL; return; } }