ReactOS 0.4.16-dev-2293-g4d8327b
msafdlib.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _SOCK_SHARED_INFO
 
struct  _HELPER_DATA
 
struct  _ASYNC_DATA
 
struct  _SOCKET_INFORMATION
 
struct  _SOCKET_CONTEXT
 
struct  _SOCK_RW_LOCK
 
struct  _WINSOCK_TEB_DATA
 
struct  _SOCK_ICF_DATA
 

Macros

#define NO_BLOCKING_HOOK   0
 
#define MAYBE_BLOCKING_HOOK   1
 
#define ALWAYS_BLOCKING_HOOK   2
 
#define NO_TIMEOUT   0
 
#define SEND_TIMEOUT   1
 
#define RECV_TIMEOUT   2
 
#define MAX_TDI_ADDRESS_LENGTH   32
 
#define WSA_FLAG_MULTIPOINT_ALL
 
#define MSAFD_IS_DGRAM_SOCK(s)    (s->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)
 

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 _HELPER_DATA HELPER_DATA
 
typedef struct _HELPER_DATAPHELPER_DATA
 
typedef struct _ASYNC_DATA ASYNC_DATA
 
typedef struct _ASYNC_DATAPASYNC_DATA
 
typedef struct _SOCKET_INFORMATION SOCKET_INFORMATION
 
typedef struct _SOCKET_INFORMATIONPSOCKET_INFORMATION
 
typedef struct _SOCKET_CONTEXT SOCKET_CONTEXT
 
typedef struct _SOCKET_CONTEXTPSOCKET_CONTEXT
 
typedef struct _SOCK_RW_LOCK SOCK_RW_LOCK
 
typedef struct _SOCK_RW_LOCKPSOCK_RW_LOCK
 
typedef struct _WINSOCK_TEB_DATA WINSOCK_TEB_DATA
 
typedef struct _WINSOCK_TEB_DATAPWINSOCK_TEB_DATA
 
typedef INT(WINAPIPICF_CONNECT) (PVOID IcfData)
 
typedef struct _SOCK_ICF_DATA SOCK_ICF_DATA
 
typedef struct _SOCK_ICF_DATAPSOCK_ICF_DATA
 
typedef PVOID(NTAPIPRTL_HEAP_ALLOCATE) (IN HANDLE Heap, IN ULONG Flags, IN ULONG Size)
 
