В принципе вопрос снят, но раз народ хотит ... Код ниже - ошибок нет Code (Text): send_mess proc lpMessage:dword LOCAL wsa_buf:WSABUF mov eax, lpMessage mov wsa_buf.buf, eax invoke lstrlen, lpMessage mov wsa_buf.len, eax invoke WSASend, Socket1, addr wsa_buf, 1, addr SendBytes, 0, NULL, NULL .if eax == SOCKET_ERROR call trans_errors_wsa .endif ret send_mess endp Код ниже - НЕ работает Code (Text): .data? wsa_buf WSABUF <?> .code send_mess proc lpMessage:dword mov eax, lpMessage mov wsa_buf.buf, eax invoke lstrlen, lpMessage mov wsa_buf.len, eax invoke WSASend, Socket1, addr wsa_buf, 1, addr SendBytes, 0, NULL, NULL .if eax == SOCKET_ERROR call trans_errors_wsa .endif ret send_mess endp Я тоже не мог понять почему такая ошибка вылетает ... Но через пару часов ... заработало (когда сунул в локал ...)
wsasend() пишет в переменную sendbytes, которая поначалу у тебя была в сегменте кода, в который по умолчанию писать нельзя, только читать (см. совет про /section:.text,EWR). Правильно будет разместить ее там, где писать можно (она же _переменная_ , соответственно, либо глобально, в сегменте данных, либо локально в функции.
nester7 Code (Text): .data? wsa_buf WSABUF <?> ... .code ... А это разве в 21 посте не сегмент данных?
leeloo Если два варианта кода отличаются только переносом wsa_buf из .data? в LOCAL, то остается только грешить на выравнивание, т.к. адреса локальных переменных автоматом выравниваются на 4, а в data нет, если перед ws_buf объявлены db\dw с суммарным размером не кратным 4. Поробуй в .data? перед wsa_buf поставить align 4 - если не поможет, тогда останется списать все на мистику или глюки компилятора