ReactOS 0.4.15-dev-7968-g24a56f8
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  _SOCK_SHARED_INFO
 
struct  _SOCKET_INFORMATION
 
struct  _SOCKET_CONTEXT
 
struct  _ASYNC_DATA
 
struct  _AFDAPCCONTEXT
 

Macros

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

Typedefs

typedef enum _SOCKET_STATE SOCKET_STATE
 
typedef enum _SOCKET_STATEPSOCKET_STATE
 
typedef struct _SOCK_SHARED_INFO SOCK_SHARED_INFO
 
typedef struct _SOCK_SHARED_INFOPSOCK_SHARED_INFO
 
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 _AFDAPCCONTEXT AFDAPCCONTEXT
 
typedef struct _AFDAPCCONTEXTPAFDAPCCONTEXT
 
typedef VOID(* PASYNC_COMPLETION_ROUTINE) (PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
 

Enumerations

enum  _SOCKET_STATE {
  SocketOpen , SocketBound , SocketBoundUdp , SocketConnected ,
  SocketClosed , SocketStateCreated , SocketStateBound , SocketStateListening ,
  SocketStateConnected , SocketUndefined = -1 , SocketOpen , SocketBound ,
  SocketBoundUdp , SocketConnected , SocketClosed
}
 

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 (NTSTATUS Status, LPINT Errno, DWORD Received, LPDWORD ReturnedBytes)
 

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

◆ AFDAPCCONTEXT

◆ ASYNC_DATA

◆ PAFDAPCCONTEXT

◆ PASYNC_COMPLETION_ROUTINE

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

Definition at line 542 of file msafd.h.

◆ PASYNC_DATA

◆ PSOCK_SHARED_INFO

◆ PSOCKET_CONTEXT

◆ PSOCKET_INFORMATION

◆ PSOCKET_STATE

◆ SOCK_SHARED_INFO

◆ SOCKET_CONTEXT

◆ SOCKET_INFORMATION

◆ SOCKET_STATE

Enumeration Type Documentation

◆ _SOCKET_STATE

Enumerator
SocketOpen 
SocketBound 
SocketBoundUdp 
SocketConnected 
SocketClosed 
SocketStateCreated 
SocketStateBound 
SocketStateListening 
SocketStateConnected 
SocketUndefined 
SocketOpen 
SocketBound 
SocketBoundUdp 
SocketConnected 
SocketClosed 

Definition at line 45 of file msafd.h.

45 {
enum _SOCKET_STATE SOCKET_STATE
enum _SOCKET_STATE * PSOCKET_STATE
@ SocketBound
Definition: msafd.h:47
@ SocketConnected
Definition: msafd.h:49
@ SocketClosed
Definition: msafd.h:50
@ SocketBoundUdp
Definition: msafd.h:48
@ SocketOpen
Definition: msafd.h:46

Function Documentation

◆ CreateContext()

int CreateContext ( PSOCKET_INFORMATION  Socket)

Definition at line 3543 of file dllmain.c.

3544{
3545 IO_STATUS_BLOCK IOSB;
3546 SOCKET_CONTEXT ContextData;
3549
3552 NULL,
3554 FALSE);
3555
3556 if( !NT_SUCCESS(Status) )
3557 return SOCKET_ERROR;
3558
3559 /* Create Context */
3560 ContextData.SharedData = *Socket->SharedData;
3561 ContextData.SizeOfHelperData = 0;
3562 RtlCopyMemory (&ContextData.LocalAddress,
3563 Socket->LocalAddress,
3565 RtlCopyMemory (&ContextData.RemoteAddress,
3566 Socket->RemoteAddress,
3568
3569 /* Send IOCTL */
3571 SockEvent,
3572 NULL,
3573 NULL,
3574 &IOSB,
3576 &ContextData,
3577 sizeof(ContextData),
3578 NULL,
3579 0);
3580
3581 /* Wait for Completion */
3582 if (Status == STATUS_PENDING)
3583 {
3585 Status = IOSB.Status;
3586 }
3587
3588 NtClose( SockEvent );
3589
3591}
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:32
HANDLE SockEvent
#define INFINITE
Definition: serial.h:102
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 STATUS_PENDING
Definition: ntstatus.h:82
#define IOCTL_AFD_SET_CONTEXT
Definition: shared.h:301
#define STATUS_SUCCESS
Definition: shellext.h:65
SOCK_SHARED_INFO SharedData
Definition: msafd.h:121
SOCKADDR RemoteAddress
Definition: msafd.h:125
SOCKADDR LocalAddress
Definition: msafd.h:124
ULONG SizeOfHelperData
Definition: msafd.h:122
PSOCKADDR LocalAddress
Definition: msafd.h:105
PSOCK_SHARED_INFO SharedData
Definition: msafd.h:100
PSOCKADDR RemoteAddress
Definition: msafd.h:106
SOCKET Handle
Definition: msafd.h:99
INT SizeOfLocalAddress
Definition: msafd.h:59
INT SizeOfRemoteAddress
Definition: msafd.h:60
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define SOCKET_ERROR
Definition: winsock.h:333

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

3277{
3278 PIO_STATUS_BLOCK IOSB;
3279 IO_STATUS_BLOCK DummyIOSB;
3280 AFD_INFO InfoData;
3282 PAFDAPCCONTEXT APCContext;
3283 PIO_APC_ROUTINE APCFunction;
3284 HANDLE Event = NULL;
3286
3289 NULL,
3291 FALSE);
3292
3293 if( !NT_SUCCESS(Status) )
3294 return SOCKET_ERROR;
3295
3296 /* Set Info Class */
3297 InfoData.InformationClass = AfdInformationClass;
3298
3299 /* Verify if we should use APC */
3300 if (Overlapped == NULL)
3301 {
3302 /* Not using Overlapped structure, so use normal blocking on event */
3303 APCContext = NULL;
3304 APCFunction = NULL;
3305 Event = SockEvent;
3306 IOSB = &DummyIOSB;
3307 }
3308 else
3309 {
3310 /* Overlapped request for non overlapped opened socket */
3311 if ((Socket->SharedData->CreateFlags & SO_SYNCHRONOUS_NONALERT) != 0)
3312 {
3313 TRACE("Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
3314 NtClose( SockEvent );
3315 return 0;
3316 }
3317 if (CompletionRoutine == NULL)
3318 {
3319 /* Using Overlapped Structure, but no Completition Routine, so no need for APC */
3320 APCContext = (PAFDAPCCONTEXT)Overlapped;
3321 APCFunction = NULL;
3322 Event = Overlapped->hEvent;
3323 }
3324 else
3325 {
3326 /* Using Overlapped Structure and a Completition Routine, so use an APC */
3327 APCFunction = &AfdInfoAPC; // should be a private io completition function inside us
3328 APCContext = HeapAlloc(GlobalHeap, 0, sizeof(AFDAPCCONTEXT));
3329 if (!APCContext)
3330 {
3331 ERR("Not enough memory for APC Context\n");
3332 NtClose( SockEvent );
3333 return WSAEFAULT;
3334 }
3336 APCContext->lpOverlapped = Overlapped;
3337 APCContext->lpSocket = Socket;
3338 }
3339
3340 IOSB = (PIO_STATUS_BLOCK)&Overlapped->Internal;
3341 }
3342
3343 IOSB->Status = STATUS_PENDING;
3344
3345 /* Send IOCTL */
3347 Event,
3348 APCFunction,
3349 APCContext,
3350 IOSB,
3352 &InfoData,
3353 sizeof(InfoData),
3354 &InfoData,
3355 sizeof(InfoData));
3356
3357 /* Wait for return */
3358 if (Status == STATUS_PENDING && Overlapped == NULL)
3359 {
3361 Status = IOSB->Status;
3362 }
3363
3364 NtClose( SockEvent );
3365
3366 TRACE("Status %x Information %d\n", Status, IOSB->Information);
3367
3368 if (Status == STATUS_PENDING)
3369 {
3370 TRACE("Leaving (Pending)\n");
3371 return WSA_IO_PENDING;
3372 }
3373
3374 if (Status != STATUS_SUCCESS)
3375 return SOCKET_ERROR;
3376
3377 /* Return Information */
3378 if (Ulong != NULL)
3379 {
3380 *Ulong = InfoData.Information.Ulong;
3381 }
3382 if (LargeInteger != NULL)
3383 {
3384 *LargeInteger = InfoData.Information.LargeInteger;
3385 }
3386 if (Boolean != NULL)
3387 {
3388 *Boolean = InfoData.Information.Boolean;
3389 }
3390
3391 return NO_ERROR;
3392
3393}
#define ERR(fmt,...)
Definition: debug.h:110
#define HeapAlloc
Definition: compat.h:733
HANDLE GlobalHeap
Definition: dllmain.c:19
VOID NTAPI AfdInfoAPC(PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved)
Definition: dllmain.c:3259
struct _AFDAPCCONTEXT * PAFDAPCCONTEXT
#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:877
#define IOCTL_AFD_GET_INFO
Definition: shared.h:327
#define TRACE(s)
Definition: solgame.cpp:4
PSOCKET_INFORMATION lpSocket
Definition: msafd.h:140
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
Definition: msafd.h:139
LPWSAOVERLAPPED lpOverlapped
Definition: msafd.h:138
union _AFD_INFO::@3387 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
DWORD CreateFlags
Definition: msafd.h:81
unsigned long Ulong
Definition: utypes.h:42
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE CompletionRoutine
Definition: wdfrequest.h:895
#define WSAEFAULT
Definition: winerror.h:1945
#define WSA_IO_PENDING
Definition: winsock2.h:616

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

◆ GetSocketStructure()

PSOCKET_INFORMATION GetSocketStructure ( SOCKET  Handle)

Definition at line 3520 of file dllmain.c.

3521{
3522 PSOCKET_INFORMATION CurrentSocket;
3523
3525
3526 CurrentSocket = SocketListHead;
3527 while (CurrentSocket)
3528 {
3529 if (CurrentSocket->Handle == Handle)
3530 {
3532 return CurrentSocket;
3533 }
3534
3535 CurrentSocket = CurrentSocket->NextSocket;
3536 }
3537
3539
3540 return NULL;
3541}
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:116
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)

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

◆ MsafdReturnWithErrno()

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

Definition at line 546 of file msafd.h.

550{
551 if (Errno)
552 {
554
555 if (ReturnedBytes)
556 *ReturnedBytes = (*Errno == 0) ? Received : 0;
557
558 return (*Errno == 0) ? 0 : SOCKET_ERROR;
559 }
560 else
561 {
562 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__);
563
564 if (ReturnedBytes)
565 *ReturnedBytes = (Status == STATUS_SUCCESS) ? Received : 0;
566
567 return (Status == STATUS_SUCCESS) ? 0 : SOCKET_ERROR;
568 }
569}
UINT Received
Definition: arping.c:40
INT TranslateNtStatusError(NTSTATUS Status)
Definition: dllmain.c:537
#define __FUNCTION__
Definition: types.h:116
#define DbgPrint
Definition: hal.h:12

Referenced by WSPAccept(), WSPAsyncSelect(), WSPBind(), WSPCloseSocket(), WSPConnect(), WSPDuplicateSocket(), WSPEnumNetworkEvents(), WSPEventSelect(), WSPGetPeerName(), WSPGetSockName(), WSPListen(), WSPRecv(), WSPRecvFrom(), 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 3397 of file dllmain.c.

3404{
3405 PIO_STATUS_BLOCK IOSB;
3406 IO_STATUS_BLOCK DummyIOSB;
3407 AFD_INFO InfoData;
3409 PAFDAPCCONTEXT APCContext;
3410 PIO_APC_ROUTINE APCFunction;
3411 HANDLE Event = NULL;
3413
3416 NULL,
3418 FALSE);
3419
3420 if( !NT_SUCCESS(Status) )
3421 return SOCKET_ERROR;
3422
3423 /* Set Info Class */
3424 InfoData.InformationClass = AfdInformationClass;
3425
3426 /* Set Information */
3427 if (Ulong != NULL)
3428 {
3429 InfoData.Information.Ulong = *Ulong;
3430 }
3431 if (LargeInteger != NULL)
3432 {
3433 InfoData.Information.LargeInteger = *LargeInteger;
3434 }
3435 if (Boolean != NULL)
3436 {
3437 InfoData.Information.Boolean = *Boolean;
3438 }
3439
3440 /* Verify if we should use APC */
3441 if (Overlapped == NULL)
3442 {
3443 /* Not using Overlapped structure, so use normal blocking on event */
3444 APCContext = NULL;
3445 APCFunction = NULL;
3446 Event = SockEvent;
3447 IOSB = &DummyIOSB;
3448 }
3449 else
3450 {
3451 /* Overlapped request for non overlapped opened socket */
3452 if ((Socket->SharedData->CreateFlags & SO_SYNCHRONOUS_NONALERT) != 0)
3453 {
3454 TRACE("Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
3455 NtClose( SockEvent );
3456 return 0;
3457 }
3458 if (CompletionRoutine == NULL)
3459 {
3460 /* Using Overlapped Structure, but no Completition Routine, so no need for APC */
3461 APCContext = (PAFDAPCCONTEXT)Overlapped;
3462 APCFunction = NULL;
3463 Event = Overlapped->hEvent;
3464 }
3465 else
3466 {
3467 /* Using Overlapped Structure and a Completition Routine, so use an APC */
3468 APCFunction = &AfdInfoAPC; // should be a private io completition function inside us
3469 APCContext = HeapAlloc(GlobalHeap, 0, sizeof(AFDAPCCONTEXT));
3470 if (!APCContext)
3471 {
3472 ERR("Not enough memory for APC Context\n");
3473 NtClose( SockEvent );
3474 return WSAEFAULT;
3475 }
3477 APCContext->lpOverlapped = Overlapped;
3478 APCContext->lpSocket = Socket;
3479 }
3480
3481 IOSB = (PIO_STATUS_BLOCK)&Overlapped->Internal;
3482 }
3483
3484 IOSB->Status = STATUS_PENDING;
3485
3486 /* Send IOCTL */
3488 Event,
3489 APCFunction,
3490 APCContext,
3491 IOSB,
3493 &InfoData,
3494 sizeof(InfoData),
3495 NULL,
3496 0);
3497
3498 /* Wait for return */
3499 if (Status == STATUS_PENDING && Overlapped == NULL)
3500 {
3502 Status = IOSB->Status;
3503 }
3504
3505 NtClose( SockEvent );
3506
3507 TRACE("Status %x Information %d\n", Status, IOSB->Information);
3508
3509 if (Status == STATUS_PENDING)
3510 {
3511 TRACE("Leaving (Pending)\n");
3512 return WSA_IO_PENDING;
3513 }
3514
3516
3517}
#define IOCTL_AFD_SET_INFO
Definition: shared.h:295

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

◆ SockAsyncSelectCompletionRoutine()

VOID SockAsyncSelectCompletionRoutine ( PVOID  Context,
PIO_STATUS_BLOCK  IoStatusBlock 
)

Definition at line 3750 of file dllmain.c.

3751{
3752
3753 PASYNC_DATA AsyncData = Context;
3754 PSOCKET_INFORMATION Socket;
3755 ULONG x;
3756
3757 /* Get the Socket */
3758 Socket = AsyncData->ParentSocket;
3759
3760 /* Check if the Sequence Number Changed behind our back */
3761 if (AsyncData->SequenceNumber != Socket->SharedData->SequenceNumber )
3762 {
3763 return;
3764 }
3765
3766 /* Check we were manually called b/c of a failure */
3768 {
3769 /* FIXME: Perform Upcall */
3770 return;
3771 }
3772
3773 for (x = 1; x; x<<=1)
3774 {
3775 switch (AsyncData->AsyncSelectInfo.Handles[0].Events & x)
3776 {
3777 case AFD_EVENT_RECEIVE:
3778 if (0 != (Socket->SharedData->AsyncEvents & FD_READ) &&
3779 0 == (Socket->SharedData->AsyncDisabledEvents & FD_READ))
3780 {
3781 /* Make the Notification */
3783 Socket->SharedData->wMsg,
3784 Socket->Handle,
3786 /* Disable this event until the next read(); */
3788 }
3789 break;
3790
3792 if (0 != (Socket->SharedData->AsyncEvents & FD_OOB) &&
3793 0 == (Socket->SharedData->AsyncDisabledEvents & FD_OOB))
3794 {
3795 /* Make the Notification */
3797 Socket->SharedData->wMsg,
3798 Socket->Handle,
3800 /* Disable this event until the next read(); */
3802 }
3803 break;
3804
3805 case AFD_EVENT_SEND:
3806 if (0 != (Socket->SharedData->AsyncEvents & FD_WRITE) &&
3807 0 == (Socket->SharedData->AsyncDisabledEvents & FD_WRITE))
3808 {
3809 /* Make the Notification */
3811 Socket->SharedData->wMsg,
3812 Socket->Handle,
3814 /* Disable this event until the next write(); */
3816 }
3817 break;
3818
3819 /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
3820 case AFD_EVENT_CONNECT:
3822 if (0 != (Socket->SharedData->AsyncEvents & FD_CONNECT) &&
3823 0 == (Socket->SharedData->AsyncDisabledEvents & FD_CONNECT))
3824 {
3825 /* Make the Notification */
3827 Socket->SharedData->wMsg,
3828 Socket->Handle,
3830 /* Disable this event forever; */
3832 }
3833 break;
3834
3835 case AFD_EVENT_ACCEPT:
3836 if (0 != (Socket->SharedData->AsyncEvents & FD_ACCEPT) &&
3837 0 == (Socket->SharedData->AsyncDisabledEvents & FD_ACCEPT))
3838 {
3839 /* Make the Notification */
3841 Socket->SharedData->wMsg,
3842 Socket->Handle,
3844 /* Disable this event until the next accept(); */
3846 }
3847 break;
3848
3850 case AFD_EVENT_ABORT:
3851 case AFD_EVENT_CLOSE:
3852 if (0 != (Socket->SharedData->AsyncEvents & FD_CLOSE) &&
3853 0 == (Socket->SharedData->AsyncDisabledEvents & FD_CLOSE))
3854 {
3855 /* Make the Notification */
3857 Socket->SharedData->wMsg,
3858 Socket->Handle,
3860 /* Disable this event forever; */
3862 }
3863 break;
3864 /* FIXME: Support QOS */
3865 }
3866 }
3867
3868 /* Check if there are any events left for us to check */
3869 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 )
3870 {
3871 return;
3872 }
3873
3874 /* Keep Polling */
3875 SockProcessAsyncSelect(Socket, AsyncData);
3876 return;
3877}
VOID SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, PASYNC_DATA AsyncData)
Definition: dllmain.c:3879
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:210
#define AFD_EVENT_SEND
Definition: shared.h:205
#define AFD_EVENT_OOB_RECEIVE
Definition: shared.h:204
#define AFD_EVENT_CONNECT_FAIL
Definition: shared.h:211
#define AFD_EVENT_RECEIVE
Definition: shared.h:203
#define AFD_EVENT_DISCONNECT
Definition: shared.h:206
#define AFD_EVENT_ABORT
Definition: shared.h:207
#define AFD_EVENT_CLOSE
Definition: shared.h:208
#define AFD_EVENT_CONNECT
Definition: shared.h:209
ULONG Events
Definition: shared.h:51
AFD_HANDLE Handles[1]
Definition: shared.h:59
AFD_POLL_INFO AsyncSelectInfo
Definition: msafd.h:133
DWORD SequenceNumber
Definition: msafd.h:131
PSOCKET_INFORMATION ParentSocket
Definition: msafd.h:130
LONG AsyncDisabledEvents
Definition: msafd.h:93
LONG AsyncEvents
Definition: msafd.h:92
DWORD SequenceNumber
Definition: msafd.h:90
LPWPUPOSTMESSAGE lpWPUPostMessage
Definition: ws2spi.h:609
uint32_t ULONG
Definition: typedefs.h:59
#define FD_READ
Definition: winsock.h:405
#define FD_WRITE
Definition: winsock.h:406
#define FD_CLOSE
Definition: winsock.h:410
#define FD_CONNECT
Definition: winsock.h:409
#define WSAMAKESELECTREPLY(e, error)
Definition: winsock.h:478
#define FD_OOB
Definition: winsock.h:407
#define FD_ACCEPT
Definition: winsock.h:408

Referenced by SockGetAsyncSelectHelperAfdHandle(), and SockProcessAsyncSelect().

◆ SockAsyncThread()

ULONG NTAPI SockAsyncThread ( PVOID  ThreadParam)

Definition at line 3654 of file dllmain.c.

3655{
3656 PVOID AsyncContext;
3657 PASYNC_COMPLETION_ROUTINE AsyncCompletionRoutine;
3658 IO_STATUS_BLOCK IOSB;
3660
3661 /* Make the Thread Higher Priority */
3663
3664 /* Do a KQUEUE/WorkItem Style Loop, thanks to IoCompletion Ports */
3665 do
3666 {
3668 (PVOID*)&AsyncCompletionRoutine,
3669 &AsyncContext,
3670 &IOSB,
3671 NULL);
3672 /* Call the Async Function */
3673 if (NT_SUCCESS(Status))
3674 {
3675 (*AsyncCompletionRoutine)(AsyncContext, &IOSB);
3676 }
3677 else
3678 {
3679 /* It Failed, sleep for a second */
3680 Sleep(1000);
3681 }
3682 } while ((Status != STATUS_TIMEOUT));
3683
3684 /* The Thread has Ended */
3685 return 0;
3686}
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:542
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
#define STATUS_TIMEOUT
Definition: ntstatus.h:81
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148
#define THREAD_PRIORITY_ABOVE_NORMAL
Definition: winbase.h:275

◆ SockCreateOrReferenceAsyncThread()

BOOLEAN SockCreateOrReferenceAsyncThread ( VOID  )

Definition at line 3593 of file dllmain.c.

3594{
3595 HANDLE hAsyncThread;
3596 DWORD AsyncThreadId;
3597 HANDLE AsyncEvent;
3600
3601 /* Check if the Thread Already Exists */
3603 {
3605 return TRUE;
3606 }
3607
3608 /* Create the Completion Port */
3610 {
3613 NULL,
3614 2); // Allow 2 threads only
3615 if (!NT_SUCCESS(Status))
3616 {
3617 ERR("Failed to create completion port: 0x%08x\n", Status);
3618 return FALSE;
3619 }
3620 /* Protect Handle */
3621 HandleFlags.ProtectFromClose = TRUE;
3622 HandleFlags.Inherit = FALSE;
3624 ObjectHandleFlagInformation,
3625 &HandleFlags,
3626 sizeof(HandleFlags));
3627 }
3628
3629 /* Create the Async Event */
3630 Status = NtCreateEvent(&AsyncEvent,
3632 NULL,
3634 FALSE);
3635
3636 /* Create the Async Thread */
3637 hAsyncThread = CreateThread(NULL,
3638 0,
3640 NULL,
3641 0,
3642 &AsyncThreadId);
3643
3644 /* Close the Handle */
3645 NtClose(hAsyncThread);
3646
3647 /* Increase the Reference Count */
3649 return TRUE;
3650}
#define TRUE
Definition: types.h:120
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:3654
ULONG SockAsyncThreadRefCount
Definition: dllmain.c:26
unsigned long DWORD
Definition: ntddk_ex.h:95
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 3688 of file dllmain.c.

