mirror of
https://github.com/reactos/reactos
synced 2025-10-06 16:32:42 +02:00
Compare commits
21 Commits
netstat_op
...
aicom-netw
Author | SHA1 | Date | |
---|---|---|---|
|
6ba6c473f5 | ||
|
e3e917fbeb | ||
|
0ee5ec5113 | ||
|
7640fe7dfb | ||
|
c2fc6d47e8 | ||
|
ffedb05b4e | ||
|
48d08ea8f6 | ||
|
641cb7e490 | ||
|
66224e0954 | ||
|
f8c89e873b | ||
|
c4a05125ed | ||
|
ec32867760 | ||
|
048e0fc5f8 | ||
|
f6d117d290 | ||
|
6b8a762c68 | ||
|
9c5e94efdd | ||
|
5a0b35cd79 | ||
|
c7202504aa | ||
|
3c77fc7e9f | ||
|
ba63a6d99b | ||
|
1aa6c8abec |
@@ -27,7 +27,7 @@ SockCoreAccept(IN PSOCKET_INFORMATION Socket,
|
||||
HANDLE EventObject = NULL;
|
||||
ULONG AsyncEvents = 0, NetworkEvents = 0;
|
||||
CHAR HelperBuffer[256];
|
||||
|
||||
|
||||
/* Set the new state */
|
||||
AcceptedSocket->SharedData.State = SocketConnected;
|
||||
|
||||
@@ -82,8 +82,7 @@ SockCoreAccept(IN PSOCKET_INFORMATION Socket,
|
||||
HelperContextSize);
|
||||
if (!HelperContext)
|
||||
{
|
||||
/* Unlock the socket and fail */
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
/* Fail */
|
||||
return WSAENOBUFS;
|
||||
}
|
||||
}
|
||||
@@ -99,9 +98,6 @@ SockCoreAccept(IN PSOCKET_INFORMATION Socket,
|
||||
&HelperContextSize);
|
||||
}
|
||||
|
||||
/* We're done with the old socket, so we can release the lock */
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
|
||||
/* Get the TDI Handles for the new socket */
|
||||
ErrorCode = SockGetTdiHandles(AcceptedSocket);
|
||||
|
||||
@@ -311,6 +307,7 @@ WSPAccept(SOCKET Handle,
|
||||
NULL,
|
||||
&Timeout,
|
||||
lpErrno);
|
||||
|
||||
if (ReturnValue == SOCKET_ERROR)
|
||||
{
|
||||
/* Fail */
|
||||
@@ -412,10 +409,13 @@ WSPAccept(SOCKET Handle,
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
/* Wait for completion */
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
SockWaitForSingleObject(ThreadData->EventHandle,
|
||||
Handle,
|
||||
NO_BLOCKING_HOOK,
|
||||
NO_TIMEOUT);
|
||||
EnterCriticalSection(&Socket->Lock);
|
||||
|
||||
/* Get new status */
|
||||
Status = IoStatusBlock.Status;
|
||||
}
|
||||
@@ -462,10 +462,13 @@ WSPAccept(SOCKET Handle,
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
/* Wait for completion */
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
SockWaitForSingleObject(ThreadData->EventHandle,
|
||||
Handle,
|
||||
NO_BLOCKING_HOOK,
|
||||
NO_TIMEOUT);
|
||||
EnterCriticalSection(&Socket->Lock);
|
||||
|
||||
/* Get new status */
|
||||
Status = IoStatusBlock.Status;
|
||||
}
|
||||
@@ -825,9 +828,6 @@ WSPAccept(SOCKET Handle,
|
||||
Socket->SharedData.SizeOfLocalAddress);
|
||||
AcceptedSocket->SharedData.SizeOfLocalAddress = Socket->SharedData.SizeOfLocalAddress;
|
||||
|
||||
/* We can release the accepted socket's lock now */
|
||||
LeaveCriticalSection(&AcceptedSocket->Lock);
|
||||
|
||||
/* Send IOCTL to Accept */
|
||||
AcceptData.UseSAN = SockSanEnabled;
|
||||
Status = NtDeviceIoControlFile(Socket->WshContext.Handle,
|
||||
@@ -894,7 +894,8 @@ WSPAccept(SOCKET Handle,
|
||||
&ErrorCode);
|
||||
|
||||
/* Dereference the socket and clear its pointer for error code logic */
|
||||
SockDereferenceSocket(Socket);
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
SockDereferenceSocket(Socket);
|
||||
Socket = NULL;
|
||||
|
||||
error:
|
||||
@@ -918,7 +919,7 @@ error:
|
||||
if (AcceptedSocket)
|
||||
{
|
||||
/* Check if the accepted socket also has a handle */
|
||||
if (ErrorCode == NO_ERROR)
|
||||
if (ErrorCode != NO_ERROR)
|
||||
{
|
||||
/* Close the socket */
|
||||
SockCloseSocket(AcceptedSocket);
|
||||
|
@@ -26,7 +26,7 @@ SockCreateAsyncQueuePort(VOID)
|
||||
Status = NtCreateIoCompletion(&SockAsyncQueuePort,
|
||||
IO_COMPLETION_ALL_ACCESS,
|
||||
NULL,
|
||||
-1);
|
||||
0);
|
||||
|
||||
/* Protect Handle */
|
||||
HandleFlags.ProtectFromClose = TRUE;
|
||||
@@ -163,14 +163,14 @@ SockAsyncThread(PVOID Context)
|
||||
&IoStatusBlock,
|
||||
&Timeout);
|
||||
/* Check for success */
|
||||
if (NT_SUCCESS(Status))
|
||||
if (Status == STATUS_SUCCESS)
|
||||
{
|
||||
/* Check if this isn't the termination command */
|
||||
if (AsyncCompletionRoutine != (PVOID)-1)
|
||||
{
|
||||
/* Call the routine */
|
||||
SockHandleAsyncIndication(AsyncCompletionRoutine,
|
||||
Context,
|
||||
AsyncContext,
|
||||
&IoStatusBlock);
|
||||
}
|
||||
else
|
||||
@@ -180,7 +180,7 @@ SockAsyncThread(PVOID Context)
|
||||
InterlockedDecrement(&SockAsyncThreadReferenceCount);
|
||||
}
|
||||
}
|
||||
else if ((SockAsyncThreadReferenceCount > 1) && (NT_ERROR(Status)))
|
||||
else if ((SockAsyncThreadReferenceCount > 1) && (NT_ERROR(Status) || Status == STATUS_TIMEOUT))
|
||||
{
|
||||
/* It Failed, sleep for a second */
|
||||
Sleep(1000);
|
||||
|
@@ -22,7 +22,7 @@ IsSockaddrEqualToZero(IN const struct sockaddr* SocketAddress,
|
||||
for (i = 0; i < SocketAddressLength; i++)
|
||||
{
|
||||
/* Make sure it's 0 */
|
||||
if (*(PULONG)SocketAddress + i)return FALSE;
|
||||
if (*(PULONG)(SocketAddress + i)) return FALSE;
|
||||
}
|
||||
|
||||
/* All zeroes, succees! */
|
||||
@@ -171,6 +171,7 @@ SockDoConnectReal(IN PSOCKET_INFORMATION Socket,
|
||||
/* Set the SAN State */
|
||||
ConnectInfo->UseSAN = SockSanEnabled;
|
||||
|
||||
#if 0
|
||||
/* Check if this is a non-blocking streaming socket */
|
||||
if ((Socket->SharedData.NonBlocking) && !(MSAFD_IS_DGRAM_SOCK(Socket)))
|
||||
{
|
||||
@@ -185,6 +186,7 @@ SockDoConnectReal(IN PSOCKET_INFORMATION Socket,
|
||||
Status = 0;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* Start the connect loop */
|
||||
do
|
||||
@@ -386,8 +388,11 @@ SockDoConnect(SOCKET Handle,
|
||||
(MSAFD_IS_DGRAM_SOCK(Socket)) &&
|
||||
(IsSockaddrEqualToZero(SocketAddress, SocketAddressLength)))
|
||||
{
|
||||
/* Disconnect the socket and return */
|
||||
return UnconnectDatagramSocket(Socket);
|
||||
/* Disconnect the socket */
|
||||
ErrorCode = UnconnectDatagramSocket(Socket);
|
||||
|
||||
/* Cleanup and return */
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Make sure the Address Family is valid */
|
||||
@@ -412,6 +417,7 @@ SockDoConnect(SOCKET Handle,
|
||||
{
|
||||
/* Fail: SO_BROADCAST must be set first in WinSock 2.0+ */
|
||||
ErrorCode = WSAEACCES;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -72,6 +72,7 @@ SockEventSelectHelper(IN PSOCKET_INFORMATION Socket,
|
||||
|
||||
/* Send close event. Note, this includes both aborts and disconnects */
|
||||
if (Events & FD_CLOSE) PollInfo.Events |= AFD_EVENT_DISCONNECT |
|
||||
AFD_EVENT_CLOSE |
|
||||
AFD_EVENT_ABORT;
|
||||
|
||||
/* Send PnP events related to live network hardware changes */
|
||||
@@ -99,10 +100,12 @@ SockEventSelectHelper(IN PSOCKET_INFORMATION Socket,
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
/* Wait for completion */
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
SockWaitForSingleObject(ThreadData->EventHandle,
|
||||
Socket->Handle,
|
||||
NO_BLOCKING_HOOK,
|
||||
NO_TIMEOUT);
|
||||
EnterCriticalSection(&Socket->Lock);
|
||||
|
||||
/* Get new status */
|
||||
Status = IoStatusBlock.Status;
|
||||
@@ -273,10 +276,12 @@ WSPEnumNetworkEvents(IN SOCKET Handle,
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
/* Wait for completion */
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
SockWaitForSingleObject(ThreadData->EventHandle,
|
||||
Socket->Handle,
|
||||
NO_BLOCKING_HOOK,
|
||||
NO_TIMEOUT);
|
||||
EnterCriticalSection(&Socket->Lock);
|
||||
|
||||
/* Get new status */
|
||||
Status = IoStatusBlock.Status;
|
||||
@@ -411,7 +416,11 @@ WSPEnumNetworkEvents(IN SOCKET Handle,
|
||||
|
||||
error:
|
||||
/* Dereference the socket, if we have one here */
|
||||
if (Socket) SockDereferenceSocket(Socket);
|
||||
if (Socket)
|
||||
{
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
SockDereferenceSocket(Socket);
|
||||
}
|
||||
|
||||
/* Check for error */
|
||||
if (ErrorCode != NO_ERROR)
|
||||
|
@@ -47,7 +47,7 @@ WSPListen(SOCKET Handle,
|
||||
EnterCriticalSection(&Socket->Lock);
|
||||
|
||||
/* If the socket is connection-less, fail */
|
||||
if (MSAFD_IS_DGRAM_SOCK(Socket));
|
||||
if (MSAFD_IS_DGRAM_SOCK(Socket))
|
||||
{
|
||||
/* Fail */
|
||||
ErrorCode = WSAEOPNOTSUPP;
|
||||
@@ -61,9 +61,9 @@ WSPListen(SOCKET Handle,
|
||||
ErrorCode = NO_ERROR;
|
||||
goto error;
|
||||
}
|
||||
else if (Socket->SharedData.State != SocketConnected)
|
||||
else if (Socket->SharedData.State != SocketBound)
|
||||
{
|
||||
/* If we're not connected, fail */
|
||||
/* If we're not bound, fail */
|
||||
ErrorCode = WSAEINVAL;
|
||||
goto error;
|
||||
}
|
||||
|
@@ -142,7 +142,7 @@ SockSetInformation(IN PSOCKET_INFORMATION Socket,
|
||||
NULL,
|
||||
NULL,
|
||||
&IoStatusBlock,
|
||||
IOCTL_AFD_GET_INFO,
|
||||
IOCTL_AFD_SET_INFO,
|
||||
&AfdInfo,
|
||||
sizeof(AfdInfo),
|
||||
NULL,
|
||||
|
@@ -13,7 +13,7 @@
|
||||
(s->SharedData.AsyncEvents & e))
|
||||
|
||||
#define HANDLES_IN_SET(s) \
|
||||
s == NULL ? 0 : (s->fd_count & 0xFFFF)
|
||||
(((s) == NULL) ? 0 : ((s)->fd_count & 0xFFFF))
|
||||
|
||||
/* DATA **********************************************************************/
|
||||
|
||||
@@ -75,7 +75,7 @@ SockCheckAndInitAsyncSelectHelper(VOID)
|
||||
}
|
||||
|
||||
/* Check if the port exists, and if not, create it */
|
||||
if (SockAsyncQueuePort) SockCreateAsyncQueuePort();
|
||||
if (!SockAsyncQueuePort) SockCreateAsyncQueuePort();
|
||||
|
||||
/*
|
||||
* Now Set up the Completion Port Information
|
||||
@@ -750,8 +750,10 @@ WSPSelect(INT nfds,
|
||||
/* Fill out handle info */
|
||||
HandleArray->Handle = (SOCKET)readfds->fd_array[i];
|
||||
HandleArray->Events = AFD_EVENT_RECEIVE |
|
||||
AFD_EVENT_DISCONNECT |
|
||||
AFD_EVENT_ABORT;
|
||||
AFD_EVENT_DISCONNECT |
|
||||
AFD_EVENT_CLOSE |
|
||||
AFD_EVENT_ABORT |
|
||||
AFD_EVENT_ACCEPT;
|
||||
|
||||
/* Move to the next one */
|
||||
HandleArray++;
|
||||
@@ -760,7 +762,7 @@ WSPSelect(INT nfds,
|
||||
{
|
||||
/* Fill out handle info */
|
||||
HandleArray->Handle = (SOCKET)writefds->fd_array[i];
|
||||
HandleArray->Events = AFD_EVENT_SEND;
|
||||
HandleArray->Events = AFD_EVENT_SEND | AFD_EVENT_CONNECT;
|
||||
|
||||
/* Move to the next one */
|
||||
HandleArray++;
|
||||
@@ -776,7 +778,7 @@ WSPSelect(INT nfds,
|
||||
}
|
||||
|
||||
/* Check if a timeout was given */
|
||||
if (timeout)
|
||||
if (!timeout)
|
||||
{
|
||||
/* Inifinte Timeout */
|
||||
PollInfo->Timeout.u.LowPart = -1;
|
||||
|
@@ -246,7 +246,7 @@ WSPSendTo(SOCKET Handle,
|
||||
INT SockaddrLength;
|
||||
PSOCKADDR Sockaddr;
|
||||
SOCKADDR_INFO SocketInfo;
|
||||
|
||||
|
||||
/* Enter prolog */
|
||||
ErrorCode = SockEnterApiFast(&ThreadData);
|
||||
if (ErrorCode != NO_ERROR)
|
||||
@@ -377,6 +377,8 @@ WSPSendTo(SOCKET Handle,
|
||||
/* Make sure it's still unbound */
|
||||
if (Socket->SharedData.State == SocketOpen)
|
||||
{
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
|
||||
/* Bind it */
|
||||
ReturnValue = WSPBind(Handle,
|
||||
Sockaddr,
|
||||
@@ -387,12 +389,13 @@ WSPSendTo(SOCKET Handle,
|
||||
{
|
||||
/* It's bound now, fake success */
|
||||
ReturnValue = NO_ERROR;
|
||||
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
}
|
||||
|
||||
/* Release the lock and free memory */
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
/* Free memory */
|
||||
RtlFreeHeap(SockPrivateHeap, 0, Sockaddr);
|
||||
|
||||
|
||||
/* Check if we failed */
|
||||
if (ReturnValue == SOCKET_ERROR) goto error;
|
||||
}
|
||||
|
@@ -693,6 +693,12 @@ WSPSocket(INT AddressFamily,
|
||||
ServiceFlags = lpProtocolInfo->dwServiceFlags1;
|
||||
ProviderFlags = lpProtocolInfo->dwProviderFlags;
|
||||
ProviderId = lpProtocolInfo->ProviderId;
|
||||
|
||||
/* HACK: We don't set this flag properly ATM */
|
||||
if(SocketType == SOCK_DGRAM || SocketType == SOCK_RAW)
|
||||
{
|
||||
ServiceFlags |= XP1_CONNECTIONLESS;
|
||||
}
|
||||
|
||||
/* Create the actual socket */
|
||||
ErrorCode = SockSocket(AddressFamily,
|
||||
|
@@ -213,7 +213,9 @@ WSPIoctl(IN SOCKET Handle,
|
||||
PSOCKET_INFORMATION Socket;
|
||||
INT ErrorCode;
|
||||
PWINSOCK_TEB_DATA ThreadData;
|
||||
|
||||
BOOLEAN Blocking;
|
||||
BOOL NeedsCompletion;
|
||||
|
||||
/* Enter prolog */
|
||||
ErrorCode = SockEnterApiFast(&ThreadData);
|
||||
if (ErrorCode != NO_ERROR)
|
||||
@@ -222,7 +224,7 @@ WSPIoctl(IN SOCKET Handle,
|
||||
*lpErrno = ErrorCode;
|
||||
return SOCKET_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Get the socket structure */
|
||||
Socket = SockFindAndReferenceSocket(Handle, TRUE);
|
||||
if (!Socket)
|
||||
@@ -231,31 +233,72 @@ WSPIoctl(IN SOCKET Handle,
|
||||
ErrorCode = WSAENOTSOCK;
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
||||
/* Lock the socket */
|
||||
EnterCriticalSection(&Socket->Lock);
|
||||
|
||||
|
||||
switch(dwIoControlCode) {
|
||||
|
||||
case FIONBIO:
|
||||
|
||||
|
||||
case FIONBIO:
|
||||
/* Check if the Buffer is OK */
|
||||
if(cbInBuffer < sizeof(ULONG))
|
||||
if(cbInBuffer < sizeof(ULONG) || IS_INTRESOURCE(lpvInBuffer))
|
||||
{
|
||||
/* Fail */
|
||||
ErrorCode = WSAEFAULT;
|
||||
goto error;
|
||||
}
|
||||
|
||||
Blocking = (*(PULONG)lpvInBuffer) ? TRUE : FALSE;
|
||||
|
||||
Socket->SharedData.NonBlocking = Blocking;
|
||||
|
||||
ErrorCode = SockSetInformation(Socket,
|
||||
AFD_INFO_BLOCKING_MODE,
|
||||
&Blocking,
|
||||
NULL,
|
||||
NULL);
|
||||
break;
|
||||
|
||||
case FIONREAD:
|
||||
if(cbOutBuffer < sizeof(ULONG) || IS_INTRESOURCE(lpvOutBuffer))
|
||||
{
|
||||
*lpErrno = WSAEFAULT;
|
||||
return SOCKET_ERROR;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
ErrorCode = SockGetInformation(Socket,
|
||||
AFD_INFO_RECEIVE_CONTENT_SIZE,
|
||||
NULL,
|
||||
0,
|
||||
NULL,
|
||||
(PULONG)lpvOutBuffer,
|
||||
NULL);
|
||||
|
||||
if (ErrorCode == NO_ERROR) *lpcbBytesReturned = sizeof(ULONG);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Unsupported by us, give it to the helper */
|
||||
ErrorCode = SockGetTdiHandles(Socket);
|
||||
if (ErrorCode != NO_ERROR) goto error;
|
||||
|
||||
/* Unsupported for now */
|
||||
*lpErrno = WSAEINVAL;
|
||||
return SOCKET_ERROR;
|
||||
/* Call the helper */
|
||||
ErrorCode = Socket->HelperData->WSHIoctl(Socket->HelperContext,
|
||||
Handle,
|
||||
Socket->TdiAddressHandle,
|
||||
Socket->TdiConnectionHandle,
|
||||
dwIoControlCode,
|
||||
lpvInBuffer,
|
||||
cbInBuffer,
|
||||
lpvOutBuffer,
|
||||
cbOutBuffer,
|
||||
lpcbBytesReturned,
|
||||
lpOverlapped,
|
||||
lpCompletionRoutine,
|
||||
&NeedsCompletion);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
error:
|
||||
/* Check if we had a socket */
|
||||
if (Socket)
|
||||
@@ -264,7 +307,7 @@ error:
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
SockDereferenceSocket(Socket);
|
||||
}
|
||||
|
||||
|
||||
/* Check for error */
|
||||
if (ErrorCode != NO_ERROR)
|
||||
{
|
||||
@@ -272,7 +315,7 @@ error:
|
||||
*lpErrno = ErrorCode;
|
||||
return SOCKET_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Return to caller */
|
||||
return NO_ERROR;
|
||||
}
|
||||
@@ -517,7 +560,7 @@ WSPSetSockOpt(IN SOCKET Handle,
|
||||
PSOCKET_INFORMATION Socket;
|
||||
INT ErrorCode;
|
||||
PWINSOCK_TEB_DATA ThreadData;
|
||||
|
||||
|
||||
/* Enter prolog */
|
||||
ErrorCode = SockEnterApiFast(&ThreadData);
|
||||
if (ErrorCode != NO_ERROR)
|
||||
@@ -526,7 +569,7 @@ WSPSetSockOpt(IN SOCKET Handle,
|
||||
*lpErrno = ErrorCode;
|
||||
return SOCKET_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Get the socket structure */
|
||||
Socket = SockFindAndReferenceSocket(Handle, TRUE);
|
||||
if (!Socket)
|
||||
@@ -535,10 +578,10 @@ WSPSetSockOpt(IN SOCKET Handle,
|
||||
*lpErrno = WSAENOTSOCK;
|
||||
return SOCKET_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Lock the socket */
|
||||
EnterCriticalSection(&Socket->Lock);
|
||||
|
||||
|
||||
/* Make sure we're not closed */
|
||||
if (Socket->SharedData.State == SocketClosed)
|
||||
{
|
||||
@@ -546,7 +589,7 @@ WSPSetSockOpt(IN SOCKET Handle,
|
||||
ErrorCode = WSAENOTSOCK;
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
||||
/* Validate the pointer */
|
||||
if (!OptionValue)
|
||||
{
|
||||
@@ -554,7 +597,7 @@ WSPSetSockOpt(IN SOCKET Handle,
|
||||
ErrorCode = WSAEFAULT;
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
||||
/* Validate option */
|
||||
if (!IsValidOptionForSocket(Socket, Level, OptionName))
|
||||
{
|
||||
@@ -562,28 +605,143 @@ WSPSetSockOpt(IN SOCKET Handle,
|
||||
ErrorCode = WSAENOPROTOOPT;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* FIXME: Write code */
|
||||
|
||||
|
||||
/* Check the Level first */
|
||||
switch (Level)
|
||||
{
|
||||
/* Handle SOL_SOCKET */
|
||||
case SOL_SOCKET:
|
||||
|
||||
/* Now check the Option */
|
||||
switch (OptionName)
|
||||
{
|
||||
case SO_RCVBUF:
|
||||
|
||||
/* Validate the size */
|
||||
if (OptionLength < sizeof(INT))
|
||||
{
|
||||
/* Size is too small, fail */
|
||||
ErrorCode = WSAEFAULT;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Set the data */
|
||||
Socket->SharedData.SizeOfRecvBuffer = *(PINT)OptionValue;
|
||||
|
||||
/* FIXME: Tell AFD */
|
||||
break;
|
||||
|
||||
case SO_SNDBUF:
|
||||
|
||||
/* Validate the size */
|
||||
if (OptionLength < sizeof(INT))
|
||||
{
|
||||
/* Size is too small, fail */
|
||||
ErrorCode = WSAEFAULT;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Set the data */
|
||||
Socket->SharedData.SizeOfSendBuffer = *(PINT)OptionValue;
|
||||
|
||||
/* FIXME: Tell AFD */
|
||||
break;
|
||||
|
||||
case SO_BROADCAST:
|
||||
|
||||
/* Validate the size */
|
||||
if (OptionLength < sizeof(INT))
|
||||
{
|
||||
/* Size is too small, fail */
|
||||
ErrorCode = WSAEFAULT;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Set the data */
|
||||
Socket->SharedData.Broadcast = *(PINT)OptionValue;
|
||||
break;
|
||||
|
||||
case SO_DEBUG:
|
||||
|
||||
/* Validate the size */
|
||||
if (OptionLength < sizeof(INT))
|
||||
{
|
||||
/* Size is too small, fail */
|
||||
ErrorCode = WSAEFAULT;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Set the data */
|
||||
Socket->SharedData.Debug = *(PINT)OptionValue;
|
||||
break;
|
||||
|
||||
case SO_CONDITIONAL_ACCEPT:
|
||||
case SO_DONTLINGER:
|
||||
case SO_DONTROUTE:
|
||||
case SO_ERROR:
|
||||
case SO_GROUP_PRIORITY:
|
||||
case SO_KEEPALIVE:
|
||||
case SO_LINGER:
|
||||
case SO_OOBINLINE:
|
||||
case SO_REUSEADDR:
|
||||
|
||||
/* Unsupported */
|
||||
|
||||
default:
|
||||
|
||||
/* Unsupported by us, give it to the helper */
|
||||
ErrorCode = SockGetTdiHandles(Socket);
|
||||
if (ErrorCode != NO_ERROR) goto error;
|
||||
|
||||
/* Call the helper */
|
||||
ErrorCode = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext,
|
||||
Handle,
|
||||
Socket->TdiAddressHandle,
|
||||
Socket->TdiConnectionHandle,
|
||||
Level,
|
||||
OptionName,
|
||||
(PCHAR)OptionValue,
|
||||
OptionLength);
|
||||
if (ErrorCode != NO_ERROR) goto error;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Unsupported by us, give it to the helper */
|
||||
ErrorCode = SockGetTdiHandles(Socket);
|
||||
if (ErrorCode != NO_ERROR) goto error;
|
||||
|
||||
/* Call the helper */
|
||||
ErrorCode = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext,
|
||||
Handle,
|
||||
Socket->TdiAddressHandle,
|
||||
Socket->TdiConnectionHandle,
|
||||
Level,
|
||||
OptionName,
|
||||
(PCHAR)OptionValue,
|
||||
OptionLength);
|
||||
if (ErrorCode != NO_ERROR) goto error;
|
||||
break;
|
||||
}
|
||||
|
||||
error:
|
||||
|
||||
/* Dereference and unlock the socket */
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
SockDereferenceSocket(Socket);
|
||||
|
||||
/* Check if this is the failure path */
|
||||
if (ErrorCode != NO_ERROR)
|
||||
{
|
||||
/* Dereference and unlock the socket */
|
||||
LeaveCriticalSection(&Socket->Lock);
|
||||
SockDereferenceSocket(Socket);
|
||||
|
||||
/* Return error */
|
||||
*lpErrno = ErrorCode;
|
||||
return SOCKET_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Update the socket's state in AFD */
|
||||
ErrorCode = SockSetHandleContext(Socket);
|
||||
if (ErrorCode != NO_ERROR) goto error;
|
||||
|
||||
|
||||
/* Return success */
|
||||
return NO_ERROR;
|
||||
return ErrorCode;
|
||||
}
|
||||
|
||||
|
@@ -59,23 +59,43 @@ VOID
|
||||
WSPAPI
|
||||
NewIcfConnection(IN PSOCK_ICF_DATA IcfData)
|
||||
{
|
||||
BOOLEAN Failed = FALSE;
|
||||
|
||||
/* Load the ICF DLL */
|
||||
IcfData->DllHandle = LoadLibraryW(L"hhnetcfg.dll");
|
||||
IcfData->DllHandle = LoadLibraryW(L"hnetcfg.dll");
|
||||
if (IcfData->DllHandle)
|
||||
{
|
||||
/* Get the entrypoints */
|
||||
IcfData->IcfOpenDynamicFwPort = GetProcAddress(IcfData->DllHandle,
|
||||
"IcfOpenDynamicFwPort");
|
||||
if (!IcfData->IcfOpenDynamicFwPort)
|
||||
{
|
||||
DbgPrint("FIXME: Implement IcfOpenDynamicFwPort in hnetcfg.dll for MSWSOCK!\n");
|
||||
Failed = TRUE;
|
||||
}
|
||||
|
||||
IcfData->IcfConnect = (PICF_CONNECT)GetProcAddress(IcfData->DllHandle,
|
||||
"IcfConnect");
|
||||
if (!IcfData->IcfConnect)
|
||||
{
|
||||
DbgPrint("FIXME: Implement IcfConnect in hnetcfg.dll for MSWSOCK!\n");
|
||||
Failed = TRUE;
|
||||
}
|
||||
|
||||
IcfData->IcfDisconnect = GetProcAddress(IcfData->DllHandle,
|
||||
"IcfDisconnect");
|
||||
if (!IcfData->IcfDisconnect)
|
||||
{
|
||||
DbgPrint("FIXME: Implement IcfDisconnect in hnetcfg.dll for MSWSOCK!\n");
|
||||
Failed = TRUE;
|
||||
}
|
||||
|
||||
/* Now call IcfConnect */
|
||||
if (!IcfData->IcfConnect(IcfData))
|
||||
if (Failed || !IcfData->IcfConnect(IcfData))
|
||||
{
|
||||
/* We failed, release the library */
|
||||
FreeLibrary(IcfData->DllHandle);
|
||||
IcfData->DllHandle = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,7 +123,7 @@ CloseIcfConnection(IN PSOCK_ICF_DATA IcfData)
|
||||
if (IcfData->IcfHandle)
|
||||
{
|
||||
/* Call IcfDisconnect */
|
||||
IcfData->IcfConnect(IcfData);
|
||||
IcfData->IcfDisconnect(IcfData);
|
||||
|
||||
/* Release the library */
|
||||
FreeLibrary(IcfData->DllHandle);
|
||||
|
@@ -169,12 +169,15 @@ typedef struct _WINSOCK_TEB_DATA
|
||||
typedef INT
|
||||
(WINAPI *PICF_CONNECT)(PVOID IcfData);
|
||||
|
||||
typedef INT
|
||||
(WINAPI *PICF_DISCONNECT)(PVOID IcfData);
|
||||
|
||||
typedef struct _SOCK_ICF_DATA
|
||||
{
|
||||
HANDLE IcfHandle;
|
||||
PVOID IcfOpenDynamicFwPort;
|
||||
PICF_CONNECT IcfConnect;
|
||||
PVOID IcfDisconnect;
|
||||
PICF_DISCONNECT IcfDisconnect;
|
||||
HINSTANCE DllHandle;
|
||||
} SOCK_ICF_DATA, *PSOCK_ICF_DATA;
|
||||
|
||||
@@ -404,7 +407,7 @@ SockEnterApiFast(OUT PWINSOCK_TEB_DATA *ThreadData)
|
||||
/* Make sure we aren't terminating and get our thread data */
|
||||
if (!(SockProcessTerminating) &&
|
||||
(SockWspStartupCount > 0) &&
|
||||
((*ThreadData == NtCurrentTeb()->WinSockData)))
|
||||
((*ThreadData = NtCurrentTeb()->WinSockData)))
|
||||
{
|
||||
/* Everything is good, return */
|
||||
return NO_ERROR;
|
||||
|
@@ -105,7 +105,7 @@ NTSTATUS
|
||||
NTAPI
|
||||
RtlIpv4StringToAddressW(IN PCWSTR String,
|
||||
IN BOOLEAN Strict,
|
||||
OUT LPTSTR *Terminator,
|
||||
OUT LPWSTR *Terminator,
|
||||
OUT struct in_addr *Addr)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
|
Reference in New Issue
Block a user