Example #1
0
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;
    }
}
Example #2
0
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;
    }
}