3689{
3690 UNICODE_STRING AfdHelper;
3692 IO_STATUS_BLOCK IoSb;
3693 FILE_COMPLETION_INFORMATION CompletionInfo;
3695
3696 /* First, make sure we're not already initialized */
3698 {
3699 return TRUE;
3700 }
3701
3702 /* Set up Handle Name and Object */
3703 RtlInitUnicodeString(&AfdHelper, L"\\Device\\Afd\\AsyncSelectHlp" );
3705 &AfdHelper,
3707 NULL,
3708 NULL);
3709
3710 /* Open the Handle to AFD */
3714 &IoSb,
3715 NULL,
3716 0,
3719 0,
3720 NULL,
3721 0);
3722
3723 /*
3724 * Now Set up the Completion Port Information
3725 * This means that whenever a Poll is finished, the routine will be executed
3726 */
3727 CompletionInfo.Port = SockAsyncCompletionPort;
3728 CompletionInfo.Key = SockAsyncSelectCompletionRoutine;
3730 &IoSb,
3731 &CompletionInfo,
3732 sizeof(CompletionInfo),
3734
3735
3736 /* Protect the Handle */
3737 HandleFlags.ProtectFromClose = TRUE;
3738 HandleFlags.Inherit = FALSE;
3740 ObjectHandleFlagInformation,
3741 &HandleFlags,
3742 sizeof(HandleFlags));
3743
3744
3745 /* Set this variable to true so that Send/Recv/Accept will know wether to renable disabled events */
3747 return TRUE;
3748}
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:3750
HANDLE SockAsyncHelperAfdHandle
Definition: dllmain.c:27
BOOLEAN SockAsyncSelectCalled
Definition: dllmain.c:29
@ 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
#define L(x)
Definition: ntvdm.h:50

Referenced by WSPAsyncSelect().

◆ SockProcessAsyncSelect()

VOID SockProcessAsyncSelect ( PSOCKET_INFORMATION  Socket,
PASYNC_DATA  AsyncData 
)

Definition at line 3879 of file dllmain.c.

3880{
3881
3882 ULONG lNetworkEvents;
3884
3885 /* Set up the Async Data Event Info */
3886 AsyncData->AsyncSelectInfo.Timeout.HighPart = 0x7FFFFFFF;
3887 AsyncData->AsyncSelectInfo.Timeout.LowPart = 0xFFFFFFFF;
3888 AsyncData->AsyncSelectInfo.HandleCount = 1;
3889 AsyncData->AsyncSelectInfo.Exclusive = TRUE;
3890 AsyncData->AsyncSelectInfo.Handles[0].Handle = Socket->Handle;
3891 AsyncData->AsyncSelectInfo.Handles[0].Events = 0;
3892
3893 /* Remove unwanted events */
3894 lNetworkEvents = Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents);
3895
3896 /* Set Events to wait for */
3897 if (lNetworkEvents & FD_READ)
3898 {
3900 }
3901
3902 if (lNetworkEvents & FD_WRITE)
3903 {
3905 }
3906
3907 if (lNetworkEvents & FD_OOB)
3908 {
3910 }
3911
3912 if (lNetworkEvents & FD_ACCEPT)
3913 {
3915 }
3916
3917 /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
3918 if (lNetworkEvents & FD_CONNECT)
3919 {
3921 }
3922
3923 if (lNetworkEvents & FD_CLOSE)
3924 {
3926 }
3927
3928 if (lNetworkEvents & FD_QOS)
3929 {
3931 }
3932
3933 if (lNetworkEvents & FD_GROUP_QOS)
3934 {
3936 }
3937
3938 /* Send IOCTL */
3940 NULL,
3941 NULL,
3942 AsyncData,
3943 &AsyncData->IoStatusBlock,
3945 &AsyncData->AsyncSelectInfo,
3946 sizeof(AsyncData->AsyncSelectInfo),
3947 &AsyncData->AsyncSelectInfo,
3948 sizeof(AsyncData->AsyncSelectInfo));
3949
3950 /* I/O Manager Won't call the completion routine, let's do it manually */
3951 if (NT_SUCCESS(Status))
3952 {
3953 return;
3954 }
3955 else
3956 {
3957 AsyncData->IoStatusBlock.Status = Status;
3958 SockAsyncSelectCompletionRoutine(AsyncData, &AsyncData->IoStatusBlock);
3959 }
3960}
#define IOCTL_AFD_SELECT
Definition: shared.h:285
#define AFD_EVENT_QOS
Definition: shared.h:212
#define AFD_EVENT_GROUP_QOS
Definition: shared.h:213
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:132
ULONG LowPart
Definition: typedefs.h:106
#define FD_QOS
Definition: winsock2.h:306
#define FD_GROUP_QOS
Definition: winsock2.h:308

◆ SockProcessQueuedAsyncSelect()

VOID SockProcessQueuedAsyncSelect ( PVOID  Context,
PIO_STATUS_BLOCK  IoStatusBlock 
)

Definition at line 3962 of file dllmain.c.

3963{
3964 PASYNC_DATA AsyncData = Context;
3965 BOOL FreeContext = TRUE;
3966 PSOCKET_INFORMATION Socket;
3967
3968 /* Get the Socket */
3969 Socket = AsyncData->ParentSocket;
3970
3971 /* If someone closed it, stop the function */
3972 if (Socket->SharedData->State != SocketClosed)
3973 {
3974 /* Check if the Sequence Number changed by now, in which case quit */
3975 if (AsyncData->SequenceNumber == Socket->SharedData->SequenceNumber)
3976 {
3977 /* Do the actual select, if needed */
3978 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)))
3979 {
3980 SockProcessAsyncSelect(Socket, AsyncData);
3981 FreeContext = FALSE;
3982 }
3983 }
3984 }
3985
3986 /* Free the Context */
3987 if (FreeContext)
3988 {
3989 HeapFree(GetProcessHeap(), 0, AsyncData);
3990 }
3991
3992 return;
3993}
#define GetProcessHeap()
Definition: compat.h:736
#define HeapFree(x, y, z)
Definition: compat.h:735
unsigned int BOOL
Definition: ntddk_ex.h:94
SOCKET_STATE State
Definition: msafd.h:54

◆ SockReenableAsyncSelectEvent()

VOID SockReenableAsyncSelectEvent ( IN PSOCKET_INFORMATION  Socket,
IN ULONG  Event 
)

Definition at line 3996 of file dllmain.c.

