[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 */
BlockMode = TRUE;
SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL);
Socket->SharedData.NonBlocking = TRUE;
Socket->SharedData->NonBlocking = TRUE;
/* Deactivate Async Select if there is one */
if (Socket->EventObject) {
Socket->SharedData.hWnd = NULL;
Socket->SharedData.wMsg = 0;
Socket->SharedData.AsyncEvents = 0;
Socket->SharedData.SequenceNumber++; // This will kill Async Select after the next completion
Socket->SharedData->hWnd = NULL;
Socket->SharedData->wMsg = 0;
Socket->SharedData->AsyncEvents = 0;
Socket->SharedData->SequenceNumber++; // This will kill Async Select after the next completion
}
/* Set Structure Info */

View file

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

View file

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