DLL_PROCESS_ATTACH не выполняется в Windows 7 C++

Я пытаюсь загрузить файл .dll и отображать окно сообщения при загрузке. Насколько я понимаю, после загрузки .dll он вызывает dllmain() и переключается на опцию DLL_PROCESS_ATTACH. Я написал код как для .dll, так и для .exe, который его загружает. .exe может загрузить его правильно и распечатать адрес, по которому была загружена dll, но я не вижу отображаемого окна сообщения. Я где-то читал на Microsoft.com, что dll входит в «блокировку» при загрузке, чтобы предотвратить выполнение определенных функций или кода в целях безопасности. Блокирует ли эта функция отображение окна сообщения? Есть ли обходной путь, такой как повышенные привилегии, система и т. Д.? Я не уверен, что DEP тоже имеет какой-либо эффект, я установил его только для защиты критических процессов Windows.

Процесс вызова:

#include <iostream>
#include <windows.h>
int main()
{
    HMODULE hDll = LoadLibraryA("dll.dll");
    if (hDll == NULL)
        std::cerr << "Unable to load dll";
    else
        std::cout << "Dll loaded @ " << hDll;
    FreeLibrary(hDll);
}

DLL-файл:

#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            MessageBox(NULL, "Dll has been loaded.", "Loaded", MB_OK);
            break;
    }
    return TRUE;
}

Я думаю, что это могло бы помочь мне, если бы у меня был способ запустить .dll через отладчик и посмотреть, что MessageBox() вернуло, но я не уверен, как это сделать. Спасибо!


person llk    schedule 19.12.2011    source источник
comment
Это просто предположение, но вы фактически ничего не делаете с DLL, кроме как загрузить ее по имени — вы можете обнаружить, что Windows лениво вызывает DllMain в первый раз, когда вы делаете что-то существенное с библиотекой.   -  person ta.speot.is    schedule 19.12.2011
comment
@coolcoder: Вы правы, что использование отладчика поможет.   -  person bk1e    schedule 19.12.2011


Ответы (2)


Рэймонд Чен говорит об этом в своей записи в блоге под названием Некоторые причины не делать ничего страшного в вашей DllMain:

И абсолютно ни при каких обстоятельствах вы не должны делать что-то настолько безумное, как создание окна внутри вашей DLL_PROCESS_ATTACH. В дополнение к проблемам сходства потоков существует проблема глобальных перехватчиков. Хуки, работающие внутри блокировки загрузчика, — прямой путь к катастрофе. Не удивляйтесь, если ваша машина заблокируется.

person Greg Hewgill    schedule 19.12.2011

В дополнение к сообщению в блоге Greg ссылки на есть несколько других информативных сообщений о блокировка загрузчика и прочее вы должны не делать в DllMain.

Как правило, вы должны вызывать только функции в kernel32, которые не создают потоки/окна, не используют COM или вызывают LoadLibrary (или другие функции, включающие блокировку загрузчика).

Разумный список безопасных вещей, ИМХО, будет следующим: DisableThreadLibraryCalls, Tls*, InitializeCriticalSection и в вашем случае (для целей отладки); ВыводОтладочнаяСтрока

person Anders    schedule 19.12.2011