3998{
3999 PASYNC_DATA AsyncData;
4000
4001 /* Make sure the event is actually disabled */
4002 if (!(Socket->SharedData->AsyncDisabledEvents & Event))
4003 {
4004 return;
4005 }
4006
4007 /* Re-enable it */
4008 Socket->SharedData->AsyncDisabledEvents &= ~Event;
4009
4010 /* Return if no more events are being polled */
4011 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 )
4012 {
4013 return;
4014 }
4015
4016 /* Wait on new events */
4017 AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(ASYNC_DATA));
4018 if (!AsyncData) return;
4019
4020 /* Create the Asynch Thread if Needed */
4022
4023 /* Increase the sequence number to stop anything else */
4024 Socket->SharedData->SequenceNumber++;
4025
4026 /* Set up the Async Data */
4027 AsyncData->ParentSocket = Socket;
4028 AsyncData->SequenceNumber = Socket->SharedData->SequenceNumber;
4029
4030 /* Begin Async Select by using I/O Completion */
4033 AsyncData,
4034 0,
4035 0);
4036
4037 /* All done */
4038 return;
4039}
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
Definition: dllmain.c:3593
VOID SockProcessQueuedAsyncSelect(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: dllmain.c:3962
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_INVALID_ADDRESS
Definition: ntstatus.h:557
#define STATUS_NETWORK_UNREACHABLE
Definition: ntstatus.h:704
#define STATUS_CANT_WAIT
Definition: ntstatus.h:452
#define STATUS_ADDRESS_ALREADY_EXISTS
Definition: ntstatus.h:654
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:532
#define STATUS_HOST_UNREACHABLE
Definition: ntstatus.h:705
#define STATUS_REMOTE_DISCONNECT
Definition: ntstatus.h:552
#define STATUS_INVALID_CONNECTION
Definition: ntstatus.h:556
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define STATUS_ACCESS_VIOLATION
Definition: ntstatus.h:242
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239
#define STATUS_REMOTE_NOT_LISTENING
Definition: ntstatus.h:424
#define STATUS_LOCAL_DISCONNECT
Definition: ntstatus.h:551
#define STATUS_PROTOCOL_NOT_SUPPORTED
Definition: ntstatus.h:1177
#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_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
#define WSAEADDRNOTAVAIL
Definition: winerror.h:1962
#define WSAEOPNOTSUPP
Definition: winerror.h:1958
#define WSAEHOSTUNREACH
Definition: winerror.h:1978
#define WSAEWOULDBLOCK
Definition: winerror.h:1948
#define WSAEINVAL
Definition: winerror.h:1946
#define WSAECONNABORTED
Definition: winerror.h:1966
#define WSAENETDOWN
Definition: winerror.h:1963
#define WSAENOBUFS
Definition: winerror.h:1968
#define WSAETIMEDOUT
Definition: winerror.h:1973
#define WSAEMSGSIZE
Definition: winerror.h:1953
#define WSAECONNRESET
Definition: winerror.h:1967
#define WSAEACCES
Definition: winerror.h:1944
#define WSAESHUTDOWN
Definition: winerror.h:1971
#define WSAENETUNREACH
Definition: winerror.h:1964
#define WSAEAFNOSUPPORT
Definition: winerror.h:1960
#define WSAECONNREFUSED
Definition: winerror.h:1974
#define WSAENOTCONN
Definition: winerror.h:1970
#define WSAEADDRINUSE
Definition: winerror.h:1961
#define WSA_OPERATION_ABORTED
Definition: winsock2.h:621

Referenced by MsafdReturnWithErrno(), WSPAccept(), WSPBind(), WSPConnect(), WSPEnumNetworkEvents(), 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 1434 of file dllmain.c.

1441{
1442 IO_STATUS_BLOCK IOSB;
1443 PAFD_RECEIVED_ACCEPT_DATA ListenReceiveData;
1444 AFD_ACCEPT_DATA AcceptData;
1445 AFD_DEFER_ACCEPT_DATA DeferData;
1446 AFD_PENDING_ACCEPT_DATA PendingAcceptData;
1447 PSOCKET_INFORMATION Socket = NULL;
1449 struct fd_set ReadSet;
1450 struct timeval Timeout;
1451 PVOID PendingData = NULL;
1452 ULONG PendingDataLength = 0;
1453 PVOID CalleeDataBuffer;
1454 WSABUF CallerData, CalleeID, CallerID, CalleeData;
1456 GROUP GroupID = 0;
1457 ULONG CallBack;
1459 PSOCKET_INFORMATION AcceptSocketInfo;
1460 UCHAR ReceiveBuffer[0x1A];
1462
1463 /* Get the Socket Structure associate to this Socket*/
1464 Socket = GetSocketStructure(Handle);
1465 if (!Socket)
1466 {
1467 if (lpErrno) *lpErrno = WSAENOTSOCK;
1468 return SOCKET_ERROR;
1469 }
1470 if (!Socket->SharedData->Listening)
1471 {
1472 if (lpErrno) *lpErrno = WSAEINVAL;
1473 return SOCKET_ERROR;
1474 }
1475 if ((SocketAddress && !SocketAddressLength) ||
1476 (SocketAddressLength && !SocketAddress) ||
1477 (SocketAddressLength && *SocketAddressLength < sizeof(SOCKADDR)))
1478 {
1479 if (lpErrno) *lpErrno = WSAEFAULT;
1480 return INVALID_SOCKET;
1481 }
1482
1485 NULL,
1487 FALSE);
1488
1489 if( !NT_SUCCESS(Status) )
1490 {
1491 return SOCKET_ERROR;
1492 }
1493
1494 /* Dynamic Structure...ugh */
1495 ListenReceiveData = (PAFD_RECEIVED_ACCEPT_DATA)ReceiveBuffer;
1496
1497 /* If this is non-blocking, make sure there's something for us to accept */
1498 if (Socket->SharedData->NonBlocking)
1499 {
1500 FD_ZERO(&ReadSet);
1501 FD_SET(Socket->Handle, &ReadSet);
1502 Timeout.tv_sec=0;
1503 Timeout.tv_usec=0;
1504
1505 if (WSPSelect(0, &ReadSet, NULL, NULL, &Timeout, lpErrno) == SOCKET_ERROR)
1506 {
1508 return SOCKET_ERROR;
1509 }
1510
1511 if (ReadSet.fd_array[0] != Socket->Handle)
1512 {
1514 if (lpErrno) *lpErrno = WSAEWOULDBLOCK;
1515 return SOCKET_ERROR;
1516 }
1517 }
1518
1519 /* Send IOCTL */
1521 SockEvent,
1522 NULL,
1523 NULL,
1524 &IOSB,
1526 NULL,
1527 0,
1528 ListenReceiveData,
1529 0xA + sizeof(*ListenReceiveData));
1530
1531 /* Wait for return */
1532 if (Status == STATUS_PENDING)
1533 {
1535 Status = IOSB.Status;
1536 }
1537
1538 if (!NT_SUCCESS(Status))
1539 {
1540 NtClose( SockEvent );
1541 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1542 }
1543
1544 if (lpfnCondition != NULL)
1545 {
1546 if ((Socket->SharedData->ServiceFlags1 & XP1_CONNECT_DATA) != 0)
1547 {
1548 /* Find out how much data is pending */
1549 PendingAcceptData.SequenceNumber = ListenReceiveData->SequenceNumber;
1550 PendingAcceptData.ReturnSize = TRUE;
1551
1552 /* Send IOCTL */
1554 SockEvent,
1555 NULL,
1556 NULL,
1557 &IOSB,
1559 &PendingAcceptData,
1560 sizeof(PendingAcceptData),
1561 &PendingAcceptData,
1562 sizeof(PendingAcceptData));
1563
1564 /* Wait for return */
1565 if (Status == STATUS_PENDING)
1566 {
1568 Status = IOSB.Status;
1569 }
1570
1571 if (!NT_SUCCESS(Status))
1572 {
1573 NtClose( SockEvent );
1574 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1575 }
1576
1577 /* How much data to allocate */
1578 PendingDataLength = IOSB.Information;
1579
1580 if (PendingDataLength)
1581 {
1582 /* Allocate needed space */
1583 PendingData = HeapAlloc(GlobalHeap, 0, PendingDataLength);
1584 if (!PendingData)
1585 {
1587 }
1588
1589 /* We want the data now */
1590 PendingAcceptData.ReturnSize = FALSE;
1591
1592 /* Send IOCTL */
1594 SockEvent,
1595 NULL,
1596 NULL,
1597 &IOSB,
1599 &PendingAcceptData,
1600 sizeof(PendingAcceptData),
1601 PendingData,
1602 PendingDataLength);
1603
1604 /* Wait for return */
1605 if (Status == STATUS_PENDING)
1606 {
1608 Status = IOSB.Status;
1609 }
1610
1611 if (!NT_SUCCESS(Status))
1612 {
1613 NtClose( SockEvent );
1614 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1615 }
1616 }
1617 }
1618
1619 if ((Socket->SharedData->ServiceFlags1 & XP1_QOS_SUPPORTED) != 0)
1620 {
1621 /* I don't support this yet */
1622 }
1623
1624 /* Build Callee ID */
1625 CalleeID.buf = (PVOID)Socket->LocalAddress;
1626 CalleeID.len = Socket->SharedData->SizeOfLocalAddress;
1627
1629 if (!RemoteAddress)
1630 {
1632 }
1633
1634 /* Set up Address in SOCKADDR Format */
1636 &ListenReceiveData->Address.Address[0].AddressType,
1637 sizeof(*RemoteAddress));
1638
1639 /* Build Caller ID */
1640 CallerID.buf = (PVOID)RemoteAddress;
1641 CallerID.len = sizeof(*RemoteAddress);
1642
1643 /* Build Caller Data */
1644 CallerData.buf = PendingData;
1645 CallerData.len = PendingDataLength;
1646
1647 /* Check if socket supports Conditional Accept */
1648 if (Socket->SharedData->UseDelayedAcceptance != 0)
1649 {
1650 /* Allocate Buffer for Callee Data */
1651 CalleeDataBuffer = HeapAlloc(GlobalHeap, 0, 4096);
1652 if (!CalleeDataBuffer) {
1654 }
1655 CalleeData.buf = CalleeDataBuffer;
1656 CalleeData.len = 4096;
1657 }
1658 else
1659 {
1660 /* Nothing */
1661 CalleeData.buf = 0;
1662 CalleeData.len = 0;
1663 }
1664
1665 /* Call the Condition Function */
1666 CallBack = (lpfnCondition)(&CallerID,
1667 CallerData.buf == NULL ? NULL : &CallerData,
1668 NULL,
1669 NULL,
1670 &CalleeID,
1671 CalleeData.buf == NULL ? NULL : &CalleeData,
1672 &GroupID,
1673 dwCallbackData);
1674
1675 if (((CallBack == CF_ACCEPT) && GroupID) != 0)
1676 {
1677 /* TBD: Check for Validity */
1678 }
1679
1680 if (CallBack == CF_ACCEPT)
1681 {
1682 if ((Socket->SharedData->ServiceFlags1 & XP1_QOS_SUPPORTED) != 0)
1683 {
1684 /* I don't support this yet */
1685 }
1686 if (CalleeData.buf)
1687 {
1688 // SockSetConnectData Sockets(SocketID), IOCTL_AFD_SET_CONNECT_DATA, CalleeData.Buffer, CalleeData.BuffSize, 0
1689 }
1690 }
1691 else
1692 {
1693 /* Callback rejected. Build Defer Structure */
1694 DeferData.SequenceNumber = ListenReceiveData->SequenceNumber;
1695 DeferData.RejectConnection = (CallBack == CF_REJECT);
1696
1697 /* Send IOCTL */
1699 SockEvent,
1700 NULL,
1701 NULL,
1702 &IOSB,
1704 &DeferData,
1705 sizeof(DeferData),
1706 NULL,
1707 0);
1708
1709 /* Wait for return */
1710 if (Status == STATUS_PENDING)
1711 {
1713 Status = IOSB.Status;
1714 }
1715
1716 NtClose( SockEvent );
1717
1718 if (!NT_SUCCESS(Status))
1719 {
1720 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1721 }
1722
1723 if (CallBack == CF_REJECT )
1724 {
1725 if (lpErrno) *lpErrno = WSAECONNREFUSED;
1726 return SOCKET_ERROR;
1727 }
1728 else
1729 {
1730 if (lpErrno) *lpErrno = WSAECONNREFUSED;
1731 return SOCKET_ERROR;
1732 }
1733 }
1734 }
1735
1736 /* Create a new Socket */
1738 Socket->SharedData->SocketType,
1739 Socket->SharedData->Protocol,
1740 &Socket->ProtocolInfo,
1741 GroupID,
1742 Socket->SharedData->CreateFlags,
1743 lpErrno);
1745 return SOCKET_ERROR;
1746
1747 /* Set up the Accept Structure */
1748 AcceptData.ListenHandle = (HANDLE)AcceptSocket;
1749 AcceptData.SequenceNumber = ListenReceiveData->SequenceNumber;
1750
1751 /* Send IOCTL to Accept */
1753 SockEvent,
1754 NULL,
1755 NULL,
1756 &IOSB,
1758 &AcceptData,
1759 sizeof(AcceptData),
1760 NULL,
1761 0);
1762
1763 /* Wait for return */
1764 if (Status == STATUS_PENDING)
1765 {
1767 Status = IOSB.Status;
1768 }
1769
1771 if (!NT_SUCCESS(Status))
1772 {
1774 WSPCloseSocket( AcceptSocket, lpErrno );
1775 return MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
1776 }
1777
1778 AcceptSocketInfo = GetSocketStructure(AcceptSocket);
1779 if (!AcceptSocketInfo)
1780 {
1782 WSPCloseSocket( AcceptSocket, lpErrno );
1784 }
1785
1786 AcceptSocketInfo->SharedData->State = SocketConnected;
1787 AcceptSocketInfo->SharedData->ConnectTime = GetCurrentTimeInSeconds();
1788 AcceptSocketInfo->SharedData->NonBlocking = Socket->SharedData->NonBlocking;
1789
1790 /* Return Address in SOCKADDR FORMAT */
1791 if( SocketAddress )
1792 {
1793 RtlCopyMemory (SocketAddress,
1794 &ListenReceiveData->Address.Address[0].AddressType,
1795 sizeof(*RemoteAddress));
1796 if( SocketAddressLength )
1797 *SocketAddressLength = sizeof(*RemoteAddress);
1798 }
1799
1800 NtClose( SockEvent );
1801
1802 /* Re-enable Async Event */
1804
1805 TRACE("Socket %x\n", AcceptSocket);
1806
1808 {
1809 Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
1810 Socket->Handle,
1811 Socket->TdiAddressHandle,
1812 Socket->TdiConnectionHandle,
1814
1815 if (Status)
1816 {
1817 if (lpErrno) *lpErrno = Status;
1818 return SOCKET_ERROR;
1819 }
1820 }
1821
1822 if (lpErrno) *lpErrno = NO_ERROR;
1823
1824 /* Return Socket */
1825 return AcceptSocket;
1826}
DWORD GetCurrentTimeInSeconds(VOID)
Definition: dllmain.c:1417
PSOCKET_INFORMATION GetSocketStructure(SOCKET Handle)
Definition: dllmain.c:3520
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:1065
INT WSPAPI WSPCloseSocket(IN SOCKET Handle, OUT LPINT lpErrno)
Definition: dllmain.c:623
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:3996
FORCEINLINE DWORD MsafdReturnWithErrno(NTSTATUS Status, LPINT Errno, DWORD Received, LPDWORD ReturnedBytes)
Definition: msafd.h:546
static ULONG Timeout
Definition: ping.c:61
#define IOCTL_AFD_WAIT_FOR_LISTEN
Definition: shared.h:273
#define IOCTL_AFD_DEFER_ACCEPT
Definition: shared.h:331
struct _AFD_RECEIVED_ACCEPT_DATA * PAFD_RECEIVED_ACCEPT_DATA
#define IOCTL_AFD_ACCEPT
Definition: shared.h:275
#define IOCTL_AFD_GET_PENDING_CONNECT_DATA
Definition: shared.h:333
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:104
HANDLE TdiConnectionHandle
Definition: msafd.h:108
PHELPER_DATA HelperData
Definition: msafd.h:103
HANDLE TdiAddressHandle
Definition: msafd.h:107
DWORD HelperEvents
Definition: msafd.h:102
WSAPROTOCOL_INFOW ProtocolInfo
Definition: msafd.h:115
INT AddressFamily
Definition: msafd.h:56
BOOLEAN NonBlocking
Definition: msafd.h:74
INT SocketLastError
Definition: msafd.h:87
INT SocketType
Definition: msafd.h:57
BOOLEAN Listening
Definition: msafd.h:68
BOOLEAN UseDelayedAcceptance
Definition: msafd.h:78
DWORD ServiceFlags1
Definition: msafd.h:82
ULONG ConnectTime
Definition: msafd.h:66
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:66
void * PVOID
Definition: typedefs.h:50
PVOID HANDLE
Definition: typedefs.h:73
#define WSAENOTSOCK
Definition: winerror.h:1951
unsigned int GROUP
Definition: winsock2.h:640
#define CF_REJECT
Definition: winsock2.h:414
#define XP1_QOS_SUPPORTED
Definition: winsock2.h:449
#define CF_ACCEPT
Definition: winsock2.h:413
#define XP1_CONNECT_DATA
Definition: winsock2.h:443
#define FD_ZERO(set)
Definition: winsock.h:96
#define INVALID_SOCKET
Definition: winsock.h:332
UINT_PTR SOCKET
Definition: winsock.h:47
#define FD_SET(fd, set)
Definition: winsock.h:89
#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: stubs.c:6

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

