Как правильно подключить WinInet к нескольким потокам?

Я написал BHO для Internet Explorer, который перехватывает WinInet для изменения некоторых HTTP-запросов от IE путем перенаправления их на внутренний сервер.

Он прекрасно работает, когда я открываю первые 3 вкладки в IE, поскольку для каждой вкладки создается новый процесс iexplore.exe, каждая из которых загружает BHO.

Проблемы возникают, когда имеется более 4 вкладок: вместо создания нового процесса iexplore.exe существующие процессы повторно используются в другом потоке. Я могу подключить один и тот же процесс несколько раз (по 1 на поток) или только один раз. В обоих случаях происходит сбой при закрытии вкладок.

Пример: открыть вкладки 1 (отдельный iepxlore.exe), 2 (отдельный iepxlore.exe), 3 (отдельный iepxlore.exe) и 4 (поделиться iexplore с вкладкой 1). Закрыть вкладку 1. Обновить вкладку 4, IE вылетает внутри NDTDLL.DLL. Сбой происходит, если я ничего не делаю внутри подключенного WinInet.ddl (просто вызовите старую функцию)

Если я подключаю WinInet только один раз для каждого процесса iexplore.exe, я не могу перехватывать запросы на всех вкладках.

Мне интересно, как лучше поступить. Все примеры, которые я нашел до сих пор, предполагают, что на одну вкладку приходится 1 процесс iexpolore.exe.

Код хука WinInet основан на Пример кода проекта, Я просто подключаю меньше функций.

Похоже, указатель на старую функцию WinInet или на ту, которую я создал, больше не действует.

2

Решение

Если вы взяли большую часть примера кода с codeproject.com, у вас возникла серьезная проблема очистки.

Так вот что происходит:

  1. Когда вы открываете вкладку, ваш BHO загружается.
  2. Объект g_oHook (статический) инициализируется. Его инициализация устанавливает хуки во всех модулях (то есть во всех других DLL, находящихся в данный момент в процессе).
  3. Под настройкой hook я подразумеваю изменение записей в IAT (таблица адресов импорта). Теперь они указывают на ваши функции в DLL (помните: когда вы делаете вызов из одной DLL в другую DLL, вы проходите через IAT (
  4. Затем вы закрываете вкладку. Ваша DLL выгружается.
  5. Адреса в IAT ntdll.dll по-прежнему указывают на пространство памяти в старом месте вашей собственной DLL, которого сейчас нет. В первый раз, когда IE пытается вызвать одну из этих функций, вы получаете ошибку

Для исправления необходимо реализовать логику очистки при уничтожении CWininetHook :: ~ CWininetHook. Просто сделайте то, что делает конструктор, и верните исходный адрес.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]