Перехватываю WSARecv в процессе браузера, обработчик подменяет адрес возврата из WSARecv на наш, обработчик WSARecvRet передает управление на оригинальный Ret адрес, все отлично работает, но стоит только вызвать в обработчике WSARecvRet getpeername, браузер перестаёт нормально функционировать, со стеком все норм (я его не нарушаю и вообще нечего туда не записываю смотрел под отладчиком), с параметрами которые передаются в getpeername тоже все норм и она возвращает правильные значения, вопрос что происходит с браузером почему не работает, либо как определить хост к которому подконекчен сокет имея его дескриптор, не использую getpeername если трабл в ней?
Эта... а ты правильно вызываешь ф-цию? Socket должен быть в connected состоянии, и указатель sockaddr обычно показывает на stack. Если ж ты просто используешь место в секции данных, то получишь race condition т.к. несколько потоков вызывают ф-цию одновременно. Код (Text): int getpeername( __in SOCKET s, __out struct sockaddr *name, __inout int *namelen );
Internet Explorer проверяет WSAGetLastError после вызова WSARecv, поэтому сохраняй это значение, а после getpeername восстанавливай функцией WSASetLastError Код (Text): ; Тут вызов реальной функции invoke WSAGetLastError mov dwErr,eax invoke getpeername... invoke WSASetLastError,dwErr