3069{
3070 SIZE_T size;
3071 WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3072 WCHAR *p;
3073
3074 if (!lpsaAddress || !lpszAddressString || !lpdwAddressStringLength)
3075 {
3076 if (lpErrno) *lpErrno = WSAEFAULT;
3077 return SOCKET_ERROR;
3078 }
3079
3080 switch (lpsaAddress->sa_family)
3081 {
3082 case AF_INET:
3083 if (dwAddressLength < sizeof(SOCKADDR_IN))
3084 {
3085 if (lpErrno) *lpErrno = WSAEINVAL;
3086 return SOCKET_ERROR;
3087 }
3089 L"%u.%u.%u.%u:%u",
3090 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 24 & 0xff),
3091 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 16 & 0xff),
3092 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 8 & 0xff),
3093 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) & 0xff),
3094 ntohs(((SOCKADDR_IN *)lpsaAddress)->sin_port));
3095
3096 p = wcschr(buffer, L':');
3097 if (!((SOCKADDR_IN *)lpsaAddress)->sin_port)
3098 {
3099 *p = 0;
3100 }
3101 break;
3102 default:
3103 if (lpErrno) *lpErrno = WSAEINVAL;
3104 return SOCKET_ERROR;
3105 }
3106
3107 size = wcslen(buffer) + 1;
3108
3109 if (*lpdwAddressStringLength < size)
3110 {
3111 *lpdwAddressStringLength = size;
3112 if (lpErrno) *lpErrno = WSAEFAULT;
3113 return SOCKET_ERROR;
3114 }
3115
3116 *lpdwAddressStringLength = size;
3117 wcscpy(lpszAddressString, buffer);
3118 return 0;
3119}
#define wcschr
Definition: compat.h:17
#define swprintf
Definition: precomp.h:40
#define AF_INET
Definition: tcpip.h:117
GLsizeiptr size
Definition: glext.h:5919
GLuint buffer
Definition: glext.h:5915
GLfloat GLfloat p
Definition: glext.h:8902
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define ntohl(x)
Definition: module.h:205
#define ntohs(x)
Definition: module.h:210
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
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
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:3397
BOOLEAN SockGetAsyncSelectHelperAfdHandle(VOID)
Definition: dllmain.c:3688
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:183
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 3247 of file dllmain.c.

3249{
3250 TRACE("Leaving.\n");
3251
3252 if (lpErrno) *lpErrno = NO_ERROR;
3253
3254 return 0;
3255}

◆ WSPCloseSocket()

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

Definition at line 623 of file dllmain.c.

625{
627 PSOCKET_INFORMATION Socket = NULL, CurrentSocket;
630 AFD_DISCONNECT_INFO DisconnectInfo;
631 SOCKET_STATE OldState;
632 LONG LingerWait = -1;
633 DWORD References;
634
635 /* Get the Socket Structure associate to this Socket*/
636 Socket = GetSocketStructure(Handle);
637 if (!Socket)
638 {
639 if (lpErrno) *lpErrno = WSAENOTSOCK;
640 return SOCKET_ERROR;
641 }
642
643 /* Create the Wait Event */
646 NULL,
648 FALSE);
649
650 if(!NT_SUCCESS(Status))
651 {
652 ERR("NtCreateEvent failed: 0x%08x\n", Status);
653 return SOCKET_ERROR;
654 }
655
656 if (Socket->HelperEvents & WSH_NOTIFY_CLOSE)
657 {
658 Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
659 Socket->Handle,
660 Socket->TdiAddressHandle,
661 Socket->TdiConnectionHandle,
663
664 if (Status)
665 {
666 if (lpErrno) *lpErrno = Status;
667 ERR("WSHNotify failed. Error 0x%#x\n", Status);
669 return SOCKET_ERROR;
670 }
671 }
672
673 /* If a Close is already in Process, give up */
674 if (Socket->SharedData->State == SocketClosed)
675 {
676 WARN("Socket is closing.\n");
678 if (lpErrno) *lpErrno = WSAENOTSOCK;
679 return SOCKET_ERROR;
680 }
681
682 /* Decrement reference count on SharedData */
683 References = InterlockedDecrement(&Socket->SharedData->RefCount);
684 if (References)
685 goto ok;
686
687 /* Set the state to close */
688 OldState = Socket->SharedData->State;
689 Socket->SharedData->State = SocketClosed;
690
691 /* If SO_LINGER is ON and the Socket is connected, we need to disconnect */
692 /* FIXME: Should we do this on Datagram Sockets too? */
693 if ((OldState == SocketConnected) && (Socket->SharedData->LingerData.l_onoff))
694 {
695 ULONG SendsInProgress;
696 ULONG SleepWait;
697
698 /* We need to respect the timeout */
699 SleepWait = 100;
700 LingerWait = Socket->SharedData->LingerData.l_linger * 1000;
701
702 /* Loop until no more sends are pending, within the timeout */
703 while (LingerWait)
704 {
705 /* Find out how many Sends are in Progress */
706 if (GetSocketInformation(Socket,
708 NULL,
709 &SendsInProgress,
710 NULL,
711 NULL,
712 NULL))
713 {
714 /* Bail out if anything but NO_ERROR */
715 LingerWait = 0;
716 break;
717 }
718
719 /* Bail out if no more sends are pending */
720 if (!SendsInProgress)
721 {
722 LingerWait = -1;
723 break;
724 }
725
726 /*
727 * We have to execute a sleep, so it's kind of like
728 * a block. If the socket is Nonblock, we cannot
729 * go on since asynchronous operation is expected
730 * and we cannot offer it
731 */
732 if (Socket->SharedData->NonBlocking)
733 {
734 WARN("Would block!\n");
736 Socket->SharedData->State = OldState;
737 if (lpErrno) *lpErrno = WSAEWOULDBLOCK;
738 return SOCKET_ERROR;
739 }
740
741 /* Now we can sleep, and decrement the linger wait */
742 /*
743 * FIXME: It seems Windows does some funky acceleration
744 * since the waiting seems to be longer and longer. I
745 * don't think this improves performance so much, so we
746 * wait a fixed time instead.
747 */
748 Sleep(SleepWait);
749 LingerWait -= SleepWait;
750 }
751 }
752
753 if (OldState == SocketConnected)
754 {
755 if (LingerWait <= 0)
756 {
757 DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(0);
758 DisconnectInfo.DisconnectType = LingerWait < 0 ? AFD_DISCONNECT_SEND : AFD_DISCONNECT_ABORT;
759
760 if (((DisconnectInfo.DisconnectType & AFD_DISCONNECT_SEND) && (!Socket->SharedData->SendShutdown)) ||
761 ((DisconnectInfo.DisconnectType & AFD_DISCONNECT_ABORT) && (!Socket->SharedData->ReceiveShutdown)))
762 {
763 /* Send IOCTL */
765 SockEvent,
766 NULL,
767 NULL,
770 &DisconnectInfo,
771 sizeof(DisconnectInfo),
772 NULL,
773 0);
774
775 /* Wait for return */
776 if (Status == STATUS_PENDING)
777 {
780 }
781 }
782 }
783 }
784
785 /* Cleanup Time! */
786 Socket->HelperContext = NULL;
787 Socket->SharedData->AsyncDisabledEvents = -1;
788 NtClose(Socket->TdiAddressHandle);
789 Socket->TdiAddressHandle = NULL;
791 Socket->TdiConnectionHandle = NULL;
792ok:
794 if (SocketListHead == Socket)
795 {
797 }
798 else
799 {
800 CurrentSocket = SocketListHead;
801 while (CurrentSocket->NextSocket)
802 {
803 if (CurrentSocket->NextSocket == Socket)
804 {
805 CurrentSocket->NextSocket = CurrentSocket->NextSocket->NextSocket;
806 break;
807 }
808
809 CurrentSocket = CurrentSocket->NextSocket;
810 }
811 }
813
814 /* Close the handle */
817
819 {
820 /* It is a duplicated socket, so unmap the memory */
822 NtClose(Socket->SharedDataHandle);
823 Socket->SharedData = NULL;
824 }
825 if( !References && Socket->SharedData )
826 {
827 HeapFree(GlobalHeap, 0, Socket->SharedData);
828 }
829 HeapFree(GlobalHeap, 0, Socket);
830 return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
831}
#define InterlockedDecrement
Definition: armddk.h:52
#define ok(value,...)
Definition: atltest.h:57
#define WARN(fmt,...)
Definition: debug.h:112
#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:3270
NTSYSAPI LONGLONG WINAPI RtlConvertLongToLargeInteger(LONG)
Definition: largeint.c:31
long LONG
Definition: pedump.c:60
#define AFD_DISCONNECT_ABORT
Definition: shared.h:199
#define IOCTL_AFD_DISCONNECT
Definition: shared.h:287
#define AFD_INFO_SENDS_IN_PROGRESS
Definition: shared.h:184
#define AFD_DISCONNECT_SEND
Definition: shared.h:197
LARGE_INTEGER Timeout
Definition: shared.h:137
ULONG DisconnectType
Definition: shared.h:136
HANDLE SharedDataHandle
Definition: msafd.h:101
BOOLEAN SendShutdown
Definition: msafd.h:77
LONG RefCount
Definition: msafd.h:55
struct linger LingerData
Definition: msafd.h:61
BOOLEAN ReceiveShutdown
Definition: msafd.h:76
#define WSH_NOTIFY_CLOSE
Definition: wsahelp.h:17

◆ 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 
)

Definition at line 75 of file stubs.c.

83{
85
86 return FALSE;
87}

Referenced by WSPIoctl().

◆ WSPDisconnectEx()

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

Definition at line 91 of file stubs.c.

