From 17e0e75eb56f29b874a39888063b7559fbd0d06a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 12 Aug 2010 13:13:19 +0000 Subject: [PATCH] [MSAFD] - Update lpcbBytesReturned when FIONREAD is called - Fix the value inside lpErrno when XxxSocketInformation() fails - Pass the unrecognized IOCTLs to the winsock helper (no behavior change for this yet because wshtcpip's WSHIoctl is unimplemented) svn path=/trunk/; revision=48522 --- reactos/dll/win32/msafd/misc/dllmain.c | 38 +++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index a5e33ae088d..66cf28587a3 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -1910,6 +1910,7 @@ WSPIoctl(IN SOCKET Handle, OUT LPINT lpErrno) { PSOCKET_INFORMATION Socket = NULL; + BOOLEAN NeedsCompletion; /* Get the Socket Structure associate to this Socket*/ Socket = GetSocketStructure(Handle); @@ -1918,6 +1919,8 @@ WSPIoctl(IN SOCKET Handle, *lpErrno = WSAENOTSOCK; return SOCKET_ERROR; } + + *lpcbBytesReturned = 0; switch( dwIoControlCode ) { @@ -1928,17 +1931,44 @@ WSPIoctl(IN SOCKET Handle, return SOCKET_ERROR; } Socket->SharedData.NonBlocking = *((PULONG)lpvInBuffer) ? 1 : 0; - return SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, (PULONG)lpvInBuffer, NULL); + *lpErrno = SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, (PULONG)lpvInBuffer, NULL); + if (*lpErrno != NO_ERROR) + return SOCKET_ERROR; + else + return NO_ERROR; case FIONREAD: if( cbOutBuffer < sizeof(INT) || IS_INTRESOURCE(lpvOutBuffer) ) { *lpErrno = WSAEFAULT; return SOCKET_ERROR; } - return GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, (PULONG)lpvOutBuffer, NULL); + *lpErrno = GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, (PULONG)lpvOutBuffer, NULL); + if (*lpErrno != NO_ERROR) + { + *lpcbBytesReturned = sizeof(ULONG); + return SOCKET_ERROR; + } + else + return NO_ERROR; default: - *lpErrno = WSAEINVAL; - return SOCKET_ERROR; + *lpErrno = Socket->HelperData->WSHIoctl(Socket->HelperContext, + Handle, + Socket->TdiAddressHandle, + Socket->TdiConnectionHandle, + dwIoControlCode, + lpvInBuffer, + cbInBuffer, + lpvOutBuffer, + cbOutBuffer, + lpcbBytesReturned, + lpOverlapped, + lpCompletionRoutine, + (LPBOOL)&NeedsCompletion); + + if (*lpErrno != NO_ERROR) + return SOCKET_ERROR; + else + return NO_ERROR; } } -- 2.17.1