[MSAFD] Implement WSPDuplicateSocket. By Peter Hater. CORE-12092

svn path=/trunk/; revision=72926
This commit is contained in:
Christoph von Wittich 2016-10-07 17:51:03 +00:00
parent eb204e920d
commit ee7a3fece4
5 changed files with 358 additions and 200 deletions

File diff suppressed because it is too large Load diff

View file

@ -47,14 +47,14 @@ WSPEventSelect(
/* Set Socket to Non-Blocking */ /* Set Socket to Non-Blocking */
BlockMode = TRUE; BlockMode = TRUE;
SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL); SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL);
Socket->SharedData.NonBlocking = TRUE; Socket->SharedData->NonBlocking = TRUE;
/* Deactivate Async Select if there is one */ /* Deactivate Async Select if there is one */
if (Socket->EventObject) { if (Socket->EventObject) {
Socket->SharedData.hWnd = NULL; Socket->SharedData->hWnd = NULL;
Socket->SharedData.wMsg = 0; Socket->SharedData->wMsg = 0;
Socket->SharedData.AsyncEvents = 0; Socket->SharedData->AsyncEvents = 0;
Socket->SharedData.SequenceNumber++; // This will kill Async Select after the next completion Socket->SharedData->SequenceNumber++; // This will kill Async Select after the next completion
} }
/* Set Structure Info */ /* Set Structure Info */

View file