typedef VOID(WSPAPIPASYNC_COMPLETION_ROUTINE) (PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
 

Enumerations

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

Functions

BOOL WSPAPI MSWSOCK_Initialize (VOID)
 
BOOL WSPAPI MSAFD_SockThreadInitialize (VOID)
 
INT WSPAPI SockCreateAsyncQueuePort (VOID)
 
PVOID WSPAPI SockInitializeHeap (IN HANDLE Heap, IN ULONG Flags, IN ULONG Size)
 
NTSTATUS WSPAPI SockInitializeRwLockAndSpinCount (IN PSOCK_RW_LOCK Lock, IN ULONG SpinCount)
 
VOID WSPAPI SockAcquireRwLockExclusive (IN PSOCK_RW_LOCK Lock)
 
VOID WSPAPI SockAcquireRwLockShared (IN PSOCK_RW_LOCK Lock)
 
VOID WSPAPI SockReleaseRwLockExclusive (IN PSOCK_RW_LOCK Lock)
 
VOID WSPAPI SockReleaseRwLockShared (IN PSOCK_RW_LOCK Lock)
 
NTSTATUS WSPAPI SockDeleteRwLock (IN PSOCK_RW_LOCK Lock)
 
INT WSPAPI SockGetConnectData (IN PSOCKET_INFORMATION Socket, IN ULONG Ioctl, IN PVOID Buffer, IN ULONG BufferLength, OUT PULONG BufferReturned)
 
INT WSPAPI SockIsAddressConsistentWithConstrainedGroup (IN PSOCKET_INFORMATION Socket, IN GROUP Group, IN PSOCKADDR SocketAddress, IN INT SocketAddressLength)
 
BOOL WSPAPI SockWaitForSingleObject (IN HANDLE Handle, IN SOCKET SocketHandle, IN DWORD BlockingFlags, IN DWORD TimeoutFlags)
 
BOOLEAN WSPAPI SockIsSocketConnected (IN PSOCKET_INFORMATION Socket)
 
INT WSPAPI SockNotifyHelperDll (IN PSOCKET_INFORMATION Socket, IN DWORD Event)
 
INT WSPAPI SockUpdateWindowSizes (IN PSOCKET_INFORMATION Socket, IN BOOLEAN Force)
 
INT WSPAPI SockBuildTdiAddress (OUT PTRANSPORT_ADDRESS TdiAddress, IN PSOCKADDR Sockaddr, IN INT SockaddrLength)
 
INT WSPAPI SockBuildSockaddr (OUT PSOCKADDR Sockaddr, OUT PINT SockaddrLength, IN PTRANSPORT_ADDRESS TdiAddress)
 
INT WSPAPI SockGetTdiHandles (IN PSOCKET_INFORMATION Socket)
 
VOID WSPAPI SockIoCompletion (IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, DWORD Reserved)
 
VOID WSPAPI SockCancelIo (IN SOCKET Handle)
 
INT WSPAPI SockGetInformation (IN PSOCKET_INFORMATION Socket, IN ULONG AfdInformationClass, IN PVOID ExtraData OPTIONAL, IN ULONG ExtraDataSize, IN OUT PBOOLEAN Boolean OPTIONAL, IN OUT PULONG Ulong OPTIONAL, IN OUT PLARGE_INTEGER LargeInteger OPTIONAL)
 
INT WSPAPI SockSetInformation (IN PSOCKET_INFORMATION Socket, IN ULONG AfdInformationClass, IN PBOOLEAN Boolean OPTIONAL, IN PULONG Ulong OPTIONAL, IN PLARGE_INTEGER LargeInteger OPTIONAL)
 
INT WSPAPI SockSetHandleContext (IN PSOCKET_INFORMATION Socket)
 
VOID WSPAPI SockDereferenceSocket (IN PSOCKET_INFORMATION Socket)
 
VOID WSPAPI SockFreeHelperDll (IN PHELPER_DATA Helper)
 
PSOCKET_INFORMATION WSPAPI SockFindAndReferenceSocket (IN SOCKET Handle, IN BOOLEAN Import)
 
INT WSPAPI SockEnterApiSlow (OUT PWINSOCK_TEB_DATA *ThreadData)
 
VOID WSPAPI SockSanInitialize (VOID)
 
VOID WSPAPI SockSanGetTcpipCatalogId (VOID)
 
VOID WSPAPI CloseIcfConnection (IN PSOCK_ICF_DATA IcfData)
 
VOID WSPAPI InitializeIcfConnection (IN PSOCK_ICF_DATA IcfData)
 
VOID WSPAPI NewIcfConnection (IN PSOCK_ICF_DATA IcfData)
 
INT WSPAPI NtStatusToSocketError (IN NTSTATUS Status)
 
INT WSPAPI SockSocket (INT AddressFamily, INT SocketType, INT Protocol, LPGUID ProviderId, GROUP g, DWORD dwFlags, DWORD ProviderFlags, DWORD ServiceFlags, DWORD CatalogEntryId, PSOCKET_INFORMATION *NewSocket)
 
INT WSPAPI SockCloseSocket (IN PSOCKET_INFORMATION Socket)
 
FORCEINLINE INT WSPAPI SockEnterApiFast (OUT PWINSOCK_TEB_DATA *ThreadData)
 
FORCEINLINE VOID WSPAPI SockDereferenceHelperDll (IN PHELPER_DATA Helper)
 
INT WSPAPI SockLoadHelperDll (PWSTR TransportName, PWINSOCK_MAPPING Mapping, PHELPER_DATA *HelperDllData)
 
INT WSPAPI SockLoadTransportMapping (PWSTR TransportName, PWINSOCK_MAPPING *Mapping)
 
INT WSPAPI SockLoadTransportList (PWSTR *TransportList)
 
BOOL WSPAPI SockIsTripleInMapping (IN PWINSOCK_MAPPING Mapping, IN INT AddressFamily, OUT PBOOLEAN AfMatch, IN INT SocketType, OUT PBOOLEAN SockMatch, IN INT Protocol, OUT PBOOLEAN ProtoMatch)
 
INT WSPAPI SockAsyncSelectHelper (IN PSOCKET_INFORMATION Socket, IN HWND hWnd, IN UINT wMsg, IN LONG Events)
 
INT WSPAPI SockEventSelectHelper (IN PSOCKET_INFORMATION Socket, IN WSAEVENT EventObject, IN LONG Events)
 
BOOLEAN WSPAPI SockCheckAndReferenceAsyncThread (VOID)
 
BOOLEAN WSPAPI SockCheckAndInitAsyncSelectHelper (VOID)
 
INT WSPAPI SockGetTdiName (PINT AddressFamily, PINT SocketType, PINT Protocol, LPGUID ProviderId, GROUP Group, DWORD Flags, PUNICODE_STRING TransportName, PVOID *HelperDllContext, PHELPER_DATA *HelperDllData, PDWORD Events)
 
INT WSPAPI SockAsyncThread (PVOID ThreadParam)
 
VOID WSPAPI SockProcessAsyncSelect (PSOCKET_INFORMATION Socket, PASYNC_DATA AsyncData)
 
VOID WSPAPI SockHandleAsyncIndication (IN PASYNC_COMPLETION_ROUTINE Callback, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatusBlock)
 
INT WSPAPI SockReenableAsyncSelectEvent (IN PSOCKET_INFORMATION Socket, IN ULONG Event)
 
VOID WSPAPI SockProcessQueuedAsyncSelect (PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
 
VOID WSPAPI SockAsyncSelectCompletion (PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
 
SOCKET WSPAPI WSPAccept (IN SOCKET s, OUT LPSOCKADDR addr, IN OUT LPINT addrlen, IN LPCONDITIONPROC lpfnCondition, IN DWORD 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 LPFD_SET readfds, IN OUT LPFD_SET writefds, IN OUT LPFD_SET exceptfds, IN CONST LPTIMEVAL 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)
 

Variables

HANDLE SockPrivateHeap
 
PRTL_HEAP_ALLOCATE SockAllocateHeapRoutine
 
SOCK_RW_LOCK SocketGlobalLock
 
PWAH_HANDLE_TABLE SockContextTable
 
LPWSPUPCALLTABLE SockUpcallTable
 
BOOL SockProcessTerminating
 
LONG SockWspStartupCount
 
DWORD SockSendBufferWindow
 
DWORD SockReceiveBufferWindow
 
HANDLE SockAsyncQueuePort
 
BOOLEAN SockAsyncSelectCalled
 
LONG SockProcessPendingAPCCount
 
HINSTANCE SockModuleHandle
 
LONG gWSM_NSPStartupRef
 
LONG gWSM_NSPCallRef
 
LIST_ENTRY SockHelperDllListHead
 
CRITICAL_SECTION MSWSOCK_SocketLock
 
HINSTANCE NlsMsgSourcemModuleHandle
 
PVOID SockBufferKeyTable
 
ULONG SockBufferKeyTableSize
 
LONG SockAsyncThreadReferenceCount
 
BOOLEAN g_fRnrLockInit
 
CRITICAL_SECTION g_RnrLock
 
HANDLE SockSanCleanUpCompleteEvent
 
BOOLEAN SockSanEnabled
 
WSAPROTOCOL_INFOW SockTcpProviderInfo
 

Macro Definition Documentation

◆ ALWAYS_BLOCKING_HOOK

#define ALWAYS_BLOCKING_HOOK   2

Definition at line 10 of file msafdlib.h.

◆ MAX_TDI_ADDRESS_LENGTH

#define MAX_TDI_ADDRESS_LENGTH   32

Definition at line 16 of file msafdlib.h.

◆ MAYBE_BLOCKING_HOOK

#define MAYBE_BLOCKING_HOOK   1

Definition at line 9 of file msafdlib.h.

◆ MSAFD_IS_DGRAM_SOCK

#define MSAFD_IS_DGRAM_SOCK (   s)     (s->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)

Definition at line 430 of file msafdlib.h.

◆ NO_BLOCKING_HOOK

#define NO_BLOCKING_HOOK   0

Definition at line 8 of file msafdlib.h.

◆ NO_TIMEOUT

#define NO_TIMEOUT   0

Definition at line 12 of file msafdlib.h.

◆ RECV_TIMEOUT

#define RECV_TIMEOUT   2

Definition at line 14 of file msafdlib.h.

◆ SEND_TIMEOUT

#define SEND_TIMEOUT   1

Definition at line 13 of file msafdlib.h.

◆ WSA_FLAG_MULTIPOINT_ALL

#define WSA_FLAG_MULTIPOINT_ALL
Value:
#define WSA_FLAG_MULTIPOINT_D_LEAF
Definition: winsock2.h:464
#define WSA_FLAG_MULTIPOINT_C_ROOT
Definition: winsock2.h:461
#define WSA_FLAG_MULTIPOINT_D_ROOT
Definition: winsock2.h:463
#define WSA_FLAG_MULTIPOINT_C_LEAF
Definition: winsock2.h:462

Definition at line 18 of file msafdlib.h.

Typedef Documentation

◆ ASYNC_DATA

◆ HELPER_DATA

◆ PASYNC_COMPLETION_ROUTINE

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

Definition at line 438 of file msafdlib.h.

◆ PASYNC_DATA

◆ PHELPER_DATA

◆ PICF_CONNECT

typedef INT(WINAPI * PICF_CONNECT) (PVOID IcfData)

Definition at line 169 of file msafdlib.h.

◆ PRTL_HEAP_ALLOCATE

typedef PVOID(NTAPI * PRTL_HEAP_ALLOCATE) (IN HANDLE Heap, IN ULONG Flags, IN ULONG Size)

Definition at line 181 of file msafdlib.h.

◆ PSOCK_ICF_DATA

◆ PSOCK_RW_LOCK

◆ PSOCK_SHARED_INFO

◆ PSOCKET_CONTEXT

◆ PSOCKET_INFORMATION

◆ PSOCKET_STATE

◆ PWINSOCK_TEB_DATA

◆ SOCK_ICF_DATA

◆ SOCK_RW_LOCK

◆ SOCK_SHARED_INFO

◆ SOCKET_CONTEXT

◆ SOCKET_INFORMATION

◆ SOCKET_STATE

◆ WINSOCK_TEB_DATA

Enumeration Type Documentation

◆ _SOCKET_STATE

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

Definition at line 25 of file msafdlib.h.

26{
27 SocketUndefined = -1,
enum _SOCKET_STATE SOCKET_STATE
enum _SOCKET_STATE * PSOCKET_STATE
@ SocketBound
Definition: msafdlib.h:29
@ SocketConnected
Definition: msafdlib.h:31
@ SocketUndefined
Definition: msafdlib.h:27
@ SocketClosed
Definition: msafdlib.h:32
@ SocketBoundUdp
Definition: msafdlib.h:30
@ SocketOpen
Definition: msafdlib.h:28

Function Documentation

◆ CloseIcfConnection()

VOID WSPAPI CloseIcfConnection ( IN PSOCK_ICF_DATA  IcfData)

◆ InitializeIcfConnection()

VOID WSPAPI InitializeIcfConnection ( IN PSOCK_ICF_DATA  IcfData)

◆ MSAFD_SockThreadInitialize()

BOOL WSPAPI MSAFD_SockThreadInitialize ( VOID  )

◆ MSWSOCK_Initialize()

BOOL WSPAPI MSWSOCK_Initialize ( VOID  )

◆ NewIcfConnection()

VOID WSPAPI NewIcfConnection ( IN PSOCK_ICF_DATA  IcfData)

◆ NtStatusToSocketError()

INT WSPAPI NtStatusToSocketError ( IN NTSTATUS  Status)

◆ SockAcquireRwLockExclusive()

VOID WSPAPI SockAcquireRwLockExclusive ( IN PSOCK_RW_LOCK  Lock)

◆ SockAcquireRwLockShared()

VOID WSPAPI SockAcquireRwLockShared ( IN PSOCK_RW_LOCK  Lock)

◆ SockAsyncSelectCompletion()

VOID WSPAPI SockAsyncSelectCompletion ( PVOID  Context,
PIO_STATUS_BLOCK  IoStatusBlock 
)

◆ SockAsyncSelectHelper()

INT WSPAPI SockAsyncSelectHelper ( IN PSOCKET_INFORMATION  Socket,
IN HWND  hWnd,
IN UINT  wMsg,
IN LONG  Events 
)

◆ SockAsyncThread()

INT WSPAPI SockAsyncThread ( PVOID  ThreadParam)

Definition at line 3979 of file dllmain.c.

3980{
3981 PVOID AsyncContext;
3982 PASYNC_COMPLETION_ROUTINE AsyncCompletionRoutine;
3983 IO_STATUS_BLOCK IOSB;
3985
3986 /* Make the Thread Higher Priority */
3988
3989 /* Do a KQUEUE/WorkItem Style Loop, thanks to IoCompletion Ports */
3990 do
3991 {
3993 (PVOID*)&AsyncCompletionRoutine,
3994 &AsyncContext,
3995 &IOSB,
3996 NULL);
3997 /* Call the Async Function */
3998 if (NT_SUCCESS(Status))
3999 {
4000 (*AsyncCompletionRoutine)(AsyncContext, &IOSB);
4001 }
4002 else
4003 {
4004 /* It Failed, sleep for a second */
4005 Sleep(1000);
4006 }
4007 } while ((Status != STATUS_TIMEOUT));
4008
4009 /* The Thread has Ended */
4010 return 0;
4011}
LONG NTSTATUS
Definition: precomp.h:26
#define STATUS_TIMEOUT
Definition: d3dkmdt.h:49
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
BOOL WINAPI SetThreadPriority(IN HANDLE hThread, IN int nPriority)
Definition: thread.c:700
HANDLE SockAsyncCompletionPort
Definition: dllmain.c:28
VOID(* PASYNC_COMPLETION_ROUTINE)(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: msafd.h:511
Status
Definition: gdiplustypes.h:25
NTSTATUS NTAPI NtRemoveIoCompletion(IN HANDLE IoCompletionHandle, OUT PVOID *KeyContext, OUT PVOID *ApcContext, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: iocomp.c:445
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:726
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1146
#define THREAD_PRIORITY_ABOVE_NORMAL
Definition: winbase.h:299

Referenced by SockCreateOrReferenceAsyncThread().

◆ SockBuildSockaddr()

INT WSPAPI SockBuildSockaddr ( OUT PSOCKADDR  Sockaddr,
OUT PINT  SockaddrLength,
IN PTRANSPORT_ADDRESS  TdiAddress 
)

◆ SockBuildTdiAddress()

INT WSPAPI SockBuildTdiAddress ( OUT PTRANSPORT_ADDRESS  TdiAddress,
IN PSOCKADDR  Sockaddr,
IN INT  SockaddrLength 
)

◆ SockCancelIo()

VOID WSPAPI SockCancelIo ( IN SOCKET  Handle)

◆ SockCheckAndInitAsyncSelectHelper()

BOOLEAN WSPAPI SockCheckAndInitAsyncSelectHelper ( VOID  )

◆ SockCheckAndReferenceAsyncThread()

BOOLEAN WSPAPI SockCheckAndReferenceAsyncThread ( VOID  )

◆ SockCloseSocket()

INT WSPAPI SockCloseSocket ( IN PSOCKET_INFORMATION  Socket)

◆ SockCreateAsyncQueuePort()

INT WSPAPI SockCreateAsyncQueuePort ( VOID  )

◆ SockDeleteRwLock()

NTSTATUS WSPAPI SockDeleteRwLock ( IN PSOCK_RW_LOCK  Lock)

◆ SockDereferenceHelperDll()

FORCEINLINE VOID WSPAPI SockDereferenceHelperDll ( IN PHELPER_DATA  Helper)

Definition at line 420 of file msafdlib.h.

421{
422 /* Dereference and see if it's the last count */
423 if (!InterlockedDecrement(&Helper->RefCount))
424 {
425 /* Destroy the Helper DLL */
426 SockFreeHelperDll(Helper);
427 }
428}
#define InterlockedDecrement
Definition: armddk.h:52
VOID WSPAPI SockFreeHelperDll(IN PHELPER_DATA Helper)

◆ SockDereferenceSocket()

VOID WSPAPI SockDereferenceSocket ( IN PSOCKET_INFORMATION  Socket)

◆ SockEnterApiFast()

FORCEINLINE INT WSPAPI SockEnterApiFast ( OUT PWINSOCK_TEB_DATA ThreadData)

Definition at line 402 of file msafdlib.h.

403{
404 /* Make sure we aren't terminating and get our thread data */
405 if (!(SockProcessTerminating) &&
406 (SockWspStartupCount > 0) &&
407 ((*ThreadData = NtCurrentTeb()->WinSockData)))
408 {
409 /* Everything is good, return */
410 return NO_ERROR;
411 }
412
413 /* Something didn't work out, use the slow path */
415}
#define NO_ERROR
Definition: dderror.h:5
#define NtCurrentTeb
LONG SockWspStartupCount
INT WSPAPI SockEnterApiSlow(OUT PWINSOCK_TEB_DATA *ThreadData)
BOOL SockProcessTerminating

◆ SockEnterApiSlow()

INT WSPAPI SockEnterApiSlow ( OUT PWINSOCK_TEB_DATA ThreadData)

Referenced by SockEnterApiFast().

◆ SockEventSelectHelper()

INT WSPAPI SockEventSelectHelper ( IN PSOCKET_INFORMATION  Socket,
IN WSAEVENT  EventObject,
IN LONG  Events 
)

◆ SockFindAndReferenceSocket()

PSOCKET_INFORMATION WSPAPI SockFindAndReferenceSocket ( IN SOCKET  Handle,
IN BOOLEAN  Import 
)

◆ SockFreeHelperDll()

VOID WSPAPI SockFreeHelperDll ( IN PHELPER_DATA  Helper)

◆ SockGetConnectData()

INT WSPAPI SockGetConnectData ( IN PSOCKET_INFORMATION  Socket,
IN ULONG  Ioctl,
IN PVOID  Buffer,
IN ULONG  BufferLength,
OUT PULONG  BufferReturned 
)

◆ SockGetInformation()

INT WSPAPI SockGetInformation ( IN PSOCKET_INFORMATION  Socket,
IN ULONG  AfdInformationClass,
IN PVOID ExtraData  OPTIONAL,
IN ULONG  ExtraDataSize,
IN OUT PBOOLEAN Boolean  OPTIONAL,
IN OUT PULONG Ulong  OPTIONAL,
IN OUT PLARGE_INTEGER LargeInteger  OPTIONAL 
)

◆ SockGetTdiHandles()

INT WSPAPI SockGetTdiHandles ( IN PSOCKET_INFORMATION  Socket)

◆ SockGetTdiName()

INT WSPAPI SockGetTdiName ( PINT  AddressFamily,
PINT  SocketType,
PINT  Protocol,
LPGUID  ProviderId,
GROUP  Group,
DWORD  Flags,
PUNICODE_STRING  TransportName,
PVOID HelperDllContext,
PHELPER_DATA HelperDllData,
PDWORD  Events 
)

◆ SockHandleAsyncIndication()

VOID WSPAPI SockHandleAsyncIndication ( IN PASYNC_COMPLETION_ROUTINE  Callback,
IN PVOID  Context,
IN PIO_STATUS_BLOCK  IoStatusBlock 
)

◆ SockInitializeHeap()

PVOID WSPAPI SockInitializeHeap ( IN HANDLE  Heap,
IN ULONG  Flags,
IN ULONG  Size 
)

◆ SockInitializeRwLockAndSpinCount()

NTSTATUS WSPAPI SockInitializeRwLockAndSpinCount ( IN PSOCK_RW_LOCK  Lock,
IN ULONG  SpinCount 
)

◆ SockIoCompletion()

VOID WSPAPI SockIoCompletion ( IN PVOID  ApcContext,
IN PIO_STATUS_BLOCK  IoStatusBlock,
DWORD  Reserved 
)

◆ SockIsAddressConsistentWithConstrainedGroup()

INT WSPAPI SockIsAddressConsistentWithConstrainedGroup ( IN PSOCKET_INFORMATION  Socket,
IN GROUP  Group,
IN PSOCKADDR  SocketAddress,
IN INT  SocketAddressLength 
)

◆ SockIsSocketConnected()

BOOLEAN WSPAPI SockIsSocketConnected ( IN PSOCKET_INFORMATION  Socket)

◆ SockIsTripleInMapping()

BOOL WSPAPI SockIsTripleInMapping ( IN PWINSOCK_MAPPING  Mapping,
IN INT  AddressFamily,
OUT PBOOLEAN  AfMatch,
IN INT  SocketType,
OUT PBOOLEAN  SockMatch,
IN INT  Protocol,
OUT PBOOLEAN  ProtoMatch 
)

◆ SockLoadHelperDll()

INT WSPAPI SockLoadHelperDll ( PWSTR  TransportName,
PWINSOCK_MAPPING  Mapping,
PHELPER_DATA HelperDllData 
)

Definition at line 298 of file helpers.c.

302{
303 PHELPER_DATA HelperData;
304 PWSTR HelperDllName;
305 PWSTR FullHelperDllName;
306 PWSTR HelperKey;
309 LONG Status;
310
311 /* Allocate space for the Helper Structure and TransportName */
312 HelperData = HeapAlloc(GlobalHeap, 0, sizeof(*HelperData) + (wcslen(TransportName) + 1) * sizeof(WCHAR));
313
314 /* Check for error */
315 if (HelperData == NULL) {
316 ERR("Buffer allocation failed\n");
317 return WSAEINVAL;
318 }
319
320 /* Allocate Space for the Helper DLL Key */
321 HelperKey = HeapAlloc(GlobalHeap, 0, (54 + wcslen(TransportName)) * sizeof(WCHAR));
322
323 /* Check for error */
324 if (HelperKey == NULL) {
325 ERR("Buffer allocation failed\n");
326 HeapFree(GlobalHeap, 0, HelperData);
327 return WSAEINVAL;
328 }
329
330 /* Generate the right key name */
331 wcscpy(HelperKey, L"System\\CurrentControlSet\\Services\\");
332 wcscat(HelperKey, TransportName);
333 wcscat(HelperKey, L"\\Parameters\\Winsock");
334
335 /* Open the Key */
337
338 HeapFree(GlobalHeap, 0, HelperKey);
339
340 /* Check for error */
341 if (Status) {
342 ERR("Error reading helper DLL parameters\n");
343 HeapFree(GlobalHeap, 0, HelperData);
344 return WSAEINVAL;
345 }
346
347 /* Read Size of SockAddr Structures */
348 DataSize = sizeof(HelperData->MinWSAddressLength);
349 HelperData->MinWSAddressLength = 16;
351 L"MinSockaddrLength",
352 NULL,
353 NULL,
354 (LPBYTE)&HelperData->MinWSAddressLength,
355 &DataSize);
356 DataSize = sizeof(HelperData->MinWSAddressLength);
357 HelperData->MaxWSAddressLength = 16;
359 L"MaxSockaddrLength",
360 NULL,
361 NULL,
362 (LPBYTE)&HelperData->MaxWSAddressLength,
363 &DataSize);
364
365 /* Size of TDI Structures */
366 HelperData->MinTDIAddressLength = HelperData->MinWSAddressLength + 6;
367 HelperData->MaxTDIAddressLength = HelperData->MaxWSAddressLength + 6;
368
369 /* Read Delayed Acceptance Setting */
370 DataSize = sizeof(DWORD);
371 HelperData->UseDelayedAcceptance = FALSE;
373 L"UseDelayedAcceptance",
374 NULL,
375 NULL,
376 (LPBYTE)&HelperData->UseDelayedAcceptance,
377 &DataSize);
378
379 /* Allocate Space for the Helper DLL Names */
380 HelperDllName = HeapAlloc(GlobalHeap, 0, 512);
381
382 /* Check for error */
383 if (HelperDllName == NULL) {
384 ERR("Buffer allocation failed\n");
385 HeapFree(GlobalHeap, 0, HelperData);
386 return WSAEINVAL;
387 }
388
389 FullHelperDllName = HeapAlloc(GlobalHeap, 0, 512);
390
391 /* Check for error */
392 if (FullHelperDllName == NULL) {
393 ERR("Buffer allocation failed\n");
394 HeapFree(GlobalHeap, 0, HelperDllName);
395 HeapFree(GlobalHeap, 0, HelperData);
396 return WSAEINVAL;
397 }
398
399 /* Get the name of the Helper DLL*/
400 DataSize = 512;
402 L"HelperDllName",
403 NULL,
404 NULL,
405 (LPBYTE)HelperDllName,
406 &DataSize);
407
408 /* Check for error */
409 if (Status) {
410 ERR("Error reading helper DLL parameters\n");
411 HeapFree(GlobalHeap, 0, FullHelperDllName);
412 HeapFree(GlobalHeap, 0, HelperDllName);
413 HeapFree(GlobalHeap, 0, HelperData);
414 return WSAEINVAL;
415 }
416
417 /* Get the Full name, expanding Environment Strings */
418 ExpandEnvironmentStringsW (HelperDllName,
419 FullHelperDllName,
420 256);
421
422 /* Load the DLL */
423 HelperData->hInstance = LoadLibraryW(FullHelperDllName);
424
425 HeapFree(GlobalHeap, 0, HelperDllName);
426 HeapFree(GlobalHeap, 0, FullHelperDllName);
427
428 if (HelperData->hInstance == NULL) {
429 ERR("Error loading helper DLL\n");
430 HeapFree(GlobalHeap, 0, HelperData);
431 return WSAEINVAL;
432 }
433
434 /* Close Key */
436
437 /* Get the Pointers to the Helper Routines */
438 HelperData->WSHOpenSocket = (PWSH_OPEN_SOCKET)
439 GetProcAddress(HelperData->hInstance,
440 "WSHOpenSocket");
441 HelperData->WSHOpenSocket2 = (PWSH_OPEN_SOCKET2)
442 GetProcAddress(HelperData->hInstance,
443 "WSHOpenSocket2");
444 HelperData->WSHJoinLeaf = (PWSH_JOIN_LEAF)
445 GetProcAddress(HelperData->hInstance,
446 "WSHJoinLeaf");
447 HelperData->WSHNotify = (PWSH_NOTIFY)
448 GetProcAddress(HelperData->hInstance, "WSHNotify");
450 GetProcAddress(HelperData->hInstance,
451 "WSHGetSocketInformation");
453 GetProcAddress(HelperData->hInstance,
454 "WSHSetSocketInformation");
456 GetProcAddress(HelperData->hInstance,
457 "WSHGetSockaddrType");
459 GetProcAddress(HelperData->hInstance,
460 "WSHGetWildcardSockaddr");
462 GetProcAddress(HelperData->hInstance,
463 "WSHGetBroadcastSockaddr");
465 GetProcAddress(HelperData->hInstance,
466 "WSHAddressToString");
468 GetProcAddress(HelperData->hInstance,
469 "WSHStringToAddress");
470 HelperData->WSHIoctl = (PWSH_IOCTL)
471 GetProcAddress(HelperData->hInstance,
472 "WSHIoctl");
473
474 /* Save the Mapping Structure and transport name */
475 HelperData->Mapping = Mapping;
476 wcscpy(HelperData->TransportName, TransportName);
477
478 /* Increment Reference Count */
479 HelperData->RefCount = 1;
480
481 /* Add it to our list */
483
484 /* Return Pointers */
485 *HelperDllData = HelperData;
486 return 0;
487}
#define ERR(fmt,...)
Definition: precomp.h:57
#define RegCloseKey(hKey)
Definition: registry.h:49
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
#define GetProcAddress(x, y)
Definition: compat.h:753
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define LoadLibraryW(x)
Definition: compat.h:747
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:520
LIST_ENTRY SockHelpersListHead
Definition: dllmain.c:25
HANDLE GlobalHeap
Definition: dllmain.c:19
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
#define L(x)
Definition: resources.c:13
static PVOID Mapping[EMS_PHYSICAL_PAGES]
Definition: emsdrv.c:41
#define InsertHeadList(ListHead, Entry)
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
Definition: ndis.h:4755
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
#define KEY_READ
Definition: nt_native.h:1026
#define DWORD
Definition: nt_native.h:44
long LONG
Definition: pedump.c:60
wcscat
wcscpy
BOOLEAN UseDelayedAcceptance
Definition: helpers.h:20
INT MaxTDIAddressLength
Definition: helpers.h:19
PWSH_GET_SOCKADDR_TYPE WSHGetSockaddrType
Definition: helpers.h:28
PWSH_JOIN_LEAF WSHJoinLeaf
Definition: helpers.h:24
HANDLE hInstance
Definition: helpers.h:15
PWSH_GET_SOCKET_INFORMATION WSHGetSocketInformation
Definition: helpers.h:26
INT MinWSAddressLength
Definition: helpers.h:16
PWSH_STRING_TO_ADDRESS WSHStringToAddress
Definition: helpers.h:32
PWSH_ADDRESS_TO_STRING WSHAddressToString
Definition: helpers.h:31
PWSH_IOCTL WSHIoctl
Definition: helpers.h:33
PWSH_OPEN_SOCKET WSHOpenSocket
Definition: helpers.h:22
PWSH_SET_SOCKET_INFORMATION WSHSetSocketInformation
Definition: helpers.h:27
PWSH_NOTIFY WSHNotify
Definition: helpers.h:25
INT MaxWSAddressLength
Definition: helpers.h:17
PWSH_GET_BROADCAST_SOCKADDR WSHGetBroadcastSockaddr
Definition: helpers.h:30
PWINSOCK_MAPPING Mapping
Definition: helpers.h:21
INT MinTDIAddressLength
Definition: helpers.h:18
LONG RefCount
Definition: helpers.h:14
WCHAR TransportName[1]
Definition: helpers.h:34
LIST_ENTRY Helpers
Definition: helpers.h:13
PWSH_OPEN_SOCKET2 WSHOpenSocket2
Definition: helpers.h:23
PWSH_GET_WILDCARD_SOCKADDR WSHGetWildcardSockaddr
Definition: helpers.h:29
uint16_t * PWSTR
Definition: typedefs.h:56
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define WSAEINVAL
Definition: winerror.h:2845
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
INT(WINAPI * PWSH_GET_BROADCAST_SOCKADDR)(PVOID, PSOCKADDR, PINT)
Definition: wsahelp.h:69
INT(WINAPI * PWSH_GET_WILDCARD_SOCKADDR)(PVOID, PSOCKADDR, PINT)
Definition: wsahelp.h:73
INT(WINAPI * PWSH_SET_SOCKET_INFORMATION)(PVOID, SOCKET, HANDLE, HANDLE, INT, INT, PCHAR, INT)
Definition: wsahelp.h:83
INT(WINAPI * PWSH_GET_SOCKADDR_TYPE)(PSOCKADDR, DWORD, PSOCKADDR_INFO)
Definition: wsahelp.h:71
INT(WINAPI * PWSH_OPEN_SOCKET2)(PINT, PINT, PINT, GROUP, DWORD, PUNICODE_STRING, PVOID *, PDWORD)
Definition: wsahelp.h:82
INT(WINAPI * PWSH_NOTIFY)(PVOID, SOCKET, HANDLE, HANDLE, DWORD)
Definition: wsahelp.h:80
INT(WINAPI * PWSH_JOIN_LEAF)(PVOID, SOCKET, HANDLE, HANDLE, PVOID, SOCKET, PSOCKADDR, DWORD, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD)
Definition: wsahelp.h:78
INT(WINAPI * PWSH_STRING_TO_ADDRESS)(LPWSTR, DWORD, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPDWORD)
Definition: wsahelp.h:84
INT(WINAPI * PWSH_OPEN_SOCKET)(PINT, PINT, PINT, PUNICODE_STRING, PVOID, PDWORD)
Definition: wsahelp.h:81
INT(WINAPI * PWSH_IOCTL)(PVOID, SOCKET, HANDLE, HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE, LPBOOL)
Definition: wsahelp.h:76
INT(WINAPI * PWSH_ADDRESS_TO_STRING)(LPSOCKADDR, INT, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD)
Definition: wsahelp.h:67
INT(WINAPI * PWSH_GET_SOCKET_INFORMATION)(PVOID, SOCKET, HANDLE, HANDLE, INT, INT, PCHAR, LPINT)
Definition: wsahelp.h:72
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by SockGetTdiName().

◆ SockLoadTransportList()

INT WSPAPI SockLoadTransportList ( PWSTR TransportList)

Definition at line 232 of file helpers.c.

234{
235 ULONG TransportListSize;
237 LONG Status;
238
239 TRACE("Called\n");
240
241 /* Open the Transports Key */
243 L"SYSTEM\\CurrentControlSet\\Services\\Winsock\\Parameters",
244 0,
245 KEY_READ,
246 &KeyHandle);
247
248 /* Check for error */
249 if (Status) {
250 ERR("Error reading transport list registry\n");
251 return WSAEINVAL;
252 }
253
254 /* Get the Transport List Size */
256 L"Transports",
257 NULL,
258 NULL,
259 NULL,
260 &TransportListSize);
261
262 /* Check for error */
263 if (Status) {
264 ERR("Error reading transport list registry\n");
265 return WSAEINVAL;
266 }
267
268 /* Allocate Memory for the Transport List */
269 *TransportList = HeapAlloc(GlobalHeap, 0, TransportListSize);
270
271 /* Check for error */
272 if (*TransportList == NULL) {
273 ERR("Buffer allocation failed\n");
274 return WSAEINVAL;
275 }
276
277 /* Get the Transports */
279 L"Transports",
280 NULL,
281 NULL,
282 (LPBYTE)*TransportList,
283 &TransportListSize);
284
285 /* Check for error */
286 if (Status) {
287 ERR("Error reading transport list registry\n");
288 HeapFree(GlobalHeap, 0, *TransportList);
289 return WSAEINVAL;
290 }
291
292 /* Close key and return */
294 return 0;
295}
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by SockGetTdiName().

