mirror of
https://github.com/reactos/reactos.git
synced 2025-08-07 15:33:03 +00:00
[MSAFD] Implement WSPDuplicateSocket. By Peter Hater. CORE-12092
svn path=/trunk/; revision=72926
This commit is contained in:
parent
eb204e920d
commit
ee7a3fece4
5 changed files with 358 additions and 200 deletions
File diff suppressed because it is too large
Load diff
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue