0

我正在使用以下代码:

bool DllGuard()
{
    HKEY keyHandle;
    bool rgValue = bool();
    DWORD Size;
    DWORD Type;

    try
    {
        if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\MSB", 0, KEY_QUERY_VALUE, &keyHandle) == ERROR_SUCCESS)
        {
            Type = REG_DWORD;

            Size = sizeof(DWORD);

            RegQueryValueEx(keyHandle, "DllGuard", NULL, &Type, (LPBYTE)rgValue,&Size);
        }     

        RegCloseKey(keyHandle);

        if (rgValue == false)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    catch (...)
    {
        return false;
    }
}

BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpReserved)
{
    if(fdwReason == DLL_PROCESS_ATTACH)
    {
        if (DllGuard())
        {
            DisableThreadLibraryCalls(hInstance);
            CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&Main, NULL, 0, NULL);
        }
        else
        {
            exit(0);
        }
    }
    return TRUE;
}

第一次工作正常,因此在 DllMain 中创建了线程。

第二次,它不起作用,因为即使注册表项设置为 true,它仍会在 DllMain 中创建线程。

帮助!

谢谢!

4

2 回答 2

1

(LPBYTE)rgValue应该是(LPBYTE)&rgValue,因为你想传递一个指针(所以rgValue由 . 修改RegQueryValueEx。它应该是DWORD rgValue而不是bool(也许你知道它们恰好大小相同,但更难阅读)。

此外,检查 的返回值也很棒,RegQueryValueEx这样下次失败时我们就有机会知道出了什么问题。(如果您不知道如何处理故障,可以用 , 写一些东西OutputDebugString,以便在 sysinternals' 中看到dbgview.exe)。

于 2013-02-03T22:41:18.757 回答
0

我无法发表评论,但我认为重要的是要知道,除非您知道自己在做什么,否则根本不应该考虑使用 DLLMain... 看看DllMain 入口点的 MSDN 页面

警告 您可以在 DLL 入口点执行的操作受到严格限制。要提供更复杂的初始化,请为 DLL 创建一个初始化例程。您可以要求应用程序在调用 DLL 中的任何其他例程之前调用初始化例程。

或者你可以害怕。非常害怕

于 2013-11-06T14:22:59.803 回答