ReactOS 0.4.17-dev-966-gf06eace
msafd.h File Reference
#include <stdarg.h>
#include <windef.h>
#include <winbase.h>
#include <ws2spi.h>
#include <ndk/exfuncs.h>
#include <ndk/iofuncs.h>
#include <ndk/obfuncs.h>
#include <ndk/rtlfuncs.h>
#include <wsahelp.h>
#include <tdi.h>
#include <afd/shared.h>
#include <mswsock.h>
#include <wine/debug.h>
#include "include/helpers.h"
Include dependency graph for msafd.h:

Go to the source code of this file.

Classes

struct  _SOCKET_INFORMATION
 
struct  _SOCKET_CONTEXT
 
struct  _ASYNC_DATA
 
struct  _MSAFD_INFO_APC_CONTEXT
 
struct  _MSAFD_SEND_APC_CONTEXT
 
struct  _MSAFD_RECV_APC_CONTEXT
 
struct  _MSAFD_CONNECT_APC_CONTEXT
 

Macros

#define WIN32_NO_STATUS
 
#define _INC_WINDOWS
 
#define COM_NO_WINDOWS_H
 
#define NTOS_MODE_USER
 

Typedefs

typedef struct _SOCKET_INFORMATION SOCKET_INFORMATION
 
typedef struct _SOCKET_INFORMATION * PSOCKET_INFORMATION
 
typedef struct _SOCKET_CONTEXT SOCKET_CONTEXT
 
typedef struct _SOCKET_CONTEXT * PSOCKET_CONTEXT
 
typedef struct _ASYNC_DATA ASYNC_DATA
 
typedef struct _ASYNC_DATA * PASYNC_DATA
 
typedef struct _MSAFD_INFO_APC_CONTEXT MSAFD_INFO_APC_CONTEXT
 
typedef struct _MSAFD_INFO_APC_CONTEXT * PMSAFD_INFO_APC_CONTEXT
 
typedef struct _MSAFD_SEND_APC_CONTEXT MSAFD_SEND_APC_CONTEXT
 
typedef struct _MSAFD_SEND_APC_CONTEXT * PMSAFD_SEND_APC_CONTEXT
 
typedef struct _MSAFD_RECV_APC_CONTEXT MSAFD_RECV_APC_CONTEXT
 
typedef struct _MSAFD_RECV_APC_CONTEXT * PMSAFD_RECV_APC_CONTEXT
 
typedef struct _MSAFD_CONNECT_APC_CONTEXT MSAFD_CONNECT_APC_CONTEXT
 
typedef struct _MSAFD_CONNECT_APC_CONTEXT * PMSAFD_CONNECT_APC_CONTEXT
 