◆ SockLoadTransportMapping()

INT WSPAPI SockLoadTransportMapping ( PWSTR  TransportName,
PWINSOCK_MAPPING Mapping 
)

Definition at line 161 of file helpers.c.

164{
165 PWSTR TransportKey;
167 ULONG MappingSize;
168 LONG Status;
169
170 TRACE("TransportName %ws\n", TransportName);
171
172 /* Allocate a Buffer */
173 TransportKey = HeapAlloc(GlobalHeap, 0, (54 + wcslen(TransportName)) * sizeof(WCHAR));
174
175 /* Check for error */
176 if (TransportKey == NULL) {
177 ERR("Buffer allocation failed\n");
178 return WSAEINVAL;
179 }
180
181 /* Generate the right key name */
182 wcscpy(TransportKey, L"System\\CurrentControlSet\\Services\\");
183 wcscat(TransportKey, TransportName);
184 wcscat(TransportKey, L"\\Parameters\\Winsock");
185
186 /* Open the Key */
188
189 /* We don't need the Transport Key anymore */
190 HeapFree(GlobalHeap, 0, TransportKey);
191
192 /* Check for error */
193 if (Status) {
194 ERR("Error reading transport mapping registry\n");
195 return WSAEINVAL;
196 }
197
198 /* Find out how much space we need for the Mapping */
199 Status = RegQueryValueExW(KeyHandle, L"Mapping", NULL, NULL, NULL, &MappingSize);
200
201 /* Check for error */
202 if (Status) {
203 ERR("Error reading transport mapping registry\n");
204 return WSAEINVAL;
205 }
206
207 /* Allocate Memory for the Mapping */
208 *Mapping = HeapAlloc(GlobalHeap, 0, MappingSize);
209
210 /* Check for error */
211 if (*Mapping == NULL) {
212 ERR("Buffer allocation failed\n");
213 return WSAEINVAL;
214 }
215
216 /* Read the Mapping */
217 Status = RegQueryValueExW(KeyHandle, L"Mapping", NULL, NULL, (LPBYTE)*Mapping, &MappingSize);
218
219 /* Check for error */
220 if (Status) {
221 ERR("Error reading transport mapping registry\n");
223 return WSAEINVAL;
224 }
225
226 /* Close key and return */
228 return 0;
229}

Referenced by SockGetTdiName().

◆ SockNotifyHelperDll()

INT WSPAPI SockNotifyHelperDll ( IN PSOCKET_INFORMATION  Socket,
IN DWORD  Event 
)

◆ SockProcessAsyncSelect()

VOID WSPAPI SockProcessAsyncSelect ( PSOCKET_INFORMATION  Socket,
PASYNC_DATA  AsyncData 
)

Definition at line 4204 of file dllmain.c.

4205{
4206
4207 ULONG lNetworkEvents;
4209
4210 /* Set up the Async Data Event Info */
4211 AsyncData->AsyncSelectInfo.Timeout.HighPart = 0x7FFFFFFF;
4212 AsyncData->AsyncSelectInfo.Timeout.LowPart = 0xFFFFFFFF;
4213 AsyncData->AsyncSelectInfo.HandleCount = 1;
4214 AsyncData->AsyncSelectInfo.Exclusive = TRUE;
4215 AsyncData->AsyncSelectInfo.Handles[0].Handle = Socket->Handle;
4216 AsyncData->AsyncSelectInfo.Handles[0].Events = 0;
4217
4218 /* Remove unwanted events */
4219 lNetworkEvents = Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents);
4220
4221 /* Set Events to wait for */
4222 if (lNetworkEvents & FD_READ)
4223 {
4225 }
4226
4227 if (lNetworkEvents & FD_WRITE)
4228 {
4230 }
4231
4232 if (lNetworkEvents & FD_OOB)
4233 {
4235 }
4236
4237 if (lNetworkEvents & FD_ACCEPT)
4238 {
4240 }
4241
4242 /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
4243 if (lNetworkEvents & FD_CONNECT)
4244 {
4246 }
4247
4248 if (lNetworkEvents & FD_CLOSE)
4249 {
4251 }
4252
4253 if (lNetworkEvents & FD_QOS)
4254 {
4256 }
4257
4258 if (lNetworkEvents & FD_GROUP_QOS)
4259 {
4261 }
4262
4263 /* Send IOCTL */
4265 NULL,
4266 NULL,
4267 AsyncData,
4268 &AsyncData->IoStatusBlock,
4270 &AsyncData->AsyncSelectInfo,
4271 sizeof(AsyncData->AsyncSelectInfo),
4272 &AsyncData->AsyncSelectInfo,
4273 sizeof(AsyncData->AsyncSelectInfo));
4274
4275 /* I/O Manager Won't call the completion routine, let's do it manually */
4276 if (NT_SUCCESS(Status))
4277 {
4278 return;
4279 }
4280 else
4281 {
4282 AsyncData->IoStatusBlock.Status = Status;
4283 SockAsyncSelectCompletionRoutine(AsyncData, &AsyncData->IoStatusBlock);
4284 }
4285}
#define TRUE
Definition: types.h:120
VOID SockAsyncSelectCompletionRoutine(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: dllmain.c:4075
HANDLE SockAsyncHelperAfdHandle
Definition: dllmain.c:27
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)
#define AFD_EVENT_ACCEPT
Definition: shared.h:216
#define AFD_EVENT_SEND
Definition: shared.h:211
#define AFD_EVENT_OOB_RECEIVE
Definition: shared.h:210
#define AFD_EVENT_CONNECT_FAIL
Definition: shared.h:217
#define AFD_EVENT_RECEIVE
Definition: shared.h:209
#define IOCTL_AFD_SELECT
Definition: shared.h:292
#define AFD_EVENT_DISCONNECT
Definition: shared.h:212
#define AFD_EVENT_ABORT
Definition: shared.h:213
#define AFD_EVENT_QOS
Definition: shared.h:218
#define AFD_EVENT_CLOSE
Definition: shared.h:214
#define AFD_EVENT_CONNECT
Definition: shared.h:215
#define AFD_EVENT_GROUP_QOS
Definition: shared.h:219
SOCKET Handle
Definition: shared.h:50
ULONG Events
Definition: shared.h:51
LARGE_INTEGER Timeout
Definition: shared.h:56
ULONG HandleCount
Definition: shared.h:57
AFD_HANDLE Handles[1]
Definition: shared.h:59
ULONG_PTR Exclusive
Definition: shared.h:58
AFD_POLL_INFO AsyncSelectInfo
Definition: msafd.h:80
IO_STATUS_BLOCK IoStatusBlock
Definition: msafd.h:79
PSOCK_SHARED_INFO SharedData
Definition: msafd.h:47
SOCKET Handle
Definition: msafd.h:46
LONG AsyncEvents
Definition: shared.h:408
ULONG LowPart
Definition: typedefs.h:106
#define FD_QOS
Definition: winsock2.h:300
#define FD_GROUP_QOS
Definition: winsock2.h:302
#define FD_READ
Definition: winsock.h:399
#define FD_WRITE
Definition: winsock.h:400
#define FD_CLOSE
Definition: winsock.h:404
#define FD_CONNECT
Definition: winsock.h:403
#define FD_OOB
Definition: winsock.h:401
#define FD_ACCEPT
Definition: winsock.h:402

Referenced by SockAsyncSelectCompletionRoutine(), and SockProcessQueuedAsyncSelect().

◆ SockProcessQueuedAsyncSelect()

VOID WSPAPI SockProcessQueuedAsyncSelect ( PVOID  Context,
PIO_STATUS_BLOCK  IoStatusBlock 
)

Definition at line 4287 of file dllmain.c.

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

Referenced by SockReenableAsyncSelectEvent(), and WSPAsyncSelect().

◆ SockReenableAsyncSelectEvent()

INT WSPAPI SockReenableAsyncSelectEvent ( IN PSOCKET_INFORMATION  Socket,
IN ULONG  Event 
)

Definition at line 4321 of file dllmain.c.

4323{
4324 PASYNC_DATA AsyncData;
4325
4326 /* Make sure the event is actually disabled */
4327 if (!(Socket->SharedData->AsyncDisabledEvents & Event))
4328 {
4329 return;
4330 }
4331
4332 /* Re-enable it */
4333 Socket->SharedData->AsyncDisabledEvents &= ~Event;
4334
4335 /* Return if no more events are being polled */
4336 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 )
4337 {
4338 return;
4339 }
4340
4341 /* Wait on new events */
4342 AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(ASYNC_DATA));
4343 if (!AsyncData) return;
4344
4345 /* Create the Asynch Thread if Needed */
4347
4348 /* Increase the sequence number to stop anything else */
4349 Socket->SharedData->SequenceNumber++;
4350
4351 /* Set up the Async Data */
4352 AsyncData->ParentSocket = Socket;
4353 AsyncData->SequenceNumber = Socket->SharedData->SequenceNumber;
4354
4355 /* Begin Async Select by using I/O Completion */
4358 AsyncData,
4359 0,
4360 0);
4361
4362 /* All done */
4363 return;
4364}
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
Definition: dllmain.c:3918
VOID SockProcessQueuedAsyncSelect(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: dllmain.c:4287
NTSTATUS NTAPI NtSetIoCompletion(IN HANDLE IoCompletionPortHandle, IN PVOID CompletionKey, IN PVOID CompletionContext, IN NTSTATUS CompletionStatus, IN ULONG CompletionInformation)
Definition: iocomp.c:569

Referenced by MsafdConnectAPC(), MsafdRecvAPC(), MsafdSendAPC(), MsafdUpdateConnectionContext(), WSPAccept(), WSPConnect(), WSPGetOverlappedResult(), WSPRecv(), WSPRecvFrom(), WSPSend(), and WSPSendTo().

◆ SockReleaseRwLockExclusive()

VOID WSPAPI SockReleaseRwLockExclusive ( IN PSOCK_RW_LOCK  Lock)

◆ SockReleaseRwLockShared()

VOID WSPAPI SockReleaseRwLockShared ( IN PSOCK_RW_LOCK  Lock)

◆ SockSanGetTcpipCatalogId()

VOID WSPAPI SockSanGetTcpipCatalogId ( VOID  )

◆ SockSanInitialize()

VOID WSPAPI SockSanInitialize ( VOID  )

◆ SockSetHandleContext()

INT WSPAPI SockSetHandleContext ( IN PSOCKET_INFORMATION  Socket)

◆ SockSetInformation()

INT WSPAPI SockSetInformation ( IN PSOCKET_INFORMATION  Socket,
IN ULONG  AfdInformationClass,
IN PBOOLEAN Boolean  OPTIONAL,
IN PULONG Ulong  OPTIONAL,
IN PLARGE_INTEGER LargeInteger  OPTIONAL 
)

◆ SockSocket()

INT WSPAPI SockSocket ( INT  AddressFamily,
INT  SocketType,
INT  Protocol,
LPGUID  ProviderId,
GROUP  g,
DWORD  dwFlags,
DWORD  ProviderFlags,
DWORD  ServiceFlags,
DWORD  CatalogEntryId,
PSOCKET_INFORMATION NewSocket 
)

◆ SockUpdateWindowSizes()

INT WSPAPI SockUpdateWindowSizes ( IN PSOCKET_INFORMATION  Socket,
IN BOOLEAN  Force 
)

◆ SockWaitForSingleObject()

BOOL WSPAPI SockWaitForSingleObject ( IN HANDLE  Handle,
IN SOCKET  SocketHandle,
IN DWORD  BlockingFlags,
IN DWORD  TimeoutFlags 
)

◆ WSPAccept()

SOCKET WSPAPI WSPAccept ( IN SOCKET  s,
OUT LPSOCKADDR  addr,
IN OUT LPINT  addrlen,
IN LPCONDITIONPROC  lpfnCondition,
IN DWORD  dwCallbackData,
OUT LPINT  lpErrno 
)

◆ WSPAddressToString()

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

Definition at line 3381 of file dllmain.c.

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

Referenced by WSPStartup().

◆ WSPAsyncSelect()

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

Definition at line 17 of file sndrcv.c.

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

Referenced by WSPStartup().

◆ WSPBind()

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

◆ WSPCancelBlockingCall()

INT WSPAPI WSPCancelBlockingCall ( OUT LPINT  lpErrno)

Definition at line 15 of file stubs.c.

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

Referenced by WSPStartup().

◆ WSPCleanup()

INT WSPAPI WSPCleanup ( OUT LPINT  lpErrno)

Definition at line 3565 of file dllmain.c.

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

Referenced by WSPStartup(), and WsTpWSPCleanup().

◆ WSPCloseSocket()

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

Definition at line 637 of file dllmain.c.

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

Referenced by WSPAccept(), and WSPStartup().

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

◆ WSPDuplicateSocket()

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

Definition at line 449 of file dllmain.c.

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

Referenced by WSPStartup().

◆ 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}
INT TranslateNtStatusError(NTSTATUS Status)
Definition: dllmain.c:537
#define IOCTL_AFD_ENUM_NETWORK_EVENTS
Definition: shared.h:342
#define STATUS_SUCCESS
Definition: shellext.h:65
NTSTATUS EventStatus[AFD_MAX_EVENTS]
Definition: shared.h:138
#define FD_CONNECT_BIT
Definition: winsock2.h:295
#define FD_CLOSE_BIT
Definition: winsock2.h:297
#define FD_OOB_BIT
Definition: winsock2.h:291
#define FD_GROUP_QOS_BIT
Definition: winsock2.h:301
#define FD_ACCEPT_BIT
Definition: winsock2.h:293
#define FD_READ_BIT
Definition: winsock2.h:287
#define FD_QOS_BIT
Definition: winsock2.h:299
#define FD_WRITE_BIT
Definition: winsock2.h:289

