Обнаружение, была ли инициализация 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 строго запрещено.
Вы также можете
Вызовите OutputDebugString для любой трассировки отладчика. Эта функция находится в kernel32.dll и должна быть безопасна для вызова.
Перед тем, как ваше приложение загрузит любые другие dll, вызовите MessageBox самостоятельно. Это гарантирует, что user32.dll и его зависимости уже загружены. Таким образом, вызов MessageBox в DllMain может иметь больше шансов на успех. Но ваш пробег может отличаться.
Проблема не в ЭЛТ. Вам не разрешено звонить MessageBox
или любая другая нетривиальная функция из DllMain