diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index 8632e1cdfb5..72f6fd8a8a3 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -1517,6 +1517,9 @@ WSPIoctl( Handle, Socket->SharedData.NonBlocking)); return 0; + case FIONREAD: + return GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, (PULONG)lpvOutBuffer, NULL); + default: *lpErrno = WSAEINVAL; return SOCKET_ERROR; diff --git a/reactos/drivers/network/afd/afd/info.c b/reactos/drivers/network/afd/afd/info.c index 11beeb18a02..32c02bb85c1 100644 --- a/reactos/drivers/network/afd/afd/info.c +++ b/reactos/drivers/network/afd/afd/info.c @@ -48,6 +48,14 @@ AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, InfoReq->Information.Ulong = 0; break; + case AFD_INFO_RECEIVE_CONTENT_SIZE: + /* Only touch InfoReq if we actually have a valid connection. + Behaviour was verified under WinXP SP2. */ + if(FCB->Connection.Handle) + InfoReq->Information.Ulong = FCB->Recv.Content - FCB->Recv.BytesUsed; + + break; + default: AFD_DbgPrint(MID_TRACE,("Unknown info id %x\n", InfoReq->InformationClass)); diff --git a/reactos/include/reactos/drivers/afd/shared.h b/reactos/include/reactos/drivers/afd/shared.h index ddf28233495..9810d75b517 100644 --- a/reactos/include/reactos/drivers/afd/shared.h +++ b/reactos/include/reactos/drivers/afd/shared.h @@ -149,6 +149,7 @@ typedef struct _AFD_DISCONNECT_INFO { #define AFD_INFO_RECEIVE_WINDOW_SIZE 0x06L #define AFD_INFO_SEND_WINDOW_SIZE 0x07L #define AFD_INFO_GROUP_ID_TYPE 0x10L +#define AFD_INFO_RECEIVE_CONTENT_SIZE 0x11L /* AFD Share Flags */ #define AFD_SHARE_UNIQUE 0x0L