Referenced by WSPStartup().

◆ WSPEventSelect()

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

Definition at line 17 of file event.c.

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

Referenced by WSPAsyncSelect(), and WSPStartup().

◆ WSPGetOverlappedResult()

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

Definition at line 96 of file sndrcv.c.

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

Referenced by WSPStartup().

◆ WSPGetPeerName()

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

Definition at line 2463 of file dllmain.c.

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

Referenced by WSPStartup().

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

Referenced by WSPStartup().

◆ WSPGetSockName()

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

Definition at line 2361 of file dllmain.c.

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

Referenced by WSPStartup().

◆ WSPGetSockOpt()

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

Definition at line 2814 of file dllmain.c.

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

Referenced by WSPStartup().

◆ WSPIoctl()

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

Definition at line 2566 of file dllmain.c.

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

Referenced by WSPStartup().

◆ 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}
UINT_PTR SOCKET
Definition: winsock.h:41

Referenced by WSPStartup().

◆ WSPListen()

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

◆ WSPRecv()

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

◆ WSPRecvDisconnect()

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

Definition at line 1052 of file sndrcv.c.

1055{
1057 return 0;
1058}

Referenced by WSPStartup().

◆ 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 LPFD_SET  readfds,
IN OUT LPFD_SET  writefds,
IN OUT LPFD_SET  exceptfds,
IN CONST LPTIMEVAL  timeout,
OUT LPINT  lpErrno 
)

