diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index 97e82f867e1..a8ab0dc4969 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -566,7 +566,7 @@ WSPCloseSocket(IN SOCKET Handle, NtClose((HANDLE)Handle); NtClose(SockEvent); - return NO_ERROR; + return MsafdReturnWithErrno(Status, lpErrno, 0, NULL); } @@ -666,13 +666,17 @@ WSPBind(SOCKET Handle, Status = IOSB.Status; } + NtClose( SockEvent ); + HeapFree(GlobalHeap, 0, BindData); + + if (Status != STATUS_SUCCESS) + return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL ); + /* Set up Socket Data */ Socket->SharedData.State = SocketBound; Socket->TdiAddressHandle = (HANDLE)IOSB.Information; - NtClose( SockEvent ); - HeapFree(GlobalHeap, 0, BindData); - if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_BIND)) + if (Socket->HelperEvents & WSH_NOTIFY_BIND) { Status = Socket->HelperData->WSHNotify(Socket->HelperContext, Socket->Handle, @@ -739,14 +743,17 @@ WSPListen(SOCKET Handle, { WaitForSingleObject(SockEvent, INFINITE); Status = IOSB.Status; - } + } + + NtClose( SockEvent ); + + if (Status != STATUS_SUCCESS) + return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL ); /* Set to Listening */ Socket->SharedData.Listening = TRUE; - NtClose( SockEvent ); - - if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_LISTEN)) + if (Socket->HelperEvents & WSH_NOTIFY_LISTEN) { Status = Socket->HelperData->WSHNotify(Socket->HelperContext, Socket->Handle, @@ -907,6 +914,7 @@ WSPSelect(int nfds, if (Status == STATUS_PENDING) { WaitForSingleObject(SockEvent, INFINITE); + Status = IOSB.Status; } /* Clear the Structures */ @@ -1440,6 +1448,9 @@ WSPConnect(SOCKET Handle, WaitForSingleObject(SockEvent, INFINITE); Status = IOSB.Status; } + + if (Status != STATUS_SUCCESS) + goto notify; } /* Dynamic Structure...ugh */ @@ -1485,6 +1496,9 @@ WSPConnect(SOCKET Handle, WaitForSingleObject(SockEvent, INFINITE); Status = IOSB.Status; } + + if (Status != STATUS_SUCCESS) + goto notify; } /* AFD doesn't seem to care if these are invalid, but let's 0 them anyways */ @@ -1516,6 +1530,9 @@ WSPConnect(SOCKET Handle, Status = IOSB.Status; } + if (Status != STATUS_SUCCESS) + goto notify; + Socket->TdiConnectionHandle = (HANDLE)IOSB.Information; /* Get any pending connect data */ @@ -1539,14 +1556,15 @@ WSPConnect(SOCKET Handle, } } + AFD_DbgPrint(MID_TRACE,("Ending\n")); + +notify: /* Re-enable Async Event */ SockReenableAsyncSelectEvent(Socket, FD_WRITE); /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */ SockReenableAsyncSelectEvent(Socket, FD_CONNECT); - AFD_DbgPrint(MID_TRACE,("Ending\n")); - NtClose( SockEvent ); if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_CONNECT)) @@ -2139,8 +2157,12 @@ GetSocketInformation(PSOCKET_INFORMATION Socket, if (Status == STATUS_PENDING) { WaitForSingleObject(SockEvent, INFINITE); + Status = IOSB.Status; } + if (Status != STATUS_SUCCESS) + return -1; + /* Return Information */ if (Ulong != NULL) { @@ -2210,11 +2232,12 @@ SetSocketInformation(PSOCKET_INFORMATION Socket, if (Status == STATUS_PENDING) { WaitForSingleObject(SockEvent, INFINITE); + Status = IOSB.Status; } NtClose( SockEvent ); - return 0; + return Status == STATUS_SUCCESS ? 0 : -1; } @@ -2275,11 +2298,12 @@ int CreateContext(PSOCKET_INFORMATION Socket) if (Status == STATUS_PENDING) { WaitForSingleObject(SockEvent, INFINITE); + Status = IOSB.Status; } NtClose( SockEvent ); - return 0; + return Status == STATUS_SUCCESS ? 0 : -1; } BOOLEAN SockCreateOrReferenceAsyncThread(VOID) diff --git a/reactos/dll/win32/msafd/misc/event.c b/reactos/dll/win32/msafd/misc/event.c index 19d5f23d617..d79fe20019e 100644 --- a/reactos/dll/win32/msafd/misc/event.c +++ b/reactos/dll/win32/msafd/misc/event.c @@ -104,12 +104,16 @@ WSPEventSelect( /* Wait for return */ if (Status == STATUS_PENDING) { WaitForSingleObject(SockEvent, INFINITE); + Status = IOSB.Status; } AFD_DbgPrint(MID_TRACE,("Waited\n")); NtClose( SockEvent ); + if (Status != STATUS_SUCCESS) + return MsafdReturnWithErrno(Status, lpErrno, 0, NULL); + AFD_DbgPrint(MID_TRACE,("Closed event\n")); /* Set Socket Data*/ @@ -168,13 +172,16 @@ WSPEnumNetworkEvents( /* Wait for return */ if (Status == STATUS_PENDING) { WaitForSingleObject(SockEvent, INFINITE); - Status = STATUS_SUCCESS; + Status = IOSB.Status; } AFD_DbgPrint(MID_TRACE,("Waited\n")); NtClose( SockEvent ); + if (Status != STATUS_SUCCESS) + return MsafdReturnWithErrno(Status, lpErrno, 0, NULL); + AFD_DbgPrint(MID_TRACE,("Closed event\n")); AFD_DbgPrint(MID_TRACE,("About to touch struct at %x (%d)\n", lpNetworkEvents, sizeof(*lpNetworkEvents))); @@ -226,12 +233,9 @@ WSPEnumNetworkEvents( lpNetworkEvents->iErrorCode[FD_GROUP_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_GROUP_QOS_BIT]); } - if( NT_SUCCESS(Status) ) *lpErrno = 0; - else *lpErrno = WSAEINVAL; - AFD_DbgPrint(MID_TRACE,("Leaving\n")); - return 0; + return MsafdReturnWithErrno(STATUS_SUCCESS, lpErrno, 0, NULL); } /* EOF */ diff --git a/reactos/dll/win32/msafd/misc/sndrcv.c b/reactos/dll/win32/msafd/misc/sndrcv.c index 3c5b2d5c232..57f9569086f 100644 --- a/reactos/dll/win32/msafd/misc/sndrcv.c +++ b/reactos/dll/win32/msafd/misc/sndrcv.c @@ -182,7 +182,7 @@ WSPRecv(SOCKET Handle, /* Send IOCTL */ Status = NtDeviceIoControlFile((HANDLE)Handle, - Event ? Event : SockEvent, + Event, APCFunction, APCContext, IOSB, @@ -209,6 +209,9 @@ WSPRecv(SOCKET Handle, /* Return the Flags */ *ReceiveFlags = 0; + if (Status == STATUS_PENDING) + return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesRead); + switch (Status) { case STATUS_RECEIVE_EXPEDITED: @@ -223,7 +226,7 @@ WSPRecv(SOCKET Handle, } /* Re-enable Async Event */ - if (*ReceiveFlags == MSG_OOB) + if (*ReceiveFlags & MSG_OOB) { SockReenableAsyncSelectEvent(Socket, FD_OOB); } @@ -334,7 +337,7 @@ WSPRecvFrom(SOCKET Handle, /* Send IOCTL */ Status = NtDeviceIoControlFile((HANDLE)Handle, - Event ? Event : SockEvent, + Event, APCFunction, APCContext, IOSB, @@ -356,6 +359,9 @@ WSPRecvFrom(SOCKET Handle, /* Return the Flags */ *ReceiveFlags = 0; + if (Status == STATUS_PENDING) + return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesRead); + switch (Status) { case STATUS_RECEIVE_EXPEDITED: *ReceiveFlags = MSG_OOB; @@ -461,7 +467,7 @@ WSPSend(SOCKET Handle, /* Send IOCTL */ Status = NtDeviceIoControlFile((HANDLE)Handle, - Event ? Event : SockEvent, + Event, APCFunction, APCContext, IOSB, @@ -483,7 +489,7 @@ WSPSend(SOCKET Handle, 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 */ @@ -613,7 +619,7 @@ WSPSendTo(SOCKET Handle, /* Send IOCTL */ Status = NtDeviceIoControlFile((HANDLE)Handle, - Event ? Event : SockEvent, + Event, APCFunction, APCContext, IOSB, @@ -638,11 +644,8 @@ WSPSendTo(SOCKET Handle, HeapFree(GlobalHeap, 0, BindAddress); } - if (Status == STATUS_PENDING) - return WSA_IO_PENDING; - - /* Re-enable Async Event */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); + if (Status != STATUS_PENDING) + SockReenableAsyncSelectEvent(Socket, FD_WRITE); return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent); }