96{
98
99 return FALSE;
100}

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 }
469 if ( !(hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId)) )
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:79
#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:1227
#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:1304
#define CreateFileMapping
Definition: winbase.h:3750
#define FILE_MAP_ALL_ACCESS
Definition: winbase.h:156
#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:335
NTSTATUS EventStatus[AFD_MAX_EVENTS]
Definition: shared.h:132
#define FD_CONNECT_BIT
Definition: winsock2.h:301
#define FD_CLOSE_BIT
Definition: winsock2.h:303
#define FD_OOB_BIT
Definition: winsock2.h:297
#define FD_GROUP_QOS_BIT
Definition: winsock2.h:307
#define FD_ACCEPT_BIT
Definition: winsock2.h:299
#define FD_READ_BIT
Definition: winsock2.h:293
#define FD_QOS_BIT
Definition: winsock2.h:305
#define FD_WRITE_BIT
Definition: winsock2.h:295

◆ 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:329
LONG NetworkEvents
Definition: msafd.h:111
HANDLE EventObject
Definition: msafd.h:110

◆ 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 104 of file stubs.c.

113{
115}

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;
105 BOOL Ret;
106
107 TRACE("Called (%x)\n", Handle);
108
109 /* Get the Socket Structure associate to this Socket*/
110 Socket = GetSocketStructure(Handle);
111 if (!Socket)
112 {
113 if(lpErrno)
114 *lpErrno = WSAENOTSOCK;
115 return FALSE;
116 }
117 if (!lpOverlapped || !lpdwBytes || !lpdwFlags)
118 {
119 if (lpErrno)
120 *lpErrno = WSAEFAULT;
121 return FALSE;
122 }
123 Ret = GetOverlappedResult((HANDLE)Handle, lpOverlapped, lpdwBytes, fWait);
124
125 if (Ret)
126 {
127 *lpdwFlags = 0;
128
129 /* Re-enable Async Event */
133 }
134
135 return Ret;
136}
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

◆ WSPGetPeerName()

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

Definition at line 2258 of file dllmain.c.

2262{
2263 IO_STATUS_BLOCK IOSB;
2264 ULONG TdiAddressSize;
2265 PTRANSPORT_ADDRESS SocketAddress;
2266 PSOCKET_INFORMATION Socket = NULL;
2269
2270 /* Get the Socket Structure associate to this Socket*/
2271 Socket = GetSocketStructure(s);
2272 if (!Socket)
2273 {
2274 if (lpErrno) *lpErrno = WSAENOTSOCK;
2275 return SOCKET_ERROR;
2276 }
2277
2278 if (Socket->SharedData->State != SocketConnected)
2279 {
2280 if (lpErrno) *lpErrno = WSAENOTCONN;
2281 return SOCKET_ERROR;
2282 }
2283
2284 if (!Name || !NameLength)
2285 {
2286 if (lpErrno) *lpErrno = WSAEFAULT;
2287 return SOCKET_ERROR;
2288 }
2289
2292 NULL,
2294 FALSE);
2295
2296 if( !NT_SUCCESS(Status) )
2297 return SOCKET_ERROR;
2298
2299 /* Allocate a buffer for the address */
2300 TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + Socket->SharedData->SizeOfRemoteAddress;
2301 SocketAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
2302
2303 if ( SocketAddress == NULL )
2304 {
2305 NtClose( SockEvent );
2306 if (lpErrno) *lpErrno = WSAENOBUFS;
2307 return SOCKET_ERROR;
2308 }
2309
2310 /* Send IOCTL */
2312 SockEvent,
2313 NULL,
2314 NULL,
2315 &IOSB,
2317 NULL,
2318 0,
2319 SocketAddress,
2320 TdiAddressSize);
2321
2322 /* Wait for return */
2323 if (Status == STATUS_PENDING)
2324 {
2326 Status = IOSB.Status;
2327 }
2328
2329 NtClose( SockEvent );
2330
2331 if (NT_SUCCESS(Status))
2332 {
2333 if (*NameLength >= Socket->SharedData->SizeOfRemoteAddress)
2334 {
2335 Name->sa_family = SocketAddress->Address[0].AddressType;
2336 RtlCopyMemory (Name->sa_data,
2337 SocketAddress->Address[0].Address,
2338 SocketAddress->Address[0].AddressLength);
2339 *NameLength = Socket->SharedData->SizeOfRemoteAddress;
2340 TRACE("NameLength %d Address: %x Port %x\n",
2341 *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr,
2342 ((struct sockaddr_in *)Name)->sin_port);
2343 HeapFree(GlobalHeap, 0, SocketAddress);
2344 return 0;
2345 }
2346 else
2347 {
2348 HeapFree(GlobalHeap, 0, SocketAddress);
2349 if (lpErrno) *lpErrno = WSAEFAULT;
2350 return SOCKET_ERROR;
2351 }
2352 }
2353
2354 HeapFree(GlobalHeap, 0, SocketAddress);
2355
2356 return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
2357}
GLdouble s
Definition: gl.h:2039
#define IOCTL_AFD_GET_PEER_NAME
Definition: shared.h:291
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 2156 of file dllmain.c.

2160{
2161 IO_STATUS_BLOCK IOSB;
2162 ULONG TdiAddressSize;
2163 PTDI_ADDRESS_INFO TdiAddress;
2164 PTRANSPORT_ADDRESS SocketAddress;
2165 PSOCKET_INFORMATION Socket = NULL;
2168
2169 /* Get the Socket Structure associate to this Socket*/
2170 Socket = GetSocketStructure(Handle);
2171 if (!Socket)
2172 {
2173 if (lpErrno) *lpErrno = WSAENOTSOCK;
2174 return SOCKET_ERROR;
2175 }
2176
2177 if (!Name || !NameLength)
2178 {
2179 if (lpErrno) *lpErrno = WSAEFAULT;
2180 return SOCKET_ERROR;
2181 }
2182
2185 NULL,
2187 FALSE);
2188
2189 if( !NT_SUCCESS(Status) )
2190 return SOCKET_ERROR;
2191
2192 /* Allocate a buffer for the address */
2193 TdiAddressSize =
2195 TdiAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
2196
2197 if ( TdiAddress == NULL )
2198 {
2199 NtClose( SockEvent );
2200 if (lpErrno) *lpErrno = WSAENOBUFS;
2201 return SOCKET_ERROR;
2202 }
2203
2204 SocketAddress = &TdiAddress->Address;
2205
2206 /* Send IOCTL */
2208 SockEvent,
2209 NULL,
2210 NULL,
2211 &IOSB,
2213 NULL,
2214 0,
2215 TdiAddress,
2216 TdiAddressSize);
2217
2218 /* Wait for return */
2219 if (Status == STATUS_PENDING)
2220 {
2222 Status = IOSB.Status;
2223 }
2224
2225 NtClose( SockEvent );
2226
2227 if (NT_SUCCESS(Status))
2228 {
2229 if (*NameLength >= Socket->SharedData->SizeOfLocalAddress)
2230 {
2231 Name->sa_family = SocketAddress->Address[0].AddressType;
2232 RtlCopyMemory (Name->sa_data,
2233 SocketAddress->Address[0].Address,
2234 SocketAddress->Address[0].AddressLength);
2235 *NameLength = Socket->SharedData->SizeOfLocalAddress;
2236 TRACE("NameLength %d Address: %x Port %x\n",
2237 *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr,
2238 ((struct sockaddr_in *)Name)->sin_port);
2239 HeapFree(GlobalHeap, 0, TdiAddress);
2240 return 0;
2241 }
2242 else
2243 {
2244 HeapFree(GlobalHeap, 0, TdiAddress);
2245 if (lpErrno) *lpErrno = WSAEFAULT;
2246 return SOCKET_ERROR;
2247 }
2248 }
2249
2250 HeapFree(GlobalHeap, 0, TdiAddress);
2251
2252 return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
2253}
#define IOCTL_AFD_GET_SOCK_NAME
Definition: shared.h:289
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 2609 of file dllmain.c.

