/* Get the Socket Structure associated to this Socket */
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Allocate the Async Data Structure to pass on to the Thread later */
AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(*AsyncData));
/* Deactive WSPEventSelect */
if (Socket->SharedData.AsyncEvents)
{
- WSPEventSelect(Handle, NULL, 0, NULL);
+ if (WSPEventSelect(Handle, NULL, 0, lpErrno) == SOCKET_ERROR)
+ {
+ HeapFree(GetProcessHeap(), 0, AsyncData);
+ return SOCKET_ERROR;
+ }
}
/* Create the Asynch Thread if Needed */
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
}
/* Re-enable Async Event */
- if (*ReceiveFlags == MSG_OOB)
+ if (*ReceiveFlags & MSG_OOB)
{
SockReenableAsyncSelectEvent(Socket, FD_OOB);
}
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
if (Status == STATUS_PENDING)
{
AFD_DbgPrint(MID_TRACE,("Leaving (Pending)\n"));
- return WSA_IO_PENDING;
+ return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent);
}
/* Re-enable Async Event */
PVOID APCFunction;
HANDLE Event = NULL;
PTRANSPORT_ADDRESS RemoteAddress;
- UCHAR TdiBuffer[0x16];
- PSOCKADDR BindAddress;
+ PSOCKADDR BindAddress = NULL;
INT BindAddressLength;
HANDLE SockEvent;
PSOCKET_INFORMATION Socket;
-
- /* Get the Socket Structure associate to this Socket*/
+ /* Get the Socket Structure associate to this Socket */
Socket = GetSocketStructure(Handle);
-
- Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
- NULL, 1, FALSE );
-
- if( !NT_SUCCESS(Status) )
- return -1;
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Bind us First */
if (Socket->SharedData.State == SocketOpen)
BindAddress = HeapAlloc(GlobalHeap, 0, BindAddressLength);
if (!BindAddress)
{
- MsafdReturnWithErrno( STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL );
+ MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL);
return INVALID_SOCKET;
}
- Socket->HelperData->WSHGetWildcardSockaddr (Socket->HelperContext,
- BindAddress,
- &BindAddressLength);
+ Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext,
+ BindAddress,
+ &BindAddressLength);
/* Bind it */
- WSPBind(Handle, BindAddress, BindAddressLength, NULL);
+ if (WSPBind(Handle, BindAddress, BindAddressLength, lpErrno) == SOCKET_ERROR)
+ return SOCKET_ERROR;
+ }
+
+ RemoteAddress = HeapAlloc(GlobalHeap, 0, 0x6 + SocketAddressLength);
+ if (!RemoteAddress)
+ {
+ if (BindAddress != NULL)
+ {
+ HeapFree(GlobalHeap, 0, BindAddress);
+ }
+ return MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL);
+ }
+
+ Status = NtCreateEvent(&SockEvent,
+ GENERIC_READ | GENERIC_WRITE,
+ NULL, 1, FALSE);
+
+ if (!NT_SUCCESS(Status))
+ {
+ HeapFree(GlobalHeap, 0, RemoteAddress);
+ if (BindAddress != NULL)
+ {
+ HeapFree(GlobalHeap, 0, BindAddress);
+ }
+ return SOCKET_ERROR;
}
/* Set up Address in TDI Format */
- RemoteAddress = (PTRANSPORT_ADDRESS)TdiBuffer;
RemoteAddress->TAAddressCount = 1;
RemoteAddress->Address[0].AddressLength = SocketAddressLength - sizeof(SocketAddress->sa_family);
RtlCopyMemory(&RemoteAddress->Address[0].AddressType, SocketAddress, SocketAddressLength);
SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
SendInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0;
SendInfo.BufferCount = dwBufferCount;
- SendInfo.RemoteAddress = RemoteAddress;
- SendInfo.SizeOfRemoteAddress = Socket->HelperData->MaxTDIAddressLength;
+ SendInfo.TdiConnection.RemoteAddress = RemoteAddress;
+ SendInfo.TdiConnection.RemoteAddressLength = Socket->HelperData->MaxTDIAddressLength;
/* Verifiy if we should use APC */
if (lpOverlapped == NULL)
else
{
/* Using Overlapped Structure and a Completition Routine, so use an APC */
- APCFunction = NULL; // should be a private io completition function inside us
+ /* Should be a private io completition function inside us */
+ APCFunction = NULL;
APCContext = lpCompletionRoutine;
SendInfo.AfdFlags |= AFD_SKIP_FIO;
}
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
- APCFunction,
- APCContext,
- IOSB,
- IOCTL_AFD_SEND_DATAGRAM,
- &SendInfo,
- sizeof(SendInfo),
- NULL,
- 0);
+ Event,
+ APCFunction,
+ APCContext,
+ IOSB,
+ IOCTL_AFD_SEND_DATAGRAM,
+ &SendInfo,
+ sizeof(SendInfo),
+ NULL,
+ 0);
/* Wait for completition of not overlapped */
if (Status == STATUS_PENDING && lpOverlapped == NULL)
{
- WaitForSingleObject(SockEvent, INFINITE); // BUGBUG, shouldn wait infintely for send...
+ /* BUGBUG, shouldn't wait infintely for send... */
+ WaitForSingleObject(SockEvent, INFINITE);
Status = IOSB->Status;
}
- NtClose( SockEvent );
-
- if (Status == STATUS_PENDING)
- return WSA_IO_PENDING;
-
+ NtClose(SockEvent);
+ HeapFree(GlobalHeap, 0, RemoteAddress);
+ if (BindAddress != NULL)
+ {
+ HeapFree(GlobalHeap, 0, BindAddress);
+ }
- /* Re-enable Async Event */
- SockReenableAsyncSelectEvent(Socket, FD_WRITE);
+ if (Status != STATUS_PENDING)
+ SockReenableAsyncSelectEvent(Socket, FD_WRITE);
- return MsafdReturnWithErrno ( Status, lpErrno, IOSB->Information, lpNumberOfBytesSent );
+ return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent);
}
+
INT
WSPAPI
WSPRecvDisconnect(IN SOCKET s,