Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2013, 22:45   #1
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию Перехват WSARecv

Добрый день. Возникла ошибка при перехвате функции WSARecv. При перехвате её в процессе Хрома, таким образом, всё происходит нормально:
Код:
function InterceptedWSARecv(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;var lpNumberOfBytesRecvd: DWORD; dwFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
type
  TrueWSARecv = function(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;
    var lpNumberOfBytesRecvd: DWORD; dwFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;
    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
begin
  // снимаем перехват
 ...
  Result := TrueWSARecv(FuncAddr)(s, lpBuffers,dwBufferCount, lpNumberOfBytesRecvd, dwFlags,lpOverlapped, lpCompletionRoutine);
  // восстанавливаем перехват
...
end
Но стоит написать в коде, например, вывод перехваченного буфера в файл, то получаю Result := -1 (INVALID_SOCKET) и WSAGetLastError = 1784.

Код:
function InterceptedWSARecv(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;var lpNumberOfBytesRecvd: DWORD; dwFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
type
  TrueWSARecv = function(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;
    var lpNumberOfBytesRecvd: DWORD; dwFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;
    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
begin
  // снимаем перехват
 ...
  Result := TrueWSARecv(FuncAddr)(s, lpBuffers,dwBufferCount, lpNumberOfBytesRecvd, dwFlags,lpOverlapped, lpCompletionRoutine);
  // восстанавливаем перехват
  WriteToFile('путь', lpBuffers.buf, lpNumberOfBytesRecvd);
end;
При этом перехватывая в других браузерах (Opera, FF, ...) всё нормально. Никто не сталкивался с подобным?

DLL прикрепил.
Вложения
Тип файла: rar Splice.rar (103.2 Кб, 22 просмотров)
hiho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват Miha85193 Общие вопросы Delphi 2 23.05.2012 13:16
Перехват. egorzenit Общие вопросы Delphi 3 29.03.2012 15:19
Перехват сообщений -Flasher- Общие вопросы Delphi 5 15.03.2010 12:44
Перехват функций 123321 Общие вопросы C/C++ 5 15.02.2009 10:54
Перехват NtTerminateProcess Terran Win Api 4 12.12.2008 22:09