2615{
2616 PSOCKET_INFORMATION Socket = NULL;
2617 PVOID Buffer;
2619 BOOL BoolBuffer;
2620 DWORD DwordBuffer;
2621 INT Errno;
2622
2623 TRACE("Called\n");
2624
2625 /* Get the Socket Structure associate to this Socket*/
2626 Socket = GetSocketStructure(Handle);
2627 if (Socket == NULL)
2628 {
2629 if (lpErrno) *lpErrno = WSAENOTSOCK;
2630 return SOCKET_ERROR;
2631 }
2632 if (!OptionLength || !OptionValue)
2633 {
2634 if (lpErrno) *lpErrno = WSAEFAULT;
2635 return SOCKET_ERROR;
2636 }
2637
2638 switch (Level)
2639 {
2640 case SOL_SOCKET:
2641 switch (OptionName)
2642 {
2643 case SO_TYPE:
2644 Buffer = &Socket->SharedData->SocketType;
2645 BufferSize = sizeof(INT);
2646 break;
2647
2648 case SO_RCVBUF:
2650 BufferSize = sizeof(ULONG);
2651 break;
2652
2653 case SO_SNDBUF:
2655 BufferSize = sizeof(ULONG);
2656 break;
2657
2658 case SO_ACCEPTCONN:
2659 BoolBuffer = Socket->SharedData->Listening;
2660 Buffer = &BoolBuffer;
2661 BufferSize = sizeof(BOOL);
2662 break;
2663
2664 case SO_BROADCAST:
2665 BoolBuffer = Socket->SharedData->Broadcast;
2666 Buffer = &BoolBuffer;
2667 BufferSize = sizeof(BOOL);
2668 break;
2669
2670 case SO_DEBUG:
2671 BoolBuffer = Socket->SharedData->Debug;
2672 Buffer = &BoolBuffer;
2673 BufferSize = sizeof(BOOL);
2674 break;
2675
2676 case SO_DONTLINGER:
2677 BoolBuffer = (Socket->SharedData->LingerData.l_onoff == 0);
2678 Buffer = &BoolBuffer;
2679 BufferSize = sizeof(BOOL);
2680 break;
2681
2682 case SO_LINGER:
2683 if (Socket->SharedData->SocketType == SOCK_DGRAM)
2684 {
2685 if (lpErrno) *lpErrno = WSAENOPROTOOPT;
2686 return SOCKET_ERROR;
2687 }
2688 Buffer = &Socket->SharedData->LingerData;
2689 BufferSize = sizeof(struct linger);
2690 break;
2691
2692 case SO_OOBINLINE:
2693 BoolBuffer = (Socket->SharedData->OobInline != 0);
2694 Buffer = &BoolBuffer;
2695 BufferSize = sizeof(BOOL);
2696 break;
2697
2698 case SO_KEEPALIVE:
2699 case SO_DONTROUTE:
2700 /* These guys go directly to the helper */
2701 goto SendToHelper;
2702
2704 BoolBuffer = (Socket->SharedData->UseDelayedAcceptance != 0);
2705 Buffer = &BoolBuffer;
2706 BufferSize = sizeof(BOOL);
2707 break;
2708
2709 case SO_REUSEADDR:
2710 BoolBuffer = (Socket->SharedData->ReuseAddresses != 0);
2711 Buffer = &BoolBuffer;
2712 BufferSize = sizeof(BOOL);
2713 break;
2714
2716 BoolBuffer = (Socket->SharedData->ExclusiveAddressUse != 0);
2717 Buffer = &BoolBuffer;
2718 BufferSize = sizeof(BOOL);
2719 break;
2720
2721 case SO_ERROR:
2722 Buffer = &Socket->SharedData->SocketLastError;
2723 BufferSize = sizeof(INT);
2724 break;
2725
2726 case SO_CONNECT_TIME:
2727 DwordBuffer = GetCurrentTimeInSeconds() - Socket->SharedData->ConnectTime;
2728 Buffer = &DwordBuffer;
2729 BufferSize = sizeof(DWORD);
2730 break;
2731
2732 case SO_SNDTIMEO:
2733 Buffer = &Socket->SharedData->SendTimeout;
2734 BufferSize = sizeof(DWORD);
2735 break;
2736 case SO_RCVTIMEO:
2737 Buffer = &Socket->SharedData->RecvTimeout;
2738 BufferSize = sizeof(DWORD);
2739 break;
2740 case SO_PROTOCOL_INFOW:
2741 Buffer = &Socket->ProtocolInfo;
2742 BufferSize = sizeof(Socket->ProtocolInfo);
2743 break;
2744
2745 case SO_GROUP_ID:
2746 case SO_GROUP_PRIORITY:
2747 case SO_MAX_MSG_SIZE:
2748
2749 default:
2750 DbgPrint("MSAFD: Get unknown optname %x\n", OptionName);
2751 if (lpErrno) *lpErrno = WSAENOPROTOOPT;
2752 return SOCKET_ERROR;
2753 }
2754
2755 if (*OptionLength < BufferSize)
2756 {
2757 if (lpErrno) *lpErrno = WSAEFAULT;
2758 *OptionLength = BufferSize;
2759 return SOCKET_ERROR;
2760 }
2761 RtlCopyMemory(OptionValue, Buffer, BufferSize);
2762
2763 return 0;
2764
2765 default:
2766 if (lpErrno) *lpErrno = WSAEINVAL;
2767 return SOCKET_ERROR;
2768 }
2769
2770SendToHelper:
2771 Errno = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext,
2772 Handle,
2773 Socket->TdiAddressHandle,
2774 Socket->TdiConnectionHandle,
2775 Level,
2776 OptionName,
2777 OptionValue,
2778 (LPINT)OptionLength);
2779 if (lpErrno) *lpErrno = Errno;
2780 return (Errno == NO_ERROR) ? NO_ERROR : SOCKET_ERROR;
2781}
Definition: bufpool.h:45
#define BufferSize
Definition: mmc.h:75
#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: msafd.h:69
BOOLEAN Debug
Definition: msafd.h:70
ULONG RecvTimeout
Definition: msafd.h:63
BOOLEAN ExclusiveAddressUse
Definition: msafd.h:73
BOOLEAN OobInline
Definition: msafd.h:71
ULONG SizeOfSendBuffer
Definition: msafd.h:65
BOOLEAN ReuseAddresses
Definition: msafd.h:72
ULONG SizeOfRecvBuffer
Definition: msafd.h:64
ULONG SendTimeout
Definition: msafd.h:62
int32_t INT
Definition: typedefs.h:58
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
int * LPINT
Definition: windef.h:178
#define WSAENOPROTOOPT
Definition: winerror.h:1955
#define SO_PROTOCOL_INFOW
Definition: winsock2.h:249
#define SO_ERROR
Definition: winsock.h:194
#define SO_KEEPALIVE
Definition: winsock.h:181
#define SO_RCVBUF
Definition: winsock.h:189
#define SO_OOBINLINE
Definition: winsock.h:186
#define SO_DONTROUTE
Definition: winsock.h:182
#define SO_ACCEPTCONN
Definition: winsock.h:179
#define SOCK_DGRAM
Definition: winsock.h:336
#define SO_LINGER
Definition: winsock.h:185
#define SO_REUSEADDR
Definition: winsock.h:180
#define SO_TYPE
Definition: winsock.h:195
#define SOL_SOCKET
Definition: winsock.h:398
#define SO_DEBUG
Definition: winsock.h:178
#define SO_SNDTIMEO
Definition: winsock.h:192
#define SO_BROADCAST
Definition: winsock.h:183
#define SO_DONTLINGER
Definition: winsock.h:187
#define SO_RCVTIMEO
Definition: winsock.h:193
#define SO_SNDBUF
Definition: winsock.h:188
_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 2361 of file dllmain.c.

2372{
2373 PSOCKET_INFORMATION Socket = NULL;
2374 BOOL NeedsCompletion = lpOverlapped != NULL;
2375 BOOLEAN NonBlocking;
2376 INT Errno = NO_ERROR, Ret = SOCKET_ERROR;
2377 DWORD cbRet = 0;
2378
2379 /* Get the Socket Structure associate to this Socket*/
2380 Socket = GetSocketStructure(Handle);
2381 if (!Socket)
2382 {
2383 if(lpErrno)
2384 *lpErrno = WSAENOTSOCK;
2385 return SOCKET_ERROR;
2386 }
2387
2388 if (!lpcbBytesReturned && !lpOverlapped)
2389 {
2390 if(lpErrno)
2391 *lpErrno = WSAEFAULT;
2392 return SOCKET_ERROR;
2393 }
2394
2395 switch( dwIoControlCode )
2396 {
2397 case FIONBIO:
2398 if( cbInBuffer < sizeof(INT) || IS_INTRESOURCE(lpvInBuffer) )
2399 {
2400 Errno = WSAEFAULT;
2401 break;
2402 }
2403 NonBlocking = *((PULONG)lpvInBuffer) ? TRUE : FALSE;
2404 /* Don't allow to go in blocking mode if WSPAsyncSelect or WSPEventSelect is pending */
2405 if (!NonBlocking)
2406 {
2407 /* If there is an WSPAsyncSelect pending, fail with WSAEINVAL */
2408 if (Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents))
2409 {
2410 Errno = WSAEINVAL;
2411 break;
2412 }
2413 /* If there is an WSPEventSelect pending, fail with WSAEINVAL */
2414 if (Socket->NetworkEvents)
2415 {
2416 Errno = WSAEINVAL;
2417 break;
2418 }
2419 }
2420 Socket->SharedData->NonBlocking = NonBlocking ? 1 : 0;
2421 NeedsCompletion = FALSE;
2422 Errno = SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &NonBlocking, NULL, NULL, lpOverlapped, lpCompletionRoutine);
2423 if (Errno == NO_ERROR)
2424 Ret = NO_ERROR;
2425 break;
2426 case FIONREAD:
2427 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2428 {
2429 cbRet = sizeof(ULONG);
2430 Errno = WSAEFAULT;
2431 break;
2432 }
2433 if (cbOutBuffer < sizeof(ULONG))
2434 {
2435 Errno = WSAEINVAL;
2436 break;
2437 }
2438 NeedsCompletion = FALSE;
2439 Errno = GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, NULL, (PULONG)lpvOutBuffer, NULL, lpOverlapped, lpCompletionRoutine);
2440 if (Errno == NO_ERROR)
2441 {
2442 cbRet = sizeof(ULONG);
2443 Ret = NO_ERROR;
2444 }
2445 break;
2446 case SIOCATMARK:
2447 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2448 {
2449 cbRet = sizeof(BOOL);
2450 Errno = WSAEFAULT;
2451 break;
2452 }
2453 if (cbOutBuffer < sizeof(BOOL))
2454 {
2455 Errno = WSAEINVAL;
2456 break;
2457 }
2458 if (Socket->SharedData->SocketType != SOCK_STREAM)
2459 {
2460 Errno = WSAEINVAL;
2461 break;
2462 }
2463
2464 /* FIXME: Return false if OOBINLINE is true for now
2465 We should MSG_PEEK|MSG_OOB check with driver
2466 */
2467 *(BOOL*)lpvOutBuffer = !Socket->SharedData->OobInline;
2468
2469 cbRet = sizeof(BOOL);
2470 Errno = NO_ERROR;
2471 Ret = NO_ERROR;
2472 break;
2474 if (cbOutBuffer == 0)
2475 {
2476 cbRet = sizeof(PVOID);
2477 Errno = WSAEFAULT;
2478 break;
2479 }
2480
2481 if (cbInBuffer < sizeof(GUID) ||
2482 cbOutBuffer < sizeof(PVOID))
2483 {
2484 Errno = WSAEINVAL;
2485 break;
2486 }
2487
2488 {
2489 GUID AcceptExGUID = WSAID_ACCEPTEX;
2490 GUID ConnectExGUID = WSAID_CONNECTEX;
2491 GUID DisconnectExGUID = WSAID_DISCONNECTEX;
2492 GUID GetAcceptExSockaddrsGUID = WSAID_GETACCEPTEXSOCKADDRS;
2493
2494 if (IsEqualGUID(&AcceptExGUID, lpvInBuffer))
2495 {
2496 *((PVOID *)lpvOutBuffer) = WSPAcceptEx;
2497 cbRet = sizeof(PVOID);
2498 Errno = NO_ERROR;
2499 Ret = NO_ERROR;
2500 }
2501 else if (IsEqualGUID(&ConnectExGUID, lpvInBuffer))
2502 {
2503 *((PVOID *)lpvOutBuffer) = WSPConnectEx;
2504 cbRet = sizeof(PVOID);
2505 Errno = NO_ERROR;
2506 Ret = NO_ERROR;
2507 }
2508 else if (IsEqualGUID(&DisconnectExGUID, lpvInBuffer))
2509 {
2510 *((PVOID *)lpvOutBuffer) = WSPDisconnectEx;
2511 cbRet = sizeof(PVOID);
2512 Errno = NO_ERROR;
2513 Ret = NO_ERROR;
2514 }
2515 else if (IsEqualGUID(&GetAcceptExSockaddrsGUID, lpvInBuffer))
2516 {
2517 *((PVOID *)lpvOutBuffer) = WSPGetAcceptExSockaddrs;
2518 cbRet = sizeof(PVOID);
2519 Errno = NO_ERROR;
2520 /* See CORE-14966 and associated commits.
2521 * Original line below was 'Ret = NO_ERROR:'.
2522 * This caused winetest ws2_32:sock to hang.
2523 * This new Ret value allows the test to complete. */
2524 ERR("SIO_GET_EXTENSION_FUNCTION_POINTER UNIMPLEMENTED\n");
2525 Ret = SOCKET_ERROR;
2526 }
2527 else
2528 {
2529 ERR("Querying unknown extension function: %x\n", ((GUID*)lpvInBuffer)->Data1);
2530 Errno = WSAEOPNOTSUPP;
2531 }
2532 }
2533
2534 break;
2536 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2537 {
2538 cbRet = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
2539 Errno = WSAEFAULT;
2540 break;
2541 }
2542 if (cbOutBuffer < sizeof(INT))
2543 {
2544 Errno = WSAEINVAL;
2545 break;
2546 }
2547
2548 cbRet = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
2549
2550 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->iAddressCount = 1;
2551
2552 if (cbOutBuffer < (sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress)))
2553 {
2554 Errno = WSAEFAULT;
2555 break;
2556 }
2557
2558 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].iSockaddrLength = sizeof(Socket->SharedData->WSLocalAddress);
2559 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].lpSockaddr = &Socket->SharedData->WSLocalAddress;
2560
2561 Errno = NO_ERROR;
2562 Ret = NO_ERROR;
2563 break;
2564 default:
2565 Errno = Socket->HelperData->WSHIoctl(Socket->HelperContext,
2566 Handle,
2567 Socket->TdiAddressHandle,
2568 Socket->TdiConnectionHandle,
2570 lpvInBuffer,
2571 cbInBuffer,
2572 lpvOutBuffer,
2573 cbOutBuffer,
2574 &cbRet,
2576 lpCompletionRoutine,
2577 &NeedsCompletion);
2578
2579 if (Errno == NO_ERROR)
2580 Ret = NO_ERROR;
2581 break;
2582 }
2583 if (lpOverlapped && NeedsCompletion)
2584 {
2585 lpOverlapped->Internal = Errno;
2586 lpOverlapped->InternalHigh = cbRet;
2587 if (lpCompletionRoutine != NULL)
2588 {
2589 lpCompletionRoutine(Errno, cbRet, lpOverlapped, 0);
2590 }
2591 if (lpOverlapped->hEvent)
2592 SetEvent(lpOverlapped->hEvent);
2594 {
2595 ERR("PostQueuedCompletionStatus failed %d\n", GetLastError());
2596 }
2597 return NO_ERROR;
2598 }
2599 if (lpErrno)
2600 *lpErrno = Errno;
2601 if (lpcbBytesReturned)
2602 *lpcbBytesReturned = cbRet;
2603 return Ret;
2604}
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)
Definition: stubs.c:75
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:104
BOOL WSPAPI WSPDisconnectEx(IN SOCKET hSocket, IN LPOVERLAPPED lpOverlapped, IN DWORD dwFlags, IN DWORD reserved)
Definition: stubs.c:91
#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:188
PWSH_IOCTL WSHIoctl
Definition: helpers.h:33
SOCKADDR WSLocalAddress
Definition: msafd.h:94
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
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:253
#define FIONREAD
Definition: winsock.h:247
#define FIONBIO
Definition: winsock.h:149
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
#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 926 of file sndrcv.c.

929{
931 return 0;
932}
#define UNIMPLEMENTED
Definition: debug.h:115

◆ 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 938 of file sndrcv.c.

941{
943 return 0;
944}

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

2792{
2793 PSOCKET_INFORMATION Socket;
2794 INT Errno;
2795
2796 /* Get the Socket Structure associate to this Socket*/
2797 Socket = GetSocketStructure(s);
2798 if (Socket == NULL)
2799 {
2800 if (lpErrno) *lpErrno = WSAENOTSOCK;
2801 return SOCKET_ERROR;
2802 }
2803 if (!optval)
2804 {
2805 if (lpErrno) *lpErrno = WSAEFAULT;
2806 return SOCKET_ERROR;
2807 }
2808
2809
2810 /* FIXME: We should handle some more cases here */
2811 if (level == SOL_SOCKET)
2812 {
2813 switch (optname)
2814 {
2815 case SO_BROADCAST:
2816 if (optlen < sizeof(BOOL))
2817 {
2818 if (lpErrno) *lpErrno = WSAEFAULT;
2819 return SOCKET_ERROR;
2820 }
2821 Socket->SharedData->Broadcast = (*optval != 0) ? 1 : 0;
2822 return NO_ERROR;
2823
2824 case SO_OOBINLINE:
2825 if (optlen < sizeof(BOOL))
2826 {
2827 if (lpErrno) *lpErrno = WSAEFAULT;
2828 return SOCKET_ERROR;
2829 }
2830 Socket->SharedData->OobInline = (*optval != 0) ? 1 : 0;
2831 return NO_ERROR;
2832
2833 case SO_DONTLINGER:
2834 if (optlen < sizeof(BOOL))
2835 {
2836 if (lpErrno) *lpErrno = WSAEFAULT;
2837 return SOCKET_ERROR;
2838 }
2839 Socket->SharedData->LingerData.l_onoff = (*optval != 0) ? 0 : 1;
2840 return NO_ERROR;
2841
2842 case SO_REUSEADDR:
2843 if (optlen < sizeof(BOOL))
2844 {
2845 if (lpErrno) *lpErrno = WSAEFAULT;
2846 return SOCKET_ERROR;
2847 }
2848 Socket->SharedData->ReuseAddresses = (*optval != 0) ? 1 : 0;
2849 return NO_ERROR;
2850
2852 if (optlen < sizeof(BOOL))
2853 {
2854 if (lpErrno) *lpErrno = WSAEFAULT;
2855 return SOCKET_ERROR;
2856 }
2857 Socket->SharedData->ExclusiveAddressUse = (*optval != 0) ? 1 : 0;
2858 return NO_ERROR;
2859
2860 case SO_LINGER:
2861 if (optlen < sizeof(struct linger))
2862 {
2863 if (lpErrno) *lpErrno = WSAEFAULT;
2864 return SOCKET_ERROR;
2865 }
2867 optval,
2868 sizeof(struct linger));
2869 return NO_ERROR;
2870
2871 case SO_SNDBUF:
2872 if (optlen < sizeof(ULONG))
2873 {
2874 if (lpErrno) *lpErrno = WSAEFAULT;
2875 return SOCKET_ERROR;
2876 }
2877
2878 SetSocketInformation(Socket,
2880 NULL,
2881 (PULONG)optval,
2882 NULL,
2883 NULL,
2884 NULL);
2885 GetSocketInformation(Socket,
2887 NULL,
2888 &Socket->SharedData->SizeOfSendBuffer,
2889 NULL,
2890 NULL,
2891 NULL);
2892
2893 return NO_ERROR;
2894
2895 case SO_RCVBUF:
2896 if (optlen < sizeof(ULONG))
2897 {
2898 if (lpErrno) *lpErrno = WSAEFAULT;
2899 return SOCKET_ERROR;
2900 }
2901
2902 /* FIXME: We should not have to limit the packet receive buffer size like this. workaround for CORE-15804 */
2903 if (*(PULONG)optval > 0x2000)
2904 *(PULONG)optval = 0x2000;
2905
2906 SetSocketInformation(Socket,
2908 NULL,
2909 (PULONG)optval,
2910 NULL,
2911 NULL,
2912 NULL);
2913 GetSocketInformation(Socket,
2915 NULL,
2916 &Socket->SharedData->SizeOfRecvBuffer,
2917 NULL,
2918 NULL,
2919 NULL);
2920
2921 return NO_ERROR;
2922
2923 case SO_ERROR:
2924 if (optlen < sizeof(INT))
2925 {
2926 if (lpErrno) *lpErrno = WSAEFAULT;
2927 return SOCKET_ERROR;
2928 }
2929
2931 optval,
2932 sizeof(INT));
2933 return NO_ERROR;
2934
2935 case SO_SNDTIMEO:
2936 if (optlen < sizeof(DWORD))
2937 {
2938 if (lpErrno) *lpErrno = WSAEFAULT;
2939 return SOCKET_ERROR;
2940 }
2941
2943 optval,
2944 sizeof(DWORD));
2945 return NO_ERROR;
2946
2947 case SO_RCVTIMEO:
2948 if (optlen < sizeof(DWORD))
2949 {
2950 if (lpErrno) *lpErrno = WSAEFAULT;
2951 return SOCKET_ERROR;
2952 }
2953
2955 optval,
2956 sizeof(DWORD));
2957 return NO_ERROR;
2958
2959 case SO_KEEPALIVE:
2960 case SO_DONTROUTE:
2961 /* These go directly to the helper dll */
2962 goto SendToHelper;
2963
2964 default:
2965 /* Obviously this is a hack */
2966 ERR("MSAFD: Set unknown optname %x\n", optname);
2967 return NO_ERROR;
2968 }
2969 }
2970
2971SendToHelper:
2972 Errno = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext,
2973 s,
2974 Socket->TdiAddressHandle,
2975 Socket->TdiConnectionHandle,
2976 level,
2977 optname,
2978 (PCHAR)optval,
2979 optlen);
2980 if (lpErrno) *lpErrno = Errno;
2981 return (Errno == NO_ERROR) ? NO_ERROR : SOCKET_ERROR;
2982}
GLint level
Definition: gl.h:1546
#define AFD_INFO_SEND_WINDOW_SIZE
Definition: shared.h:186
#define AFD_INFO_RECEIVE_WINDOW_SIZE
Definition: shared.h:185
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 3123 of file dllmain.c.

3129{
3130 int numdots = 0;
3131 USHORT port;
3132 LONG inetaddr = 0, ip_part;
3133 LPWSTR *bp = NULL;
3135
3136 if (!lpAddressLength || !lpAddress || !AddressString)
3137 {
3138 if (lpErrno) *lpErrno = WSAEINVAL;
3139 return SOCKET_ERROR;
3140 }
3141
3142 sockaddr = (SOCKADDR_IN *)lpAddress;
3143
3144 /* Set right address family */
3145 if (lpProtocolInfo != NULL)
3146 {
3147 sockaddr->sin_family = lpProtocolInfo->iAddressFamily;
3148 }
3149 else
3150 {
3151 sockaddr->sin_family = AddressFamily;
3152 }
3153
3154 /* Report size */
3155 if (AddressFamily == AF_INET)
3156 {
3157 if (*lpAddressLength < (INT)sizeof(SOCKADDR_IN))
3158 {
3159 if (lpErrno) *lpErrno = WSAEFAULT;
3160 }
3161 else
3162 {
3163 // translate ip string to ip
3164
3165 /* Get ip number */
3166 bp = &AddressString;
3167 inetaddr = 0;
3168
3169 while (*bp < &AddressString[wcslen(AddressString)])
3170 {
3171 ip_part = wcstol(*bp, bp, 10);
3172 /* ip part number should be in range 0-255 */
3173 if (ip_part < 0 || ip_part > 255)
3174 {
3175 if (lpErrno) *lpErrno = WSAEINVAL;
3176 return SOCKET_ERROR;
3177 }
3178 inetaddr = (inetaddr << 8) + ip_part;
3179 /* we end on string end or port separator */
3180 if ((*bp)[0] == 0 || (*bp)[0] == L':')
3181 break;
3182 /* ip parts are dot separated. verify it */
3183 if ((*bp)[0] != L'.')
3184 {
3185 if (lpErrno) *lpErrno = WSAEINVAL;
3186 return SOCKET_ERROR;
3187 }
3188 /* count the dots */
3189 numdots++;
3190 /* move over the dot to next ip part */
3191 (*bp)++;
3192 }
3193
3194 /* check dots count */
3195 if (numdots != 3)
3196 {
3197 if (lpErrno) *lpErrno = WSAEINVAL;
3198 return SOCKET_ERROR;
3199 }
3200
3201 /* Get port number */
3202 if ((*bp)[0] == L':')
3203 {
3204 /* move over the column to port part */
3205 (*bp)++;
3206 /* next char should be numeric */
3207 if ((*bp)[0] < L'0' || (*bp)[0] > L'9')
3208 {
3209 if (lpErrno) *lpErrno = WSAEINVAL;
3210 return SOCKET_ERROR;
3211 }
3212 port = wcstol(*bp, bp, 10);
3213 }
3214 else
3215 {
3216 port = 0;
3217 }
3218
3219 if (lpErrno) *lpErrno = NO_ERROR;
3220 /* rest sockaddr.sin_addr.s_addr
3221 for we need to be sure it is zero when we come to while */
3222 *lpAddressLength = sizeof(*sockaddr);
3223 memset(lpAddress, 0, sizeof(*sockaddr));
3224 sockaddr->sin_family = AF_INET;
3225 sockaddr->sin_addr.s_addr = inetaddr;
3226 sockaddr->sin_port = port;
3227 }
3228 }
3229
3230 if (lpErrno && !*lpErrno)
3231 {
3232 return 0;
3233 }
3234
3235 return SOCKET_ERROR;
3236}
USHORT port
Definition: uri.c:228
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
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:487
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().