◆ WSPSend()

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

◆ WSPSendDisconnect()

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

Definition at line 1064 of file sndrcv.c.

1067{
1069 return 0;
1070}

Referenced by WSPStartup().

◆ WSPSendTo()

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

◆ WSPSetSockOpt()

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

Definition at line 3100 of file dllmain.c.

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

Referenced by WSPStartup().

◆ WSPShutdown()

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

◆ WSPSocket()

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

◆ WSPStringToAddress()

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

Definition at line 3441 of file dllmain.c.

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

Referenced by WSPStartup().

Variable Documentation

◆ g_fRnrLockInit

BOOLEAN g_fRnrLockInit
extern

◆ g_RnrLock

CRITICAL_SECTION g_RnrLock
extern

◆ gWSM_NSPCallRef

LONG gWSM_NSPCallRef
extern

◆ gWSM_NSPStartupRef

LONG gWSM_NSPStartupRef
extern

◆ MSWSOCK_SocketLock

CRITICAL_SECTION MSWSOCK_SocketLock
extern

◆ NlsMsgSourcemModuleHandle

HINSTANCE NlsMsgSourcemModuleHandle
extern

◆ SockAllocateHeapRoutine

PRTL_HEAP_ALLOCATE SockAllocateHeapRoutine
extern

◆ SockAsyncQueuePort

