mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 16:51:39 +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 */
|
||||
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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue