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 にスレッドが作成されます。

2 回目は、レジストリ キーが 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 に答える