HANDLE SockAsyncQueuePort
extern

◆ SockAsyncSelectCalled

BOOLEAN SockAsyncSelectCalled
extern

Definition at line 29 of file dllmain.c.

Referenced by SockGetAsyncSelectHelperAfdHandle().

◆ SockAsyncThreadReferenceCount

LONG SockAsyncThreadReferenceCount
extern

◆ SockBufferKeyTable

PVOID SockBufferKeyTable
extern

◆ SockBufferKeyTableSize

ULONG SockBufferKeyTableSize
extern

◆ SockContextTable

PWAH_HANDLE_TABLE SockContextTable
extern

◆ SocketGlobalLock

SOCK_RW_LOCK SocketGlobalLock
extern

◆ SockHelperDllListHead

LIST_ENTRY SockHelperDllListHead
extern

◆ SockModuleHandle

HINSTANCE SockModuleHandle
extern

◆ SockPrivateHeap

HANDLE SockPrivateHeap
extern

◆ SockProcessPendingAPCCount

LONG SockProcessPendingAPCCount
extern

◆ SockProcessTerminating

BOOL SockProcessTerminating
extern

Referenced by SockEnterApiFast().

◆ SockReceiveBufferWindow

DWORD SockReceiveBufferWindow
extern

◆ SockSanCleanUpCompleteEvent

HANDLE SockSanCleanUpCompleteEvent
extern

◆ SockSanEnabled

BOOLEAN SockSanEnabled
extern

◆ SockSendBufferWindow

DWORD SockSendBufferWindow
extern

◆ SockTcpProviderInfo

WSAPROTOCOL_INFOW SockTcpProviderInfo
extern

◆ SockUpcallTable

LPWSPUPCALLTABLE SockUpcallTable
extern

◆ SockWspStartupCount

LONG SockWspStartupCount
extern

Referenced by SockEnterApiFast().