typedef VOID(* PASYNC_COMPLETION_ROUTINE) (PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (msafd)
 
_Must_inspect_result_ SOCKET WSPAPI WSPAccept (_In_ SOCKET s, _Out_writes_bytes_to_opt_(*addrlen, *addrlen) struct sockaddr FAR *addr, _Inout_opt_ LPINT addrlen, _In_opt_ LPCONDITIONPROC lpfnCondition, _In_opt_ DWORD_PTR dwCallbackData, _Out_ LPINT lpErrno)
 
INT WSPAPI WSPAddressToString (IN LPSOCKADDR lpsaAddress, IN DWORD dwAddressLength, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPWSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength, OUT LPINT lpErrno)
 
INT WSPAPI WSPAsyncSelect (IN SOCKET s, IN HWND hWnd, IN UINT wMsg, IN LONG lEvent, OUT LPINT lpErrno)
 
INT WSPAPI WSPBind (IN SOCKET s, IN CONST SOCKADDR *name, IN INT namelen, OUT LPINT lpErrno)
 
INT WSPAPI WSPCancelBlockingCall (OUT LPINT lpErrno)
 
INT WSPAPI WSPCleanup (OUT LPINT lpErrno)
 
INT WSPAPI WSPCloseSocket (IN SOCKET s, OUT LPINT lpErrno)
 
INT WSPAPI WSPConnect (IN SOCKET s, IN CONST SOCKADDR *name, IN INT namelen, IN LPWSABUF lpCallerData, OUT LPWSABUF lpCalleeData, IN LPQOS lpSQOS, IN LPQOS lpGQOS, OUT LPINT lpErrno)
 
INT WSPAPI WSPDuplicateSocket (IN SOCKET s, IN DWORD dwProcessId, OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPINT lpErrno)
 
INT WSPAPI WSPEnumNetworkEvents (IN SOCKET s, IN WSAEVENT hEventObject, OUT LPWSANETWORKEVENTS lpNetworkEvents, OUT LPINT lpErrno)
 
INT WSPAPI WSPEventSelect (IN SOCKET s, IN WSAEVENT hEventObject, IN LONG lNetworkEvents, OUT LPINT lpErrno)
 
BOOL WSPAPI WSPGetOverlappedResult (IN SOCKET s, IN LPWSAOVERLAPPED lpOverlapped, OUT LPDWORD lpcbTransfer, IN BOOL fWait, OUT LPDWORD lpdwFlags, OUT LPINT lpErrno)
 
INT WSPAPI WSPGetPeerName (IN SOCKET s, OUT LPSOCKADDR name, IN OUT LPINT namelen, OUT LPINT lpErrno)
 
BOOL WSPAPI WSPGetQOSByName (IN SOCKET s, IN OUT LPWSABUF lpQOSName, OUT LPQOS lpQOS, OUT LPINT lpErrno)
 
INT WSPAPI WSPGetSockName (IN SOCKET s, OUT LPSOCKADDR name, IN OUT LPINT namelen, OUT LPINT lpErrno)
 
INT WSPAPI WSPGetSockOpt (IN SOCKET s, IN INT level, IN INT optname, OUT CHAR FAR *optval, IN OUT LPINT optlen, OUT LPINT lpErrno)
 
INT WSPAPI WSPIoctl (IN SOCKET s, IN DWORD dwIoControlCode, IN LPVOID lpvInBuffer, IN DWORD cbInBuffer, OUT LPVOID lpvOutBuffer, IN DWORD cbOutBuffer, OUT LPDWORD lpcbBytesReturned, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, IN LPWSATHREADID lpThreadId, OUT LPINT lpErrno)
 
SOCKET WSPAPI WSPJoinLeaf (IN SOCKET s, IN CONST SOCKADDR *name, IN INT namelen, IN LPWSABUF lpCallerData, OUT LPWSABUF lpCalleeData, IN LPQOS lpSQOS, IN LPQOS lpGQOS, IN DWORD dwFlags, OUT LPINT lpErrno)
 
INT WSPAPI WSPListen (IN SOCKET s, IN INT backlog, OUT LPINT lpErrno)
 
INT WSPAPI WSPRecv (IN SOCKET s, IN OUT LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesRecvd, IN OUT LPDWORD lpFlags, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, IN LPWSATHREADID lpThreadId, OUT LPINT lpErrno)
 
INT WSPAPI WSPRecvDisconnect (IN SOCKET s, OUT LPWSABUF lpInboundDisconnectData, OUT LPINT lpErrno)
 
INT WSPAPI WSPRecvFrom (IN SOCKET s, IN OUT LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesRecvd, IN OUT LPDWORD lpFlags, OUT LPSOCKADDR lpFrom, IN OUT LPINT lpFromlen, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, IN LPWSATHREADID lpThreadId, OUT LPINT lpErrno)
 
INT WSPAPI WSPSelect (IN INT nfds, IN OUT fd_set *readfds, IN OUT fd_set *writefds, IN OUT fd_set *exceptfds, IN CONST struct timeval *timeout, OUT LPINT lpErrno)
 
INT WSPAPI WSPSend (IN SOCKET s, IN LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesSent, IN DWORD dwFlags, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, IN LPWSATHREADID lpThreadId, OUT LPINT lpErrno)
 
INT WSPAPI WSPSendDisconnect (IN SOCKET s, IN LPWSABUF lpOutboundDisconnectData, OUT LPINT lpErrno)
 
INT WSPAPI WSPSendTo (IN SOCKET s, IN LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesSent, IN DWORD dwFlags, IN CONST SOCKADDR *lpTo, IN INT iTolen, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, IN LPWSATHREADID lpThreadId, OUT LPINT lpErrno)
 
INT WSPAPI WSPSetSockOpt (IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen, OUT LPINT lpErrno)
 
INT WSPAPI WSPShutdown (IN SOCKET s, IN INT how, OUT LPINT lpErrno)
 
SOCKET WSPAPI WSPSocket (IN INT af, IN INT type, IN INT protocol, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, IN GROUP g, IN DWORD dwFlags, OUT LPINT lpErrno)
 
INT WSPAPI WSPStringToAddress (IN LPWSTR AddressString, IN INT AddressFamily, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPSOCKADDR lpAddress, IN OUT LPINT lpAddressLength, OUT LPINT lpErrno)
 
BOOL WSPAPI WSPAcceptEx (IN SOCKET sListenSocket, IN SOCKET sAcceptSocket, OUT PVOID lpOutputBuffer, IN DWORD dwReceiveDataLength, IN DWORD dwLocalAddressLength, IN DWORD dwRemoteAddressLength, OUT LPDWORD lpdwBytesReceived, IN OUT LPOVERLAPPED lpOverlapped)
 
BOOL WSPAPI WSPConnectEx (IN SOCKET s, IN const struct sockaddr *name, IN int namelen, IN PVOID lpSendBuffer, IN DWORD dwSendDataLength, OUT LPDWORD lpdwBytesSent, IN OUT LPOVERLAPPED lpOverlapped)
 
BOOL WSPAPI WSPDisconnectEx (IN SOCKET hSocket, IN LPOVERLAPPED lpOverlapped, IN DWORD dwFlags, IN DWORD reserved)
 
VOID WSPAPI WSPGetAcceptExSockaddrs (IN PVOID lpOutputBuffer, IN DWORD dwReceiveDataLength, IN DWORD dwLocalAddressLength, IN DWORD dwRemoteAddressLength, OUT struct sockaddr **LocalSockaddr, OUT LPINT LocalSockaddrLength, OUT struct sockaddr **RemoteSockaddr, OUT LPINT RemoteSockaddrLength)
 
PSOCKET_INFORMATION GetSocketStructure (SOCKET Handle)
 
INT TranslateNtStatusError (NTSTATUS Status)
 
VOID DeleteSocketStructure (SOCKET Handle)
 
int GetSocketInformation (PSOCKET_INFORMATION Socket, ULONG AfdInformationClass, PBOOLEAN Boolean OPTIONAL, PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL, LPWSAOVERLAPPED Overlapped OPTIONAL, LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL)
 
int SetSocketInformation (PSOCKET_INFORMATION Socket, ULONG AfdInformationClass, PBOOLEAN Boolean OPTIONAL, PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL, LPWSAOVERLAPPED Overlapped OPTIONAL, LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL)
 
int CreateContext (PSOCKET_INFORMATION Socket)
 
ULONG NTAPI SockAsyncThread (PVOID ThreadParam)
 
VOID SockProcessAsyncSelect (PSOCKET_INFORMATION Socket, PASYNC_DATA AsyncData)
 
VOID SockAsyncSelectCompletionRoutine (PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
 
BOOLEAN SockCreateOrReferenceAsyncThread (VOID)
 
BOOLEAN SockGetAsyncSelectHelperAfdHandle (VOID)
 
VOID SockProcessQueuedAsyncSelect (PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
 
VOID SockReenableAsyncSelectEvent (IN PSOCKET_INFORMATION Socket, IN ULONG Event)
 
FORCEINLINE DWORD MsafdReturnWithErrno (_In_ NTSTATUS Status, _Out_opt_ LPINT Errno, _In_ DWORD Received, _Out_opt_ LPDWORD ReturnedBytes)
 
VOID MsafdWaitForAlert (_In_ HANDLE hObject)
 

Variables

HANDLE GlobalHeap
 
WSPUPCALLTABLE Upcalls
 
LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest
 
LIST_ENTRY SockHelpersListHead
 
HANDLE SockEvent
 
HANDLE SockAsyncCompletionPort
 
BOOLEAN SockAsyncSelectCalled
 

Macro Definition Documentation

◆ _INC_WINDOWS

#define _INC_WINDOWS

Definition at line 14 of file msafd.h.

◆ COM_NO_WINDOWS_H

#define COM_NO_WINDOWS_H

Definition at line 15 of file msafd.h.

◆ NTOS_MODE_USER

#define NTOS_MODE_USER

Definition at line 20 of file msafd.h.

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 13 of file msafd.h.

Typedef Documentation

◆ ASYNC_DATA

◆ MSAFD_CONNECT_APC_CONTEXT

◆ MSAFD_INFO_APC_CONTEXT

◆ MSAFD_RECV_APC_CONTEXT

◆ MSAFD_SEND_APC_CONTEXT

◆ PASYNC_COMPLETION_ROUTINE

typedef VOID(* PASYNC_COMPLETION_ROUTINE) (PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)

Definition at line 511 of file msafd.h.

◆ PASYNC_DATA

◆ PMSAFD_CONNECT_APC_CONTEXT

◆ PMSAFD_INFO_APC_CONTEXT

◆ PMSAFD_RECV_APC_CONTEXT

◆ PMSAFD_SEND_APC_CONTEXT

◆ PSOCKET_CONTEXT

◆ PSOCKET_INFORMATION

◆ SOCKET_CONTEXT

◆ SOCKET_INFORMATION

Function Documentation

◆ CreateContext()

int CreateContext ( PSOCKET_INFORMATION  Socket)

Definition at line 3983 of file dllmain.c.

3984{
3985 IO_STATUS_BLOCK IOSB;
3986 SOCKET_CONTEXT ContextData;
3989
3992 NULL,
3994 FALSE);
3995
3996 if( !NT_SUCCESS(Status) )
3997 return SOCKET_ERROR;
3998
3999 /* Create Context */
4000 ContextData.SharedData = *Socket->SharedData;
4001 ContextData.SizeOfHelperData = 0;
4002 RtlCopyMemory (&ContextData.LocalAddress,
4003 Socket->LocalAddress,
4005 RtlCopyMemory (&ContextData.RemoteAddress,
4006 Socket->RemoteAddress,
4008
4009 /* Send IOCTL */
4011 SockEvent,
4012 NULL,
4013 NULL,
4014 &IOSB,
4016 &ContextData,
4017 sizeof(ContextData),
4018 NULL,
4019 0);
4020
4021 /* Wait for Completion */
4022 if (Status == STATUS_PENDING)
4023 {
4025 Status = IOSB.Status;
4026 }
4027
4028 NtClose( SockEvent );
4029
4031}
LONG NTSTATUS
Definition: precomp.h:26
#define NO_ERROR
Definition: dderror.h:5
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
VOID MsafdWaitForAlert(_In_ HANDLE hObject)
Definition: dllmain.c:614
HANDLE SockEvent
Status
Definition: gdiplustypes.h:24
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3429
@ SynchronizationEvent
NTSTATUS NTAPI NtCreateEvent(OUT PHANDLE EventHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN EVENT_TYPE EventType, IN BOOLEAN InitialState)
Definition: event.c:96
#define IOCTL_AFD_SET_CONTEXT
Definition: shared.h:319
#define STATUS_SUCCESS
Definition: shellext.h:65
SOCK_SHARED_INFO SharedData
Definition: msafd.h:68
SOCKADDR RemoteAddress
Definition: msafd.h:72
SOCKADDR LocalAddress
Definition: msafd.h:71
ULONG SizeOfHelperData
Definition: msafd.h:69
PSOCKADDR LocalAddress
Definition: msafd.h:52
PSOCK_SHARED_INFO SharedData
Definition: msafd.h:47
PSOCKADDR RemoteAddress
Definition: msafd.h:53
SOCKET Handle
Definition: msafd.h:46
INT SizeOfLocalAddress
Definition: shared.h:388
INT SizeOfRemoteAddress
Definition: shared.h:389
#define STATUS_PENDING
Definition: telnetd.h:14
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define SOCKET_ERROR
Definition: winsock.h:327

Referenced by WSPSocket().

◆ DeleteSocketStructure()

VOID DeleteSocketStructure ( SOCKET  Handle)

◆ GetSocketInformation()

int GetSocketInformation ( PSOCKET_INFORMATION  Socket,
ULONG  AfdInformationClass,
PBOOLEAN Boolean  OPTIONAL,
PULONG Ulong  OPTIONAL,
PLARGE_INTEGER LargeInteger  OPTIONAL,
LPWSAOVERLAPPED Overlapped  OPTIONAL,
LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine  OPTIONAL 
)

Definition at line 3712 of file dllmain.c.

3719{
3720 PIO_STATUS_BLOCK IOSB;
3721 IO_STATUS_BLOCK DummyIOSB;
3722 PAFD_INFO InfoData;
3724 PMSAFD_INFO_APC_CONTEXT APCContext;
3725 PIO_APC_ROUTINE APCFunction;
3726 HANDLE Event = NULL;
3728
3729 InfoData = HeapAlloc(GlobalHeap, 0, sizeof(*InfoData));
3730 if (!InfoData)
3731 return SOCKET_ERROR;
3732
3735 NULL,
3737 FALSE);
3738 if (!NT_SUCCESS(Status))
3739 {
3740 HeapFree(GlobalHeap, 0, InfoData);
3741 return SOCKET_ERROR;
3742 }
3743
3744 /* Set Info Class */
3745 InfoData->InformationClass = AfdInformationClass;
3746
3747 /* Verify if we should use APC */
3748 if (!Overlapped)
3749 {
3750 /* Not using Overlapped structure, so use normal blocking on event */
3751 APCContext = NULL;
3752 APCFunction = NULL;
3753 Event = SockEvent;
3754 IOSB = &DummyIOSB;
3755 }
3756 else
3757 {
3758 /* Overlapped request for non overlapped opened socket */
3759 if ((Socket->SharedData->CreateFlags & SO_SYNCHRONOUS_NONALERT) != 0)
3760 {
3761 TRACE("Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
3763 HeapFree(GlobalHeap, 0, InfoData);
3765 }
3766
3767 APCContext = HeapAlloc(GlobalHeap, 0, sizeof(*APCContext));
3768 if (!APCContext)
3769 {
3770 ERR("Not enough memory for APC Context\n");
3772 HeapFree(GlobalHeap, 0, InfoData);
3774 }
3776 APCContext->lpOverlapped = Overlapped;
3777 APCContext->lpInfoData = InfoData;
3778 APCFunction = &MsafdInfoAPC;
3779
3780 if (!CompletionRoutine)
3781 Event = Overlapped->hEvent;
3782
3783 IOSB = (PIO_STATUS_BLOCK)&Overlapped->Internal;
3784 }
3785
3786 IOSB->Status = STATUS_PENDING;
3787
3788 /* Send IOCTL */
3790 Event,
3791 APCFunction,
3792 APCContext,
3793 IOSB,
3795 InfoData,
3796 sizeof(*InfoData),
3797 InfoData,
3798 sizeof(*InfoData));
3799
3800 /* Wait for completion if not overlapped */
3801 if (!Overlapped && Status == STATUS_PENDING)
3802 {
3804 Status = IOSB->Status;
3805 }
3806
3807 TRACE("Status %lx\n", Status);
3808
3809 if (Status == STATUS_SUCCESS)
3810 {
3811 /* Return Information */
3812 if (Ulong != NULL)
3813 {
3814 *Ulong = InfoData->Information.Ulong;
3815 }
3816 if (LargeInteger != NULL)
3817 {
3818 *LargeInteger = InfoData->Information.LargeInteger;
3819 }
3820 if (Boolean != NULL)
3821 {
3822 *Boolean = InfoData->Information.Boolean;
3823 }
3824 }
3825
3827 if (!APCFunction)
3828 {
3829 /* When using APC, this will be freed by the APC function */
3830 HeapFree(GlobalHeap, 0, InfoData);
3831 }
3832
3833 return MsafdReturnWithErrno(Status, NULL, 0, NULL);
3834}
#define ERR(fmt,...)
Definition: precomp.h:57
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
static VOID NTAPI MsafdInfoAPC(_In_ PVOID ApcContext, _In_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG Reserved)
Definition: dllmain.c:3693
HANDLE GlobalHeap
Definition: dllmain.c:19
FORCEINLINE DWORD MsafdReturnWithErrno(_In_ NTSTATUS Status, _Out_opt_ LPINT Errno, _In_ DWORD Received, _Out_opt_ LPDWORD ReturnedBytes)
Definition: msafd.h:515
#define SO_SYNCHRONOUS_NONALERT
Definition: ws2_32.h:41
struct _IO_STATUS_BLOCK * PIO_STATUS_BLOCK
Definition: change.c:34
VOID(* PIO_APC_ROUTINE)(IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved)
Definition: nt_native.h:880
#define IOCTL_AFD_GET_INFO
Definition: shared.h:345
#define TRACE(s)
Definition: solgame.cpp:4
ULONG InformationClass
Definition: shared.h:29
ULONG Ulong
Definition: shared.h:31
union _AFD_INFO::@4118 Information
BOOLEAN Boolean
Definition: shared.h:33
LARGE_INTEGER LargeInteger
Definition: shared.h:32
PAFD_INFO lpInfoData
Definition: msafd.h:87
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
Definition: msafd.h:86
LPWSAOVERLAPPED lpOverlapped
Definition: msafd.h:85
DWORD CreateFlags
Definition: shared.h:410
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
unsigned long Ulong
Definition: utypes.h:42
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE CompletionRoutine
Definition: wdfrequest.h:895

Referenced by WSPCloseSocket(), WSPIoctl(), WSPSetSockOpt(), and WSPSocket().

◆ GetSocketStructure()

PSOCKET_INFORMATION GetSocketStructure ( SOCKET  Handle)

Definition at line 3960 of file dllmain.c.

3961{
3962 PSOCKET_INFORMATION CurrentSocket;
3963
3965
3966 CurrentSocket = SocketListHead;
3967 while (CurrentSocket)
3968 {
3969 if (CurrentSocket->Handle == Handle)
3970 {
3972 return CurrentSocket;
3973 }
3974
3975 CurrentSocket = CurrentSocket->NextSocket;
3976 }
3977
3979
3980 return NULL;
3981}
PSOCKET_INFORMATION SocketListHead
Definition: dllmain.c:23
CRITICAL_SECTION SocketListLock
Definition: dllmain.c:24
ULONG Handle
Definition: gdb_input.c:15
struct _SOCKET_INFORMATION * NextSocket
Definition: msafd.h:63
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)

Referenced by MsafdConnectAPC(), MsafdUpdateConnectionContext(), WSPAccept(), WSPAcceptEx(), WSPAsyncSelect(), WSPBind(), WSPCloseSocket(), WSPConnect(), WSPConnectEx(), WSPDuplicateSocket(), WSPEnumNetworkEvents(), WSPEventSelect(), WSPGetOverlappedResult(), WSPGetPeerName(), WSPGetSockName(), WSPGetSockOpt(), WSPIoctl(), WSPListen(), WSPRecv(), WSPRecvFrom(), WSPSelect(), WSPSend(), WSPSendTo(), WSPSetSockOpt(), and WSPShutdown().

◆ MsafdReturnWithErrno()

FORCEINLINE DWORD MsafdReturnWithErrno ( _In_ NTSTATUS  Status,
_Out_opt_ LPINT  Errno,
_In_ DWORD  Received,
_Out_opt_ LPDWORD  ReturnedBytes 
)

Definition at line 515 of file msafd.h.

520{
521 if (Errno)
522 {
524
525 if (ReturnedBytes)
526 *ReturnedBytes = (*Errno == 0) ? Received : 0;
527
528 return (*Errno == 0) ? 0 : SOCKET_ERROR;
529 }
530 else
531 {
532 if (ReturnedBytes)
533 *ReturnedBytes = (Status == STATUS_SUCCESS) ? Received : 0;
534
535 return (Status == STATUS_SUCCESS) ? 0 : SOCKET_ERROR;
536 }
537}
UINT Received
Definition: arping.c:40
INT TranslateNtStatusError(NTSTATUS Status)
Definition: dllmain.c:537

Referenced by GetSocketInformation(), SetSocketInformation(), WSPAccept(), WSPAsyncSelect(), WSPBind(), WSPCloseSocket(), WSPConnect(), WSPDuplicateSocket(), WSPEnumNetworkEvents(), WSPEventSelect(), WSPGetPeerName(), WSPGetSockName(), WSPListen(), WSPRecv(), WSPRecvFrom(), WSPSend(), WSPSendTo(), and WSPShutdown().

◆ MsafdWaitForAlert()

VOID MsafdWaitForAlert ( _In_ HANDLE  hObject)

Definition at line 614 of file dllmain.c.

616{
618
619 for (;;)
620 {
623 break;
624 }
625}
#define TRUE
Definition: types.h:120
#define INFINITE
Definition: serial.h:102
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD WINAPI WaitForSingleObjectEx(IN HANDLE hHandle, IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:94
#define WAIT_IO_COMPLETION
Definition: winbase.h:388
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

Referenced by CreateContext(), GetSocketInformation(), MsafdUpdateConnectionContext(), SetSocketInformation(), WSPAccept(), WSPBind(), WSPCloseSocket(), WSPConnect(), WSPEnumNetworkEvents(), WSPEventSelect(), WSPGetPeerName(), WSPGetSockName(), WSPListen(), WSPRecv(), WSPRecvFrom(), WSPSelect(), WSPSend(), WSPSendTo(), and WSPShutdown().

◆ SetSocketInformation()

int SetSocketInformation ( PSOCKET_INFORMATION  Socket,
ULONG  AfdInformationClass,
PBOOLEAN Boolean  OPTIONAL,
PULONG Ulong  OPTIONAL,
PLARGE_INTEGER LargeInteger  OPTIONAL,
LPWSAOVERLAPPED Overlapped  OPTIONAL,
LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine  OPTIONAL 
)

Definition at line 3838 of file dllmain.c.

3845{
3846 PIO_STATUS_BLOCK IOSB;
3847 IO_STATUS_BLOCK DummyIOSB;
3848 PAFD_INFO InfoData;
3850 PMSAFD_INFO_APC_CONTEXT APCContext;
3851 PIO_APC_ROUTINE APCFunction;
3852 HANDLE Event = NULL;
3854
3855 InfoData = HeapAlloc(GlobalHeap, 0, sizeof(*InfoData));
3856 if (!InfoData)
3857 return SOCKET_ERROR;
3858
3861 NULL,
3863 FALSE);
3864 if (!NT_SUCCESS(Status))
3865 {
3866 HeapFree(GlobalHeap, 0, InfoData);
3867 return SOCKET_ERROR;
3868 }
3869
3870 /* Set Info Class */
3871 InfoData->InformationClass = AfdInformationClass;
3872
3873 /* Set Information */
3874 if (Ulong != NULL)
3875 {
3876 InfoData->Information.Ulong = *Ulong;
3877 }
3878 if (LargeInteger != NULL)
3879 {
3880 InfoData->Information.LargeInteger = *LargeInteger;
3881 }
3882 if (Boolean != NULL)
3883 {
3884 InfoData->Information.Boolean = *Boolean;
3885 }
3886
3887 /* Verify if we should use APC */
3888 if (!Overlapped)
3889 {
3890 /* Not using Overlapped structure, so use normal blocking on event */
3891 APCContext = NULL;
3892 APCFunction = NULL;
3893 Event = SockEvent;
3894 IOSB = &DummyIOSB;
3895 }
3896 else
3897 {
3898 /* Overlapped request for non overlapped opened socket */
3899 if ((Socket->SharedData->CreateFlags & SO_SYNCHRONOUS_NONALERT) != 0)
3900 {
3901 TRACE("Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
3903 HeapFree(GlobalHeap, 0, InfoData);
3905 }
3906
3907 APCContext = HeapAlloc(GlobalHeap, 0, sizeof(*APCContext));
3908 if (!APCContext)
3909 {
3910 ERR("Not enough memory for APC Context\n");
3912 HeapFree(GlobalHeap, 0, InfoData);
3914 }
3916 APCContext->lpOverlapped = Overlapped;
3917 APCContext->lpInfoData = InfoData;
3918 APCFunction = &MsafdInfoAPC;
3919
3920 if (!CompletionRoutine)
3921 Event = Overlapped->hEvent;
3922
3923 IOSB = (PIO_STATUS_BLOCK)&Overlapped->Internal;
3924 }
3925
3926 IOSB->Status = STATUS_PENDING;
3927
3928 /* Send IOCTL */
3930 Event,
3931 APCFunction,
3932 APCContext,
3933 IOSB,
3935 InfoData,
3936 sizeof(*InfoData),
3937 NULL,
3938 0);
3939
3940 /* Wait for completion if not overlapped */
3941 if (!Overlapped && Status == STATUS_PENDING)
3942 {
3944 Status = IOSB->Status;
3945 }
3946
3947 TRACE("Status %lx\n", Status);
3948
3950 if (!APCFunction)
3951 {
3952 /* When using APC, this will be freed by the APC function */
3953 HeapFree(GlobalHeap, 0, InfoData);
3954 }
3955
3956 return MsafdReturnWithErrno(Status, NULL, 0, NULL);
3957}
#define IOCTL_AFD_SET_INFO
Definition: shared.h:313

Referenced by WSPAsyncSelect(), WSPEventSelect(), WSPIoctl(), and WSPSetSockOpt().

◆ SockAsyncSelectCompletionRoutine()

VOID SockAsyncSelectCompletionRoutine ( PVOID  Context,
PIO_STATUS_BLOCK  IoStatusBlock 
)

Definition at line 4190 of file dllmain.c.

4191{
4192
4193 PASYNC_DATA AsyncData = Context;
4194 PSOCKET_INFORMATION Socket;
4195 ULONG x;
4196
4197 /* Get the Socket */
4198 Socket = AsyncData->ParentSocket;
4199
4200 /* Check if the Sequence Number Changed behind our back */
4201 if (AsyncData->SequenceNumber != Socket->SharedData->SequenceNumber )
4202 {
4203 return;
4204 }
4205
4206 /* Check we were manually called b/c of a failure */
4207 if (!NT_SUCCESS(IoStatusBlock->Status))
4208 {
4209 /* FIXME: Perform Upcall */
4210 return;
4211 }
4212
4213 for (x = 1; x; x<<=1)
4214 {
4215 switch (AsyncData->AsyncSelectInfo.Handles[0].Events & x)
4216 {
4217 case AFD_EVENT_RECEIVE:
4218 if (0 != (Socket->SharedData->AsyncEvents & FD_READ) &&
4219 0 == (Socket->SharedData->AsyncDisabledEvents & FD_READ))
4220 {
4221 /* Make the Notification */
4223 Socket->SharedData->wMsg,
4224 Socket->Handle,
4226 /* Disable this event until the next read(); */
4228 }
4229 break;
4230
4232 if (0 != (Socket->SharedData->AsyncEvents & FD_OOB) &&
4233 0 == (Socket->SharedData->AsyncDisabledEvents & FD_OOB))
4234 {
4235 /* Make the Notification */
4237 Socket->SharedData->wMsg,
4238 Socket->Handle,
4240 /* Disable this event until the next read(); */
4242 }
4243 break;
4244
4245 case AFD_EVENT_SEND:
4246 if (0 != (Socket->SharedData->AsyncEvents & FD_WRITE) &&
4247 0 == (Socket->SharedData->AsyncDisabledEvents & FD_WRITE))
4248 {
4249 /* Make the Notification */
4251 Socket->SharedData->wMsg,
4252 Socket->Handle,
4254 /* Disable this event until the next write(); */
4256 }
4257 break;
4258
4259 /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
4260 case AFD_EVENT_CONNECT:
4262 if (0 != (Socket->SharedData->AsyncEvents & FD_CONNECT) &&
4263 0 == (Socket->SharedData->AsyncDisabledEvents & FD_CONNECT))
4264 {
4265 /* Make the Notification */
4267 Socket->SharedData->wMsg,
4268 Socket->Handle,
4270 /* Disable this event forever; */
4272 }
4273 break;
4274
4275 case AFD_EVENT_ACCEPT:
4276 if (0 != (Socket->SharedData->AsyncEvents & FD_ACCEPT) &&
4277 0 == (Socket->SharedData->AsyncDisabledEvents & FD_ACCEPT))
4278 {
4279 /* Make the Notification */
4281 Socket->SharedData->wMsg,
4282 Socket->Handle,
4284 /* Disable this event until the next accept(); */
4286 }
4287 break;
4288
4290 case AFD_EVENT_ABORT:
4291 case AFD_EVENT_CLOSE:
4292 if (0 != (Socket->SharedData->AsyncEvents & FD_CLOSE) &&
4293 0 == (Socket->SharedData->AsyncDisabledEvents & FD_CLOSE))
4294 {
4295 /* Make the Notification */
4297 Socket->SharedData->wMsg,
4298 Socket->Handle,
4300 /* Disable this event forever; */
4302 }
4303 break;
4304 /* FIXME: Support QOS */
4305 }
4306 }
4307
4308 /* Check if there are any events left for us to check */
4309 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 )
4310 {
4311 return;
4312 }
4313
4314 /* Keep Polling */
4315 SockProcessAsyncSelect(Socket, AsyncData);
4316 return;
4317}
_In_ PIO_STATUS_BLOCK IoStatusBlock
Definition: dispmprt.h:608
VOID SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, PASYNC_DATA AsyncData)
Definition: dllmain.c:4319
WSPUPCALLTABLE Upcalls
Definition: dllmain.c:20
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define AFD_EVENT_ACCEPT
Definition: shared.h:226
#define AFD_EVENT_SEND
Definition: shared.h:221
#define AFD_EVENT_OOB_RECEIVE
Definition: shared.h:220
#define AFD_EVENT_CONNECT_FAIL
Definition: shared.h:227
#define AFD_EVENT_RECEIVE
Definition: shared.h:219
#define AFD_EVENT_DISCONNECT
Definition: shared.h:222
#define AFD_EVENT_ABORT
Definition: shared.h:223
#define AFD_EVENT_CLOSE
Definition: shared.h:224
#define AFD_EVENT_CONNECT
Definition: shared.h:225
_In_ PVOID Context
Definition: storport.h:2269
ULONG Events
Definition: shared.h:51
AFD_HANDLE Handles[1]
Definition: shared.h:59
AFD_POLL_INFO AsyncSelectInfo
Definition: msafd.h:80
DWORD SequenceNumber
Definition: msafd.h:78
PSOCKET_INFORMATION ParentSocket
Definition: msafd.h:77
LONG AsyncDisabledEvents
Definition: shared.h:422
LONG AsyncEvents
Definition: shared.h:421
DWORD SequenceNumber
Definition: shared.h:419
LPWPUPOSTMESSAGE lpWPUPostMessage
Definition: ws2spi.h:609
uint32_t ULONG
Definition: typedefs.h:59
#define FD_READ
Definition: winsock.h:399
#define FD_WRITE
Definition: winsock.h:400
#define FD_CLOSE
Definition: winsock.h:404
#define FD_CONNECT
Definition: winsock.h:403
#define WSAMAKESELECTREPLY(e, error)
Definition: winsock.h:472
#define FD_OOB
Definition: winsock.h:401
#define FD_ACCEPT
Definition: winsock.h:402

Referenced by SockGetAsyncSelectHelperAfdHandle(), and SockProcessAsyncSelect().

◆ SockAsyncThread()

ULONG NTAPI SockAsyncThread ( PVOID  ThreadParam)

Definition at line 4094 of file dllmain.c.

4095{
4096 PVOID AsyncContext;
4097 PASYNC_COMPLETION_ROUTINE AsyncCompletionRoutine;
4098 IO_STATUS_BLOCK IOSB;
4100
4101 /* Make the Thread Higher Priority */
4103
4104 /* Do a KQUEUE/WorkItem Style Loop, thanks to IoCompletion Ports */
4105 do
4106 {
4108 (PVOID*)&AsyncCompletionRoutine,
4109 &AsyncContext,
4110 &IOSB,
4111 NULL);
4112 /* Call the Async Function */
4113 if (NT_SUCCESS(Status))
4114 {
4115 (*AsyncCompletionRoutine)(AsyncContext, &IOSB);
4116 }
4117 else
4118 {
4119 /* It Failed, sleep for a second */
4120 Sleep(1000);
4121 }
4122 } while ((Status != STATUS_TIMEOUT));
4123
4124 /* The Thread has Ended */
4125 return 0;
4126}
#define STATUS_TIMEOUT
Definition: d3dkmdt.h:49
BOOL WINAPI SetThreadPriority(IN HANDLE hThread, IN int nPriority)
Definition: thread.c:758
HANDLE SockAsyncCompletionPort
Definition: dllmain.c:28
VOID(* PASYNC_COMPLETION_ROUTINE)(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: msafd.h:511
NTSTATUS NTAPI NtRemoveIoCompletion(IN HANDLE IoCompletionHandle, OUT PVOID *KeyContext, OUT PVOID *ApcContext, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: iocomp.c:445
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:726
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1195
#define THREAD_PRIORITY_ABOVE_NORMAL
Definition: winbase.h:300

◆ SockCreateOrReferenceAsyncThread()

BOOLEAN SockCreateOrReferenceAsyncThread ( VOID  )

Definition at line 4033 of file dllmain.c.

4034{
4035 HANDLE hAsyncThread;
4036 DWORD AsyncThreadId;
4037 HANDLE AsyncEvent;
4040
4041 /* Check if the Thread Already Exists */
4043 {
4045 return TRUE;
4046 }
4047
4048 /* Create the Completion Port */
4050 {
4053 NULL,
4054 2); // Allow 2 threads only
4055 if (!NT_SUCCESS(Status))
4056 {
4057 ERR("Failed to create completion port: 0x%08x\n", Status);
4058 return FALSE;
4059 }
4060 /* Protect Handle */
4061 HandleFlags.ProtectFromClose = TRUE;
4062 HandleFlags.Inherit = FALSE;
4065 &HandleFlags,
4066 sizeof(HandleFlags));
4067 }
4068
4069 /* Create the Async Event */
4070 Status = NtCreateEvent(&AsyncEvent,
4072 NULL,
4074 FALSE);
4075
4076 /* Create the Async Thread */
4077 hAsyncThread = CreateThread(NULL,
4078 0,
4080 NULL,
4081 0,
4082 &AsyncThreadId);
4083
4084 /* Close the Handle */
4085 NtClose(hAsyncThread);
4086
4087 /* Increase the Reference Count */
4089 return TRUE;
4090}
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
ULONG NTAPI SockAsyncThread(PVOID ThreadParam)
Definition: dllmain.c:4094
ULONG SockAsyncThreadRefCount
Definition: dllmain.c:26
NTSTATUS NTAPI NtCreateIoCompletion(OUT PHANDLE IoCompletionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG NumberOfConcurrentThreads)
Definition: iocomp.c:253
#define ASSERT(a)
Definition: mode.c:44
#define IO_COMPLETION_ALL_ACCESS
Definition: file.c:43
@ ObjectHandleFlagInformation
Definition: obtypes.h:267
@ NotificationEvent
NTSTATUS NTAPI NtSetInformationObject(_In_ HANDLE ObjectHandle, _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass, _In_reads_bytes_(Length) PVOID ObjectInformation, _In_ ULONG Length)
Sets information for an object or for a handle to an object.
Definition: oblife.c:1845

Referenced by SockReenableAsyncSelectEvent(), and WSPAsyncSelect().

◆ SockGetAsyncSelectHelperAfdHandle()

BOOLEAN SockGetAsyncSelectHelperAfdHandle ( VOID  )

Definition at line 4128 of file dllmain.c.

4129{
4130 UNICODE_STRING AfdHelper;
4132 IO_STATUS_BLOCK IoSb;
4133 FILE_COMPLETION_INFORMATION CompletionInfo;
4135
4136 /* First, make sure we're not already initialized */
4138 {
4139 return TRUE;
4140 }
4141
4142 /* Set up Handle Name and Object */
4143 RtlInitUnicodeString(&AfdHelper, L"\\Device\\Afd\\AsyncSelectHlp" );
4145 &AfdHelper,
4147 NULL,
4148 NULL);
4149
4150 /* Open the Handle to AFD */
4154 &IoSb,
4155 NULL,
4156 0,
4159 0,
4160 NULL,
4161 0);
4162
4163 /*
4164 * Now Set up the Completion Port Information
4165 * This means that whenever a Poll is finished, the routine will be executed
4166 */
4167 CompletionInfo.Port = SockAsyncCompletionPort;
4168 CompletionInfo.Key = SockAsyncSelectCompletionRoutine;
4170 &IoSb,
4171 &CompletionInfo,
4172 sizeof(CompletionInfo),
4174
4175
4176 /* Protect the Handle */
4177 HandleFlags.ProtectFromClose = TRUE;
4178 HandleFlags.Inherit = FALSE;
4181 &HandleFlags,
4182 sizeof(HandleFlags));
4183
4184
4185 /* Set this variable to true so that Send/Recv/Accept will know wether to renable disabled events */
4187 return TRUE;
4188}
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define GENERIC_READ
Definition: compat.h:135
#define FILE_SHARE_READ
Definition: compat.h:136
VOID SockAsyncSelectCompletionRoutine(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: dllmain.c:4190
HANDLE SockAsyncHelperAfdHandle
Definition: dllmain.c:27
BOOLEAN SockAsyncSelectCalled
Definition: dllmain.c:29
#define L(x)
Definition: resources.c:13
@ FileCompletionInformation
Definition: from_kernel.h:91
#define FILE_OPEN_IF
Definition: from_kernel.h:56
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define SYNCHRONIZE
Definition: nt_native.h:61
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
Definition: iofunc.c:3096
NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)
#define GENERIC_WRITE
Definition: nt_native.h:90
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define OBJ_INHERIT
Definition: winternl.h:225

Referenced by WSPAsyncSelect().

◆ SockProcessAsyncSelect()

VOID SockProcessAsyncSelect ( PSOCKET_INFORMATION  Socket,
PASYNC_DATA  AsyncData 
)

Definition at line 4319 of file dllmain.c.

4320{
4321
4322 ULONG lNetworkEvents;
4324
4325 /* Set up the Async Data Event Info */
4326 AsyncData->AsyncSelectInfo.Timeout.HighPart = 0x7FFFFFFF;
4327 AsyncData->AsyncSelectInfo.Timeout.LowPart = 0xFFFFFFFF;
4328 AsyncData->AsyncSelectInfo.HandleCount = 1;
4329 AsyncData->AsyncSelectInfo.Exclusive = TRUE;
4330 AsyncData->AsyncSelectInfo.Handles[0].Handle = Socket->Handle;
4331 AsyncData->AsyncSelectInfo.Handles[0].Events = 0;
4332
4333 /* Remove unwanted events */
4334 lNetworkEvents = Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents);
4335
4336 /* Set Events to wait for */
4337 if (lNetworkEvents & FD_READ)
4338 {
4340 }
4341
4342 if (lNetworkEvents & FD_WRITE)
4343 {
4345 }
4346
4347 if (lNetworkEvents & FD_OOB)
4348 {
4350 }
4351
4352 if (lNetworkEvents & FD_ACCEPT)
4353 {
4355 }
4356
4357 /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
4358 if (lNetworkEvents & FD_CONNECT)
4359 {
4361 }
4362
4363 if (lNetworkEvents & FD_CLOSE)
4364 {
4366 }
4367
4368 if (lNetworkEvents & FD_QOS)
4369 {
4371 }
4372
4373 if (lNetworkEvents & FD_GROUP_QOS)
4374 {
4376 }
4377
4378 /* Send IOCTL */
4380 NULL,
4381 NULL,
4382 AsyncData,
4383 &AsyncData->IoStatusBlock,
4385 &AsyncData->AsyncSelectInfo,
4386 sizeof(AsyncData->AsyncSelectInfo),
4387 &AsyncData->AsyncSelectInfo,
4388 sizeof(AsyncData->AsyncSelectInfo));
4389
4390 /* I/O Manager Won't call the completion routine, let's do it manually */
4391 if (NT_SUCCESS(Status))
4392 {
4393 return;
4394 }
4395 else
4396 {
4397 AsyncData->IoStatusBlock.Status = Status;
4398 SockAsyncSelectCompletionRoutine(AsyncData, &AsyncData->IoStatusBlock);
4399 }
4400}
#define IOCTL_AFD_SELECT
Definition: shared.h:303
#define AFD_EVENT_QOS
Definition: shared.h:228
#define AFD_EVENT_GROUP_QOS
Definition: shared.h:229
SOCKET Handle
Definition: shared.h:50
LARGE_INTEGER Timeout
Definition: shared.h:56
ULONG HandleCount
Definition: shared.h:57
ULONG_PTR Exclusive
Definition: shared.h:58
IO_STATUS_BLOCK IoStatusBlock
Definition: msafd.h:79
ULONG LowPart
Definition: typedefs.h:106
#define FD_QOS
Definition: winsock2.h:300
#define FD_GROUP_QOS
Definition: winsock2.h:302

◆ SockProcessQueuedAsyncSelect()

VOID SockProcessQueuedAsyncSelect ( PVOID  Context,
PIO_STATUS_BLOCK  IoStatusBlock 
)

Definition at line 4402 of file dllmain.c.

4403{
4404 PASYNC_DATA AsyncData = Context;
4405 BOOL FreeContext = TRUE;
4406 PSOCKET_INFORMATION Socket;
4407
4408 /* Get the Socket */
4409 Socket = AsyncData->ParentSocket;
4410
4411 /* If someone closed it, stop the function */
4412 if (Socket->SharedData->State != SocketClosed)
4413 {
4414 /* Check if the Sequence Number changed by now, in which case quit */
4415 if (AsyncData->SequenceNumber == Socket->SharedData->SequenceNumber)
4416 {
4417 /* Do the actual select, if needed */
4418 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)))
4419 {
4420 SockProcessAsyncSelect(Socket, AsyncData);
4421 FreeContext = FALSE;
4422 }
4423 }
4424 }
4425
4426 /* Free the Context */
4427 if (FreeContext)
4428 {
4429 HeapFree(GetProcessHeap(), 0, AsyncData);
4430 }
4431
4432 return;
4433}
#define GetProcessHeap()
Definition: compat.h:736
unsigned int BOOL
Definition: ntddk_ex.h:94
@ SocketClosed
Definition: shared.h:379
SOCKET_STATE State
Definition: shared.h:383

◆ SockReenableAsyncSelectEvent()

VOID SockReenableAsyncSelectEvent ( IN PSOCKET_INFORMATION  Socket,
IN ULONG  Event 
)

Definition at line 4436 of file dllmain.c.

4438{
4439 PASYNC_DATA AsyncData;
4440
4441 /* Make sure the event is actually disabled */
4442 if (!(Socket->SharedData->AsyncDisabledEvents & Event))
4443 {
4444 return;
4445 }
4446
4447 /* Re-enable it */
4448 Socket->SharedData->AsyncDisabledEvents &= ~Event;
4449
4450 /* Return if no more events are being polled */
4451 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 )
4452 {
4453 return;
4454 }
4455
4456 /* Wait on new events */
4457 AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(ASYNC_DATA));
4458 if (!AsyncData) return;
4459
4460 /* Create the Asynch Thread if Needed */
4462
4463 /* Increase the sequence number to stop anything else */
4464 Socket->SharedData->SequenceNumber++;
4465
4466 /* Set up the Async Data */
4467 AsyncData->ParentSocket = Socket;
4468 AsyncData->SequenceNumber = Socket->SharedData->SequenceNumber;
4469
4470 /* Begin Async Select by using I/O Completion */
4473 AsyncData,
4474 0,
4475 0);
4476
4477 /* All done */
4478 return;
4479}
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
Definition: dllmain.c:4033
VOID SockProcessQueuedAsyncSelect(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: dllmain.c:4402
NTSTATUS NTAPI NtSetIoCompletion(IN HANDLE IoCompletionPortHandle, IN PVOID CompletionKey, IN PVOID CompletionContext, IN NTSTATUS CompletionStatus, IN ULONG CompletionInformation)
Definition: iocomp.c:569

◆ TranslateNtStatusError()

INT TranslateNtStatusError ( NTSTATUS  Status)

Definition at line 537 of file dllmain.c.

538{
539 switch (Status)
540 {
541 case STATUS_CANT_WAIT:
542 return WSAEWOULDBLOCK;
543
544 case STATUS_TIMEOUT:
545 return WSAETIMEDOUT;
546
547 case STATUS_SUCCESS:
548 return NO_ERROR;
549
551 return WSAECONNRESET;
552
554 return WSAESHUTDOWN;
555
556 case STATUS_PENDING:
557 return WSA_IO_PENDING;
558
561 return WSAEMSGSIZE;
562
563 case STATUS_NO_MEMORY:
565 return WSAENOBUFS;
566
568 return WSAENOTCONN;
569
571 return WSAEAFNOSUPPORT;
572
574 return WSAEADDRNOTAVAIL;
575
578 return WSAECONNREFUSED;
579
581 return WSAENETUNREACH;
582
584 return WSAEHOSTUNREACH;
585
587 return WSAEINVAL;
588
589 case STATUS_CANCELLED:
591
593 return WSAEADDRINUSE;
594
596 return WSAECONNABORTED;
597
599 return WSAEFAULT;
600
602 return WSAEACCES;
603
605 return WSAEOPNOTSUPP;
606
607 default:
608 ERR("MSAFD: Unhandled NTSTATUS value: 0x%x\n", Status);
609 return WSAENETDOWN;
610 }
611}
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
#define STATUS_ACCESS_VIOLATION
#define STATUS_INVALID_ADDRESS
Definition: ntstatus.h:651
#define STATUS_NETWORK_UNREACHABLE
Definition: ntstatus.h:826
#define STATUS_CANT_WAIT
Definition: ntstatus.h:546
#define STATUS_ADDRESS_ALREADY_EXISTS
Definition: ntstatus.h:776
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:626
#define STATUS_HOST_UNREACHABLE
Definition: ntstatus.h:827
#define STATUS_REMOTE_DISCONNECT
Definition: ntstatus.h:646
#define STATUS_INVALID_CONNECTION
Definition: ntstatus.h:650
#define STATUS_REMOTE_NOT_LISTENING
Definition: ntstatus.h:518
#define STATUS_LOCAL_DISCONNECT
Definition: ntstatus.h:645
#define STATUS_PROTOCOL_NOT_SUPPORTED
Definition: ntstatus.h:1410
#define STATUS_END_OF_FILE
Definition: shellext.h:67
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
#define WSAEADDRNOTAVAIL
Definition: winerror.h:2865
#define WSAEOPNOTSUPP
Definition: winerror.h:2861
#define WSAEHOSTUNREACH
Definition: winerror.h:2881
#define WSAEWOULDBLOCK
Definition: winerror.h:2851
#define WSAEINVAL
Definition: winerror.h:2845
#define WSAECONNABORTED
Definition: winerror.h:2869
#define WSAENETDOWN
Definition: winerror.h:2866
#define WSAENOBUFS
Definition: winerror.h:2871
#define WSAETIMEDOUT
Definition: winerror.h:2876
#define WSAEMSGSIZE
Definition: winerror.h:2856
#define WSAECONNRESET
Definition: winerror.h:2870
#define WSAEACCES
Definition: winerror.h:2843
#define WSAESHUTDOWN
Definition: winerror.h:2874
#define WSAENETUNREACH
Definition: winerror.h:2867
#define WSAEAFNOSUPPORT
Definition: winerror.h:2863
#define WSAECONNREFUSED
Definition: winerror.h:2877
#define WSAENOTCONN
Definition: winerror.h:2873
#define WSAEADDRINUSE
Definition: winerror.h:2864
#define WSAEFAULT
Definition: winerror.h:2844
#define WSA_OPERATION_ABORTED
Definition: winsock2.h:615
#define WSA_IO_PENDING
Definition: winsock2.h:610

Referenced by MsafdConnectAPC(), MsafdReturnWithErrno(), MsafdUpdateConnectionContext(), WSPAccept(), WSPAcceptEx(), WSPBind(), WSPConnect(), WSPConnectEx(), WSPEnumNetworkEvents(), WSPGetOverlappedResult(), WSPListen(), WSPShutdown(), and WSPSocket().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( msafd  )

◆ WSPAccept()

_Must_inspect_result_ SOCKET WSPAPI WSPAccept ( _In_ SOCKET  s,
_Out_writes_bytes_to_opt_ *, *addrlen struct sockaddr FAR *  addr,
_Inout_opt_ LPINT  addrlen,
_In_opt_ LPCONDITIONPROC  lpfnCondition,
_In_opt_ DWORD_PTR  dwCallbackData,
_Out_ LPINT  lpErrno 
)

Definition at line 1451 of file dllmain.c.

1458{
1459 IO_STATUS_BLOCK IOSB;
1460 PAFD_RECEIVED_ACCEPT_DATA ListenReceiveData;
1461 AFD_ACCEPT_DATA AcceptData;
1462 AFD_DEFER_ACCEPT_DATA DeferData;
1463 AFD_PENDING_ACCEPT_DATA PendingAcceptData;
1464 PSOCKET_INFORMATION Socket = NULL;
1466 struct fd_set ReadSet;
1467 struct timeval Timeout;
1468 PVOID PendingData = NULL;
1469 ULONG PendingDataLength = 0;
1470 PVOID CalleeDataBuffer;
1471 WSABUF CallerData, CalleeID, CallerID, CalleeData;
1473 GROUP GroupID = 0;
1474 ULONG CallBack;
1476 PSOCKET_INFORMATION AcceptSocketInfo;
1477 UCHAR ReceiveBuffer[0x1A];
1479
1480 /* Get the Socket Structure associate to this Socket*/
1481 Socket = GetSocketStructure(Handle);
1482 if (!Socket)
1483 {
1484 if (lpErrno) *lpErrno = WSAENOTSOCK;
1485 return SOCKET_ERROR;
1486 }
1487 if (!Socket->SharedData->Listening)
1488 {
1489 if (lpErrno) *lpErrno = WSAEINVAL;
1490 return SOCKET_ERROR;
1491 }
1492 if ((SocketAddress && !SocketAddressLength) ||
1493 (SocketAddressLength && !SocketAddress) ||
1494 (SocketAddressLength && *SocketAddressLength < sizeof(SOCKADDR)))
1495 {
1496 if (lpErrno) *lpErrno = WSAEFAULT;
1497 return INVALID_SOCKET;
1498 }
1499
1502 NULL,
1504 FALSE);
1505
1506 if( !NT_SUCCESS(Status) )
1507 {
1508 return SOCKET_ERROR;
1509 }
1510
1511 /* Dynamic Structure...ugh */
1512 ListenReceiveData = (PAFD_RECEIVED_ACCEPT_DATA)ReceiveBuffer;
1513
1514 /* If this is non-blocking, make sure there's something for us to accept */
1515 if (Socket->SharedData->NonBlocking)
1516 {
1517 FD_ZERO(&ReadSet);
1518 FD_SET(Socket->Handle, &ReadSet);
1519 Timeout.tv_sec=0;
1520 Timeout.tv_usec=0;
1521
1522 if (WSPSelect(0, &ReadSet, NULL, NULL, &Timeout, lpErrno) == SOCKET_ERROR)
1523 {
1525 return SOCKET_ERROR;
1526 }
1527
1528 if (ReadSet.fd_array[0] != Socket->Handle)
1529 {
1531 if (lpErrno) *lpErrno = WSAEWOULDBLOCK;
1532 return SOCKET_ERROR;
1533 }
1534 }
1535
1536 /* Send IOCTL */
1538 SockEvent,
1539 NULL,
1540 NULL,
1541 &IOSB,
1543 NULL,
1544 0,
1545 ListenReceiveData,
1546 0xA + sizeof(*ListenReceiveData));
1547
1548 /* Wait for return */
1549 if (Status == STATUS_PENDING)
1550 {
1552 Status = IOSB.Status;
1553 }
1554
1555 if (!NT_SUCCESS(Status))
1556 {
1557 NtClose( SockEvent );
1558 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1559 }
1560
1561 if (lpfnCondition != NULL)
1562 {
1563 if ((Socket->SharedData->ServiceFlags1 & XP1_CONNECT_DATA) != 0)
1564 {
1565 /* Find out how much data is pending */
1566 PendingAcceptData.SequenceNumber = ListenReceiveData->SequenceNumber;
1567 PendingAcceptData.ReturnSize = TRUE;
1568
1569 /* Send IOCTL */
1571 SockEvent,
1572 NULL,
1573 NULL,
1574 &IOSB,
1576 &PendingAcceptData,
1577 sizeof(PendingAcceptData),
1578 &PendingAcceptData,
1579 sizeof(PendingAcceptData));
1580
1581 /* Wait for return */
1582 if (Status == STATUS_PENDING)
1583 {
1585 Status = IOSB.Status;
1586 }
1587
1588 if (!NT_SUCCESS(Status))
1589 {
1590 NtClose( SockEvent );
1591 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1592 }
1593
1594 /* How much data to allocate */
1595 PendingDataLength = IOSB.Information;
1596
1597 if (PendingDataLength)
1598 {
1599 /* Allocate needed space */
1600 PendingData = HeapAlloc(GlobalHeap, 0, PendingDataLength);
1601 if (!PendingData)
1602 {
1604 }
1605
1606 /* We want the data now */
1607 PendingAcceptData.ReturnSize = FALSE;
1608
1609 /* Send IOCTL */
1611 SockEvent,
1612 NULL,
1613 NULL,
1614 &IOSB,
1616 &PendingAcceptData,
1617 sizeof(PendingAcceptData),
1618 PendingData,
1619 PendingDataLength);
1620
1621 /* Wait for return */
1622 if (Status == STATUS_PENDING)
1623 {
1625 Status = IOSB.Status;
1626 }
1627
1628 if (!NT_SUCCESS(Status))
1629 {
1630 NtClose( SockEvent );
1631 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1632 }
1633 }
1634 }
1635
1636 if ((Socket->SharedData->ServiceFlags1 & XP1_QOS_SUPPORTED) != 0)
1637 {
1638 /* I don't support this yet */
1639 }
1640
1641 /* Build Callee ID */
1642 CalleeID.buf = (PVOID)Socket->LocalAddress;
1643 CalleeID.len = Socket->SharedData->SizeOfLocalAddress;
1644
1646 if (!RemoteAddress)
1647 {
1649 }
1650
1651 /* Set up Address in SOCKADDR Format */
1653 &ListenReceiveData->Address.Address[0].AddressType,
1654 sizeof(*RemoteAddress));
1655
1656 /* Build Caller ID */
1657 CallerID.buf = (PVOID)RemoteAddress;
1658 CallerID.len = sizeof(*RemoteAddress);
1659
1660 /* Build Caller Data */
1661 CallerData.buf = PendingData;
1662 CallerData.len = PendingDataLength;
1663
1664 /* Check if socket supports Conditional Accept */
1665 if (Socket->SharedData->UseDelayedAcceptance != 0)
1666 {
1667 /* Allocate Buffer for Callee Data */
1668 CalleeDataBuffer = HeapAlloc(GlobalHeap, 0, 4096);
1669 if (!CalleeDataBuffer) {
1671 }
1672 CalleeData.buf = CalleeDataBuffer;
1673 CalleeData.len = 4096;
1674 }
1675 else
1676 {
1677 /* Nothing */
1678 CalleeData.buf = 0;
1679 CalleeData.len = 0;
1680 }
1681
1682 /* Call the Condition Function */
1683 CallBack = (lpfnCondition)(&CallerID,
1684 CallerData.buf == NULL ? NULL : &CallerData,
1685 NULL,
1686 NULL,
1687 &CalleeID,
1688 CalleeData.buf == NULL ? NULL : &CalleeData,
1689 &GroupID,
1690 dwCallbackData);
1691
1692 if (((CallBack == CF_ACCEPT) && GroupID) != 0)
1693 {
1694 /* TBD: Check for Validity */
1695 }
1696
1697 if (CallBack == CF_ACCEPT)
1698 {
1699 if ((Socket->SharedData->ServiceFlags1 & XP1_QOS_SUPPORTED) != 0)
1700 {
1701 /* I don't support this yet */
1702 }
1703 if (CalleeData.buf)
1704 {
1705 // SockSetConnectData Sockets(SocketID), IOCTL_AFD_SET_CONNECT_DATA, CalleeData.Buffer, CalleeData.BuffSize, 0
1706 }
1707 }
1708 else
1709 {
1710 /* Callback rejected. Build Defer Structure */
1711 DeferData.SequenceNumber = ListenReceiveData->SequenceNumber;
1712 DeferData.RejectConnection = (CallBack == CF_REJECT);
1713
1714 /* Send IOCTL */
1716 SockEvent,
1717 NULL,
1718 NULL,
1719 &IOSB,
1721 &DeferData,
1722 sizeof(DeferData),
1723 NULL,
1724 0);
1725
1726 /* Wait for return */
1727 if (Status == STATUS_PENDING)
1728 {
1730 Status = IOSB.Status;
1731 }
1732
1733 NtClose( SockEvent );
1734
1735 if (!NT_SUCCESS(Status))
1736 {
1737 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1738 }
1739
1740 if (CallBack == CF_REJECT )
1741 {
1742 if (lpErrno) *lpErrno = WSAECONNREFUSED;
1743 return SOCKET_ERROR;
1744 }
1745 else
1746 {
1747 if (lpErrno) *lpErrno = WSAECONNREFUSED;
1748 return SOCKET_ERROR;
1749 }
1750 }
1751 }
1752
1753 /* Create a new Socket */
1755 Socket->SharedData->SocketType,
1756 Socket->SharedData->Protocol,
1757 &Socket->ProtocolInfo,
1758 GroupID,
1759 Socket->SharedData->CreateFlags,
1760 lpErrno);
1762 return SOCKET_ERROR;
1763
1764 /* Set up the Accept Structure */
1765 AcceptData.ListenHandle = (HANDLE)AcceptSocket;
1766 AcceptData.SequenceNumber = ListenReceiveData->SequenceNumber;
1767
1768 /* Send IOCTL to Accept */
1770 SockEvent,
1771 NULL,
1772 NULL,
1773 &IOSB,
1775 &AcceptData,
1776 sizeof(AcceptData),
1777 NULL,
1778 0);
1779
1780 /* Wait for return */
1781 if (Status == STATUS_PENDING)
1782 {
1784 Status = IOSB.Status;
1785 }
1786
1788 if (!NT_SUCCESS(Status))
1789 {
1791 WSPCloseSocket( AcceptSocket, lpErrno );
1792 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1793 }
1794
1795 AcceptSocketInfo = GetSocketStructure(AcceptSocket);
1796 if (!AcceptSocketInfo)
1797 {
1799 WSPCloseSocket( AcceptSocket, lpErrno );
1801 }
1802
1803 AcceptSocketInfo->SharedData->State = SocketConnected;
1804 AcceptSocketInfo->SharedData->ConnectTime = GetCurrentTimeInSeconds();
1805 AcceptSocketInfo->SharedData->NonBlocking = Socket->SharedData->NonBlocking;
1806
1807 /* Return Address in SOCKADDR FORMAT */
1808 if( SocketAddress )
1809 {
1810 RtlCopyMemory (SocketAddress,
1811 &ListenReceiveData->Address.Address[0].AddressType,
1812 sizeof(*RemoteAddress));
1813 if( SocketAddressLength )
1814 *SocketAddressLength = sizeof(*RemoteAddress);
1815 }
1816
1817 NtClose( SockEvent );
1818
1819 /* Re-enable Async Event */
1821
1822 TRACE("Socket %x\n", AcceptSocket);
1823
1825 {
1826 Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
1827 Socket->Handle,
1828 Socket->TdiAddressHandle,
1829 Socket->TdiConnectionHandle,
1831
1832 if (Status)
1833 {
1834 if (lpErrno) *lpErrno = Status;
1835 return SOCKET_ERROR;
1836 }
1837 }
1838
1839 if (lpErrno) *lpErrno = NO_ERROR;
1840
1841 /* Return Socket */
1842 return AcceptSocket;
1843}
DWORD GetCurrentTimeInSeconds(VOID)
Definition: dllmain.c:1434
PSOCKET_INFORMATION GetSocketStructure(SOCKET Handle)
Definition: dllmain.c:3960
int WSPAPI WSPSelect(IN int nfds, IN OUT fd_set *readfds OPTIONAL, IN OUT fd_set *writefds OPTIONAL, IN OUT fd_set *exceptfds OPTIONAL, IN const struct timeval *timeout OPTIONAL, OUT LPINT lpErrno)
Definition: dllmain.c:1082
INT WSPAPI WSPCloseSocket(IN SOCKET Handle, OUT LPINT lpErrno)
Definition: dllmain.c:637
INT TranslateNtStatusError(NTSTATUS Status)
Definition: dllmain.c:537
SOCKET WSPAPI WSPSocket(int AddressFamily, int SocketType, int Protocol, LPWSAPROTOCOL_INFOW lpProtocolInfo, GROUP g, DWORD dwFlags, LPINT lpErrno)
Definition: dllmain.c:48
VOID SockReenableAsyncSelectEvent(IN PSOCKET_INFORMATION Socket, IN ULONG Event)
Definition: dllmain.c:4436
static ULONG Timeout
Definition: ping.c:61
#define IOCTL_AFD_WAIT_FOR_LISTEN
Definition: shared.h:291
#define IOCTL_AFD_DEFER_ACCEPT
Definition: shared.h:351
struct _AFD_RECEIVED_ACCEPT_DATA * PAFD_RECEIVED_ACCEPT_DATA
#define IOCTL_AFD_ACCEPT
Definition: shared.h:293
#define IOCTL_AFD_GET_PENDING_CONNECT_DATA
Definition: shared.h:353
@ SocketConnected
Definition: shared.h:378
HANDLE ListenHandle
Definition: shared.h:65
ULONG SequenceNumber
Definition: shared.h:64
BOOLEAN RejectConnection
Definition: shared.h:91
TRANSPORT_ADDRESS Address
Definition: shared.h:80
PWSH_NOTIFY WSHNotify
Definition: helpers.h:25
PVOID HelperContext
Definition: msafd.h:51
HANDLE TdiConnectionHandle
Definition: msafd.h:55
PHELPER_DATA HelperData
Definition: msafd.h:50
HANDLE TdiAddressHandle
Definition: msafd.h:54
DWORD HelperEvents
Definition: msafd.h:49
WSAPROTOCOL_INFOW ProtocolInfo
Definition: msafd.h:62
BOOLEAN NonBlocking
Definition: shared.h:403
INT SocketLastError
Definition: shared.h:416
BOOLEAN Listening
Definition: shared.h:397
BOOLEAN UseDelayedAcceptance
Definition: shared.h:407
DWORD ServiceFlags1
Definition: shared.h:411
ULONG ConnectTime
Definition: shared.h:395
USHORT AddressType
Definition: tdi.h:339
TA_ADDRESS Address[1]
Definition: tdi.h:377
ULONG len
Definition: ws2def.h:525
CHAR FAR * buf
Definition: ws2def.h:526
Definition: winsock.h:60
unsigned char UCHAR
Definition: typedefs.h:53
void * PVOID
Definition: typedefs.h:50
PVOID HANDLE
Definition: typedefs.h:73
#define WSAENOTSOCK
Definition: winerror.h:2854
unsigned int GROUP
Definition: winsock2.h:634
#define CF_REJECT
Definition: winsock2.h:408
#define XP1_QOS_SUPPORTED
Definition: winsock2.h:443
#define CF_ACCEPT
Definition: winsock2.h:407
#define XP1_CONNECT_DATA
Definition: winsock2.h:437
#define FD_ZERO(set)
Definition: winsock.h:90
#define INVALID_SOCKET
Definition: winsock.h:326
UINT_PTR SOCKET
Definition: winsock.h:41
#define FD_SET(fd, set)
Definition: winsock.h:83
#define WSH_NOTIFY_ACCEPT
Definition: wsahelp.h:13
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _In_opt_ PWSK_SOCKET AcceptSocket
Definition: wsk.h:173
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
Definition: wsk.h:172

Referenced by WSPStartup().

◆ WSPAcceptEx()

BOOL WSPAPI WSPAcceptEx ( IN SOCKET  sListenSocket,
IN SOCKET  sAcceptSocket,
OUT PVOID  lpOutputBuffer,
IN DWORD  dwReceiveDataLength,
IN DWORD  dwLocalAddressLength,
IN DWORD  dwRemoteAddressLength,
OUT LPDWORD  lpdwBytesReceived,
IN OUT LPOVERLAPPED  lpOverlapped 
)

◆ WSPAddressToString()

INT WSPAPI WSPAddressToString ( IN LPSOCKADDR  lpsaAddress,
IN DWORD  dwAddressLength,
IN LPWSAPROTOCOL_INFOW  lpProtocolInfo,
OUT LPWSTR  lpszAddressString,
IN OUT LPDWORD  lpdwAddressStringLength,
OUT LPINT  lpErrno 
)

Definition at line 3496 of file dllmain.c.

3502{
3503 SIZE_T size;
3504 WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3505 WCHAR *p;
3506
3507 if (!lpsaAddress || !lpszAddressString || !lpdwAddressStringLength)
3508 {
3509 if (lpErrno) *lpErrno = WSAEFAULT;
3510 return SOCKET_ERROR;
3511 }
3512
3513 switch (lpsaAddress->sa_family)
3514 {
3515 case AF_INET:
3516 if (dwAddressLength < sizeof(SOCKADDR_IN))
3517 {
3518 if (lpErrno) *lpErrno = WSAEINVAL;
3519 return SOCKET_ERROR;
3520 }
3522 L"%u.%u.%u.%u:%u",
3523 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 24 & 0xff),
3524 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 16 & 0xff),
3525 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 8 & 0xff),
3526 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) & 0xff),
3527 ntohs(((SOCKADDR_IN *)lpsaAddress)->sin_port));
3528
3529 p = wcschr(buffer, L':');
3530 if (!((SOCKADDR_IN *)lpsaAddress)->sin_port)
3531 {
3532 *p = 0;
3533 }
3534 break;
3535 default:
3536 if (lpErrno) *lpErrno = WSAEINVAL;
3537 return SOCKET_ERROR;
3538 }
3539
3540 size = wcslen(buffer) + 1;
3541
3542 if (*lpdwAddressStringLength < size)
3543 {
3544 *lpdwAddressStringLength = size;
3545 if (lpErrno) *lpErrno = WSAEFAULT;
3546 return SOCKET_ERROR;
3547 }
3548
3549 *lpdwAddressStringLength = size;
3550 wcscpy(lpszAddressString, buffer);
3551 return 0;
3552}
#define wcschr
Definition: compat.h:17
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
#define AF_INET
Definition: tcpip.h:117
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLfloat GLfloat p
Definition: glext.h:8902
#define ntohl(x)
Definition: module.h:205
#define ntohs(x)
Definition: module.h:210
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
short WCHAR
Definition: pedump.c:58
wcscpy
ULONG_PTR SIZE_T
Definition: typedefs.h:80

◆ WSPAsyncSelect()

INT WSPAPI WSPAsyncSelect ( IN SOCKET  s,
IN HWND  hWnd,
IN UINT  wMsg,
IN LONG  lEvent,
OUT LPINT  lpErrno 
)

Definition at line 17 of file sndrcv.c.

22{
24 PASYNC_DATA AsyncData;
25 BOOLEAN BlockMode;
26
27 /* Get the Socket Structure associated to this Socket */
28 Socket = GetSocketStructure(Handle);
29 if (!Socket)
30 {
31 *lpErrno = WSAENOTSOCK;
32 return SOCKET_ERROR;
33 }
34
35 /* Allocate the Async Data Structure to pass on to the Thread later */
36 AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(*AsyncData));
37 if (!AsyncData)
38 {
40 return INVALID_SOCKET;
41 }
42
43 /* Change the Socket to Non Blocking */
44 BlockMode = TRUE;
46 Socket->SharedData->NonBlocking = TRUE;
47
48 /* Deactivate WSPEventSelect */
49 if (Socket->SharedData->AsyncEvents)
50 {
51 if (WSPEventSelect(Handle, NULL, 0, lpErrno) == SOCKET_ERROR)
52 {
53 HeapFree(GetProcessHeap(), 0, AsyncData);
54 return SOCKET_ERROR;
55 }
56 }
57
58 /* Create the Asynch Thread if Needed */
60
61 /* Open a Handle to AFD's Async Helper */
63
64 /* Store Socket Data */
65 Socket->SharedData->hWnd = hWnd;
66 Socket->SharedData->wMsg = wMsg;
67 Socket->SharedData->AsyncEvents = lEvent;
69 Socket->SharedData->SequenceNumber++;
70
71 /* Return if there are no more Events */
72 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0)
73 {
74 HeapFree(GetProcessHeap(), 0, AsyncData);
75 return 0;
76 }
77
78 /* Set up the Async Data */
79 AsyncData->ParentSocket = Socket;
80 AsyncData->SequenceNumber = Socket->SharedData->SequenceNumber;
81
82 /* Begin Async Select by using I/O Completion */
85 AsyncData,
86 0,
87 0);
88
89 /* Return */
90 return ERROR_SUCCESS;
91}
unsigned char BOOLEAN
Definition: actypes.h:127
HWND hWnd
Definition: settings.c:17
#define ERROR_SUCCESS
Definition: deptool.c:10
int SetSocketInformation(PSOCKET_INFORMATION Socket, ULONG AfdInformationClass, PBOOLEAN Boolean OPTIONAL, PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL, LPWSAOVERLAPPED Overlapped OPTIONAL, LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL)
Definition: dllmain.c:3838
BOOLEAN SockGetAsyncSelectHelperAfdHandle(VOID)
Definition: dllmain.c:4128
int WSPAPI WSPEventSelect(IN SOCKET Handle, IN WSAEVENT hEventObject, IN long lNetworkEvents, OUT LPINT lpErrno)
Definition: event.c:17
#define AFD_INFO_BLOCKING_MODE
Definition: shared.h:199
HANDLE lEvent
Definition: tftpd.cpp:56

◆ WSPBind()

INT WSPAPI WSPBind ( IN SOCKET  s,
IN CONST SOCKADDR *  name,
IN INT  namelen,
OUT LPINT  lpErrno 
)

◆ WSPCancelBlockingCall()

INT WSPAPI WSPCancelBlockingCall ( OUT LPINT  lpErrno)

Definition at line 15 of file stubs.c.

17{
19
20 return 0;
21}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

◆ WSPCleanup()

INT WSPAPI WSPCleanup ( OUT LPINT  lpErrno)

Definition at line 3680 of file dllmain.c.

3682{
3683 TRACE("Leaving.\n");
3684
3685 if (lpErrno) *lpErrno = NO_ERROR;
3686
3687 return 0;
3688}

◆ WSPCloseSocket()

INT WSPAPI WSPCloseSocket ( IN SOCKET  s,
OUT LPINT  lpErrno 
)

Definition at line 637 of file dllmain.c.

639{
641 PSOCKET_INFORMATION Socket = NULL, CurrentSocket;
644 AFD_DISCONNECT_INFO DisconnectInfo;
645 SOCKET_STATE OldState;
646 LONG LingerWait = -1;
647 DWORD References;
648
649 /* Get the Socket Structure associate to this Socket*/
650 Socket = GetSocketStructure(Handle);
651 if (!Socket)
652 {
653 if (lpErrno) *lpErrno = WSAENOTSOCK;
654 return SOCKET_ERROR;
655 }
656
657 /* HACK: Allow APC to be processed */
658 SleepEx(0, TRUE);
659
660 if (Socket->HelperEvents & WSH_NOTIFY_CLOSE)
661 {
662 Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
663 Socket->Handle,
664 Socket->TdiAddressHandle,
665 Socket->TdiConnectionHandle,
667
668 if (Status)
669 {
670 ERR("WSHNotify failed. Error 0x%#x\n", Status);
671 if (lpErrno) *lpErrno = Status;
672 return SOCKET_ERROR;
673 }
674 }
675
676 /* If a Close is already in Process, give up */
677 if (Socket->SharedData->State == SocketClosed)
678 {
679 WARN("Socket is closing.\n");
680 if (lpErrno) *lpErrno = WSAENOTSOCK;
681 return SOCKET_ERROR;
682 }
683
684 /* Create the Wait Event */
687 NULL,
689 FALSE);
690 if (!NT_SUCCESS(Status))
691 {
692 ERR("NtCreateEvent failed: 0x%08x\n", Status);
693 return SOCKET_ERROR;
694 }
695
696 /* Decrement reference count on SharedData */
697 References = InterlockedDecrement(&Socket->SharedData->RefCount);
698 if (References)
699 goto ok;
700
701 /* Set the state to close */
702 OldState = Socket->SharedData->State;
703 Socket->SharedData->State = SocketClosed;
704
705 /* If SO_LINGER is ON and the Socket is connected, we need to disconnect */
706 /* FIXME: Should we do this on Datagram Sockets too? */
707 if ((OldState == SocketConnected) && (Socket->SharedData->LingerData.l_onoff))
708 {
709 ULONG SendsInProgress;
710 ULONG SleepWait;
711
712 /* We need to respect the timeout */
713 SleepWait = 100;
714 LingerWait = Socket->SharedData->LingerData.l_linger * 1000;
715
716 /* Loop until no more sends are pending, within the timeout */
717 while (LingerWait)
718 {
719 /* Find out how many Sends are in Progress */
720 if (GetSocketInformation(Socket,
722 NULL,
723 &SendsInProgress,
724 NULL,
725 NULL,
726 NULL))
727 {
728 /* Bail out if anything but NO_ERROR */
729 LingerWait = 0;
730 break;
731 }
732
733 /* Bail out if no more sends are pending */
734 if (!SendsInProgress)
735 {
736 LingerWait = -1;
737 break;
738 }
739
740 /*
741 * We have to execute a sleep, so it's kind of like
742 * a block. If the socket is Nonblock, we cannot
743 * go on since asynchronous operation is expected
744 * and we cannot offer it
745 */
746 if (Socket->SharedData->NonBlocking)
747 {
748 WARN("Would block!\n");
750 Socket->SharedData->State = OldState;
751 if (lpErrno) *lpErrno = WSAEWOULDBLOCK;
752 return SOCKET_ERROR;
753 }
754
755 /* Now we can sleep, and decrement the linger wait */
756 /*
757 * FIXME: It seems Windows does some funky acceleration
758 * since the waiting seems to be longer and longer. I
759 * don't think this improves performance so much, so we
760 * wait a fixed time instead.
761 */
762 Sleep(SleepWait);
763 LingerWait -= SleepWait;
764 }
765 }
766
767 if (OldState == SocketConnected)
768 {
769 if (LingerWait <= 0)
770 {
771 DisconnectInfo.Timeout.QuadPart = 0LL;
772 DisconnectInfo.DisconnectType = LingerWait < 0 ? AFD_DISCONNECT_SEND : AFD_DISCONNECT_ABORT;
773
774 if (((DisconnectInfo.DisconnectType & AFD_DISCONNECT_SEND) && (!Socket->SharedData->SendShutdown)) ||
775 ((DisconnectInfo.DisconnectType & AFD_DISCONNECT_ABORT) && (!Socket->SharedData->ReceiveShutdown)))
776 {
777 /* Send IOCTL */
779 SockEvent,
780 NULL,
781 NULL,
784 &DisconnectInfo,
785 sizeof(DisconnectInfo),
786 NULL,
787 0);
788
789 /* Wait for return */
790 if (Status == STATUS_PENDING)
791 {
793 Status = IoStatusBlock.Status;
794 }
795 }
796 }
797 }
798
799 /* Cleanup Time! */
800 Socket->HelperContext = NULL;
801 Socket->SharedData->AsyncDisabledEvents = -1;
802 NtClose(Socket->TdiAddressHandle);
803 Socket->TdiAddressHandle = NULL;
805 Socket->TdiConnectionHandle = NULL;
806ok:
808 if (SocketListHead == Socket)
809 {
811 }
812 else
813 {
814 CurrentSocket = SocketListHead;
815 while (CurrentSocket->NextSocket)
816 {
817 if (CurrentSocket->NextSocket == Socket)
818 {
819 CurrentSocket->NextSocket = CurrentSocket->NextSocket->NextSocket;
820 break;
821 }
822
823 CurrentSocket = CurrentSocket->NextSocket;
824 }
825 }
827
828 /* Close the handle */
831
833 {
834 /* It is a duplicated socket, so unmap the memory */
836 NtClose(Socket->SharedDataHandle);
837 Socket->SharedData = NULL;
838 }
839 if( !References && Socket->SharedData )
840 {
841 HeapFree(GlobalHeap, 0, Socket->SharedData);
842 }
843 HeapFree(GlobalHeap, 0, Socket);
844 return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
845}
#define InterlockedDecrement
Definition: armddk.h:52
#define ok(value,...)
Definition: atltest.h:57
#define WARN(fmt,...)
Definition: precomp.h:61
#define UnmapViewOfFile
Definition: compat.h:746
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
int GetSocketInformation(PSOCKET_INFORMATION Socket, ULONG AfdInformationClass, PBOOLEAN Boolean OPTIONAL, PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL, LPWSAOVERLAPPED Overlapped OPTIONAL, LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL)
Definition: dllmain.c:3712
long LONG
Definition: pedump.c:60
#define AFD_DISCONNECT_ABORT
Definition: shared.h:215
#define IOCTL_AFD_DISCONNECT
Definition: shared.h:305
#define AFD_INFO_SENDS_IN_PROGRESS
Definition: shared.h:200
#define AFD_DISCONNECT_SEND
Definition: shared.h:213
LARGE_INTEGER Timeout
Definition: shared.h:153
ULONG DisconnectType
Definition: shared.h:152
HANDLE SharedDataHandle
Definition: msafd.h:48
BOOLEAN SendShutdown
Definition: shared.h:406
struct linger LingerData
Definition: shared.h:390
BOOLEAN ReceiveShutdown
Definition: shared.h:405
DWORD WINAPI SleepEx(IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:738
#define LL
Definition: tui.h:167
LONGLONG QuadPart
Definition: typedefs.h:114
#define WSH_NOTIFY_CLOSE
Definition: wsahelp.h:17
enum _SOCKET_STATE SOCKET_STATE

◆ WSPConnect()

INT WSPAPI WSPConnect ( IN SOCKET  s,
IN CONST SOCKADDR *  name,
IN INT  namelen,
IN LPWSABUF  lpCallerData,
OUT LPWSABUF  lpCalleeData,
IN LPQOS  lpSQOS,
IN LPQOS  lpGQOS,
OUT LPINT  lpErrno 
)

◆ WSPConnectEx()

BOOL WSPAPI WSPConnectEx ( IN SOCKET  s,
IN const struct sockaddr *  name,
IN int  namelen,
IN PVOID  lpSendBuffer,
IN DWORD  dwSendDataLength,
OUT LPDWORD  lpdwBytesSent,
IN OUT LPOVERLAPPED  lpOverlapped 
)

◆ WSPDisconnectEx()

BOOL WSPAPI WSPDisconnectEx ( IN SOCKET  hSocket,
IN LPOVERLAPPED  lpOverlapped,
IN DWORD  dwFlags,
IN DWORD  reserved 
)

Definition at line 58 of file stubs.c.

63{
65
66 return FALSE;
67}

Referenced by WSPIoctl().

◆ WSPDuplicateSocket()

INT WSPAPI WSPDuplicateSocket ( IN SOCKET  s,
IN DWORD  dwProcessId,
OUT LPWSAPROTOCOL_INFOW  lpProtocolInfo,
OUT LPINT  lpErrno 
)

Definition at line 449 of file dllmain.c.

454{
455 HANDLE hProcess, hDuplicatedSharedData, hDuplicatedHandle;
456 PSOCKET_INFORMATION Socket;
457 PSOCK_SHARED_INFO pSharedData, pOldSharedData;
458 BOOL bDuplicated;
459
460 if (Handle == INVALID_SOCKET)
462 Socket = GetSocketStructure(Handle);
463 if( !Socket )
464 {
465 if( lpErrno )
466 *lpErrno = WSAENOTSOCK;
467 return SOCKET_ERROR;
468 }
471
472 /* It is a not yet duplicated socket, so map the memory, copy the SharedData and free heap */
474 {
476 NULL,
478 0,
479 (sizeof(SOCK_SHARED_INFO) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1),
480 NULL);
483 pSharedData = MapViewOfFile(Socket->SharedDataHandle,
485 0,
486 0,
487 sizeof(SOCK_SHARED_INFO));
488
489 RtlCopyMemory(pSharedData, Socket->SharedData, sizeof(SOCK_SHARED_INFO));
490 pOldSharedData = Socket->SharedData;
491 Socket->SharedData = pSharedData;
492 HeapFree(GlobalHeap, 0, pOldSharedData);
493 }
494 /* Duplicate the handles for the new process */
495 bDuplicated = DuplicateHandle(GetCurrentProcess(),
496 Socket->SharedDataHandle,
497 hProcess,
498 (LPHANDLE)&hDuplicatedSharedData,
499 0,
500 FALSE,
502 if (!bDuplicated)
503 {
506 }
507 bDuplicated = DuplicateHandle(GetCurrentProcess(),
508 (HANDLE)Socket->Handle,
509 hProcess,
510 (LPHANDLE)&hDuplicatedHandle,
511 0,
512 FALSE,
515 if( !bDuplicated )
517
518
519 if (!lpProtocolInfo)
521
522 RtlCopyMemory(lpProtocolInfo, &Socket->ProtocolInfo, sizeof(*lpProtocolInfo));
523
524 lpProtocolInfo->iAddressFamily = Socket->SharedData->AddressFamily;
525 lpProtocolInfo->iProtocol = Socket->SharedData->Protocol;
526 lpProtocolInfo->iSocketType = Socket->SharedData->SocketType;
527 lpProtocolInfo->dwServiceFlags3 = HandleToUlong(hDuplicatedSharedData);
528 lpProtocolInfo->dwServiceFlags4 = HandleToUlong(hDuplicatedHandle);
529
530 if( lpErrno )
531 *lpErrno = NO_ERROR;
532
533 return NO_ERROR;
534}
#define HandleToUlong(h)
Definition: basetsd.h:73
#define GetCurrentProcess()
Definition: compat.h:759
#define MapViewOfFile
Definition: compat.h:745
BOOL WINAPI DuplicateHandle(IN HANDLE hSourceProcessHandle, IN HANDLE hSourceHandle, IN HANDLE hTargetProcessHandle, OUT LPHANDLE lpTargetHandle, IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwOptions)
Definition: handle.c:149
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
Definition: proc.c:1274
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define PROCESS_DUP_HANDLE
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
#define SEC_COMMIT
Definition: mmtypes.h:100
#define PAGE_READWRITE
Definition: nt_native.h:1307
_In_ DWORD dwProcessId
Definition: shlwapi.h:193
#define CreateFileMapping
Definition: winbase.h:3473
#define FILE_MAP_ALL_ACCESS
Definition: winbase.h:159
#define DUPLICATE_SAME_ACCESS

◆ WSPEnumNetworkEvents()

INT WSPAPI WSPEnumNetworkEvents ( IN SOCKET  s,
IN WSAEVENT  hEventObject,
OUT LPWSANETWORKEVENTS  lpNetworkEvents,
OUT LPINT  lpErrno 
)

Definition at line 133 of file event.c.

138{
140 IO_STATUS_BLOCK IOSB;
141 PSOCKET_INFORMATION Socket = NULL;
144
145 TRACE("Called (lpNetworkEvents %x)\n", lpNetworkEvents);
146
147 /* Get the Socket Structure associate to this Socket*/
148 Socket = GetSocketStructure(Handle);
149 if (!Socket)
150 {
151 if (lpErrno) *lpErrno = WSAENOTSOCK;
152 return SOCKET_ERROR;
153 }
154 if (!lpNetworkEvents)
155 {
156 if (lpErrno) *lpErrno = WSAEFAULT;
157 return SOCKET_ERROR;
158 }
159
162
163 if( !NT_SUCCESS(Status) ) {
164 ERR("Could not make an event %x\n", Status);
165 return SOCKET_ERROR;
166 }
167
168 EnumReq.Event = hEventObject;
169
170 /* Send IOCTL */
172 SockEvent,
173 NULL,
174 NULL,
175 &IOSB,
177 &EnumReq,
178 sizeof(EnumReq),
179 NULL,
180 0);
181
182 /* Wait for return */
183 if (Status == STATUS_PENDING) {
185 Status = IOSB.Status;
186 }
187
189
190 if (Status != STATUS_SUCCESS)
191 {
192 ERR("Status 0x%08x\n", Status);
193 return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
194 }
195
196 lpNetworkEvents->lNetworkEvents = 0;
197
198 /* Set Events to wait for */
199 if (EnumReq.PollEvents & AFD_EVENT_RECEIVE) {
200 lpNetworkEvents->lNetworkEvents |= FD_READ;
201 lpNetworkEvents->iErrorCode[FD_READ_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_READ_BIT]);
202 }
203
204 if (EnumReq.PollEvents & AFD_EVENT_SEND) {
205 lpNetworkEvents->lNetworkEvents |= FD_WRITE;
206 lpNetworkEvents->iErrorCode[FD_WRITE_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_WRITE_BIT]);
207 }
208
209 if (EnumReq.PollEvents & AFD_EVENT_OOB_RECEIVE) {
210 lpNetworkEvents->lNetworkEvents |= FD_OOB;
211 lpNetworkEvents->iErrorCode[FD_OOB_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_OOB_BIT]);
212 }
213
214 if (EnumReq.PollEvents & AFD_EVENT_ACCEPT) {
215 lpNetworkEvents->lNetworkEvents |= FD_ACCEPT;
216 lpNetworkEvents->iErrorCode[FD_ACCEPT_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_ACCEPT_BIT]);
217 }
218
219 if (EnumReq.PollEvents &
221 lpNetworkEvents->lNetworkEvents |= FD_CONNECT;
222 lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_CONNECT_BIT]);
223 }
224
225 if (EnumReq.PollEvents &
227 lpNetworkEvents->lNetworkEvents |= FD_CLOSE;
228 lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_CLOSE_BIT]);
229 }
230
231 if (EnumReq.PollEvents & AFD_EVENT_QOS) {
232 lpNetworkEvents->lNetworkEvents |= FD_QOS;
233 lpNetworkEvents->iErrorCode[FD_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_QOS_BIT]);
234 }
235
236 if (EnumReq.PollEvents & AFD_EVENT_GROUP_QOS) {
237 lpNetworkEvents->lNetworkEvents |= FD_GROUP_QOS;
238 lpNetworkEvents->iErrorCode[FD_GROUP_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_GROUP_QOS_BIT]);
239 }
240
241 TRACE("Leaving\n");
242
243 return MsafdReturnWithErrno(STATUS_SUCCESS, lpErrno, 0, NULL);
244}
#define IOCTL_AFD_ENUM_NETWORK_EVENTS
Definition: shared.h:355
NTSTATUS EventStatus[AFD_MAX_EVENTS]
Definition: shared.h:148
#define FD_CONNECT_BIT
Definition: winsock2.h:295
#define FD_CLOSE_BIT
Definition: winsock2.h:297
#define FD_OOB_BIT
Definition: winsock2.h:291
#define FD_GROUP_QOS_BIT
Definition: winsock2.h:301
#define FD_ACCEPT_BIT
Definition: winsock2.h:293
#define FD_READ_BIT
Definition: winsock2.h:287
#define FD_QOS_BIT
Definition: winsock2.h:299
#define FD_WRITE_BIT
Definition: winsock2.h:289

◆ WSPEventSelect()

INT WSPAPI WSPEventSelect ( IN SOCKET  s,
IN WSAEVENT  hEventObject,
IN LONG  lNetworkEvents,
OUT LPINT  lpErrno 
)

Definition at line 17 of file event.c.

22{
23 IO_STATUS_BLOCK IOSB;
24 AFD_EVENT_SELECT_INFO EventSelectInfo;
27 BOOLEAN BlockMode;
29
30 TRACE("WSPEventSelect (%lx) %lx %lx\n", Handle, hEventObject, lNetworkEvents);
31
32 /* Get the Socket Structure associate to this Socket*/
33 Socket = GetSocketStructure(Handle);
34 if (!Socket)
35 {
36 if (lpErrno) *lpErrno = WSAENOTSOCK;
37 return SOCKET_ERROR;
38 }
39
42
43 if (!NT_SUCCESS(Status)) return SOCKET_ERROR;
44
45 /* Set Socket to Non-Blocking */
46 BlockMode = TRUE;
48 Socket->SharedData->NonBlocking = TRUE;
49
50 /* Deactivate Async Select if there is one */
51 if (Socket->EventObject) {
52 Socket->SharedData->hWnd = NULL;
53 Socket->SharedData->wMsg = 0;
54 Socket->SharedData->AsyncEvents = 0;
55 Socket->SharedData->SequenceNumber++; // This will kill Async Select after the next completion
56 }
57
58 /* Set Structure Info */
59 EventSelectInfo.EventObject = hEventObject;
60 EventSelectInfo.Events = 0;
61
62 /* Set Events to wait for */
63 if (lNetworkEvents & FD_READ) {
64 EventSelectInfo.Events |= AFD_EVENT_RECEIVE;
65 }
66
67 if (lNetworkEvents & FD_WRITE) {
68 EventSelectInfo.Events |= AFD_EVENT_SEND;
69 }
70
71 if (lNetworkEvents & FD_OOB) {
72 EventSelectInfo.Events |= AFD_EVENT_OOB_RECEIVE;
73 }
74
75 if (lNetworkEvents & FD_ACCEPT) {
76 EventSelectInfo.Events |= AFD_EVENT_ACCEPT;
77 }
78
79 if (lNetworkEvents & FD_CONNECT) {
81 }
82
83 if (lNetworkEvents & FD_CLOSE) {
85 }
86
87 if (lNetworkEvents & FD_QOS) {
88 EventSelectInfo.Events |= AFD_EVENT_QOS;
89 }
90
91 if (lNetworkEvents & FD_GROUP_QOS) {
92 EventSelectInfo.Events |= AFD_EVENT_GROUP_QOS;
93 }
94
95 /* Send IOCTL */
98 NULL,
99 NULL,
100 &IOSB,
102 &EventSelectInfo,
103 sizeof(EventSelectInfo),
104 NULL,
105 0);
106
107 /* Wait for return */
108 if (Status == STATUS_PENDING) {
110 Status = IOSB.Status;
111 }
112
114
115 if (Status != STATUS_SUCCESS)
116 {
117 ERR("Got status 0x%08x.\n", Status);
118 return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
119 }
120
121 /* Set Socket Data*/
122 Socket->EventObject = hEventObject;
123 Socket->NetworkEvents = lNetworkEvents;
124
125 TRACE("Leaving\n");
126
127 return 0;
128}
#define IOCTL_AFD_EVENT_SELECT
Definition: shared.h:349
LONG NetworkEvents
Definition: msafd.h:58
HANDLE EventObject
Definition: msafd.h:57

◆ WSPGetAcceptExSockaddrs()

VOID WSPAPI WSPGetAcceptExSockaddrs ( IN PVOID  lpOutputBuffer,
IN DWORD  dwReceiveDataLength,
IN DWORD  dwLocalAddressLength,
IN DWORD  dwRemoteAddressLength,
OUT struct sockaddr **  LocalSockaddr,
OUT LPINT  LocalSockaddrLength,
OUT struct sockaddr **  RemoteSockaddr,
OUT LPINT  RemoteSockaddrLength 
)

Definition at line 1934 of file dllmain.c.

1943{
1944 /* AFD_SUPER_ACCEPT outputs receive data + local address + local address length + remote address + remote address length */
1945 /* Length is located 2 bytes before address length */
1946 BYTE* LocalAddress = (BYTE *)lpOutputBuffer + dwReceiveDataLength;
1948 {
1949 *LocalSockaddr = (struct sockaddr *)LocalAddress;
1951 }
1952
1954 {
1958 }
1959}
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int UINT
Definition: sysinfo.c:13
_In_ DWORD _In_ DWORD _In_ DWORD _Outptr_result_bytebuffer_ LocalSockaddrLength struct sockaddr ** LocalSockaddr
Definition: mswsock.h:114
_In_ DWORD _In_ DWORD _In_ DWORD _Outptr_result_bytebuffer_ LocalSockaddrLength struct sockaddr _Out_ LPINT LocalSockaddrLength
Definition: mswsock.h:115
_In_ DWORD _In_ DWORD _In_ DWORD _Outptr_result_bytebuffer_ LocalSockaddrLength struct sockaddr _Out_ LPINT _Outptr_result_bytebuffer_ RemoteSockaddrLength struct sockaddr ** RemoteSockaddr
Definition: mswsock.h:116
_In_ SOCKET _In_ DWORD dwReceiveDataLength
Definition: mswsock.h:102
_In_ DWORD _In_ DWORD _In_ DWORD _Outptr_result_bytebuffer_ LocalSockaddrLength struct sockaddr _Out_ LPINT _Outptr_result_bytebuffer_ RemoteSockaddrLength struct sockaddr _Out_ LPINT RemoteSockaddrLength
Definition: mswsock.h:117
_In_ SOCKET _In_ DWORD _In_ DWORD _In_ DWORD dwRemoteAddressLength
Definition: mswsock.h:104
_In_ SOCKET _In_ DWORD _In_ DWORD dwLocalAddressLength
Definition: mswsock.h:103
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR LocalAddress
Definition: wsk.h:171
unsigned char BYTE
Definition: xxhash.c:193

Referenced by WSPIoctl().

◆ WSPGetOverlappedResult()

BOOL WSPAPI WSPGetOverlappedResult ( IN SOCKET  s,
IN LPWSAOVERLAPPED  lpOverlapped,
OUT LPDWORD  lpcbTransfer,
IN BOOL  fWait,
OUT LPDWORD  lpdwFlags,
OUT LPINT  lpErrno 
)

Definition at line 96 of file sndrcv.c.

103{
104 PSOCKET_INFORMATION Socket;
106 BOOL Ret;
107
108 TRACE("Called (%x)\n", Handle);
109
110 /* Get the Socket Structure associate to this Socket*/
111 Socket = GetSocketStructure(Handle);
112 if (!Socket)
113 {
114 if(lpErrno)
115 *lpErrno = WSAENOTSOCK;
116 return FALSE;
117 }
118 if (!lpOverlapped || !lpdwBytes || !lpdwFlags)
119 {
120 if (lpErrno)
121 *lpErrno = WSAEFAULT;
122 return FALSE;
123 }
124
126 Ret = GetOverlappedResult((HANDLE)Handle, lpOverlapped, lpdwBytes, fWait);
127
128 /* HACK: Allow APC to be processed */
129 SleepEx(0, TRUE);
130
131 if (!fWait && IoStatusBlock->Status == STATUS_PENDING)
132 {
133 if (lpErrno)
134 *lpErrno = WSA_IO_INCOMPLETE;
135 return FALSE;
136 }
137
138 if (Ret)
139 {
140
141 /* Re-enable Async Event */
145 }
146
147 switch (IoStatusBlock->Status)
148 {
150 *lpdwFlags = MSG_OOB;
151 break;
153 *lpdwFlags = MSG_PARTIAL | MSG_OOB;
154 break;
156 *lpdwFlags = MSG_PARTIAL;
157 break;
158 default:
159 *lpdwFlags = 0;
160 if (lpErrno)
161 *lpErrno = TranslateNtStatusError(IoStatusBlock->Status);
162 break;
163 }
164
165 return Ret;
166}
BOOL WINAPI GetOverlappedResult(IN HANDLE hFile, IN LPOVERLAPPED lpOverlapped, OUT LPDWORD lpNumberOfBytesTransferred, IN BOOL bWait)
Definition: iocompl.c:221
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED lpOverlapped
Definition: mswsock.h:93
#define STATUS_RECEIVE_EXPEDITED
Definition: ntstatus.h:205
#define STATUS_RECEIVE_PARTIAL
Definition: ntstatus.h:204
#define STATUS_RECEIVE_PARTIAL_EXPEDITED
Definition: ntstatus.h:206
#define WSA_IO_INCOMPLETE
Definition: winsock2.h:611
#define MSG_OOB
Definition: winsock.h:215
#define MSG_PARTIAL
Definition: winsock.h:396

◆ WSPGetPeerName()

INT WSPAPI WSPGetPeerName ( IN SOCKET  s,
OUT LPSOCKADDR  name,
IN OUT LPINT  namelen,
OUT LPINT  lpErrno 
)

Definition at line 2579 of file dllmain.c.

2583{
2584 IO_STATUS_BLOCK IOSB;
2585 ULONG TdiAddressSize;
2586 PTRANSPORT_ADDRESS SocketAddress;
2587 PSOCKET_INFORMATION Socket = NULL;
2590
2591 /* Get the Socket Structure associate to this Socket*/
2592 Socket = GetSocketStructure(s);
2593 if (!Socket)
2594 {
2595 if (lpErrno) *lpErrno = WSAENOTSOCK;
2596 return SOCKET_ERROR;
2597 }
2598
2599 if (Socket->SharedData->State != SocketConnected)
2600 {
2601 if (lpErrno) *lpErrno = WSAENOTCONN;
2602 return SOCKET_ERROR;
2603 }
2604
2605 if (!Name || !NameLength)
2606 {
2607 if (lpErrno) *lpErrno = WSAEFAULT;
2608 return SOCKET_ERROR;
2609 }
2610
2613 NULL,
2615 FALSE);
2616
2617 if( !NT_SUCCESS(Status) )
2618 return SOCKET_ERROR;
2619
2620 /* Allocate a buffer for the address */
2621 TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + Socket->SharedData->SizeOfRemoteAddress;
2622 SocketAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
2623
2624 if ( SocketAddress == NULL )
2625 {
2626 NtClose( SockEvent );
2627 if (lpErrno) *lpErrno = WSAENOBUFS;
2628 return SOCKET_ERROR;
2629 }
2630
2631 /* Send IOCTL */
2633 SockEvent,
2634 NULL,
2635 NULL,
2636 &IOSB,
2638 NULL,
2639 0,
2640 SocketAddress,
2641 TdiAddressSize);
2642
2643 /* Wait for return */
2644 if (Status == STATUS_PENDING)
2645 {
2647 Status = IOSB.Status;
2648 }
2649
2650 NtClose( SockEvent );
2651
2652 if (NT_SUCCESS(Status))
2653 {
2654 if (*NameLength >= Socket->SharedData->SizeOfRemoteAddress)
2655 {
2656 Name->sa_family = SocketAddress->Address[0].AddressType;
2657 RtlCopyMemory (Name->sa_data,
2658 SocketAddress->Address[0].Address,
2659 SocketAddress->Address[0].AddressLength);
2660 *NameLength = Socket->SharedData->SizeOfRemoteAddress;
2661 TRACE("NameLength %d Address: %x Port %x\n",
2662 *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr,
2663 ((struct sockaddr_in *)Name)->sin_port);
2664 HeapFree(GlobalHeap, 0, SocketAddress);
2665 return 0;
2666 }
2667 else
2668 {
2669 HeapFree(GlobalHeap, 0, SocketAddress);
2670 if (lpErrno) *lpErrno = WSAEFAULT;
2671 return SOCKET_ERROR;
2672 }
2673 }
2674
2675 HeapFree(GlobalHeap, 0, SocketAddress);
2676
2677 return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
2678}
LPWSTR Name
Definition: desk.c:124
GLdouble s
Definition: gl.h:2039
#define IOCTL_AFD_GET_PEER_NAME
Definition: shared.h:309
UCHAR Address[1]
Definition: tdi.h:340
USHORT AddressLength
Definition: tdi.h:338
struct _TRANSPORT_ADDRESS TRANSPORT_ADDRESS

◆ WSPGetQOSByName()

BOOL WSPAPI WSPGetQOSByName ( IN SOCKET  s,
IN OUT LPWSABUF  lpQOSName,
OUT LPQOS  lpQOS,
OUT LPINT  lpErrno 
)

Definition at line 26 of file stubs.c.

31{
33
34 return FALSE;
35}

◆ WSPGetSockName()

INT WSPAPI WSPGetSockName ( IN SOCKET  s,
OUT LPSOCKADDR  name,
IN OUT LPINT  namelen,
OUT LPINT  lpErrno 
)

Definition at line 2477 of file dllmain.c.

2481{
2482 IO_STATUS_BLOCK IOSB;
2483 ULONG TdiAddressSize;
2484 PTDI_ADDRESS_INFO TdiAddress;
2485 PTRANSPORT_ADDRESS SocketAddress;
2486 PSOCKET_INFORMATION Socket = NULL;
2489
2490 /* Get the Socket Structure associate to this Socket*/
2491 Socket = GetSocketStructure(Handle);
2492 if (!Socket)
2493 {
2494 if (lpErrno) *lpErrno = WSAENOTSOCK;
2495 return SOCKET_ERROR;
2496 }
2497
2498 if (!Name || !NameLength)
2499 {
2500 if (lpErrno) *lpErrno = WSAEFAULT;
2501 return SOCKET_ERROR;
2502 }
2503
2506 NULL,
2508 FALSE);
2509
2510 if( !NT_SUCCESS(Status) )
2511 return SOCKET_ERROR;
2512
2513 /* Allocate a buffer for the address */
2514 TdiAddressSize =
2516 TdiAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
2517
2518 if ( TdiAddress == NULL )
2519 {
2520 NtClose( SockEvent );
2521 if (lpErrno) *lpErrno = WSAENOBUFS;
2522 return SOCKET_ERROR;
2523 }
2524
2525 SocketAddress = &TdiAddress->Address;
2526
2527 /* Send IOCTL */
2529 SockEvent,
2530 NULL,
2531 NULL,
2532 &IOSB,
2534 NULL,
2535 0,
2536 TdiAddress,
2537 TdiAddressSize);
2538
2539 /* Wait for return */
2540 if (Status == STATUS_PENDING)
2541 {
2543 Status = IOSB.Status;
2544 }
2545
2546 NtClose( SockEvent );
2547
2548 if (NT_SUCCESS(Status))
2549 {
2550 if (*NameLength >= Socket->SharedData->SizeOfLocalAddress)
2551 {
2552 Name->sa_family = SocketAddress->Address[0].AddressType;
2553 RtlCopyMemory (Name->sa_data,
2554 SocketAddress->Address[0].Address,
2555 SocketAddress->Address[0].AddressLength);
2556 *NameLength = Socket->SharedData->SizeOfLocalAddress;
2557 TRACE("NameLength %d Address: %x Port %x\n",
2558 *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr,
2559 ((struct sockaddr_in *)Name)->sin_port);
2560 HeapFree(GlobalHeap, 0, TdiAddress);
2561 return 0;
2562 }
2563 else
2564 {
2565 HeapFree(GlobalHeap, 0, TdiAddress);
2566 if (lpErrno) *lpErrno = WSAEFAULT;
2567 return SOCKET_ERROR;
2568 }
2569 }
2570
2571 HeapFree(GlobalHeap, 0, TdiAddress);
2572
2573 return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
2574}
#define IOCTL_AFD_GET_SOCK_NAME
Definition: shared.h:307
TRANSPORT_ADDRESS Address
Definition: tdi.h:388

◆ WSPGetSockOpt()

INT WSPAPI WSPGetSockOpt ( IN SOCKET  s,
IN INT  level,
IN INT  optname,
OUT CHAR FAR *  optval,
IN OUT LPINT  optlen,
OUT LPINT  lpErrno 
)

Definition at line 2925 of file dllmain.c.

2931{
2932 PSOCKET_INFORMATION Socket = NULL;
2933 PVOID Buffer;
2935 BOOL BoolBuffer;
2936 DWORD DwordBuffer;
2937 INT Errno;
2938
2939 TRACE("Called\n");
2940
2941 /* Get the Socket Structure associate to this Socket*/
2942 Socket = GetSocketStructure(Handle);
2943 if (Socket == NULL)
2944 {
2945 if (lpErrno) *lpErrno = WSAENOTSOCK;
2946 return SOCKET_ERROR;
2947 }
2948 if (!OptionLength || !OptionValue)
2949 {
2950 if (lpErrno) *lpErrno = WSAEFAULT;
2951 return SOCKET_ERROR;
2952 }
2953
2954 switch (Level)
2955 {
2956 case SOL_SOCKET:
2957 switch (OptionName)
2958 {
2959 case SO_TYPE:
2960 Buffer = &Socket->SharedData->SocketType;
2961 BufferSize = sizeof(INT);
2962 break;
2963
2964 case SO_RCVBUF:
2966 BufferSize = sizeof(ULONG);
2967 break;
2968
2969 case SO_SNDBUF:
2971 BufferSize = sizeof(ULONG);
2972 break;
2973
2974 case SO_ACCEPTCONN:
2975 BoolBuffer = Socket->SharedData->Listening;
2976 Buffer = &BoolBuffer;
2977 BufferSize = sizeof(BOOL);
2978 break;
2979
2980 case SO_BROADCAST:
2981 BoolBuffer = Socket->SharedData->Broadcast;
2982 Buffer = &BoolBuffer;
2983 BufferSize = sizeof(BOOL);
2984 break;
2985
2986 case SO_DEBUG:
2987 BoolBuffer = Socket->SharedData->Debug;
2988 Buffer = &BoolBuffer;
2989 BufferSize = sizeof(BOOL);
2990 break;
2991
2992 case SO_DONTLINGER:
2993 BoolBuffer = (Socket->SharedData->LingerData.l_onoff == 0);
2994 Buffer = &BoolBuffer;
2995 BufferSize = sizeof(BOOL);
2996 break;
2997
2998 case SO_LINGER:
2999 if (Socket->SharedData->SocketType == SOCK_DGRAM)
3000 {
3001 if (lpErrno) *lpErrno = WSAENOPROTOOPT;
3002 return SOCKET_ERROR;
3003 }
3004 Buffer = &Socket->SharedData->LingerData;
3005 BufferSize = sizeof(struct linger);
3006 break;
3007
3008 case SO_OOBINLINE:
3009 BoolBuffer = (Socket->SharedData->OobInline != 0);
3010 Buffer = &BoolBuffer;
3011 BufferSize = sizeof(BOOL);
3012 break;
3013
3014 case SO_KEEPALIVE:
3015 case SO_DONTROUTE:
3016 /* These guys go directly to the helper */
3017 goto SendToHelper;
3018
3020 BoolBuffer = (Socket->SharedData->UseDelayedAcceptance != 0);
3021 Buffer = &BoolBuffer;
3022 BufferSize = sizeof(BOOL);
3023 break;
3024
3025 case SO_REUSEADDR:
3026 BoolBuffer = (Socket->SharedData->ReuseAddresses != 0);
3027 Buffer = &BoolBuffer;
3028 BufferSize = sizeof(BOOL);
3029 break;
3030
3032 BoolBuffer = (Socket->SharedData->ExclusiveAddressUse != 0);
3033 Buffer = &BoolBuffer;
3034 BufferSize = sizeof(BOOL);
3035 break;
3036
3037 case SO_ERROR:
3038 Buffer = &Socket->SharedData->SocketLastError;
3039 BufferSize = sizeof(INT);
3040 break;
3041
3042 case SO_CONNECT_TIME:
3043 if (Socket->SharedData->ConnectTime)
3044 DwordBuffer = GetCurrentTimeInSeconds() - Socket->SharedData->ConnectTime;
3045 else
3046 DwordBuffer = -1;
3047 Buffer = &DwordBuffer;
3048 BufferSize = sizeof(DWORD);
3049 break;
3050
3051 case SO_SNDTIMEO:
3052 Buffer = &Socket->SharedData->SendTimeout;
3053 BufferSize = sizeof(DWORD);
3054 break;
3055 case SO_RCVTIMEO:
3056 Buffer = &Socket->SharedData->RecvTimeout;
3057 BufferSize = sizeof(DWORD);
3058 break;
3059 case SO_PROTOCOL_INFOW:
3060 Buffer = &Socket->ProtocolInfo;
3061 BufferSize = sizeof(Socket->ProtocolInfo);
3062 break;
3063
3064 case SO_GROUP_ID:
3065 case SO_GROUP_PRIORITY:
3066 case SO_MAX_MSG_SIZE:
3067
3068 default:
3069 DbgPrint("MSAFD: Get unknown optname %x\n", OptionName);
3070 if (lpErrno) *lpErrno = WSAENOPROTOOPT;
3071 return SOCKET_ERROR;
3072 }
3073
3074 if (*OptionLength < BufferSize)
3075 {
3076 if (lpErrno) *lpErrno = WSAEFAULT;
3077 *OptionLength = BufferSize;
3078 return SOCKET_ERROR;
3079 }
3080 RtlCopyMemory(OptionValue, Buffer, BufferSize);
3081
3082 return 0;
3083
3084 default:
3085 if (lpErrno) *lpErrno = WSAEINVAL;
3086 return SOCKET_ERROR;
3087 }
3088
3089SendToHelper:
3090 Errno = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext,
3091 Handle,
3092 Socket->TdiAddressHandle,
3093 Socket->TdiConnectionHandle,
3094 Level,
3095 OptionName,
3096 OptionValue,
3097 (LPINT)OptionLength);
3098 if (lpErrno) *lpErrno = Errno;
3099 return (Errno == NO_ERROR) ? NO_ERROR : SOCKET_ERROR;
3100}
Definition: bufpool.h:45
#define BufferSize
Definition: mmc.h:75
_In_ ULONG BufferSize
Definition: dispmprt.h:490
_In_ ULONG _In_ UCHAR Level
Definition: dispmprt.h:1329
#define DbgPrint
Definition: hal.h:12
int * LPINT
Definition: minwindef.h:151
#define SO_CONNECT_TIME
Definition: mswsock.h:36
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
#define INT
Definition: polytest.cpp:20
PWSH_GET_SOCKET_INFORMATION WSHGetSocketInformation
Definition: helpers.h:26
BOOLEAN Broadcast
Definition: shared.h:398
BOOLEAN Debug
Definition: shared.h:399
ULONG RecvTimeout
Definition: shared.h:392
BOOLEAN ExclusiveAddressUse
Definition: shared.h:402
BOOLEAN OobInline
Definition: shared.h:400
ULONG SizeOfSendBuffer
Definition: shared.h:394
BOOLEAN ReuseAddresses
Definition: shared.h:401
ULONG SizeOfRecvBuffer
Definition: shared.h:393
ULONG SendTimeout
Definition: shared.h:391
int32_t INT
Definition: typedefs.h:58
#define WSAENOPROTOOPT
Definition: winerror.h:2858
#define SO_PROTOCOL_INFOW
Definition: winsock2.h:243
#define SO_ERROR
Definition: winsock.h:188
#define SO_KEEPALIVE
Definition: winsock.h:175
#define SO_RCVBUF
Definition: winsock.h:183
#define SO_OOBINLINE
Definition: winsock.h:180
#define SO_DONTROUTE
Definition: winsock.h:176
#define SO_ACCEPTCONN
Definition: winsock.h:173
#define SOCK_DGRAM
Definition: winsock.h:330
#define SO_LINGER
Definition: winsock.h:179
#define SO_REUSEADDR
Definition: winsock.h:174
#define SO_TYPE
Definition: winsock.h:189
#define SOL_SOCKET
Definition: winsock.h:392
#define SO_DEBUG
Definition: winsock.h:172
#define SO_SNDTIMEO
Definition: winsock.h:186
#define SO_BROADCAST
Definition: winsock.h:177
#define SO_DONTLINGER
Definition: winsock.h:181
#define SO_RCVTIMEO
Definition: winsock.h:187
#define SO_SNDBUF
Definition: winsock.h:182
#define SO_CONDITIONAL_ACCEPT
Definition: ws2def.h:121
#define SO_EXCLUSIVEADDRUSE
Definition: ws2def.h:105
#define SO_GROUP_ID
Definition: ws2def.h:117
#define SO_MAX_MSG_SIZE
Definition: ws2def.h:119
#define SO_GROUP_PRIORITY
Definition: ws2def.h:118

◆ WSPIoctl()

INT WSPAPI WSPIoctl ( IN SOCKET  s,
IN DWORD  dwIoControlCode,
IN LPVOID  lpvInBuffer,
IN DWORD  cbInBuffer,
OUT LPVOID  lpvOutBuffer,
IN DWORD  cbOutBuffer,
OUT LPDWORD  lpcbBytesReturned,
IN LPWSAOVERLAPPED  lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpCompletionRoutine,
IN LPWSATHREADID  lpThreadId,
OUT LPINT  lpErrno 
)

Definition at line 2682 of file dllmain.c.

2693{
2694 PSOCKET_INFORMATION Socket = NULL;
2695 BOOL NeedsCompletion = lpOverlapped != NULL;
2696 BOOLEAN NonBlocking;
2697 INT Errno = NO_ERROR, Ret = SOCKET_ERROR;
2698 DWORD cbRet = 0;
2699
2700 /* Get the Socket Structure associate to this Socket*/
2701 Socket = GetSocketStructure(Handle);
2702 if (!Socket)
2703 {
2704 if(lpErrno)
2705 *lpErrno = WSAENOTSOCK;
2706 return SOCKET_ERROR;
2707 }
2708
2709 if (!lpcbBytesReturned && !lpOverlapped)
2710 {
2711 if(lpErrno)
2712 *lpErrno = WSAEFAULT;
2713 return SOCKET_ERROR;
2714 }
2715
2716 switch( dwIoControlCode )
2717 {
2718 case FIONBIO:
2719 if( cbInBuffer < sizeof(INT) || IS_INTRESOURCE(lpvInBuffer) )
2720 {
2721 Errno = WSAEFAULT;
2722 break;
2723 }
2724 NonBlocking = *((PULONG)lpvInBuffer) ? TRUE : FALSE;
2725 /* Don't allow to go in blocking mode if WSPAsyncSelect or WSPEventSelect is pending */
2726 if (!NonBlocking)
2727 {
2728 /* If there is an WSPAsyncSelect pending, fail with WSAEINVAL */
2729 if (Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents))
2730 {
2731 Errno = WSAEINVAL;
2732 break;
2733 }
2734 /* If there is an WSPEventSelect pending, fail with WSAEINVAL */
2735 if (Socket->NetworkEvents)
2736 {
2737 Errno = WSAEINVAL;
2738 break;
2739 }
2740 }
2741 Socket->SharedData->NonBlocking = NonBlocking ? 1 : 0;
2742 NeedsCompletion = FALSE;
2743 Errno = SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &NonBlocking, NULL, NULL, lpOverlapped, lpCompletionRoutine);
2744 if (Errno == NO_ERROR)
2745 Ret = NO_ERROR;
2746 break;
2747 case FIONREAD:
2748 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2749 {
2750 cbRet = sizeof(ULONG);
2751 Errno = WSAEFAULT;
2752 break;
2753 }
2754 if (cbOutBuffer < sizeof(ULONG))
2755 {
2756 Errno = WSAEINVAL;
2757 break;
2758 }
2759 NeedsCompletion = FALSE;
2760 Errno = GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, NULL, (PULONG)lpvOutBuffer, NULL, lpOverlapped, lpCompletionRoutine);
2761 if (Errno == NO_ERROR)
2762 {
2763 cbRet = sizeof(ULONG);
2764 Ret = NO_ERROR;
2765 }
2766 break;
2767 case SIOCATMARK:
2768 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2769 {
2770 cbRet = sizeof(BOOL);
2771 Errno = WSAEFAULT;
2772 break;
2773 }
2774 if (cbOutBuffer < sizeof(BOOL))
2775 {
2776 Errno = WSAEINVAL;
2777 break;
2778 }
2779 if (Socket->SharedData->SocketType != SOCK_STREAM)
2780 {
2781 Errno = WSAEINVAL;
2782 break;
2783 }
2784
2785 /* FIXME: Return false if OOBINLINE is true for now
2786 We should MSG_PEEK|MSG_OOB check with driver
2787 */
2788 *(BOOL*)lpvOutBuffer = !Socket->SharedData->OobInline;
2789
2790 cbRet = sizeof(BOOL);
2791 Errno = NO_ERROR;
2792 Ret = NO_ERROR;
2793 break;
2795 if (cbOutBuffer == 0)
2796 {
2797 cbRet = sizeof(PVOID);
2798 Errno = WSAEFAULT;
2799 break;
2800 }
2801
2802 if (cbInBuffer < sizeof(GUID) ||
2803 cbOutBuffer < sizeof(PVOID))
2804 {
2805 Errno = WSAEINVAL;
2806 break;
2807 }
2808
2809 {
2810 GUID AcceptExGUID = WSAID_ACCEPTEX;
2811 GUID ConnectExGUID = WSAID_CONNECTEX;
2812 GUID DisconnectExGUID = WSAID_DISCONNECTEX;
2813 GUID GetAcceptExSockaddrsGUID = WSAID_GETACCEPTEXSOCKADDRS;
2814
2815 if (IsEqualGUID(&AcceptExGUID, lpvInBuffer))
2816 {
2817 *((PVOID *)lpvOutBuffer) = WSPAcceptEx;
2818 cbRet = sizeof(PVOID);
2819 Errno = NO_ERROR;
2820 Ret = NO_ERROR;
2821 }
2822 else if (IsEqualGUID(&ConnectExGUID, lpvInBuffer))
2823 {
2824 *((PVOID *)lpvOutBuffer) = WSPConnectEx;
2825 cbRet = sizeof(PVOID);
2826 Errno = NO_ERROR;
2827 Ret = NO_ERROR;
2828 }
2829 else if (IsEqualGUID(&DisconnectExGUID, lpvInBuffer))
2830 {
2831 *((PVOID *)lpvOutBuffer) = WSPDisconnectEx;
2832 cbRet = sizeof(PVOID);
2833 Errno = NO_ERROR;
2834 Ret = NO_ERROR;
2835 }
2836 else if (IsEqualGUID(&GetAcceptExSockaddrsGUID, lpvInBuffer))
2837 {
2838 *((PVOID *)lpvOutBuffer) = WSPGetAcceptExSockaddrs;
2839 cbRet = sizeof(PVOID);
2840 Errno = NO_ERROR;
2841 Ret = NO_ERROR;
2842 }
2843 else
2844 {
2845 ERR("Querying unknown extension function: %x\n", ((GUID*)lpvInBuffer)->Data1);
2846 Errno = WSAEOPNOTSUPP;
2847 }
2848 }
2849
2850 break;
2852 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2853 {
2854 cbRet = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
2855 Errno = WSAEFAULT;
2856 break;
2857 }
2858 if (cbOutBuffer < sizeof(INT))
2859 {
2860 Errno = WSAEINVAL;
2861 break;
2862 }
2863
2864 cbRet = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
2865
2866 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->iAddressCount = 1;
2867
2868 if (cbOutBuffer < (sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress)))
2869 {
2870 Errno = WSAEFAULT;
2871 break;
2872 }
2873
2874 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].iSockaddrLength = sizeof(Socket->SharedData->WSLocalAddress);
2875 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].lpSockaddr = &Socket->SharedData->WSLocalAddress;
2876
2877 Errno = NO_ERROR;
2878 Ret = NO_ERROR;
2879 break;
2880 default:
2881 Errno = Socket->HelperData->WSHIoctl(Socket->HelperContext,
2882 Handle,
2883 Socket->TdiAddressHandle,
2884 Socket->TdiConnectionHandle,
2886 lpvInBuffer,
2887 cbInBuffer,
2888 lpvOutBuffer,
2889 cbOutBuffer,
2890 &cbRet,
2892 lpCompletionRoutine,
2893 &NeedsCompletion);
2894
2895 if (Errno == NO_ERROR)
2896 Ret = NO_ERROR;
2897 break;
2898 }
2899 if (lpOverlapped && NeedsCompletion)
2900 {
2901 lpOverlapped->Internal = Errno;
2902 lpOverlapped->InternalHigh = cbRet;
2903 if (lpCompletionRoutine != NULL)
2904 {
2905 lpCompletionRoutine(Errno, cbRet, lpOverlapped, 0);
2906 }
2907 if (lpOverlapped->hEvent)
2908 SetEvent(lpOverlapped->hEvent);
2910 {
2911 ERR("PostQueuedCompletionStatus failed %d\n", GetLastError());
2912 }
2913 return NO_ERROR;
2914 }
2915 if (lpErrno)
2916 *lpErrno = Errno;
2917 if (lpcbBytesReturned)
2918 *lpcbBytesReturned = cbRet;
2919 return Ret;
2920}
#define IS_INTRESOURCE(x)
Definition: loader.c:613
BOOL WSPAPI WSPConnectEx(_In_ SOCKET Handle, _In_ const struct sockaddr *SocketAddress, _In_ int SocketAddressLength, _In_ PVOID lpSendBuffer, _In_ DWORD dwSendDataLength, _Out_ LPDWORD lpdwBytesSent, _Inout_ LPOVERLAPPED lpOverlapped)
Definition: dllmain.c:2298
VOID WSPAPI WSPGetAcceptExSockaddrs(IN PVOID lpOutputBuffer, IN DWORD dwReceiveDataLength, IN DWORD dwLocalAddressLength, IN DWORD dwRemoteAddressLength, OUT struct sockaddr **LocalSockaddr, OUT LPINT LocalSockaddrLength, OUT struct sockaddr **RemoteSockaddr, OUT LPINT RemoteSockaddrLength)
Definition: dllmain.c:1934
BOOL WSPAPI WSPAcceptEx(_In_ SOCKET sListenSocket, _In_ SOCKET sAcceptSocket, _Out_ PVOID lpOutputBuffer, _In_ DWORD dwReceiveDataLength, _In_ DWORD dwLocalAddressLength, _In_ DWORD dwRemoteAddressLength, _Out_ LPDWORD lpdwBytesReceived, _Inout_ LPOVERLAPPED lpOverlapped)
Definition: dllmain.c:1847
BOOL WSPAPI WSPDisconnectEx(IN SOCKET hSocket, IN LPOVERLAPPED lpOverlapped, IN DWORD dwFlags, IN DWORD reserved)
Definition: stubs.c:58
#define SOCK_STREAM
Definition: tcpip.h:118
BOOL WINAPI PostQueuedCompletionStatus(IN HANDLE CompletionHandle, IN DWORD dwNumberOfBytesTransferred, IN ULONG_PTR dwCompletionKey, IN LPOVERLAPPED lpOverlapped)
Definition: iocompl.c:192
#define WSAID_GETACCEPTEXSOCKADDRS
Definition: mswsock.h:77
#define WSAID_ACCEPTEX
Definition: mswsock.h:74
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define AFD_INFO_RECEIVE_CONTENT_SIZE
Definition: shared.h:204
PWSH_IOCTL WSHIoctl
Definition: helpers.h:33
SOCKADDR WSLocalAddress
Definition: shared.h:423
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
uint32_t * PULONG
Definition: typedefs.h:59
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ DWORD dwIoControlCode
Definition: winddi.h:1700
#define SIOCATMARK
Definition: winsock.h:247
#define FIONREAD
Definition: winsock.h:241
#define FIONBIO
Definition: winsock.h:143
#define SIO_ADDRESS_LIST_QUERY
Definition: ws2def.h:177
struct _SOCKET_ADDRESS_LIST SOCKET_ADDRESS_LIST
#define SIO_GET_EXTENSION_FUNCTION_POINTER
Definition: ws2def.h:167

◆ WSPJoinLeaf()

SOCKET WSPAPI WSPJoinLeaf ( IN SOCKET  s,
IN CONST SOCKADDR *  name,
IN INT  namelen,
IN LPWSABUF  lpCallerData,
OUT LPWSABUF  lpCalleeData,
IN LPQOS  lpSQOS,
IN LPQOS  lpGQOS,
IN DWORD  dwFlags,
OUT LPINT  lpErrno 
)

Definition at line 40 of file stubs.c.

50{
52
53 return (SOCKET)0;
54}

◆ WSPListen()

INT WSPAPI WSPListen ( IN SOCKET  s,
IN INT  backlog,
OUT LPINT  lpErrno 
)

◆ WSPRecv()

INT WSPAPI WSPRecv ( IN SOCKET  s,
IN OUT LPWSABUF  lpBuffers,
IN DWORD  dwBufferCount,
OUT LPDWORD  lpNumberOfBytesRecvd,
IN OUT LPDWORD  lpFlags,
IN LPWSAOVERLAPPED  lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpCompletionRoutine,
IN LPWSATHREADID  lpThreadId,
OUT LPINT  lpErrno 
)

◆ WSPRecvDisconnect()

INT WSPAPI WSPRecvDisconnect ( IN SOCKET  s,
OUT LPWSABUF  lpInboundDisconnectData,
OUT LPINT  lpErrno 
)

Definition at line 1052 of file sndrcv.c.

1055{
1057 return 0;
1058}

◆ WSPRecvFrom()

INT WSPAPI WSPRecvFrom ( IN SOCKET  s,
IN OUT LPWSABUF  lpBuffers,
IN DWORD  dwBufferCount,
OUT LPDWORD  lpNumberOfBytesRecvd,
IN OUT LPDWORD  lpFlags,
OUT LPSOCKADDR  lpFrom,
IN OUT LPINT  lpFromlen,
IN LPWSAOVERLAPPED  lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpCompletionRoutine,
IN LPWSATHREADID  lpThreadId,
OUT LPINT  lpErrno 
)

◆ WSPSelect()

INT WSPAPI WSPSelect ( IN INT  nfds,
IN OUT fd_set *  readfds,
IN OUT fd_set *  writefds,
IN OUT fd_set *  exceptfds,
IN CONST struct timeval *  timeout,
OUT LPINT  lpErrno 
)

◆ WSPSend()

INT WSPAPI WSPSend ( IN SOCKET  s,
IN LPWSABUF  lpBuffers,
IN DWORD  dwBufferCount,
OUT LPDWORD  lpNumberOfBytesSent,
IN DWORD  dwFlags,
IN LPWSAOVERLAPPED  lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpCompletionRoutine,
IN LPWSATHREADID  lpThreadId,
OUT LPINT  lpErrno 
)

◆ WSPSendDisconnect()

INT WSPAPI WSPSendDisconnect ( IN SOCKET  s,
IN LPWSABUF  lpOutboundDisconnectData,
OUT LPINT  lpErrno 
)

Definition at line 1064 of file sndrcv.c.

1067{
1069 return 0;
1070}

◆ WSPSendTo()

INT WSPAPI WSPSendTo ( IN SOCKET  s,
IN LPWSABUF  lpBuffers,
IN DWORD  dwBufferCount,
OUT LPDWORD  lpNumberOfBytesSent,
IN DWORD  dwFlags,
IN CONST SOCKADDR *  lpTo,
IN INT  iTolen,
IN LPWSAOVERLAPPED  lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpCompletionRoutine,
IN LPWSATHREADID  lpThreadId,
OUT LPINT  lpErrno 
)

◆ WSPSetSockOpt()

INT WSPAPI WSPSetSockOpt ( IN SOCKET  s,
IN INT  level,
IN INT  optname,
IN CONST CHAR FAR *  optval,
IN INT  optlen,
OUT LPINT  lpErrno 
)

Definition at line 3214 of file dllmain.c.

3221{
3222 PSOCKET_INFORMATION Socket;
3223 INT Errno;
3224
3225 /* Get the Socket Structure associate to this Socket*/
3226 Socket = GetSocketStructure(s);
3227 if (Socket == NULL)
3228 {
3229 if (lpErrno) *lpErrno = WSAENOTSOCK;
3230 return SOCKET_ERROR;
3231 }
3232 if (!optval && optlen)
3233 {
3234 if (lpErrno) *lpErrno = WSAEFAULT;
3235 return SOCKET_ERROR;
3236 }
3237
3238
3239 /* FIXME: We should handle some more cases here */
3240 if (level == SOL_SOCKET)
3241 {
3242 switch (optname)
3243 {
3244 case SO_BROADCAST:
3245 if (optlen < sizeof(BOOL))
3246 {
3247 if (lpErrno) *lpErrno = WSAEFAULT;
3248 return SOCKET_ERROR;
3249 }
3250 Socket->SharedData->Broadcast = (*optval != 0) ? 1 : 0;
3251 return NO_ERROR;
3252
3253 case SO_OOBINLINE:
3254 if (optlen < sizeof(BOOL))
3255 {
3256 if (lpErrno) *lpErrno = WSAEFAULT;
3257 return SOCKET_ERROR;
3258 }
3259 Socket->SharedData->OobInline = (*optval != 0) ? 1 : 0;
3260 return NO_ERROR;
3261
3262 case SO_DONTLINGER:
3263 if (optlen < sizeof(BOOL))
3264 {
3265 if (lpErrno) *lpErrno = WSAEFAULT;
3266 return SOCKET_ERROR;
3267 }
3268 Socket->SharedData->LingerData.l_onoff = (*optval != 0) ? 0 : 1;
3269 return NO_ERROR;
3270
3271 case SO_REUSEADDR:
3272 if (optlen < sizeof(BOOL))
3273 {
3274 if (lpErrno) *lpErrno = WSAEFAULT;
3275 return SOCKET_ERROR;
3276 }
3277 Socket->SharedData->ReuseAddresses = (*optval != 0) ? 1 : 0;
3278 return NO_ERROR;
3279
3281 if (optlen < sizeof(BOOL))
3282 {
3283 if (lpErrno) *lpErrno = WSAEFAULT;
3284 return SOCKET_ERROR;
3285 }
3286 Socket->SharedData->ExclusiveAddressUse = (*optval != 0) ? 1 : 0;
3287 return NO_ERROR;
3288
3289 case SO_LINGER:
3290 if (optlen < sizeof(struct linger))
3291 {
3292 if (lpErrno) *lpErrno = WSAEFAULT;
3293 return SOCKET_ERROR;
3294 }
3296 optval,
3297 sizeof(struct linger));
3298 return NO_ERROR;
3299
3300 case SO_SNDBUF:
3301 if (optlen < sizeof(ULONG))
3302 {
3303 if (lpErrno) *lpErrno = WSAEFAULT;
3304 return SOCKET_ERROR;
3305 }
3306
3307 SetSocketInformation(Socket,
3309 NULL,
3310 (PULONG)optval,
3311 NULL,
3312 NULL,
3313 NULL);
3314 GetSocketInformation(Socket,
3316 NULL,
3317 &Socket->SharedData->SizeOfSendBuffer,
3318 NULL,
3319 NULL,
3320 NULL);
3321
3322 return NO_ERROR;
3323
3324 case SO_RCVBUF:
3325 if (optlen < sizeof(ULONG))
3326 {
3327 if (lpErrno) *lpErrno = WSAEFAULT;
3328 return SOCKET_ERROR;
3329 }
3330
3331 /* FIXME: We should not have to limit the packet receive buffer size like this. workaround for CORE-15804 */
3332 if (*(PULONG)optval > 0x2000)
3333 *(PULONG)optval = 0x2000;
3334
3335 SetSocketInformation(Socket,
3337 NULL,
3338 (PULONG)optval,
3339 NULL,
3340 NULL,
3341 NULL);
3342 GetSocketInformation(Socket,
3344 NULL,
3345 &Socket->SharedData->SizeOfRecvBuffer,
3346 NULL,
3347 NULL,
3348 NULL);
3349
3350 return NO_ERROR;
3351
3352 case SO_UPDATE_CONNECT_CONTEXT:
3354 return MsafdUpdateConnectionContext(s, lpErrno);
3355
3356 case SO_ERROR:
3357 if (optlen < sizeof(INT))
3358 {
3359 if (lpErrno) *lpErrno = WSAEFAULT;
3360 return SOCKET_ERROR;
3361 }
3362
3364 optval,
3365 sizeof(INT));
3366 return NO_ERROR;
3367
3368 case SO_SNDTIMEO:
3369 if (optlen < sizeof(DWORD))
3370 {
3371 if (lpErrno) *lpErrno = WSAEFAULT;
3372 return SOCKET_ERROR;
3373 }
3374
3376 optval,
3377 sizeof(DWORD));
3378 return NO_ERROR;
3379
3380 case SO_RCVTIMEO:
3381 if (optlen < sizeof(DWORD))
3382 {
3383 if (lpErrno) *lpErrno = WSAEFAULT;
3384 return SOCKET_ERROR;
3385 }
3386
3388 optval,
3389 sizeof(DWORD));
3390 return NO_ERROR;
3391
3392 case SO_KEEPALIVE:
3393 case SO_DONTROUTE:
3394 /* These go directly to the helper dll */
3395 goto SendToHelper;
3396
3397 default:
3398 /* Obviously this is a hack */
3399 ERR("MSAFD: Set unknown optname %x\n", optname);
3400 return NO_ERROR;
3401 }
3402 }
3403
3404SendToHelper:
3405 Errno = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext,
3406 s,
3407 Socket->TdiAddressHandle,
3408 Socket->TdiConnectionHandle,
3409 level,
3410 optname,
3411 (PCHAR)optval,
3412 optlen);
3413 if (lpErrno) *lpErrno = Errno;
3414 return (Errno == NO_ERROR) ? NO_ERROR : SOCKET_ERROR;
3415}
static INT NTAPI MsafdUpdateConnectionContext(_In_ SOCKET Handle, _Out_ LPINT lpErrno)
Definition: dllmain.c:3105
GLint level
Definition: gl.h:1546
#define SO_UPDATE_ACCEPT_CONTEXT
Definition: mswsock.h:35
#define AFD_INFO_SEND_WINDOW_SIZE
Definition: shared.h:202
#define AFD_INFO_RECEIVE_WINDOW_SIZE
Definition: shared.h:201
PWSH_SET_SOCKET_INFORMATION WSHSetSocketInformation
Definition: helpers.h:27
char * PCHAR
Definition: typedefs.h:51

◆ WSPShutdown()

INT WSPAPI WSPShutdown ( IN SOCKET  s,
IN INT  how,
OUT LPINT  lpErrno 
)

◆ WSPSocket()

SOCKET WSPAPI WSPSocket ( IN INT  af,
IN INT  type,
IN INT  protocol,
IN LPWSAPROTOCOL_INFOW  lpProtocolInfo,
IN GROUP  g,
IN DWORD  dwFlags,
OUT LPINT  lpErrno 
)

◆ WSPStringToAddress()

INT WSPAPI WSPStringToAddress ( IN LPWSTR  AddressString,
IN INT  AddressFamily,
IN LPWSAPROTOCOL_INFOW  lpProtocolInfo,
OUT LPSOCKADDR  lpAddress,
IN OUT LPINT  lpAddressLength,
OUT LPINT  lpErrno 
)

Definition at line 3556 of file dllmain.c.

3562{
3563 int numdots = 0;
3564 USHORT port;
3565 LONG inetaddr = 0, ip_part;
3566 LPWSTR *bp = NULL;
3568
3569 if (!lpAddressLength || !lpAddress || !AddressString)
3570 {
3571 if (lpErrno) *lpErrno = WSAEINVAL;
3572 return SOCKET_ERROR;
3573 }
3574
3575 sockaddr = (SOCKADDR_IN *)lpAddress;
3576
3577 /* Set right address family */
3578 if (lpProtocolInfo != NULL)
3579 {
3580 sockaddr->sin_family = lpProtocolInfo->iAddressFamily;
3581 }
3582 else
3583 {
3584 sockaddr->sin_family = AddressFamily;
3585 }
3586
3587 /* Report size */
3588 if (AddressFamily == AF_INET)
3589 {
3590 if (*lpAddressLength < (INT)sizeof(SOCKADDR_IN))
3591 {
3592 if (lpErrno) *lpErrno = WSAEFAULT;
3593 }
3594 else
3595 {
3596 // translate ip string to ip
3597
3598 /* Get ip number */
3599 bp = &AddressString;
3600 inetaddr = 0;
3601
3602 while (*bp < &AddressString[wcslen(AddressString)])
3603 {
3604 ip_part = wcstol(*bp, bp, 10);
3605 /* ip part number should be in range 0-255 */
3606 if (ip_part < 0 || ip_part > 255)
3607 {
3608 if (lpErrno) *lpErrno = WSAEINVAL;
3609 return SOCKET_ERROR;
3610 }
3611 inetaddr = (inetaddr << 8) + ip_part;
3612 /* we end on string end or port separator */
3613 if ((*bp)[0] == 0 || (*bp)[0] == L':')
3614 break;
3615 /* ip parts are dot separated. verify it */
3616 if ((*bp)[0] != L'.')
3617 {
3618 if (lpErrno) *lpErrno = WSAEINVAL;
3619 return SOCKET_ERROR;
3620 }
3621 /* count the dots */
3622 numdots++;
3623 /* move over the dot to next ip part */
3624 (*bp)++;
3625 }
3626
3627 /* check dots count */
3628 if (numdots != 3)
3629 {
3630 if (lpErrno) *lpErrno = WSAEINVAL;
3631 return SOCKET_ERROR;
3632 }
3633
3634 /* Get port number */
3635 if ((*bp)[0] == L':')
3636 {
3637 /* move over the column to port part */
3638 (*bp)++;
3639 /* next char should be numeric */
3640 if ((*bp)[0] < L'0' || (*bp)[0] > L'9')
3641 {
3642 if (lpErrno) *lpErrno = WSAEINVAL;
3643 return SOCKET_ERROR;
3644 }
3645 port = wcstol(*bp, bp, 10);
3646 }
3647 else
3648 {
3649 port = 0;
3650 }
3651
3652 if (lpErrno) *lpErrno = NO_ERROR;
3653 /* rest sockaddr.sin_addr.s_addr
3654 for we need to be sure it is zero when we come to while */
3655 *lpAddressLength = sizeof(*sockaddr);
3656 memset(lpAddress, 0, sizeof(*sockaddr));
3657 sockaddr->sin_family = AF_INET;
3658 sockaddr->sin_addr.s_addr = inetaddr;
3659 sockaddr->sin_port = port;
3660 }
3661 }
3662
3663 if (lpErrno && !*lpErrno)
3664 {
3665 return 0;
3666 }
3667
3668 return SOCKET_ERROR;
3669}
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2752
USHORT port
Definition: uri.c:210
IN PCO_ADDRESS_FAMILY AddressFamily
Definition: ndis.h:1906
unsigned short USHORT
Definition: pedump.c:61
#define memset(x, y, z)
Definition: compat.h:39
uint16_t * LPWSTR
Definition: typedefs.h:56
struct sockaddr_in SOCKADDR_IN
Definition: winsock.h:481

Variable Documentation

◆ GlobalHeap

HANDLE GlobalHeap
extern

Definition at line 19 of file dllmain.c.

◆ lpWPUCompleteOverlappedRequest

LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest
extern

Definition at line 22 of file dllmain.c.

◆ SockAsyncCompletionPort

◆ SockAsyncSelectCalled

BOOLEAN SockAsyncSelectCalled
extern

Definition at line 29 of file dllmain.c.

◆ SockEvent

◆ SockHelpersListHead

LIST_ENTRY SockHelpersListHead
extern

Definition at line 25 of file dllmain.c.

Referenced by DllMain(), SockGetTdiName(), and SockLoadHelperDll().

◆ Upcalls

WSPUPCALLTABLE Upcalls
extern

Definition at line 20 of file dllmain.c.

Referenced by SockAsyncSelectCompletionRoutine(), WSPSocket(), and WSPStartup().