为什么Gplmpgdec(GPL MPEG-1/2 DirectShow解码器过滤器)覆盖/绕开IsDebuggerPresent?

时间:2018-06-04 22:30:42

标签: c++ winapi dll mpeg detours

Mpeg2DecFilter.cpp中,存在以下代码:

#include "detours.h"

DETOUR_TRAMPOLINE(BOOL WINAPI Real_IsDebuggerPresent(), IsDebuggerPresent);
BOOL WINAPI Mine_IsDebuggerPresent()
{
    TRACE(_T("Oops, somebody was trying to be naughty! (called IsDebuggerPresent)\n")); 
    return FALSE;
}
...snip...
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if(!fDetourInited)
    {
        DetourFunctionWithTrampoline((PBYTE)Real_IsDebuggerPresent, (PBYTE)Mine_IsDebuggerPresent);
        ...snip...
        fDetourInited = true;
    }

    return DllEntryPoint((HINSTANCE)hModule, ul_reason_for_call, 0); // "DllMain" of the dshow baseclasses;
}

我不能为我的生活找出为什么Gplmpgdec会覆盖IsDebuggerPresent以永远返回FALSE。这有什么用呢?

问题是,对我来说,由于调试器消息没有显示而导致问题,并且(有时)如果在卸载Gplmpgdec DLL时写入跟踪消息,应用程序将崩溃。

为了决定如何处理这个问题,我想我真的需要知道为什么Gplmpgdec会这样做。有关解决方案的任何建议也欢迎。我宁愿不必维护我自己的自定义Gplmpgdec库;这种维护头痛我宁愿不惜一切代价避免。有没有办法禁用绕行?

2 个答案:

答案 0 :(得分:0)

当存在调试器时,某些DirectShow过滤器实际上无法正常工作。

我不确定这是Gplmpgdec的解决方法,还是与其他钩子函数有关; ChangeDisplaySettingsEx。您可以在代码中清楚地看到对Macrovision的引用,他们可能会尝试禁用它们。

Media Player Classic / MPC-HC使用相同类型的代码,它在.exe中更有意义,然后在解码器库中。

答案 1 :(得分:0)

我也很惊讶在一个开源项目中看到此代码。

我认为这只是开发者的笑话。如果您看到该消息

  

糟糕,有人试图调皮!

对我来说,这是第二学位,也许开发人员刚刚发现了IsDebuggerPresent,并发现使用它很有趣...

我还记得在编写此编解码器时,某些视频编解码器阻止了DirectShow应用程序的调试(使用filtergraph)。也许这位开发商来自这些公司之一...

要解决此问题,您只需注释此代码,然后重新编译即可。