Обнаружение, была ли инициализация CRT сделана во введенном процессе


Я работаю над приложением, которое внедряет dll при запуске процесса (Suspend -> Inject -> Resume) Самый первый вызов в DllMain с DLL_PROCESS_ATTACH (в dll, который я ввел) - это вызов MessageBox() (просто в целях отладки). Однако этот вызов MessageBox () иногда выдает ошибку и приводит к сбою внедренного процесса.

Ошибка выполнения!
Программа: C: \ Program Files \ Microsoft Office \ Office14 \ OUTLOOK.EXE

R6030
- CRT не инициализирован

Это воспроизводимо с Outlook и Winword, например. Хоть Notepad, IE, CMD, Calc и многие другие - распечатайте окно сообщения и продолжайте в обычном режиме.

Печать окна сообщения не обязательна для меня, поэтому я просто хочу иметь возможность проверить, выполняла ли CRT инициализацию или нет, поэтому обычно я могу продолжать, как это:

case DLL_PROCESS_ATTACH:
     if (IsCRTInitialized())
        MessageBox(...);

Пожалуйста, дайте мне знать, если какая-то информация отсутствует. Спасибо!

2 ответа

Kernel32.dll гарантированно загружается в адресное пространство процесса при вызове функции точки входа DLLMain. MessageBox находится в user32.dll, и в соответствии с рекомендациями по созданию функций вызова DLL из user32.dll строго запрещено.

Вы также можете

  1. Вызовите OutputDebugString для любой трассировки отладчика. Эта функция находится в kernel32.dll и должна быть безопасна для вызова.

  2. Перед тем, как ваше приложение загрузит любые другие dll, вызовите MessageBox самостоятельно. Это гарантирует, что user32.dll и его зависимости уже загружены. Таким образом, вызов MessageBox в DllMain может иметь больше шансов на успех. Но ваш пробег может отличаться.

Проблема не в ЭЛТ. Вам не разрешено звонить MessageBox или любая другая нетривиальная функция из DllMain

Другие вопросы по тегам