Вопрос, с которым вы столкнулись, связан с отладкой процесса Explorer.exe в среде Delphi 7 с использованием функций отладчика Windows. Вы запустили экземпляр Explorer.exe с флагами NORMAL_PRIORITY_CLASS, DEBUG_PROCESS и DEBUG_ONLY_THIS_PROCESS, после чего начали цикл ожидания событий отладки, используя функцию WaitForDebugEvent. Однако в процессе отладки вы сталкиваетесь с большим количеством событий EXCEPTION_DEBUG_EVENT, генерируемых модулем rpcrt4.dll, и ошибками доступа к памяти (EXCEPTION_ACCESS_VIOLATION).
Подробности проблемы
Ваш код на Object Pascal для отладки процесса выглядит следующим образом:
procedure FakeDebugProcess;
var
wDebugEvent: DEBUG_EVENT;
begin
FillChar(wDebugEvent, SizeOf(wDebugEvent), 0);
repeat
if WaitForDebugEvent(wDebugEvent, INFINITE) then
begin
if wDebugEvent.dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT then
break;
ContinueDebugEvent(wDebugEvent.dwProcessId, wDebugEvent.dwThreadId, DBG_CONTINUE);
end;
until False;
end;
Вы ожидаете, что код будет корректно продолжать работу процесса, но вместо этого получаете большое количество исключений, которые делают Explorer.exe неработоспособным.
Предложенное решение
Из контекста вашего вопроса видно, что вы уже нашли возможное решение проблемы. Вы предложили изменить логику обработки событий отладки следующим образом:
// ...
if wDebugEvent.dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT then
break;
ContinueDebugEvent(wDebugEvent.dwProcessId, wDebugEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
// ...
Согласно документации MSDN, использование DBG_EXCEPTION_NOT_HANDLED позволяет продолжить обработку исключения. Это может быть полезно, если исключение является первым шансом для обработчика структурированных исключений.
Однако, несмотря на изменения в коде, Explorer.exe по-прежнему завершается с ошибкой "The application failed to initialize properly (0x80000003)".
Альтернативный подход
В альтернативном ответе выдвигается гипотеза, что проблема может быть не в вашем коде, а в самом процессе Explorer.exe, который пытается работать с некорректными расширениями оболочки. Рекомендуется использовать утилиту SysInternals' Autoruns для отключения нежелательных расширений оболочки.
Подтвержденное решение
В подтвержденном ответе указывается, что ваш код корректен, и проблема может быть связана с самим модулем rpcrt4.dll, который генерирует исключения при попытке подключения отладчика. Рекомендуется определить фильтры, которые будут игнорировать исключения, связанные с этим модулем.
Пример кода с фильтрацией исключений
// Псевдокод для демонстрации фильтрации исключений
if (ExceptionCode = EXCEPTION_ACCESS_VIOLATION) and
(EIP >= (UINT_PTR)GetModuleHandle("rpcrt4.dll")) and
(EIP <= (UINT_PTR)GetModuleHandle("rpcrt4.dll") + GetModuleSize("rpcrt4.dll")) then
ContinueDebugEvent(DBG_CONTINUE)
else
ContinueDebugEvent(DBG_EXCEPTION_NOT_HANDLED);
Заключение
Для решения проблемы доступа к недопустимым областям памяти при отладке Explorer.exe в Delphi 7, необходимо тщательно проработать логику фильтрации исключений. Это позволит игнорировать нежелательные события отладки, связанные с определенными модулями, и продолжить работу отладчика без блокировки основного процесса.
Обратите внимание, что для реализации фильтрации вам может потребоваться использование дополнительных функций и, возможно, настройки хуков в ядро операционной системы.
Отладка Explorer.exe в Delphi 7 требует тщательного подхода к фильтрации исключений для предотвращения ошибок доступа к памяти.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.