Обнаружение, была ли инициализация CRT была сделана во внедренном процессе - PullRequest
3 голосов
/ 22 ноября 2011


Я работаю над приложением, которое внедряет 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 ]

3 голосов
/ 22 ноября 2011

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

Для любой трассировки отладчика вы можете либо

  1. Call OutputDebugString Эта функция находится в kernel32.dll и ее можно безопасно вызывать.

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

2 голосов
/ 22 ноября 2011

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

...