@ -46,10 +46,10 @@ WSPAsyncSelect(IN SOCKET Handle,
/* Change the Socket to Non Blocking */ /* Change the Socket to Non Blocking */
BlockMode = TRUE; BlockMode = TRUE;
SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL); SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL);
Socket->SharedData.NonBlocking = TRUE; Socket->SharedData->NonBlocking = TRUE;
/* Deactive WSPEventSelect */ /* Deactive WSPEventSelect */
if (Socket->SharedData.AsyncEvents) if (Socket->SharedData->AsyncEvents)
{ {
if (WSPEventSelect(Handle, NULL, 0, lpErrno) == SOCKET_ERROR) if (WSPEventSelect(Handle, NULL, 0, lpErrno) == SOCKET_ERROR)
{ {
@ -65,14 +65,14 @@ WSPAsyncSelect(IN SOCKET Handle,
SockGetAsyncSelectHelperAfdHandle(); SockGetAsyncSelectHelperAfdHandle();
/* Store Socket Data */ /* Store Socket Data */
Socket->SharedData.hWnd = hWnd; Socket->SharedData->hWnd = hWnd;
Socket->SharedData.wMsg = wMsg; Socket->SharedData->wMsg = wMsg;
Socket->SharedData.AsyncEvents = lEvent; Socket->SharedData->AsyncEvents = lEvent;
Socket->SharedData.AsyncDisabledEvents = 0; Socket->SharedData->AsyncDisabledEvents = 0;
Socket->SharedData.SequenceNumber++; Socket->SharedData->SequenceNumber++;
/* Return if there are no more Events */ /* Return if there are no more Events */
if ((Socket->SharedData.AsyncEvents & (~Socket->SharedData.AsyncDisabledEvents)) == 0) if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0)
{ {
HeapFree(GetProcessHeap(), 0, AsyncData); HeapFree(GetProcessHeap(), 0, AsyncData);
return 0; return 0;
@ -80,7 +80,7 @@ WSPAsyncSelect(IN SOCKET Handle,
/* Set up the Async Data */ /* Set up the Async Data */
AsyncData->ParentSocket = Socket; AsyncData->ParentSocket = Socket;
AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber; AsyncData->SequenceNumber = Socket->SharedData->SequenceNumber;
/* Begin Async Select by using I/O Completion */ /* Begin Async Select by using I/O Completion */
NtSetIoCompletion(SockAsyncCompletionPort, NtSetIoCompletion(SockAsyncCompletionPort,
@ -136,7 +136,7 @@ WSPRecv(SOCKET Handle,
RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
RecvInfo.BufferCount = dwBufferCount; RecvInfo.BufferCount = dwBufferCount;
RecvInfo.TdiFlags = 0; RecvInfo.TdiFlags = 0;
RecvInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0; RecvInfo.AfdFlags = Socket->SharedData->NonBlocking ? AFD_IMMEDIATE : 0;
/* Set the TDI Flags */ /* Set the TDI Flags */
if (*ReceiveFlags == 0) if (*ReceiveFlags == 0)
@ -281,7 +281,7 @@ WSPRecvFrom(SOCKET Handle,
return SOCKET_ERROR; return SOCKET_ERROR;
} }
if (!(Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)) if (!(Socket->SharedData->ServiceFlags1 & XP1_CONNECTIONLESS))
{ {
/* Call WSPRecv for a non-datagram socket */ /* Call WSPRecv for a non-datagram socket */
return WSPRecv(Handle, return WSPRecv(Handle,
@ -295,6 +295,17 @@ WSPRecvFrom(SOCKET Handle,
lpErrno); lpErrno);
} }
/* Bind us First */
if (Socket->SharedData->State == SocketOpen)
{
Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext,
SocketAddress,
SocketAddressLength);
/* Bind it */
if (WSPBind(Handle, SocketAddress, *SocketAddressLength, lpErrno) == SOCKET_ERROR)
return SOCKET_ERROR;
}
Status = NtCreateEvent( &SockEvent, EVENT_ALL_ACCESS, Status = NtCreateEvent( &SockEvent, EVENT_ALL_ACCESS,
NULL, 1, FALSE ); NULL, 1, FALSE );
@ -305,7 +316,7 @@ WSPRecvFrom(SOCKET Handle,
RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
RecvInfo.BufferCount = dwBufferCount; RecvInfo.BufferCount = dwBufferCount;
RecvInfo.TdiFlags = 0; RecvInfo.TdiFlags = 0;
RecvInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0; RecvInfo.AfdFlags = Socket->SharedData->NonBlocking ? AFD_IMMEDIATE : 0;
RecvInfo.AddressLength = SocketAddressLength; RecvInfo.AddressLength = SocketAddressLength;
RecvInfo.Address = SocketAddress; RecvInfo.Address = SocketAddress;
@ -457,7 +468,7 @@ WSPSend(SOCKET Handle,
SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
SendInfo.BufferCount = dwBufferCount; SendInfo.BufferCount = dwBufferCount;
SendInfo.TdiFlags = 0; SendInfo.TdiFlags = 0;
SendInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0; SendInfo.AfdFlags = Socket->SharedData->NonBlocking ? AFD_IMMEDIATE : 0;
/* Set the TDI Flags */ /* Set the TDI Flags */
if (iFlags) if (iFlags)
@ -574,7 +585,7 @@ WSPSendTo(SOCKET Handle,
return SOCKET_ERROR; return SOCKET_ERROR;
} }
if (!(Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)) if (!(Socket->SharedData->ServiceFlags1 & XP1_CONNECTIONLESS))
{ {
/* Use WSPSend for connection-oriented sockets */ /* Use WSPSend for connection-oriented sockets */
return WSPSend(Handle, return WSPSend(Handle,
@ -589,7 +600,7 @@ WSPSendTo(SOCKET Handle,
} }
/* Bind us First */ /* Bind us First */
if (Socket->SharedData.State == SocketOpen) if (Socket->SharedData->State == SocketOpen)
{ {
/* Get the Wildcard Address */ /* Get the Wildcard Address */
BindAddressLength = Socket->HelperData->MaxWSAddressLength; BindAddressLength = Socket->HelperData->MaxWSAddressLength;
@ -639,7 +650,7 @@ WSPSendTo(SOCKET Handle,
/* Set up Structure */ /* Set up Structure */
SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
SendInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0; SendInfo.AfdFlags = Socket->SharedData->NonBlocking ? AFD_IMMEDIATE : 0;
SendInfo.BufferCount = dwBufferCount; SendInfo.BufferCount = dwBufferCount;
SendInfo.TdiConnection.RemoteAddress = RemoteAddress; SendInfo.TdiConnection.RemoteAddress = RemoteAddress;
SendInfo.TdiConnection.RemoteAddressLength = Socket->HelperData->MaxTDIAddressLength; SendInfo.TdiConnection.RemoteAddressLength = Socket->HelperData->MaxTDIAddressLength;

View file

@ -24,20 +24,6 @@ WSPCancelBlockingCall(
} }
INT
WSPAPI
WSPDuplicateSocket(
IN SOCKET s,
IN DWORD dwProcessId,
OUT LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPINT lpErrno)
{
UNIMPLEMENTED;
return SOCKET_ERROR;
}
BOOL BOOL
WSPAPI WSPAPI
WSPGetOverlappedResult( WSPGetOverlappedResult(

View file

@ -47,6 +47,7 @@ typedef enum _SOCKET_STATE {
typedef struct _SOCK_SHARED_INFO { typedef struct _SOCK_SHARED_INFO {
SOCKET_STATE State; SOCKET_STATE State;
LONG RefCount;
INT AddressFamily; INT AddressFamily;
INT SocketType; INT SocketType;
INT Protocol; INT Protocol;
@ -84,12 +85,14 @@ typedef struct _SOCK_SHARED_INFO {
UINT wMsg; UINT wMsg;
LONG AsyncEvents; LONG AsyncEvents;
LONG AsyncDisabledEvents; LONG AsyncDisabledEvents;
SOCKADDR WSLocalAddress;
SOCKADDR WSRemoteAddress;
} SOCK_SHARED_INFO, *PSOCK_SHARED_INFO; } SOCK_SHARED_INFO, *PSOCK_SHARED_INFO;
typedef struct _SOCKET_INFORMATION { typedef struct _SOCKET_INFORMATION {
ULONG RefCount;
SOCKET Handle; SOCKET Handle;
SOCK_SHARED_INFO SharedData; PSOCK_SHARED_INFO SharedData;
HANDLE SharedDataHandle;
DWORD HelperEvents; DWORD HelperEvents;
PHELPER_DATA HelperData; PHELPER_DATA HelperData;
PVOID HelperContext; PVOID HelperContext;
@ -103,8 +106,6 @@ typedef struct _SOCKET_INFORMATION {
CRITICAL_SECTION Lock; CRITICAL_SECTION Lock;
PVOID SanData; PVOID SanData;
BOOL TrySAN; BOOL TrySAN;
SOCKADDR WSLocalAddress;
SOCKADDR WSRemoteAddress;
WSAPROTOCOL_INFOW ProtocolInfo; WSAPROTOCOL_INFOW ProtocolInfo;
struct _SOCKET_INFORMATION *NextSocket; struct _SOCKET_INFORMATION *NextSocket;
} SOCKET_INFORMATION, *PSOCKET_INFORMATION; } SOCKET_INFORMATION, *PSOCKET_INFORMATION;