DLL_PROCESS_ATTACH не удалось выполнить в Windows 7 C ++ - PullRequest
2 голосов
/ 19 декабря 2011

Я пытаюсь загрузить файл .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(), но я не уверен, как это сделать. Спасибо!

Ответы [ 2 ]

5 голосов
/ 19 декабря 2011

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

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

1 голос
/ 19 декабря 2011

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

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

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

...