Перехват WSARecv.

Discussion in 'WASM.NETWORKS' started by blast, Aug 13, 2008.

  1. blast

    blast New Member

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

    s0larian New Member

    Blog Posts:
    0
    Joined:
    Jul 15, 2004
    Messages:
    489
    Location:
    Крыжёпполь
    Эта... а ты правильно вызываешь ф-цию? Socket должен быть в connected состоянии, и указатель sockaddr обычно показывает на stack. Если ж ты просто используешь место в секции данных, то получишь race condition т.к. несколько потоков вызывают ф-цию одновременно.

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

    blast New Member

    Blog Posts:
    0
    Joined:
    Mar 8, 2008
    Messages:
    170
    х3 почему не работало, проблема решилась вызовом getpeername немного в другом месте..
     
  4. integer

    integer New Member

    Blog Posts:
    0
    Joined:
    Jan 2, 2007
    Messages:
    62
    Internet Explorer проверяет WSAGetLastError после вызова WSARecv, поэтому сохраняй это значение, а после getpeername восстанавливай функцией WSASetLastError

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