Перехват WSARecv.

Тема в разделе "WASM.NETWORKS", создана пользователем blast, 13 авг 2008.

  1. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Перехватываю WSARecv в процессе браузера, обработчик подменяет адрес возврата из WSARecv на наш, обработчик WSARecvRet передает управление на оригинальный Ret адрес, все отлично работает, но стоит только вызвать в обработчике WSARecvRet getpeername, браузер перестаёт нормально функционировать, со стеком все норм (я его не нарушаю и вообще нечего туда не записываю смотрел под отладчиком), с параметрами которые передаются в getpeername тоже все норм и она возвращает правильные значения, вопрос что происходит с браузером почему не работает, либо как определить хост к которому подконекчен сокет имея его дескриптор, не использую getpeername если трабл в ней?
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Эта... а ты правильно вызываешь ф-цию? Socket должен быть в connected состоянии, и указатель sockaddr обычно показывает на stack. Если ж ты просто используешь место в секции данных, то получишь race condition т.к. несколько потоков вызывают ф-цию одновременно.

    Код (Text):
    1. int getpeername(
    2.   __in     SOCKET s,
    3.   __out    struct sockaddr *name,
    4.   __inout  int *namelen
    5. );
     
  3. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    х3 почему не работало, проблема решилась вызовом getpeername немного в другом месте..
     
  4. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    Internet Explorer проверяет WSAGetLastError после вызова WSARecv, поэтому сохраняй это значение, а после getpeername восстанавливай функцией WSASetLastError

    Код (Text):
    1. ; Тут вызов реальной функции
    2.  
    3. invoke  WSAGetLastError
    4. mov     dwErr,eax
    5.  
    6. invoke  getpeername...
    7.  
    8. invoke  WSASetLastError,dwErr