Commit 54a39d57 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

ws2_32: Add more status codes to NtStatusToWSAError().

parent a64861fb
......@@ -972,35 +972,88 @@ static NTSTATUS sock_error_to_ntstatus( DWORD err )
}
}
static DWORD NtStatusToWSAError( DWORD status )
{
switch ( status )
{
case STATUS_SUCCESS: return 0;
case STATUS_PENDING: return WSA_IO_PENDING;
case STATUS_INVALID_HANDLE:
case STATUS_OBJECT_TYPE_MISMATCH: return WSAENOTSOCK;
case STATUS_INVALID_PARAMETER: return WSAEINVAL;
case STATUS_PIPE_DISCONNECTED: return WSAESHUTDOWN;
case STATUS_NETWORK_BUSY: return WSAEALREADY;
case STATUS_NETWORK_UNREACHABLE: return WSAENETUNREACH;
case STATUS_CONNECTION_REFUSED: return WSAECONNREFUSED;
case STATUS_INVALID_CONNECTION: return WSAENOTCONN;
case STATUS_CONNECTION_RESET: return WSAECONNRESET;
case STATUS_CONNECTION_ABORTED: return WSAECONNABORTED;
case STATUS_CANCELLED: return WSA_OPERATION_ABORTED;
case STATUS_SHARING_VIOLATION: return WSAEADDRINUSE;
case STATUS_IO_TIMEOUT:
case STATUS_TIMEOUT: return WSAETIMEDOUT;
case STATUS_ACCESS_VIOLATION: return WSAEFAULT;
case STATUS_ACCESS_DENIED: return WSAEACCES;
case STATUS_TOO_MANY_OPENED_FILES: return WSAEMFILE;
case STATUS_DEVICE_NOT_READY: return WSAEWOULDBLOCK;
case STATUS_BUFFER_OVERFLOW: return WSAEMSGSIZE;
case STATUS_NOT_SUPPORTED: return WSAEOPNOTSUPP;
case STATUS_HOST_UNREACHABLE: return WSAEHOSTUNREACH;
default: return RtlNtStatusToDosError( status );
static DWORD NtStatusToWSAError( NTSTATUS status )
{
static const struct
{
NTSTATUS status;
DWORD error;
}
errors[] =
{
{STATUS_PENDING, ERROR_IO_PENDING},
{STATUS_BUFFER_OVERFLOW, WSAEMSGSIZE},
{STATUS_NOT_IMPLEMENTED, WSAEOPNOTSUPP},
{STATUS_ACCESS_VIOLATION, WSAEFAULT},
{STATUS_PAGEFILE_QUOTA, WSAENOBUFS},
{STATUS_INVALID_HANDLE, WSAENOTSOCK},
{STATUS_NO_SUCH_DEVICE, WSAENETDOWN},
{STATUS_NO_SUCH_FILE, WSAENETDOWN},
{STATUS_NO_MEMORY, WSAENOBUFS},
{STATUS_CONFLICTING_ADDRESSES, WSAENOBUFS},
{STATUS_ACCESS_DENIED, WSAEACCES},
{STATUS_BUFFER_TOO_SMALL, WSAEFAULT},
{STATUS_OBJECT_TYPE_MISMATCH, WSAENOTSOCK},
{STATUS_OBJECT_NAME_NOT_FOUND, WSAENETDOWN},
{STATUS_OBJECT_PATH_NOT_FOUND, WSAENETDOWN},
{STATUS_SHARING_VIOLATION, WSAEADDRINUSE},
{STATUS_QUOTA_EXCEEDED, WSAENOBUFS},
{STATUS_TOO_MANY_PAGING_FILES, WSAENOBUFS},
{STATUS_INSUFFICIENT_RESOURCES, WSAENOBUFS},
{STATUS_WORKING_SET_QUOTA, WSAENOBUFS},
{STATUS_DEVICE_NOT_READY, WSAEWOULDBLOCK},
{STATUS_PIPE_DISCONNECTED, WSAESHUTDOWN},
{STATUS_IO_TIMEOUT, WSAETIMEDOUT},
{STATUS_NOT_SUPPORTED, WSAEOPNOTSUPP},
{STATUS_REMOTE_NOT_LISTENING, WSAECONNREFUSED},
{STATUS_BAD_NETWORK_PATH, WSAENETUNREACH},
{STATUS_NETWORK_BUSY, WSAENETDOWN},
{STATUS_INVALID_NETWORK_RESPONSE, WSAENETDOWN},
{STATUS_UNEXPECTED_NETWORK_ERROR, WSAENETDOWN},
{STATUS_REQUEST_NOT_ACCEPTED, WSAEWOULDBLOCK},
{STATUS_CANCELLED, ERROR_OPERATION_ABORTED},
{STATUS_COMMITMENT_LIMIT, WSAENOBUFS},
{STATUS_LOCAL_DISCONNECT, WSAECONNABORTED},
{STATUS_REMOTE_DISCONNECT, WSAECONNRESET},
{STATUS_REMOTE_RESOURCES, WSAENOBUFS},
{STATUS_LINK_FAILED, WSAECONNRESET},
{STATUS_LINK_TIMEOUT, WSAETIMEDOUT},
{STATUS_INVALID_CONNECTION, WSAENOTCONN},
{STATUS_INVALID_ADDRESS, WSAEADDRNOTAVAIL},
{STATUS_INVALID_BUFFER_SIZE, WSAEMSGSIZE},
{STATUS_INVALID_ADDRESS_COMPONENT, WSAEADDRNOTAVAIL},
{STATUS_TOO_MANY_ADDRESSES, WSAENOBUFS},
{STATUS_ADDRESS_ALREADY_EXISTS, WSAEADDRINUSE},
{STATUS_CONNECTION_DISCONNECTED, WSAECONNRESET},
{STATUS_CONNECTION_RESET, WSAECONNRESET},
{STATUS_TRANSACTION_ABORTED, WSAECONNABORTED},
{STATUS_CONNECTION_REFUSED, WSAECONNREFUSED},
{STATUS_GRACEFUL_DISCONNECT, WSAEDISCON},
{STATUS_CONNECTION_ACTIVE, WSAEISCONN},
{STATUS_NETWORK_UNREACHABLE, WSAENETUNREACH},
{STATUS_HOST_UNREACHABLE, WSAEHOSTUNREACH},
{STATUS_PROTOCOL_UNREACHABLE, WSAENETUNREACH},
{STATUS_PORT_UNREACHABLE, WSAECONNRESET},
{STATUS_REQUEST_ABORTED, WSAEINTR},
{STATUS_CONNECTION_ABORTED, WSAECONNABORTED},
{STATUS_DATATYPE_MISALIGNMENT_ERROR,WSAEFAULT},
{STATUS_HOST_DOWN, WSAEHOSTDOWN},
{0x80070000 | ERROR_IO_INCOMPLETE, ERROR_IO_INCOMPLETE},
{0xc0010000 | ERROR_IO_INCOMPLETE, ERROR_IO_INCOMPLETE},
{0xc0070000 | ERROR_IO_INCOMPLETE, ERROR_IO_INCOMPLETE},
};
unsigned int i;
for (i = 0; i < ARRAY_SIZE(errors); ++i)
{
if (errors[i].status == status)
return errors[i].error;
}
return NT_SUCCESS(status) ? RtlNtStatusToDosErrorNoTeb(status) : WSAEINVAL;
}
/* set last error code from NT status without mapping WSA errors */
......@@ -5871,7 +5924,7 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol,
IOCTL_AFD_CREATE, &create_params, sizeof(create_params), NULL, 0)))
{
WARN("Failed to initialize socket, status %#x.\n", status);
err = NtStatusToWSAError(status);
err = RtlNtStatusToDosError( status );
if (err == WSAEACCES) /* raw socket denied */
{
if (type == SOCK_RAW)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment