ReactOS 0.4.16-dev-2293-g4d8327b
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_INFORMATIONPSOCKET_INFORMATION
 
typedef struct _SOCKET_CONTEXT SOCKET_CONTEXT
 
typedef struct _SOCKET_CONTEXTPSOCKET_CONTEXT
 
typedef struct _ASYNC_DATA ASYNC_DATA
 
typedef struct _ASYNC_DATAPASYNC_DATA
 
typedef struct _MSAFD_INFO_APC_CONTEXT MSAFD_INFO_APC_CONTEXT
 
typedef struct _MSAFD_INFO_APC_CONTEXTPMSAFD_INFO_APC_CONTEXT
 
typedef struct _MSAFD_SEND_APC_CONTEXT MSAFD_SEND_APC_CONTEXT
 
typedef struct _MSAFD_SEND_APC_CONTEXTPMSAFD_SEND_APC_CONTEXT
 
typedef struct _MSAFD_RECV_APC_CONTEXT MSAFD_RECV_APC_CONTEXT
 
typedef struct _MSAFD_RECV_APC_CONTEXTPMSAFD_RECV_APC_CONTEXT
 
typedef struct _MSAFD_CONNECT_APC_CONTEXT MSAFD_CONNECT_APC_CONTEXT
 
typedef struct _MSAFD_CONNECT_APC_CONTEXTPMSAFD_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 3868 of file dllmain.c.

3869{
3870 IO_STATUS_BLOCK IOSB;
3871 SOCKET_CONTEXT ContextData;
3874
3877 NULL,
3879 FALSE);
3880
3881 if( !NT_SUCCESS(Status) )
3882 return SOCKET_ERROR;
3883
3884 /* Create Context */
3885 ContextData.SharedData = *Socket->SharedData;
3886 ContextData.SizeOfHelperData = 0;
3887 RtlCopyMemory (&ContextData.LocalAddress,
3888 Socket->LocalAddress,
3890 RtlCopyMemory (&ContextData.RemoteAddress,
3891 Socket->RemoteAddress,
3893
3894 /* Send IOCTL */
3896 SockEvent,
3897 NULL,
3898 NULL,
3899 &IOSB,
3901 &ContextData,
3902 sizeof(ContextData),
3903 NULL,
3904 0);
3905
3906 /* Wait for Completion */
3907 if (Status == STATUS_PENDING)
3908 {
3910 Status = IOSB.Status;
3911 }
3912
3913 NtClose( SockEvent );
3914
3916}
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:25
#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:3402
@ 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:308
#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:375
INT SizeOfRemoteAddress
Definition: shared.h:376
#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 3597 of file dllmain.c.

3604{
3605 PIO_STATUS_BLOCK IOSB;
3606 IO_STATUS_BLOCK DummyIOSB;
3607 PAFD_INFO InfoData;
3609 PMSAFD_INFO_APC_CONTEXT APCContext;
3610 PIO_APC_ROUTINE APCFunction;
3611 HANDLE Event = NULL;
3613
3614 InfoData = HeapAlloc(GlobalHeap, 0, sizeof(*InfoData));
3615 if (!InfoData)
3616 return SOCKET_ERROR;
3617
3620 NULL,
3622 FALSE);
3623 if (!NT_SUCCESS(Status))
3624 {
3625 HeapFree(GlobalHeap, 0, InfoData);
3626 return SOCKET_ERROR;
3627 }
3628
3629 /* Set Info Class */
3630 InfoData->InformationClass = AfdInformationClass;
3631
3632 /* Verify if we should use APC */
3633 if (!Overlapped)
3634 {
3635 /* Not using Overlapped structure, so use normal blocking on event */
3636 APCContext = NULL;
3637 APCFunction = NULL;
3638 Event = SockEvent;
3639 IOSB = &DummyIOSB;
3640 }
3641 else
3642 {
3643 /* Overlapped request for non overlapped opened socket */
3644 if ((Socket->SharedData->CreateFlags & SO_SYNCHRONOUS_NONALERT) != 0)
3645 {
3646 TRACE("Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
3648 HeapFree(GlobalHeap, 0, InfoData);
3650 }
3651
3652 APCContext = HeapAlloc(GlobalHeap, 0, sizeof(*APCContext));
3653 if (!APCContext)
3654 {
3655 ERR("Not enough memory for APC Context\n");
3657 HeapFree(GlobalHeap, 0, InfoData);
3659 }
3661 APCContext->lpOverlapped = Overlapped;
3662 APCContext->lpInfoData = InfoData;
3663 APCFunction = &MsafdInfoAPC;
3664
3665 if (!CompletionRoutine)
3666 Event = Overlapped->hEvent;
3667
3668 IOSB = (PIO_STATUS_BLOCK)&Overlapped->Internal;
3669 }
3670
3671 IOSB->Status = STATUS_PENDING;
3672
3673 /* Send IOCTL */
3675 Event,
3676 APCFunction,
3677 APCContext,
3678 IOSB,
3680 InfoData,
3681 sizeof(*InfoData),
3682 InfoData,
3683 sizeof(*InfoData));
3684
3685 /* Wait for completion if not overlapped */
3686 if (!Overlapped && Status == STATUS_PENDING)
3687 {
3689 Status = IOSB->Status;
3690 }
3691
3692 TRACE("Status %lx\n", Status);
3693
3694 if (Status == STATUS_SUCCESS)
3695 {
3696 /* Return Information */
3697 if (Ulong != NULL)
3698 {
3699 *Ulong = InfoData->Information.Ulong;
3700 }
3701 if (LargeInteger != NULL)
3702 {
3703 *LargeInteger = InfoData->Information.LargeInteger;
3704 }
3705 if (Boolean != NULL)
3706 {
3707 *Boolean = InfoData->Information.Boolean;
3708 }
3709 }
3710
3712 if (!APCFunction)
3713 {
3714 /* When using APC, this will be freed by the APC function */
3715 HeapFree(GlobalHeap, 0, InfoData);
3716 }
3717
3718 return MsafdReturnWithErrno(Status, NULL, 0, NULL);
3719}
#define ERR(fmt,...)
Definition: precomp.h:57
#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:3578
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:334
#define TRACE(s)
Definition: solgame.cpp:4
union _AFD_INFO::@3574 Information
ULONG InformationClass
Definition: shared.h:29
ULONG Ulong
Definition: shared.h:31
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:397
#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 3845 of file dllmain.c.

3846{
3847 PSOCKET_INFORMATION CurrentSocket;
3848
3850
3851 CurrentSocket = SocketListHead;
3852 while (CurrentSocket)
3853 {
3854 if (CurrentSocket->Handle == Handle)
3855 {
3857 return CurrentSocket;
3858 }
3859
3860 CurrentSocket = CurrentSocket->NextSocket;
3861 }
3862
3864
3865 return NULL;
3866}
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(), 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 3723 of file dllmain.c.

3730{
3731 PIO_STATUS_BLOCK IOSB;
3732 IO_STATUS_BLOCK DummyIOSB;
3733 PAFD_INFO InfoData;
3735 PMSAFD_INFO_APC_CONTEXT APCContext;
3736 PIO_APC_ROUTINE APCFunction;
3737 HANDLE Event = NULL;
3739
3740 InfoData = HeapAlloc(GlobalHeap, 0, sizeof(*InfoData));
3741 if (!InfoData)
3742 return SOCKET_ERROR;
3743
3746 NULL,
3748 FALSE);
3749 if (!NT_SUCCESS(Status))
3750 {
3751 HeapFree(GlobalHeap, 0, InfoData);
3752 return SOCKET_ERROR;
3753 }
3754
3755 /* Set Info Class */
3756 InfoData->InformationClass = AfdInformationClass;
3757
3758 /* Set Information */
3759 if (Ulong != NULL)
3760 {
3761 InfoData->Information.Ulong = *Ulong;
3762 }
3763 if (LargeInteger != NULL)
3764 {
3765 InfoData->Information.LargeInteger = *LargeInteger;
3766 }
3767 if (Boolean != NULL)
3768 {
3769 InfoData->Information.Boolean = *Boolean;
3770 }
3771
3772 /* Verify if we should use APC */
3773 if (!Overlapped)
3774 {
3775 /* Not using Overlapped structure, so use normal blocking on event */
3776 APCContext = NULL;
3777 APCFunction = NULL;
3778 Event = SockEvent;
3779 IOSB = &DummyIOSB;
3780 }
3781 else
3782 {
3783 /* Overlapped request for non overlapped opened socket */
3784 if ((Socket->SharedData->CreateFlags & SO_SYNCHRONOUS_NONALERT) != 0)
3785 {
3786 TRACE("Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
3788 HeapFree(GlobalHeap, 0, InfoData);
3790 }
3791
3792 APCContext = HeapAlloc(GlobalHeap, 0, sizeof(*APCContext));
3793 if (!APCContext)
3794 {
3795 ERR("Not enough memory for APC Context\n");
3797 HeapFree(GlobalHeap, 0, InfoData);
3799 }
3801 APCContext->lpOverlapped = Overlapped;
3802 APCContext->lpInfoData = InfoData;
3803 APCFunction = &MsafdInfoAPC;
3804
3805 if (!CompletionRoutine)
3806 Event = Overlapped->hEvent;
3807
3808 IOSB = (PIO_STATUS_BLOCK)&Overlapped->Internal;
3809 }
3810
3811 IOSB->Status = STATUS_PENDING;
3812
3813 /* Send IOCTL */
3815 Event,
3816 APCFunction,
3817 APCContext,
3818 IOSB,
3820 InfoData,
3821 sizeof(*InfoData),
3822 NULL,
3823 0);
3824
3825 /* Wait for completion if not overlapped */
3826 if (!Overlapped && Status == STATUS_PENDING)
3827 {
3829 Status = IOSB->Status;
3830 }
3831
3832 TRACE("Status %lx\n", Status);
3833
3835 if (!APCFunction)
3836 {
3837 /* When using APC, this will be freed by the APC function */
3838 HeapFree(GlobalHeap, 0, InfoData);
3839 }
3840
3841 return MsafdReturnWithErrno(Status, NULL, 0, NULL);
3842}
#define IOCTL_AFD_SET_INFO
Definition: shared.h:302

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

◆ SockAsyncSelectCompletionRoutine()

VOID SockAsyncSelectCompletionRoutine ( PVOID  Context,
PIO_STATUS_BLOCK  IoStatusBlock 
)

Definition at line 4075 of file dllmain.c.

4076{
4077
4078 PASYNC_DATA AsyncData = Context;
4079 PSOCKET_INFORMATION Socket;
4080 ULONG x;
4081
4082 /* Get the Socket */
4083 Socket = AsyncData->ParentSocket;
4084
4085 /* Check if the Sequence Number Changed behind our back */
4086 if (AsyncData->SequenceNumber != Socket->SharedData->SequenceNumber )
4087 {
4088 return;
4089 }
4090
4091 /* Check we were manually called b/c of a failure */
4093 {
4094 /* FIXME: Perform Upcall */
4095 return;
4096 }
4097
4098 for (x = 1; x; x<<=1)
4099 {
4100 switch (AsyncData->AsyncSelectInfo.Handles[0].Events & x)
4101 {
4102 case AFD_EVENT_RECEIVE:
4103 if (0 != (Socket->SharedData->AsyncEvents & FD_READ) &&
4104 0 == (Socket->SharedData->AsyncDisabledEvents & FD_READ))
4105 {
4106 /* Make the Notification */
4108 Socket->SharedData->wMsg,
4109 Socket->Handle,
4111 /* Disable this event until the next read(); */
4113 }
4114 break;
4115
4117 if (0 != (Socket->SharedData->AsyncEvents & FD_OOB) &&
4118 0 == (Socket->SharedData->AsyncDisabledEvents & FD_OOB))
4119 {
4120 /* Make the Notification */
4122 Socket->SharedData->wMsg,
4123 Socket->Handle,
4125 /* Disable this event until the next read(); */
4127 }
4128 break;
4129
4130 case AFD_EVENT_SEND:
4131 if (0 != (Socket->SharedData->AsyncEvents & FD_WRITE) &&
4132 0 == (Socket->SharedData->AsyncDisabledEvents & FD_WRITE))
4133 {
4134 /* Make the Notification */
4136 Socket->SharedData->wMsg,
4137 Socket->Handle,
4139 /* Disable this event until the next write(); */
4141 }
4142 break;
4143
4144 /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
4145 case AFD_EVENT_CONNECT:
4147 if (0 != (Socket->SharedData->AsyncEvents & FD_CONNECT) &&
4148 0 == (Socket->SharedData->AsyncDisabledEvents & FD_CONNECT))
4149 {
4150 /* Make the Notification */
4152 Socket->SharedData->wMsg,
4153 Socket->Handle,
4155 /* Disable this event forever; */
4157 }
4158 break;
4159
4160 case AFD_EVENT_ACCEPT:
4161 if (0 != (Socket->SharedData->AsyncEvents & FD_ACCEPT) &&
4162 0 == (Socket->SharedData->AsyncDisabledEvents & FD_ACCEPT))
4163 {
4164 /* Make the Notification */
4166 Socket->SharedData->wMsg,
4167 Socket->Handle,
4169 /* Disable this event until the next accept(); */
4171 }
4172 break;
4173
4175 case AFD_EVENT_ABORT:
4176 case AFD_EVENT_CLOSE:
4177 if (0 != (Socket->SharedData->AsyncEvents & FD_CLOSE) &&
4178 0 == (Socket->SharedData->AsyncDisabledEvents & FD_CLOSE))
4179 {
4180 /* Make the Notification */
4182 Socket->SharedData->wMsg,
4183 Socket->Handle,
4185 /* Disable this event forever; */
4187 }
4188 break;
4189 /* FIXME: Support QOS */
4190 }
4191 }
4192
4193 /* Check if there are any events left for us to check */
4194 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 )
4195 {
4196 return;
4197 }
4198
4199 /* Keep Polling */
4200 SockProcessAsyncSelect(Socket, AsyncData);
4201 return;
4202}
VOID SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, PASYNC_DATA AsyncData)
Definition: dllmain.c:4204
WSPUPCALLTABLE Upcalls
Definition: dllmain.c:20
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define AFD_EVENT_ACCEPT
Definition: shared.h:216
#define AFD_EVENT_SEND
Definition: shared.h:211
#define AFD_EVENT_OOB_RECEIVE
Definition: shared.h:210
#define AFD_EVENT_CONNECT_FAIL
Definition: shared.h:217
#define AFD_EVENT_RECEIVE
Definition: shared.h:209
#define AFD_EVENT_DISCONNECT
Definition: shared.h:212
#define AFD_EVENT_ABORT
Definition: shared.h:213
#define AFD_EVENT_CLOSE
Definition: shared.h:214
#define AFD_EVENT_CONNECT
Definition: shared.h:215
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:409
LONG AsyncEvents
Definition: shared.h:408
DWORD SequenceNumber
Definition: shared.h:406
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 3979 of file dllmain.c.

3980{
3981 PVOID AsyncContext;
3982 PASYNC_COMPLETION_ROUTINE AsyncCompletionRoutine;
3983 IO_STATUS_BLOCK IOSB;
3985
3986 /* Make the Thread Higher Priority */
3988
3989 /* Do a KQUEUE/WorkItem Style Loop, thanks to IoCompletion Ports */
3990 do
3991 {
3993 (PVOID*)&AsyncCompletionRoutine,
3994 &AsyncContext,
3995 &IOSB,
3996 NULL);
3997 /* Call the Async Function */
3998 if (NT_SUCCESS(Status))
3999 {
4000 (*AsyncCompletionRoutine)(AsyncContext, &IOSB);
4001 }
4002 else
4003 {
4004 /* It Failed, sleep for a second */
4005 Sleep(1000);
4006 }
4007 } while ((Status != STATUS_TIMEOUT));
4008
4009 /* The Thread has Ended */
4010 return 0;
4011}
#define STATUS_TIMEOUT
Definition: d3dkmdt.h:49
BOOL WINAPI SetThreadPriority(IN HANDLE hThread, IN int nPriority)
Definition: thread.c:700
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:1146
#define THREAD_PRIORITY_ABOVE_NORMAL
Definition: winbase.h:299

◆ SockCreateOrReferenceAsyncThread()

BOOLEAN SockCreateOrReferenceAsyncThread ( VOID  )

Definition at line 3918 of file dllmain.c.

3919{
3920 HANDLE hAsyncThread;
3921 DWORD AsyncThreadId;
3922 HANDLE AsyncEvent;
3925
3926 /* Check if the Thread Already Exists */
3928 {
3930 return TRUE;
3931 }
3932
3933 /* Create the Completion Port */
3935 {
3938 NULL,
3939 2); // Allow 2 threads only
3940 if (!NT_SUCCESS(Status))
3941 {
3942 ERR("Failed to create completion port: 0x%08x\n", Status);
3943 return FALSE;
3944 }
3945 /* Protect Handle */
3946 HandleFlags.ProtectFromClose = TRUE;
3947 HandleFlags.Inherit = FALSE;
3950 &HandleFlags,
3951 sizeof(HandleFlags));
3952 }
3953
3954 /* Create the Async Event */
3955 Status = NtCreateEvent(&AsyncEvent,
3957 NULL,
3959 FALSE);
3960
3961 /* Create the Async Thread */
3962 hAsyncThread = CreateThread(NULL,
3963 0,
3965 NULL,
3966 0,
3967 &AsyncThreadId);
3968
3969 /* Close the Handle */
3970 NtClose(hAsyncThread);
3971
3972 /* Increase the Reference Count */
3974 return TRUE;
3975}
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:3979
ULONG SockAsyncThreadRefCount
Definition: dllmain.c:26
@ ObjectHandleFlagInformation
Definition: winternl.h:1876
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:72
@ NotificationEvent
NTSTATUS NTAPI NtSetInformationObject(IN HANDLE ObjectHandle, IN OBJECT_INFORMATION_CLASS ObjectInformationClass, IN PVOID ObjectInformation, IN ULONG Length)
Definition: oblife.c:1824

Referenced by SockReenableAsyncSelectEvent(), and WSPAsyncSelect().

◆ SockGetAsyncSelectHelperAfdHandle()

BOOLEAN SockGetAsyncSelectHelperAfdHandle ( VOID  )

Definition at line 4013 of file dllmain.c.

4014{
4015 UNICODE_STRING AfdHelper;
4017 IO_STATUS_BLOCK IoSb;
4018 FILE_COMPLETION_INFORMATION CompletionInfo;
4020
4021 /* First, make sure we're not already initialized */
4023 {
4024 return TRUE;
4025 }
4026
4027 /* Set up Handle Name and Object */
4028 RtlInitUnicodeString(&AfdHelper, L"\\Device\\Afd\\AsyncSelectHlp" );
4030 &AfdHelper,
4032 NULL,
4033 NULL);
4034
4035 /* Open the Handle to AFD */
4039 &IoSb,
4040 NULL,
4041 0,
4044 0,
4045 NULL,
4046 0);
4047
4048 /*
4049 * Now Set up the Completion Port Information
4050 * This means that whenever a Poll is finished, the routine will be executed
4051 */
4052 CompletionInfo.Port = SockAsyncCompletionPort;
4053 CompletionInfo.Key = SockAsyncSelectCompletionRoutine;
4055 &IoSb,
4056 &CompletionInfo,
4057 sizeof(CompletionInfo),
4059
4060
4061 /* Protect the Handle */
4062 HandleFlags.ProtectFromClose = TRUE;
4063 HandleFlags.Inherit = FALSE;
4066 &HandleFlags,
4067 sizeof(HandleFlags));
4068
4069
4070 /* Set this variable to true so that Send/Recv/Accept will know wether to renable disabled events */
4072 return TRUE;
4073}
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:4075
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 OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define OBJ_INHERIT
Definition: winternl.h:225
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#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

Referenced by WSPAsyncSelect().

◆ SockProcessAsyncSelect()

VOID SockProcessAsyncSelect ( PSOCKET_INFORMATION  Socket,
PASYNC_DATA  AsyncData 
)

Definition at line 4204 of file dllmain.c.

4205{
4206
4207 ULONG lNetworkEvents;
4209
4210 /* Set up the Async Data Event Info */
4211 AsyncData->AsyncSelectInfo.Timeout.HighPart = 0x7FFFFFFF;
4212 AsyncData->AsyncSelectInfo.Timeout.LowPart = 0xFFFFFFFF;
4213 AsyncData->AsyncSelectInfo.HandleCount = 1;
4214 AsyncData->AsyncSelectInfo.Exclusive = TRUE;
4215 AsyncData->AsyncSelectInfo.Handles[0].Handle = Socket->Handle;
4216 AsyncData->AsyncSelectInfo.Handles[0].Events = 0;
4217
4218 /* Remove unwanted events */
4219 lNetworkEvents = Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents);
4220
4221 /* Set Events to wait for */
4222 if (lNetworkEvents & FD_READ)
4223 {
4225 }
4226
4227 if (lNetworkEvents & FD_WRITE)
4228 {
4230 }
4231
4232 if (lNetworkEvents & FD_OOB)
4233 {
4235 }
4236
4237 if (lNetworkEvents & FD_ACCEPT)
4238 {
4240 }
4241
4242 /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
4243 if (lNetworkEvents & FD_CONNECT)
4244 {
4246 }
4247
4248 if (lNetworkEvents & FD_CLOSE)
4249 {
4251 }
4252
4253 if (lNetworkEvents & FD_QOS)
4254 {
4256 }
4257
4258 if (lNetworkEvents & FD_GROUP_QOS)
4259 {
4261 }
4262
4263 /* Send IOCTL */
4265 NULL,
4266 NULL,
4267 AsyncData,
4268 &AsyncData->IoStatusBlock,
4270 &AsyncData->AsyncSelectInfo,
4271 sizeof(AsyncData->AsyncSelectInfo),
4272 &AsyncData->AsyncSelectInfo,
4273 sizeof(AsyncData->AsyncSelectInfo));
4274
4275 /* I/O Manager Won't call the completion routine, let's do it manually */
4276 if (NT_SUCCESS(Status))
4277 {
4278 return;
4279 }
4280 else
4281 {
4282 AsyncData->IoStatusBlock.Status = Status;
4283 SockAsyncSelectCompletionRoutine(AsyncData, &AsyncData->IoStatusBlock);
4284 }
4285}
#define IOCTL_AFD_SELECT
Definition: shared.h:292
#define AFD_EVENT_QOS
Definition: shared.h:218
#define AFD_EVENT_GROUP_QOS
Definition: shared.h:219
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 4287 of file dllmain.c.

4288{
4289 PASYNC_DATA AsyncData = Context;
4290 BOOL FreeContext = TRUE;
4291 PSOCKET_INFORMATION Socket;
4292
4293 /* Get the Socket */
4294 Socket = AsyncData->ParentSocket;
4295
4296 /* If someone closed it, stop the function */
4297 if (Socket->SharedData->State != SocketClosed)
4298 {
4299 /* Check if the Sequence Number changed by now, in which case quit */
4300 if (AsyncData->SequenceNumber == Socket->SharedData->SequenceNumber)
4301 {
4302 /* Do the actual select, if needed */
4303 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)))
4304 {
4305 SockProcessAsyncSelect(Socket, AsyncData);
4306 FreeContext = FALSE;
4307 }
4308 }
4309 }
4310
4311 /* Free the Context */
4312 if (FreeContext)
4313 {
4314 HeapFree(GetProcessHeap(), 0, AsyncData);
4315 }
4316
4317 return;
4318}
#define GetProcessHeap()
Definition: compat.h:736
unsigned int BOOL
Definition: ntddk_ex.h:94
@ SocketClosed
Definition: shared.h:366
SOCKET_STATE State
Definition: shared.h:370

◆ SockReenableAsyncSelectEvent()

VOID SockReenableAsyncSelectEvent ( IN PSOCKET_INFORMATION  Socket,
IN ULONG  Event 
)

Definition at line 4321 of file dllmain.c.

4323{
4324 PASYNC_DATA AsyncData;
4325
4326 /* Make sure the event is actually disabled */
4327 if (!(Socket->SharedData->AsyncDisabledEvents & Event))
4328 {
4329 return;
4330 }
4331
4332 /* Re-enable it */
4333 Socket->SharedData->AsyncDisabledEvents &= ~Event;
4334
4335 /* Return if no more events are being polled */
4336 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 )
4337 {
4338 return;
4339 }
4340
4341 /* Wait on new events */
4342 AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(ASYNC_DATA));
4343 if (!AsyncData) return;
4344
4345 /* Create the Asynch Thread if Needed */
4347
4348 /* Increase the sequence number to stop anything else */
4349 Socket->SharedData->SequenceNumber++;
4350
4351 /* Set up the Async Data */
4352 AsyncData->ParentSocket = Socket;
4353 AsyncData->SequenceNumber = Socket->SharedData->SequenceNumber;
4354
4355 /* Begin Async Select by using I/O Completion */
4358 AsyncData,
4359 0,
4360 0);
4361
4362 /* All done */
4363 return;
4364}
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
Definition: dllmain.c:3918
VOID SockProcessQueuedAsyncSelect(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: dllmain.c:4287
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(), 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:3845
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:4321
static ULONG Timeout
Definition: ping.c:61
#define IOCTL_AFD_WAIT_FOR_LISTEN
Definition: shared.h:280
#define IOCTL_AFD_DEFER_ACCEPT
Definition: shared.h:338
struct _AFD_RECEIVED_ACCEPT_DATA * PAFD_RECEIVED_ACCEPT_DATA
#define IOCTL_AFD_ACCEPT
Definition: shared.h:282
#define IOCTL_AFD_GET_PENDING_CONNECT_DATA
Definition: shared.h:340
@ SocketConnected
Definition: shared.h:365
HANDLE ListenHandle
Definition: shared.h:65
ULONG SequenceNumber
Definition: shared.h:64
BOOLEAN RejectConnection
Definition: shared.h:81
TRANSPORT_ADDRESS Address
Definition: shared.h:70
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:390
INT SocketLastError
Definition: shared.h:403
BOOLEAN Listening
Definition: shared.h:384
BOOLEAN UseDelayedAcceptance
Definition: shared.h:394
DWORD ServiceFlags1
Definition: shared.h:398
ULONG ConnectTime
Definition: shared.h:382
USHORT AddressType
Definition: tdi.h:339
TA_ADDRESS Address[1]
Definition: tdi.h:377
ULONG len
Definition: ws2def.h:519
CHAR FAR * buf
Definition: ws2def.h:520
Definition: winsock.h:60
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
unsigned char UCHAR
Definition: xmlstorage.h:181

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 
)

Definition at line 58 of file stubs.c.

67{
69
70 return FALSE;
71}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

Referenced by WSPIoctl().

◆ 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 3381 of file dllmain.c.

3387{
3388 SIZE_T size;
3389 WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3390 WCHAR *p;
3391
3392 if (!lpsaAddress || !lpszAddressString || !lpdwAddressStringLength)
3393 {
3394 if (lpErrno) *lpErrno = WSAEFAULT;
3395 return SOCKET_ERROR;
3396 }
3397
3398 switch (lpsaAddress->sa_family)
3399 {
3400 case AF_INET:
3401 if (dwAddressLength < sizeof(SOCKADDR_IN))
3402 {
3403 if (lpErrno) *lpErrno = WSAEINVAL;
3404 return SOCKET_ERROR;
3405 }
3407 L"%u.%u.%u.%u:%u",
3408 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 24 & 0xff),
3409 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 16 & 0xff),
3410 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 8 & 0xff),
3411 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) & 0xff),
3412 ntohs(((SOCKADDR_IN *)lpsaAddress)->sin_port));
3413
3414 p = wcschr(buffer, L':');
3415 if (!((SOCKADDR_IN *)lpsaAddress)->sin_port)
3416 {
3417 *p = 0;
3418 }
3419 break;
3420 default:
3421 if (lpErrno) *lpErrno = WSAEINVAL;
3422 return SOCKET_ERROR;
3423 }
3424
3425 size = wcslen(buffer) + 1;
3426
3427 if (*lpdwAddressStringLength < size)
3428 {
3429 *lpdwAddressStringLength = size;
3430 if (lpErrno) *lpErrno = WSAEFAULT;
3431 return SOCKET_ERROR;
3432 }
3433
3434 *lpdwAddressStringLength = size;
3435 wcscpy(lpszAddressString, buffer);
3436 return 0;
3437}
#define wcschr
Definition: compat.h:17
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
#define swprintf
Definition: precomp.h:40
#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
wcscpy
ULONG_PTR SIZE_T
Definition: typedefs.h:80
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ 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:3723
BOOLEAN SockGetAsyncSelectHelperAfdHandle(VOID)
Definition: dllmain.c:4013
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:189
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}

◆ WSPCleanup()

INT WSPAPI WSPCleanup ( OUT LPINT  lpErrno)

Definition at line 3565 of file dllmain.c.

3567{
3568 TRACE("Leaving.\n");
3569
3570 if (lpErrno) *lpErrno = NO_ERROR;
3571
3572 return 0;
3573}

◆ 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 = RtlConvertLongToLargeInteger(0);
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 {
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:3597
NTSYSAPI LONGLONG WINAPI RtlConvertLongToLargeInteger(LONG)
Definition: largeint.c:31
long LONG
Definition: pedump.c:60
#define AFD_DISCONNECT_ABORT
Definition: shared.h:205
#define IOCTL_AFD_DISCONNECT
Definition: shared.h:294
#define AFD_INFO_SENDS_IN_PROGRESS
Definition: shared.h:190
#define AFD_DISCONNECT_SEND
Definition: shared.h:203
LARGE_INTEGER Timeout
Definition: shared.h:143
ULONG DisconnectType
Definition: shared.h:142
HANDLE SharedDataHandle
Definition: msafd.h:48
BOOLEAN SendShutdown
Definition: shared.h:393
struct linger LingerData
Definition: shared.h:377
BOOLEAN ReceiveShutdown
Definition: shared.h:392
DWORD WINAPI SleepEx(IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:738
#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 75 of file stubs.c.

80{
82
83 return FALSE;
84}

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:1225
#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:3499
#define FILE_MAP_ALL_ACCESS
Definition: winbase.h:158
#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:342
NTSTATUS EventStatus[AFD_MAX_EVENTS]
Definition: shared.h:138
#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:336
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 88 of file stubs.c.

97{
99}

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)
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 2463 of file dllmain.c.

2467{
2468 IO_STATUS_BLOCK IOSB;
2469 ULONG TdiAddressSize;
2470 PTRANSPORT_ADDRESS SocketAddress;
2471 PSOCKET_INFORMATION Socket = NULL;
2474
2475 /* Get the Socket Structure associate to this Socket*/
2476 Socket = GetSocketStructure(s);
2477 if (!Socket)
2478 {
2479 if (lpErrno) *lpErrno = WSAENOTSOCK;
2480 return SOCKET_ERROR;
2481 }
2482
2483 if (Socket->SharedData->State != SocketConnected)
2484 {
2485 if (lpErrno) *lpErrno = WSAENOTCONN;
2486 return SOCKET_ERROR;
2487 }
2488
2489 if (!Name || !NameLength)
2490 {
2491 if (lpErrno) *lpErrno = WSAEFAULT;
2492 return SOCKET_ERROR;
2493 }
2494
2497 NULL,
2499 FALSE);
2500
2501 if( !NT_SUCCESS(Status) )
2502 return SOCKET_ERROR;
2503
2504 /* Allocate a buffer for the address */
2505 TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + Socket->SharedData->SizeOfRemoteAddress;
2506 SocketAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
2507
2508 if ( SocketAddress == NULL )
2509 {
2510 NtClose( SockEvent );
2511 if (lpErrno) *lpErrno = WSAENOBUFS;
2512 return SOCKET_ERROR;
2513 }
2514
2515 /* Send IOCTL */
2517 SockEvent,
2518 NULL,
2519 NULL,
2520 &IOSB,
2522 NULL,
2523 0,
2524 SocketAddress,
2525 TdiAddressSize);
2526
2527 /* Wait for return */
2528 if (Status == STATUS_PENDING)
2529 {
2531 Status = IOSB.Status;
2532 }
2533
2534 NtClose( SockEvent );
2535
2536 if (NT_SUCCESS(Status))
2537 {
2538 if (*NameLength >= Socket->SharedData->SizeOfRemoteAddress)
2539 {
2540 Name->sa_family = SocketAddress->Address[0].AddressType;
2541 RtlCopyMemory (Name->sa_data,
2542 SocketAddress->Address[0].Address,
2543 SocketAddress->Address[0].AddressLength);
2544 *NameLength = Socket->SharedData->SizeOfRemoteAddress;
2545 TRACE("NameLength %d Address: %x Port %x\n",
2546 *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr,
2547 ((struct sockaddr_in *)Name)->sin_port);
2548 HeapFree(GlobalHeap, 0, SocketAddress);
2549 return 0;
2550 }
2551 else
2552 {
2553 HeapFree(GlobalHeap, 0, SocketAddress);
2554 if (lpErrno) *lpErrno = WSAEFAULT;
2555 return SOCKET_ERROR;
2556 }
2557 }
2558
2559 HeapFree(GlobalHeap, 0, SocketAddress);
2560
2561 return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
2562}
LPWSTR Name
Definition: desk.c:124
GLdouble s
Definition: gl.h:2039
#define IOCTL_AFD_GET_PEER_NAME
Definition: shared.h:298
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 2361 of file dllmain.c.

2365{
2366 IO_STATUS_BLOCK IOSB;
2367 ULONG TdiAddressSize;
2368 PTDI_ADDRESS_INFO TdiAddress;
2369 PTRANSPORT_ADDRESS SocketAddress;
2370 PSOCKET_INFORMATION Socket = NULL;
2373
2374 /* Get the Socket Structure associate to this Socket*/
2375 Socket = GetSocketStructure(Handle);
2376 if (!Socket)
2377 {
2378 if (lpErrno) *lpErrno = WSAENOTSOCK;
2379 return SOCKET_ERROR;
2380 }
2381
2382 if (!Name || !NameLength)
2383 {
2384 if (lpErrno) *lpErrno = WSAEFAULT;
2385 return SOCKET_ERROR;
2386 }
2387
2390 NULL,
2392 FALSE);
2393
2394 if( !NT_SUCCESS(Status) )
2395 return SOCKET_ERROR;
2396
2397 /* Allocate a buffer for the address */
2398 TdiAddressSize =
2400 TdiAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
2401
2402 if ( TdiAddress == NULL )
2403 {
2404 NtClose( SockEvent );
2405 if (lpErrno) *lpErrno = WSAENOBUFS;
2406 return SOCKET_ERROR;
2407 }
2408
2409 SocketAddress = &TdiAddress->Address;
2410
2411 /* Send IOCTL */
2413 SockEvent,
2414 NULL,
2415 NULL,
2416 &IOSB,
2418 NULL,
2419 0,
2420 TdiAddress,
2421 TdiAddressSize);
2422
2423 /* Wait for return */
2424 if (Status == STATUS_PENDING)
2425 {
2427 Status = IOSB.Status;
2428 }
2429
2430 NtClose( SockEvent );
2431
2432 if (NT_SUCCESS(Status))
2433 {
2434 if (*NameLength >= Socket->SharedData->SizeOfLocalAddress)
2435 {
2436 Name->sa_family = SocketAddress->Address[0].AddressType;
2437 RtlCopyMemory (Name->sa_data,
2438 SocketAddress->Address[0].Address,
2439 SocketAddress->Address[0].AddressLength);
2440 *NameLength = Socket->SharedData->SizeOfLocalAddress;
2441 TRACE("NameLength %d Address: %x Port %x\n",
2442 *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr,
2443 ((struct sockaddr_in *)Name)->sin_port);
2444 HeapFree(GlobalHeap, 0, TdiAddress);
2445 return 0;
2446 }
2447 else
2448 {
2449 HeapFree(GlobalHeap, 0, TdiAddress);
2450 if (lpErrno) *lpErrno = WSAEFAULT;
2451 return SOCKET_ERROR;
2452 }
2453 }
2454
2455 HeapFree(GlobalHeap, 0, TdiAddress);
2456
2457 return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
2458}
#define IOCTL_AFD_GET_SOCK_NAME
Definition: shared.h:296
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 2814 of file dllmain.c.

2820{
2821 PSOCKET_INFORMATION Socket = NULL;
2822 PVOID Buffer;
2824 BOOL BoolBuffer;
2825 DWORD DwordBuffer;
2826 INT Errno;
2827
2828 TRACE("Called\n");
2829
2830 /* Get the Socket Structure associate to this Socket*/
2831 Socket = GetSocketStructure(Handle);
2832 if (Socket == NULL)
2833 {
2834 if (lpErrno) *lpErrno = WSAENOTSOCK;
2835 return SOCKET_ERROR;
2836 }
2837 if (!OptionLength || !OptionValue)
2838 {
2839 if (lpErrno) *lpErrno = WSAEFAULT;
2840 return SOCKET_ERROR;
2841 }
2842
2843 switch (Level)
2844 {
2845 case SOL_SOCKET:
2846 switch (OptionName)
2847 {
2848 case SO_TYPE:
2849 Buffer = &Socket->SharedData->SocketType;
2850 BufferSize = sizeof(INT);
2851 break;
2852
2853 case SO_RCVBUF:
2855 BufferSize = sizeof(ULONG);
2856 break;
2857
2858 case SO_SNDBUF:
2860 BufferSize = sizeof(ULONG);
2861 break;
2862
2863 case SO_ACCEPTCONN:
2864 BoolBuffer = Socket->SharedData->Listening;
2865 Buffer = &BoolBuffer;
2866 BufferSize = sizeof(BOOL);
2867 break;
2868
2869 case SO_BROADCAST:
2870 BoolBuffer = Socket->SharedData->Broadcast;
2871 Buffer = &BoolBuffer;
2872 BufferSize = sizeof(BOOL);
2873 break;
2874
2875 case SO_DEBUG:
2876 BoolBuffer = Socket->SharedData->Debug;
2877 Buffer = &BoolBuffer;
2878 BufferSize = sizeof(BOOL);
2879 break;
2880
2881 case SO_DONTLINGER:
2882 BoolBuffer = (Socket->SharedData->LingerData.l_onoff == 0);
2883 Buffer = &BoolBuffer;
2884 BufferSize = sizeof(BOOL);
2885 break;
2886
2887 case SO_LINGER:
2888 if (Socket->SharedData->SocketType == SOCK_DGRAM)
2889 {
2890 if (lpErrno) *lpErrno = WSAENOPROTOOPT;
2891 return SOCKET_ERROR;
2892 }
2893 Buffer = &Socket->SharedData->LingerData;
2894 BufferSize = sizeof(struct linger);
2895 break;
2896
2897 case SO_OOBINLINE:
2898 BoolBuffer = (Socket->SharedData->OobInline != 0);
2899 Buffer = &BoolBuffer;
2900 BufferSize = sizeof(BOOL);
2901 break;
2902
2903 case SO_KEEPALIVE:
2904 case SO_DONTROUTE:
2905 /* These guys go directly to the helper */
2906 goto SendToHelper;
2907
2909 BoolBuffer = (Socket->SharedData->UseDelayedAcceptance != 0);
2910 Buffer = &BoolBuffer;
2911 BufferSize = sizeof(BOOL);
2912 break;
2913
2914 case SO_REUSEADDR:
2915 BoolBuffer = (Socket->SharedData->ReuseAddresses != 0);
2916 Buffer = &BoolBuffer;
2917 BufferSize = sizeof(BOOL);
2918 break;
2919
2921 BoolBuffer = (Socket->SharedData->ExclusiveAddressUse != 0);
2922 Buffer = &BoolBuffer;
2923 BufferSize = sizeof(BOOL);
2924 break;
2925
2926 case SO_ERROR:
2927 Buffer = &Socket->SharedData->SocketLastError;
2928 BufferSize = sizeof(INT);
2929 break;
2930
2931 case SO_CONNECT_TIME:
2932 DwordBuffer = GetCurrentTimeInSeconds() - Socket->SharedData->ConnectTime;
2933 Buffer = &DwordBuffer;
2934 BufferSize = sizeof(DWORD);
2935 break;
2936
2937 case SO_SNDTIMEO:
2938 Buffer = &Socket->SharedData->SendTimeout;
2939 BufferSize = sizeof(DWORD);
2940 break;
2941 case SO_RCVTIMEO:
2942 Buffer = &Socket->SharedData->RecvTimeout;
2943 BufferSize = sizeof(DWORD);
2944 break;
2945 case SO_PROTOCOL_INFOW:
2946 Buffer = &Socket->ProtocolInfo;
2947 BufferSize = sizeof(Socket->ProtocolInfo);
2948 break;
2949
2950 case SO_GROUP_ID:
2951 case SO_GROUP_PRIORITY:
2952 case SO_MAX_MSG_SIZE:
2953
2954 default:
2955 DbgPrint("MSAFD: Get unknown optname %x\n", OptionName);
2956 if (lpErrno) *lpErrno = WSAENOPROTOOPT;
2957 return SOCKET_ERROR;
2958 }
2959
2960 if (*OptionLength < BufferSize)
2961 {
2962 if (lpErrno) *lpErrno = WSAEFAULT;
2963 *OptionLength = BufferSize;
2964 return SOCKET_ERROR;
2965 }
2966 RtlCopyMemory(OptionValue, Buffer, BufferSize);
2967
2968 return 0;
2969
2970 default:
2971 if (lpErrno) *lpErrno = WSAEINVAL;
2972 return SOCKET_ERROR;
2973 }
2974
2975SendToHelper:
2976 Errno = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext,
2977 Handle,
2978 Socket->TdiAddressHandle,
2979 Socket->TdiConnectionHandle,
2980 Level,
2981 OptionName,
2982 OptionValue,
2983 (LPINT)OptionLength);
2984 if (lpErrno) *lpErrno = Errno;
2985 return (Errno == NO_ERROR) ? NO_ERROR : SOCKET_ERROR;
2986}
Definition: bufpool.h:45
#define BufferSize
Definition: mmc.h:75
#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:385
BOOLEAN Debug
Definition: shared.h:386
ULONG RecvTimeout
Definition: shared.h:379
BOOLEAN ExclusiveAddressUse
Definition: shared.h:389
BOOLEAN OobInline
Definition: shared.h:387
ULONG SizeOfSendBuffer
Definition: shared.h:381
BOOLEAN ReuseAddresses
Definition: shared.h:388
ULONG SizeOfRecvBuffer
Definition: shared.h:380
ULONG SendTimeout
Definition: shared.h:378
int32_t INT
Definition: typedefs.h:58
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
#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
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
#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 2566 of file dllmain.c.

2577{
2578 PSOCKET_INFORMATION Socket = NULL;
2579 BOOL NeedsCompletion = lpOverlapped != NULL;
2580 BOOLEAN NonBlocking;
2581 INT Errno = NO_ERROR, Ret = SOCKET_ERROR;
2582 DWORD cbRet = 0;
2583
2584 /* Get the Socket Structure associate to this Socket*/
2585 Socket = GetSocketStructure(Handle);
2586 if (!Socket)
2587 {
2588 if(lpErrno)
2589 *lpErrno = WSAENOTSOCK;
2590 return SOCKET_ERROR;
2591 }
2592
2593 if (!lpcbBytesReturned && !lpOverlapped)
2594 {
2595 if(lpErrno)
2596 *lpErrno = WSAEFAULT;
2597 return SOCKET_ERROR;
2598 }
2599
2600 switch( dwIoControlCode )
2601 {
2602 case FIONBIO:
2603 if( cbInBuffer < sizeof(INT) || IS_INTRESOURCE(lpvInBuffer) )
2604 {
2605 Errno = WSAEFAULT;
2606 break;
2607 }
2608 NonBlocking = *((PULONG)lpvInBuffer) ? TRUE : FALSE;
2609 /* Don't allow to go in blocking mode if WSPAsyncSelect or WSPEventSelect is pending */
2610 if (!NonBlocking)
2611 {
2612 /* If there is an WSPAsyncSelect pending, fail with WSAEINVAL */
2613 if (Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents))
2614 {
2615 Errno = WSAEINVAL;
2616 break;
2617 }
2618 /* If there is an WSPEventSelect pending, fail with WSAEINVAL */
2619 if (Socket->NetworkEvents)
2620 {
2621 Errno = WSAEINVAL;
2622 break;
2623 }
2624 }
2625 Socket->SharedData->NonBlocking = NonBlocking ? 1 : 0;
2626 NeedsCompletion = FALSE;
2627 Errno = SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &NonBlocking, NULL, NULL, lpOverlapped, lpCompletionRoutine);
2628 if (Errno == NO_ERROR)
2629 Ret = NO_ERROR;
2630 break;
2631 case FIONREAD:
2632 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2633 {
2634 cbRet = sizeof(ULONG);
2635 Errno = WSAEFAULT;
2636 break;
2637 }
2638 if (cbOutBuffer < sizeof(ULONG))
2639 {
2640 Errno = WSAEINVAL;
2641 break;
2642 }
2643 NeedsCompletion = FALSE;
2644 Errno = GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, NULL, (PULONG)lpvOutBuffer, NULL, lpOverlapped, lpCompletionRoutine);
2645 if (Errno == NO_ERROR)
2646 {
2647 cbRet = sizeof(ULONG);
2648 Ret = NO_ERROR;
2649 }
2650 break;
2651 case SIOCATMARK:
2652 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2653 {
2654 cbRet = sizeof(BOOL);
2655 Errno = WSAEFAULT;
2656 break;
2657 }
2658 if (cbOutBuffer < sizeof(BOOL))
2659 {
2660 Errno = WSAEINVAL;
2661 break;
2662 }
2663 if (Socket->SharedData->SocketType != SOCK_STREAM)
2664 {
2665 Errno = WSAEINVAL;
2666 break;
2667 }
2668
2669 /* FIXME: Return false if OOBINLINE is true for now
2670 We should MSG_PEEK|MSG_OOB check with driver
2671 */
2672 *(BOOL*)lpvOutBuffer = !Socket->SharedData->OobInline;
2673
2674 cbRet = sizeof(BOOL);
2675 Errno = NO_ERROR;
2676 Ret = NO_ERROR;
2677 break;
2679 if (cbOutBuffer == 0)
2680 {
2681 cbRet = sizeof(PVOID);
2682 Errno = WSAEFAULT;
2683 break;
2684 }
2685
2686 if (cbInBuffer < sizeof(GUID) ||
2687 cbOutBuffer < sizeof(PVOID))
2688 {
2689 Errno = WSAEINVAL;
2690 break;
2691 }
2692
2693 {
2694 GUID AcceptExGUID = WSAID_ACCEPTEX;
2695 GUID ConnectExGUID = WSAID_CONNECTEX;
2696 GUID DisconnectExGUID = WSAID_DISCONNECTEX;
2697 GUID GetAcceptExSockaddrsGUID = WSAID_GETACCEPTEXSOCKADDRS;
2698
2699 if (IsEqualGUID(&AcceptExGUID, lpvInBuffer))
2700 {
2701 *((PVOID *)lpvOutBuffer) = WSPAcceptEx;
2702 cbRet = sizeof(PVOID);
2703 Errno = NO_ERROR;
2704 Ret = NO_ERROR;
2705 }
2706 else if (IsEqualGUID(&ConnectExGUID, lpvInBuffer))
2707 {
2708 *((PVOID *)lpvOutBuffer) = WSPConnectEx;
2709 cbRet = sizeof(PVOID);
2710 Errno = NO_ERROR;
2711 Ret = NO_ERROR;
2712 }
2713 else if (IsEqualGUID(&DisconnectExGUID, lpvInBuffer))
2714 {
2715 *((PVOID *)lpvOutBuffer) = WSPDisconnectEx;
2716 cbRet = sizeof(PVOID);
2717 Errno = NO_ERROR;
2718 Ret = NO_ERROR;
2719 }
2720 else if (IsEqualGUID(&GetAcceptExSockaddrsGUID, lpvInBuffer))
2721 {
2722 *((PVOID *)lpvOutBuffer) = WSPGetAcceptExSockaddrs;
2723 cbRet = sizeof(PVOID);
2724 Errno = NO_ERROR;
2725 /* See CORE-14966 and associated commits.
2726 * Original line below was 'Ret = NO_ERROR:'.
2727 * This caused winetest ws2_32:sock to hang.
2728 * This new Ret value allows the test to complete. */
2729 ERR("SIO_GET_EXTENSION_FUNCTION_POINTER UNIMPLEMENTED\n");
2730 Ret = SOCKET_ERROR;
2731 }
2732 else
2733 {
2734 ERR("Querying unknown extension function: %x\n", ((GUID*)lpvInBuffer)->Data1);
2735 Errno = WSAEOPNOTSUPP;
2736 }
2737 }
2738
2739 break;
2741 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2742 {
2743 cbRet = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
2744 Errno = WSAEFAULT;
2745 break;
2746 }
2747 if (cbOutBuffer < sizeof(INT))
2748 {
2749 Errno = WSAEINVAL;
2750 break;
2751 }
2752
2753 cbRet = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
2754
2755 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->iAddressCount = 1;
2756
2757 if (cbOutBuffer < (sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress)))
2758 {
2759 Errno = WSAEFAULT;
2760 break;
2761 }
2762
2763 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].iSockaddrLength = sizeof(Socket->SharedData->WSLocalAddress);
2764 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].lpSockaddr = &Socket->SharedData->WSLocalAddress;
2765
2766 Errno = NO_ERROR;
2767 Ret = NO_ERROR;
2768 break;
2769 default:
2770 Errno = Socket->HelperData->WSHIoctl(Socket->HelperContext,
2771 Handle,
2772 Socket->TdiAddressHandle,
2773 Socket->TdiConnectionHandle,
2775 lpvInBuffer,
2776 cbInBuffer,
2777 lpvOutBuffer,
2778 cbOutBuffer,
2779 &cbRet,
2781 lpCompletionRoutine,
2782 &NeedsCompletion);
2783
2784 if (Errno == NO_ERROR)
2785 Ret = NO_ERROR;
2786 break;
2787 }
2788 if (lpOverlapped && NeedsCompletion)
2789 {
2790 lpOverlapped->Internal = Errno;
2791 lpOverlapped->InternalHigh = cbRet;
2792 if (lpCompletionRoutine != NULL)
2793 {
2794 lpCompletionRoutine(Errno, cbRet, lpOverlapped, 0);
2795 }
2796 if (lpOverlapped->hEvent)
2797 SetEvent(lpOverlapped->hEvent);
2799 {
2800 ERR("PostQueuedCompletionStatus failed %d\n", GetLastError());
2801 }
2802 return NO_ERROR;
2803 }
2804 if (lpErrno)
2805 *lpErrno = Errno;
2806 if (lpcbBytesReturned)
2807 *lpcbBytesReturned = cbRet;
2808 return Ret;
2809}
#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:2182
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)
Definition: stubs.c:58
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: stubs.c:88
BOOL WSPAPI WSPDisconnectEx(IN SOCKET hSocket, IN LPOVERLAPPED lpOverlapped, IN DWORD dwFlags, IN DWORD reserved)
Definition: stubs.c:75
#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:194
PWSH_IOCTL WSHIoctl
Definition: helpers.h:33
SOCKADDR WSLocalAddress
Definition: shared.h:410
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 3100 of file dllmain.c.

3107{
3108 PSOCKET_INFORMATION Socket;
3109 INT Errno;
3110
3111 /* Get the Socket Structure associate to this Socket*/
3112 Socket = GetSocketStructure(s);
3113 if (Socket == NULL)
3114 {
3115 if (lpErrno) *lpErrno = WSAENOTSOCK;
3116 return SOCKET_ERROR;
3117 }
3118 if (!optval && optlen)
3119 {
3120 if (lpErrno) *lpErrno = WSAEFAULT;
3121 return SOCKET_ERROR;
3122 }
3123
3124
3125 /* FIXME: We should handle some more cases here */
3126 if (level == SOL_SOCKET)
3127 {
3128 switch (optname)
3129 {
3130 case SO_BROADCAST:
3131 if (optlen < sizeof(BOOL))
3132 {
3133 if (lpErrno) *lpErrno = WSAEFAULT;
3134 return SOCKET_ERROR;
3135 }
3136 Socket->SharedData->Broadcast = (*optval != 0) ? 1 : 0;
3137 return NO_ERROR;
3138
3139 case SO_OOBINLINE:
3140 if (optlen < sizeof(BOOL))
3141 {
3142 if (lpErrno) *lpErrno = WSAEFAULT;
3143 return SOCKET_ERROR;
3144 }
3145 Socket->SharedData->OobInline = (*optval != 0) ? 1 : 0;
3146 return NO_ERROR;
3147
3148 case SO_DONTLINGER:
3149 if (optlen < sizeof(BOOL))
3150 {
3151 if (lpErrno) *lpErrno = WSAEFAULT;
3152 return SOCKET_ERROR;
3153 }
3154 Socket->SharedData->LingerData.l_onoff = (*optval != 0) ? 0 : 1;
3155 return NO_ERROR;
3156
3157 case SO_REUSEADDR:
3158 if (optlen < sizeof(BOOL))
3159 {
3160 if (lpErrno) *lpErrno = WSAEFAULT;
3161 return SOCKET_ERROR;
3162 }
3163 Socket->SharedData->ReuseAddresses = (*optval != 0) ? 1 : 0;
3164 return NO_ERROR;
3165
3167 if (optlen < sizeof(BOOL))
3168 {
3169 if (lpErrno) *lpErrno = WSAEFAULT;
3170 return SOCKET_ERROR;
3171 }
3172 Socket->SharedData->ExclusiveAddressUse = (*optval != 0) ? 1 : 0;
3173 return NO_ERROR;
3174
3175 case SO_LINGER:
3176 if (optlen < sizeof(struct linger))
3177 {
3178 if (lpErrno) *lpErrno = WSAEFAULT;
3179 return SOCKET_ERROR;
3180 }
3182 optval,
3183 sizeof(struct linger));
3184 return NO_ERROR;
3185
3186 case SO_SNDBUF:
3187 if (optlen < sizeof(ULONG))
3188 {
3189 if (lpErrno) *lpErrno = WSAEFAULT;
3190 return SOCKET_ERROR;
3191 }
3192
3193 SetSocketInformation(Socket,
3195 NULL,
3196 (PULONG)optval,
3197 NULL,
3198 NULL,
3199 NULL);
3200 GetSocketInformation(Socket,
3202 NULL,
3203 &Socket->SharedData->SizeOfSendBuffer,
3204 NULL,
3205 NULL,
3206 NULL);
3207
3208 return NO_ERROR;
3209
3210 case SO_RCVBUF:
3211 if (optlen < sizeof(ULONG))
3212 {
3213 if (lpErrno) *lpErrno = WSAEFAULT;
3214 return SOCKET_ERROR;
3215 }
3216
3217 /* FIXME: We should not have to limit the packet receive buffer size like this. workaround for CORE-15804 */
3218 if (*(PULONG)optval > 0x2000)
3219 *(PULONG)optval = 0x2000;
3220
3221 SetSocketInformation(Socket,
3223 NULL,
3224 (PULONG)optval,
3225 NULL,
3226 NULL,
3227 NULL);
3228 GetSocketInformation(Socket,
3230 NULL,
3231 &Socket->SharedData->SizeOfRecvBuffer,
3232 NULL,
3233 NULL,
3234 NULL);
3235
3236 return NO_ERROR;
3237
3238 case SO_UPDATE_CONNECT_CONTEXT:
3239 return MsafdUpdateConnectionContext(s, lpErrno);
3240
3241 case SO_ERROR:
3242 if (optlen < sizeof(INT))
3243 {
3244 if (lpErrno) *lpErrno = WSAEFAULT;
3245 return SOCKET_ERROR;
3246 }
3247
3249 optval,
3250 sizeof(INT));
3251 return NO_ERROR;
3252
3253 case SO_SNDTIMEO:
3254 if (optlen < sizeof(DWORD))
3255 {
3256 if (lpErrno) *lpErrno = WSAEFAULT;
3257 return SOCKET_ERROR;
3258 }
3259
3261 optval,
3262 sizeof(DWORD));
3263 return NO_ERROR;
3264
3265 case SO_RCVTIMEO:
3266 if (optlen < sizeof(DWORD))
3267 {
3268 if (lpErrno) *lpErrno = WSAEFAULT;
3269 return SOCKET_ERROR;
3270 }
3271
3273 optval,
3274 sizeof(DWORD));
3275 return NO_ERROR;
3276
3277 case SO_KEEPALIVE:
3278 case SO_DONTROUTE:
3279 /* These go directly to the helper dll */
3280 goto SendToHelper;
3281
3282 default:
3283 /* Obviously this is a hack */
3284 ERR("MSAFD: Set unknown optname %x\n", optname);
3285 return NO_ERROR;
3286 }
3287 }
3288
3289SendToHelper:
3290 Errno = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext,
3291 s,
3292 Socket->TdiAddressHandle,
3293 Socket->TdiConnectionHandle,
3294 level,
3295 optname,
3296 (PCHAR)optval,
3297 optlen);
3298 if (lpErrno) *lpErrno = Errno;
3299 return (Errno == NO_ERROR) ? NO_ERROR : SOCKET_ERROR;
3300}
static INT NTAPI MsafdUpdateConnectionContext(_In_ SOCKET Handle, _Out_ LPINT lpErrno)
Definition: dllmain.c:2991
GLint level
Definition: gl.h:1546
#define AFD_INFO_SEND_WINDOW_SIZE
Definition: shared.h:192
#define AFD_INFO_RECEIVE_WINDOW_SIZE
Definition: shared.h:191
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 3441 of file dllmain.c.

3447{
3448 int numdots = 0;
3449 USHORT port;
3450 LONG inetaddr = 0, ip_part;
3451 LPWSTR *bp = NULL;
3453
3454 if (!lpAddressLength || !lpAddress || !AddressString)
3455 {
3456 if (lpErrno) *lpErrno = WSAEINVAL;
3457 return SOCKET_ERROR;
3458 }
3459
3460 sockaddr = (SOCKADDR_IN *)lpAddress;
3461
3462 /* Set right address family */
3463 if (lpProtocolInfo != NULL)
3464 {
3465 sockaddr->sin_family = lpProtocolInfo->iAddressFamily;
3466 }
3467 else
3468 {
3469 sockaddr->sin_family = AddressFamily;
3470 }
3471
3472 /* Report size */
3473 if (AddressFamily == AF_INET)
3474 {
3475 if (*lpAddressLength < (INT)sizeof(SOCKADDR_IN))
3476 {
3477 if (lpErrno) *lpErrno = WSAEFAULT;
3478 }
3479 else
3480 {
3481 // translate ip string to ip
3482
3483 /* Get ip number */
3484 bp = &AddressString;
3485 inetaddr = 0;
3486
3487 while (*bp < &AddressString[wcslen(AddressString)])
3488 {
3489 ip_part = wcstol(*bp, bp, 10);
3490 /* ip part number should be in range 0-255 */
3491 if (ip_part < 0 || ip_part > 255)
3492 {
3493 if (lpErrno) *lpErrno = WSAEINVAL;
3494 return SOCKET_ERROR;
3495 }
3496 inetaddr = (inetaddr << 8) + ip_part;
3497 /* we end on string end or port separator */
3498 if ((*bp)[0] == 0 || (*bp)[0] == L':')
3499 break;
3500 /* ip parts are dot separated. verify it */
3501 if ((*bp)[0] != L'.')
3502 {
3503 if (lpErrno) *lpErrno = WSAEINVAL;
3504 return SOCKET_ERROR;
3505 }
3506 /* count the dots */
3507 numdots++;
3508 /* move over the dot to next ip part */
3509 (*bp)++;
3510 }
3511
3512 /* check dots count */
3513 if (numdots != 3)
3514 {
3515 if (lpErrno) *lpErrno = WSAEINVAL;
3516 return SOCKET_ERROR;
3517 }
3518
3519 /* Get port number */
3520 if ((*bp)[0] == L':')
3521 {
3522 /* move over the column to port part */
3523 (*bp)++;
3524 /* next char should be numeric */
3525 if ((*bp)[0] < L'0' || (*bp)[0] > L'9')
3526 {
3527 if (lpErrno) *lpErrno = WSAEINVAL;
3528 return SOCKET_ERROR;
3529 }
3530 port = wcstol(*bp, bp, 10);
3531 }
3532 else
3533 {
3534 port = 0;
3535 }
3536
3537 if (lpErrno) *lpErrno = NO_ERROR;
3538 /* rest sockaddr.sin_addr.s_addr
3539 for we need to be sure it is zero when we come to while */
3540 *lpAddressLength = sizeof(*sockaddr);
3541 memset(lpAddress, 0, sizeof(*sockaddr));
3542 sockaddr->sin_family = AF_INET;
3543 sockaddr->sin_addr.s_addr = inetaddr;
3544 sockaddr->sin_port = port;
3545 }
3546 }
3547
3548 if (lpErrno && !*lpErrno)
3549 {
3550 return 0;
3551 }
3552
3553 return SOCKET_ERROR;
3554}
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2747
USHORT port
Definition: uri.c:228
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
struct sockaddr_in SOCKADDR_IN
Definition: winsock.h:481
WCHAR * LPWSTR
Definition: xmlstorage.h:184

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().