Re: hook HttpSendRequest + DELPHI
От: Alexander G Украина  
Дата: 07.09.11 20:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>приветствую!


А>Я перехватываю функцию HttpSendRequestW из WinInet в IE9 , наблюдаю мистическое поведение

А>Код выглядит так:
А>
А>var
А>  HttpSendRequestWhook: THttpSendRequestW;

А>function HttpSendRequestWHookProc(hRequest: HINTERNET; lpszHeaders: PWideChar;
А>                                  dwHeadersLength: DWORD; lpOptional: Pointer;
А>                                  dwOptionalLength: DWORD): BOOL; stdcall;
А>var
А>  wsTmp: WideString;
А>begin
А>  OutputDebugStringA('[HttpSendRequestWHookProc]');
А>//  wsTmp := '11';

А>  Result := HttpSendRequestWhook(hRequest, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength);
А>end;

А>begin
А>  OutputDebugString('Dll Main');
А>  @HttpSendRequestWhook := HookCode(GetProcAddress(LoadLibrary('WinInet.dll'), 'HttpSendRequestW'), @HttpSendRequestWHookProc);
А>end.
А>


А>Если в HttpSendRequestWHookProc делать какие-то действия, например, OutputDebugStringW(lpszHeaders); или еще чего — всё ок. А вот если убрать комментарий с wsTmp := '11' — IE начнёт возвращать Internet Explorer cannot display the webpage!!


А>Я грешил на менеджер памяти, попробовал подключить FastMM — пофигу. Пробовал отлаживать, но проблему найти так и не удалось.

А>Кто постарше, посоветуйте как искать причину или помогите разобраться, пожалуйста..

А>Спасибо!


Если делать действия в HttpSendRequestWHookProc, они могут изменить GetLastError()-значение в TEB.
wsTmp := '11'; приводит у вызову SysFreeString с ненулевым параметром при достижении end, оно делает SetLastError(0);

решение — аккуратно сохранять значение LastError, полученное после вызова оригинальной функции и восстанавливать его перед возвратом. при использовании строк WideString — использовать восстановление LastError после освобождение Wide-строк, т.к. в некоторых случаях именно ненулевой LastError будет тем что нужно.
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.