ReactOS 0.4.16-dev-2208-g6350669
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 {
  SocketOpen , SocketBound , SocketBoundUdp , SocketConnected ,
  SocketClosed , SocketStateCreated , SocketStateBound , SocketStateListening ,
  SocketStateConnected , 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
SocketOpen 
SocketBound 
SocketBoundUdp 
SocketConnected 
SocketClosed 
SocketStateCreated 
SocketStateBound 
SocketStateListening 
SocketStateConnected 
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 3763 of file dllmain.c.

3764{
3765 PVOID AsyncContext;
3766 PASYNC_COMPLETION_ROUTINE AsyncCompletionRoutine;
3767 IO_STATUS_BLOCK IOSB;
3769
3770 /* Make the Thread Higher Priority */
3772
3773 /* Do a KQUEUE/WorkItem Style Loop, thanks to IoCompletion Ports */
3774 do
3775 {
3777 (PVOID*)&AsyncCompletionRoutine,
3778 &AsyncContext,
3779 &IOSB,
3780 NULL);
3781 /* Call the Async Function */
3782 if (NT_SUCCESS(Status))
3783 {
3784 (*AsyncCompletionRoutine)(AsyncContext, &IOSB);
3785 }
3786 else
3787 {
3788 /* It Failed, sleep for a second */
3789 Sleep(1000);
3790 }
3791 } while ((Status != STATUS_TIMEOUT));
3792
3793 /* The Thread has Ended */
3794 return 0;
3795}
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:564
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:790
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148
#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 3988 of file dllmain.c.

3989{
3990
3991 ULONG lNetworkEvents;
3993
3994 /* Set up the Async Data Event Info */
3995 AsyncData->AsyncSelectInfo.Timeout.HighPart = 0x7FFFFFFF;
3996 AsyncData->AsyncSelectInfo.Timeout.LowPart = 0xFFFFFFFF;
3997 AsyncData->AsyncSelectInfo.HandleCount = 1;
3998 AsyncData->AsyncSelectInfo.Exclusive = TRUE;
3999 AsyncData->AsyncSelectInfo.Handles[0].Handle = Socket->Handle;
4000 AsyncData->AsyncSelectInfo.Handles[0].Events = 0;
4001
4002 /* Remove unwanted events */
4003 lNetworkEvents = Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents);
4004
4005 /* Set Events to wait for */
4006 if (lNetworkEvents & FD_READ)
4007 {
4009 }
4010
4011 if (lNetworkEvents & FD_WRITE)
4012 {
4014 }
4015
4016 if (lNetworkEvents & FD_OOB)
4017 {
4019 }
4020
4021 if (lNetworkEvents & FD_ACCEPT)
4022 {
4024 }
4025
4026 /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
4027 if (lNetworkEvents & FD_CONNECT)
4028 {
4030 }
4031
4032 if (lNetworkEvents & FD_CLOSE)
4033 {
4035 }
4036
4037 if (lNetworkEvents & FD_QOS)
4038 {
4040 }
4041
4042 if (lNetworkEvents & FD_GROUP_QOS)
4043 {
4045 }
4046
4047 /* Send IOCTL */
4049 NULL,
4050 NULL,
4051 AsyncData,
4052 &AsyncData->IoStatusBlock,
4054 &AsyncData->AsyncSelectInfo,
4055 sizeof(AsyncData->AsyncSelectInfo),
4056 &AsyncData->AsyncSelectInfo,
4057 sizeof(AsyncData->AsyncSelectInfo));
4058
4059 /* I/O Manager Won't call the completion routine, let's do it manually */
4060 if (NT_SUCCESS(Status))
4061 {
4062 return;
4063 }
4064 else
4065 {
4066 AsyncData->IoStatusBlock.Status = Status;
4067 SockAsyncSelectCompletionRoutine(AsyncData, &AsyncData->IoStatusBlock);
4068 }
4069}
#define TRUE
Definition: types.h:120
VOID SockAsyncSelectCompletionRoutine(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: dllmain.c:3859
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:210
#define AFD_EVENT_SEND
Definition: shared.h:205
#define AFD_EVENT_OOB_RECEIVE
Definition: shared.h:204
#define AFD_EVENT_CONNECT_FAIL
Definition: shared.h:211
#define AFD_EVENT_RECEIVE
Definition: shared.h:203
#define IOCTL_AFD_SELECT
Definition: shared.h:285
#define AFD_EVENT_DISCONNECT
Definition: shared.h:206
#define AFD_EVENT_ABORT
Definition: shared.h:207
#define AFD_EVENT_QOS
Definition: shared.h:212
#define AFD_EVENT_CLOSE
Definition: shared.h:208
#define AFD_EVENT_CONNECT
Definition: shared.h:209
#define AFD_EVENT_GROUP_QOS
Definition: shared.h:213
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:133
IO_STATUS_BLOCK IoStatusBlock
Definition: msafd.h:132
PSOCK_SHARED_INFO SharedData
Definition: msafd.h:100
SOCKET Handle
Definition: msafd.h:99
LONG AsyncEvents
Definition: msafd.h:92
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 4071 of file dllmain.c.

4072{
4073 PASYNC_DATA AsyncData = Context;
4074 BOOL FreeContext = TRUE;
4075 PSOCKET_INFORMATION Socket;
4076
4077 /* Get the Socket */
4078 Socket = AsyncData->ParentSocket;
4079
4080 /* If someone closed it, stop the function */
4081 if (Socket->SharedData->State != SocketClosed)
4082 {
4083 /* Check if the Sequence Number changed by now, in which case quit */
4084 if (AsyncData->SequenceNumber == Socket->SharedData->SequenceNumber)
4085 {
4086 /* Do the actual select, if needed */
4087 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)))
4088 {
4089 SockProcessAsyncSelect(Socket, AsyncData);
4090 FreeContext = FALSE;
4091 }
4092 }
4093 }
4094
4095 /* Free the Context */
4096 if (FreeContext)
4097 {
4098 HeapFree(GetProcessHeap(), 0, AsyncData);
4099 }
4100
4101 return;
4102}
#define GetProcessHeap()
Definition: compat.h:736
VOID SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, PASYNC_DATA AsyncData)
Definition: dllmain.c:3988
@ SocketClosed
Definition: msafd.h:50
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD SequenceNumber
Definition: msafd.h:131
PSOCKET_INFORMATION ParentSocket
Definition: msafd.h:130
LONG AsyncDisabledEvents
Definition: msafd.h:93
SOCKET_STATE State
Definition: msafd.h:54
DWORD SequenceNumber
Definition: msafd.h:90

Referenced by SockReenableAsyncSelectEvent(), and WSPAsyncSelect().

◆ SockReenableAsyncSelectEvent()

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

Definition at line 4105 of file dllmain.c.

4107{
4108 PASYNC_DATA AsyncData;
4109
4110 /* Make sure the event is actually disabled */
4111 if (!(Socket->SharedData->AsyncDisabledEvents & Event))
4112 {
4113 return;
4114 }
4115
4116 /* Re-enable it */
4117 Socket->SharedData->AsyncDisabledEvents &= ~Event;
4118
4119 /* Return if no more events are being polled */
4120 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 )
4121 {
4122 return;
4123 }
4124
4125 /* Wait on new events */
4126 AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(ASYNC_DATA));
4127 if (!AsyncData) return;
4128
4129 /* Create the Asynch Thread if Needed */
4131
4132 /* Increase the sequence number to stop anything else */
4133 Socket->SharedData->SequenceNumber++;
4134
4135 /* Set up the Async Data */
4136 AsyncData->ParentSocket = Socket;
4137 AsyncData->SequenceNumber = Socket->SharedData->SequenceNumber;
4138
4139 /* Begin Async Select by using I/O Completion */
4142 AsyncData,
4143 0,
4144 0);
4145
4146 /* All done */
4147 return;
4148}
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
Definition: dllmain.c:3702
VOID SockProcessQueuedAsyncSelect(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
Definition: dllmain.c:4071
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(), 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 3165 of file dllmain.c.

3171{
3172 SIZE_T size;
3173 WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3174 WCHAR *p;
3175
3176 if (!lpsaAddress || !lpszAddressString || !lpdwAddressStringLength)
3177 {
3178 if (lpErrno) *lpErrno = WSAEFAULT;
3179 return SOCKET_ERROR;
3180 }
3181
3182 switch (lpsaAddress->sa_family)
3183 {
3184 case AF_INET:
3185 if (dwAddressLength < sizeof(SOCKADDR_IN))
3186 {
3187 if (lpErrno) *lpErrno = WSAEINVAL;
3188 return SOCKET_ERROR;
3189 }
3191 L"%u.%u.%u.%u:%u",
3192 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 24 & 0xff),
3193 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 16 & 0xff),
3194 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 8 & 0xff),
3195 (unsigned int)(ntohl(((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) & 0xff),
3196 ntohs(((SOCKADDR_IN *)lpsaAddress)->sin_port));
3197
3198 p = wcschr(buffer, L':');
3199 if (!((SOCKADDR_IN *)lpsaAddress)->sin_port)
3200 {
3201 *p = 0;
3202 }
3203 break;
3204 default:
3205 if (lpErrno) *lpErrno = WSAEINVAL;
3206 return SOCKET_ERROR;
3207 }
3208
3209 size = wcslen(buffer) + 1;
3210
3211 if (*lpdwAddressStringLength < size)
3212 {
3213 *lpdwAddressStringLength = size;
3214 if (lpErrno) *lpErrno = WSAEFAULT;
3215 return SOCKET_ERROR;
3216 }
3217
3218 *lpdwAddressStringLength = size;
3219 wcscpy(lpszAddressString, buffer);
3220 return 0;
3221}
#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
HWND hWnd
Definition: settings.c:17
#define ERROR_SUCCESS
Definition: deptool.c:10
PSOCKET_INFORMATION GetSocketStructure(SOCKET Handle)
Definition: dllmain.c:3629
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:3507
BOOLEAN SockGetAsyncSelectHelperAfdHandle(VOID)
Definition: dllmain.c:3797
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:568
ULONG Handle
Definition: gdb_input.c:15
#define AFD_INFO_BLOCKING_MODE
Definition: shared.h:183
BOOLEAN NonBlocking
Definition: msafd.h:74
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 3349 of file dllmain.c.

3351{
3352 TRACE("Leaving.\n");
3353
3354 if (lpErrno) *lpErrno = NO_ERROR;
3355
3356 return 0;
3357}

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:3381
VOID MsafdWaitForAlert(_In_ HANDLE hObject)
Definition: dllmain.c:614
PSOCKET_INFORMATION SocketListHead
Definition: dllmain.c:23
CRITICAL_SECTION SocketListLock
Definition: dllmain.c:24
enum _SOCKET_STATE SOCKET_STATE
HANDLE SockEvent
@ SocketConnected
Definition: msafd.h:49
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:199
#define IOCTL_AFD_DISCONNECT
Definition: shared.h:287
#define AFD_INFO_SENDS_IN_PROGRESS
Definition: shared.h:184
#define AFD_DISCONNECT_SEND
Definition: shared.h:197
LARGE_INTEGER Timeout
Definition: shared.h:137
ULONG DisconnectType
Definition: shared.h:136
PVOID HelperContext
Definition: msafd.h:104
HANDLE TdiConnectionHandle
Definition: msafd.h:108
struct _SOCKET_INFORMATION * NextSocket
Definition: msafd.h:116
HANDLE SharedDataHandle
Definition: msafd.h:101
PHELPER_DATA HelperData
Definition: msafd.h:103
HANDLE TdiAddressHandle
Definition: msafd.h:107
DWORD HelperEvents
Definition: msafd.h:102
BOOLEAN SendShutdown
Definition: msafd.h:77
LONG RefCount
Definition: msafd.h:55
struct linger LingerData
Definition: msafd.h:61
BOOLEAN ReceiveShutdown
Definition: msafd.h:76
DWORD WINAPI SleepEx(IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:802
#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

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:1227
#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:115
INT AddressFamily
Definition: msafd.h:56
INT SocketType
Definition: msafd.h:57
#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:335
#define STATUS_SUCCESS
Definition: shellext.h:65
NTSTATUS EventStatus[AFD_MAX_EVENTS]
Definition: shared.h:132
#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:329
LONG NetworkEvents
Definition: msafd.h:111
HANDLE EventObject
Definition: msafd.h:110

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:4105
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 2360 of file dllmain.c.

2364{
2365 IO_STATUS_BLOCK IOSB;
2366 ULONG TdiAddressSize;
2367 PTRANSPORT_ADDRESS SocketAddress;
2368 PSOCKET_INFORMATION Socket = NULL;
2371
2372 /* Get the Socket Structure associate to this Socket*/
2373 Socket = GetSocketStructure(s);
2374 if (!Socket)
2375 {
2376 if (lpErrno) *lpErrno = WSAENOTSOCK;
2377 return SOCKET_ERROR;
2378 }
2379
2380 if (Socket->SharedData->State != SocketConnected)
2381 {
2382 if (lpErrno) *lpErrno = WSAENOTCONN;
2383 return SOCKET_ERROR;
2384 }
2385
2386 if (!Name || !NameLength)
2387 {
2388 if (lpErrno) *lpErrno = WSAEFAULT;
2389 return SOCKET_ERROR;
2390 }
2391
2394 NULL,
2396 FALSE);
2397
2398 if( !NT_SUCCESS(Status) )
2399 return SOCKET_ERROR;
2400
2401 /* Allocate a buffer for the address */
2402 TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + Socket->SharedData->SizeOfRemoteAddress;
2403 SocketAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
2404
2405 if ( SocketAddress == NULL )
2406 {
2407 NtClose( SockEvent );
2408 if (lpErrno) *lpErrno = WSAENOBUFS;
2409 return SOCKET_ERROR;
2410 }
2411
2412 /* Send IOCTL */
2414 SockEvent,
2415 NULL,
2416 NULL,
2417 &IOSB,
2419 NULL,
2420 0,
2421 SocketAddress,
2422 TdiAddressSize);
2423
2424 /* Wait for return */
2425 if (Status == STATUS_PENDING)
2426 {
2428 Status = IOSB.Status;
2429 }
2430
2431 NtClose( SockEvent );
2432
2433 if (NT_SUCCESS(Status))
2434 {
2435 if (*NameLength >= Socket->SharedData->SizeOfRemoteAddress)
2436 {
2437 Name->sa_family = SocketAddress->Address[0].AddressType;
2438 RtlCopyMemory (Name->sa_data,
2439 SocketAddress->Address[0].Address,
2440 SocketAddress->Address[0].AddressLength);
2441 *NameLength = Socket->SharedData->SizeOfRemoteAddress;
2442 TRACE("NameLength %d Address: %x Port %x\n",
2443 *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr,
2444 ((struct sockaddr_in *)Name)->sin_port);
2445 HeapFree(GlobalHeap, 0, SocketAddress);
2446 return 0;
2447 }
2448 else
2449 {
2450 HeapFree(GlobalHeap, 0, SocketAddress);
2451 if (lpErrno) *lpErrno = WSAEFAULT;
2452 return SOCKET_ERROR;
2453 }
2454 }
2455
2456 HeapFree(GlobalHeap, 0, SocketAddress);
2457
2458 return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
2459}
LPWSTR Name
Definition: desk.c:124
GLdouble s
Definition: gl.h:2039
#define IOCTL_AFD_GET_PEER_NAME
Definition: shared.h:291
INT SizeOfRemoteAddress
Definition: msafd.h:60
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 2258 of file dllmain.c.

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

2717{
2718 PSOCKET_INFORMATION Socket = NULL;
2719 PVOID Buffer;
2721 BOOL BoolBuffer;
2722 DWORD DwordBuffer;
2723 INT Errno;
2724
2725 TRACE("Called\n");
2726
2727 /* Get the Socket Structure associate to this Socket*/
2728 Socket = GetSocketStructure(Handle);
2729 if (Socket == NULL)
2730 {
2731 if (lpErrno) *lpErrno = WSAENOTSOCK;
2732 return SOCKET_ERROR;
2733 }
2734 if (!OptionLength || !OptionValue)
2735 {
2736 if (lpErrno) *lpErrno = WSAEFAULT;
2737 return SOCKET_ERROR;
2738 }
2739
2740 switch (Level)
2741 {
2742 case SOL_SOCKET:
2743 switch (OptionName)
2744 {
2745 case SO_TYPE:
2746 Buffer = &Socket->SharedData->SocketType;
2747 BufferSize = sizeof(INT);
2748 break;
2749
2750 case SO_RCVBUF:
2752 BufferSize = sizeof(ULONG);
2753 break;
2754
2755 case SO_SNDBUF:
2757 BufferSize = sizeof(ULONG);
2758 break;
2759
2760 case SO_ACCEPTCONN:
2761 BoolBuffer = Socket->SharedData->Listening;
2762 Buffer = &BoolBuffer;
2763 BufferSize = sizeof(BOOL);
2764 break;
2765
2766 case SO_BROADCAST:
2767 BoolBuffer = Socket->SharedData->Broadcast;
2768 Buffer = &BoolBuffer;
2769 BufferSize = sizeof(BOOL);
2770 break;
2771
2772 case SO_DEBUG:
2773 BoolBuffer = Socket->SharedData->Debug;
2774 Buffer = &BoolBuffer;
2775 BufferSize = sizeof(BOOL);
2776 break;
2777
2778 case SO_DONTLINGER:
2779 BoolBuffer = (Socket->SharedData->LingerData.l_onoff == 0);
2780 Buffer = &BoolBuffer;
2781 BufferSize = sizeof(BOOL);
2782 break;
2783
2784 case SO_LINGER:
2785 if (Socket->SharedData->SocketType == SOCK_DGRAM)
2786 {
2787 if (lpErrno) *lpErrno = WSAENOPROTOOPT;
2788 return SOCKET_ERROR;
2789 }
2790 Buffer = &Socket->SharedData->LingerData;
2791 BufferSize = sizeof(struct linger);
2792 break;
2793
2794 case SO_OOBINLINE:
2795 BoolBuffer = (Socket->SharedData->OobInline != 0);
2796 Buffer = &BoolBuffer;
2797 BufferSize = sizeof(BOOL);
2798 break;
2799
2800 case SO_KEEPALIVE:
2801 case SO_DONTROUTE:
2802 /* These guys go directly to the helper */
2803 goto SendToHelper;
2804
2806 BoolBuffer = (Socket->SharedData->UseDelayedAcceptance != 0);
2807 Buffer = &BoolBuffer;
2808 BufferSize = sizeof(BOOL);
2809 break;
2810
2811 case SO_REUSEADDR:
2812 BoolBuffer = (Socket->SharedData->ReuseAddresses != 0);
2813 Buffer = &BoolBuffer;
2814 BufferSize = sizeof(BOOL);
2815 break;
2816
2818 BoolBuffer = (Socket->SharedData->ExclusiveAddressUse != 0);
2819 Buffer = &BoolBuffer;
2820 BufferSize = sizeof(BOOL);
2821 break;
2822
2823 case SO_ERROR:
2824 Buffer = &Socket->SharedData->SocketLastError;
2825 BufferSize = sizeof(INT);
2826 break;
2827
2828 case SO_CONNECT_TIME:
2829 DwordBuffer = GetCurrentTimeInSeconds() - Socket->SharedData->ConnectTime;
2830 Buffer = &DwordBuffer;
2831 BufferSize = sizeof(DWORD);
2832 break;
2833
2834 case SO_SNDTIMEO:
2835 Buffer = &Socket->SharedData->SendTimeout;
2836 BufferSize = sizeof(DWORD);
2837 break;
2838 case SO_RCVTIMEO:
2839 Buffer = &Socket->SharedData->RecvTimeout;
2840 BufferSize = sizeof(DWORD);
2841 break;
2842 case SO_PROTOCOL_INFOW:
2843 Buffer = &Socket->ProtocolInfo;
2844 BufferSize = sizeof(Socket->ProtocolInfo);
2845 break;
2846
2847 case SO_GROUP_ID:
2848 case SO_GROUP_PRIORITY:
2849 case SO_MAX_MSG_SIZE:
2850
2851 default:
2852 DbgPrint("MSAFD: Get unknown optname %x\n", OptionName);
2853 if (lpErrno) *lpErrno = WSAENOPROTOOPT;
2854 return SOCKET_ERROR;
2855 }
2856
2857 if (*OptionLength < BufferSize)
2858 {
2859 if (lpErrno) *lpErrno = WSAEFAULT;
2860 *OptionLength = BufferSize;
2861 return SOCKET_ERROR;
2862 }
2863 RtlCopyMemory(OptionValue, Buffer, BufferSize);
2864
2865 return 0;
2866
2867 default:
2868 if (lpErrno) *lpErrno = WSAEINVAL;
2869 return SOCKET_ERROR;
2870 }
2871
2872SendToHelper:
2873 Errno = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext,
2874 Handle,
2875 Socket->TdiAddressHandle,
2876 Socket->TdiConnectionHandle,
2877 Level,
2878 OptionName,
2879 OptionValue,
2880 (LPINT)OptionLength);
2881 if (lpErrno) *lpErrno = Errno;
2882 return (Errno == NO_ERROR) ? NO_ERROR : SOCKET_ERROR;
2883}
Definition: bufpool.h:45
#define BufferSize
Definition: mmc.h:75
DWORD GetCurrentTimeInSeconds(VOID)
Definition: dllmain.c:1431
#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: msafd.h:69
BOOLEAN Debug
Definition: msafd.h:70
ULONG RecvTimeout
Definition: msafd.h:63
BOOLEAN ExclusiveAddressUse
Definition: msafd.h:73
BOOLEAN OobInline
Definition: msafd.h:71
ULONG SizeOfSendBuffer
Definition: msafd.h:65
BOOLEAN ReuseAddresses
Definition: msafd.h:72
ULONG SizeOfRecvBuffer
Definition: msafd.h:64
INT SocketLastError
Definition: msafd.h:87
ULONG SendTimeout
Definition: msafd.h:62
BOOLEAN Listening
Definition: msafd.h:68
BOOLEAN UseDelayedAcceptance
Definition: msafd.h:78
ULONG ConnectTime
Definition: msafd.h:66
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 2463 of file dllmain.c.

2474{
2475 PSOCKET_INFORMATION Socket = NULL;
2476 BOOL NeedsCompletion = lpOverlapped != NULL;
2477 BOOLEAN NonBlocking;
2478 INT Errno = NO_ERROR, Ret = SOCKET_ERROR;
2479 DWORD cbRet = 0;
2480
2481 /* Get the Socket Structure associate to this Socket*/
2482 Socket = GetSocketStructure(Handle);
2483 if (!Socket)
2484 {
2485 if(lpErrno)
2486 *lpErrno = WSAENOTSOCK;
2487 return SOCKET_ERROR;
2488 }
2489
2490 if (!lpcbBytesReturned && !lpOverlapped)
2491 {
2492 if(lpErrno)
2493 *lpErrno = WSAEFAULT;
2494 return SOCKET_ERROR;
2495 }
2496
2497 switch( dwIoControlCode )
2498 {
2499 case FIONBIO:
2500 if( cbInBuffer < sizeof(INT) || IS_INTRESOURCE(lpvInBuffer) )
2501 {
2502 Errno = WSAEFAULT;
2503 break;
2504 }
2505 NonBlocking = *((PULONG)lpvInBuffer) ? TRUE : FALSE;
2506 /* Don't allow to go in blocking mode if WSPAsyncSelect or WSPEventSelect is pending */
2507 if (!NonBlocking)
2508 {
2509 /* If there is an WSPAsyncSelect pending, fail with WSAEINVAL */
2510 if (Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents))
2511 {
2512 Errno = WSAEINVAL;
2513 break;
2514 }
2515 /* If there is an WSPEventSelect pending, fail with WSAEINVAL */
2516 if (Socket->NetworkEvents)
2517 {
2518 Errno = WSAEINVAL;
2519 break;
2520 }
2521 }
2522 Socket->SharedData->NonBlocking = NonBlocking ? 1 : 0;
2523 NeedsCompletion = FALSE;
2524 Errno = SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &NonBlocking, NULL, NULL, lpOverlapped, lpCompletionRoutine);
2525 if (Errno == NO_ERROR)
2526 Ret = NO_ERROR;
2527 break;
2528 case FIONREAD:
2529 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2530 {
2531 cbRet = sizeof(ULONG);
2532 Errno = WSAEFAULT;
2533 break;
2534 }
2535 if (cbOutBuffer < sizeof(ULONG))
2536 {
2537 Errno = WSAEINVAL;
2538 break;
2539 }
2540 NeedsCompletion = FALSE;
2541 Errno = GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, NULL, (PULONG)lpvOutBuffer, NULL, lpOverlapped, lpCompletionRoutine);
2542 if (Errno == NO_ERROR)
2543 {
2544 cbRet = sizeof(ULONG);
2545 Ret = NO_ERROR;
2546 }
2547 break;
2548 case SIOCATMARK:
2549 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2550 {
2551 cbRet = sizeof(BOOL);
2552 Errno = WSAEFAULT;
2553 break;
2554 }
2555 if (cbOutBuffer < sizeof(BOOL))
2556 {
2557 Errno = WSAEINVAL;
2558 break;
2559 }
2560 if (Socket->SharedData->SocketType != SOCK_STREAM)
2561 {
2562 Errno = WSAEINVAL;
2563 break;
2564 }
2565
2566 /* FIXME: Return false if OOBINLINE is true for now
2567 We should MSG_PEEK|MSG_OOB check with driver
2568 */
2569 *(BOOL*)lpvOutBuffer = !Socket->SharedData->OobInline;
2570
2571 cbRet = sizeof(BOOL);
2572 Errno = NO_ERROR;
2573 Ret = NO_ERROR;
2574 break;
2576 if (cbOutBuffer == 0)
2577 {
2578 cbRet = sizeof(PVOID);
2579 Errno = WSAEFAULT;
2580 break;
2581 }
2582
2583 if (cbInBuffer < sizeof(GUID) ||
2584 cbOutBuffer < sizeof(PVOID))
2585 {
2586 Errno = WSAEINVAL;
2587 break;
2588 }
2589
2590 {
2591 GUID AcceptExGUID = WSAID_ACCEPTEX;
2592 GUID ConnectExGUID = WSAID_CONNECTEX;
2593 GUID DisconnectExGUID = WSAID_DISCONNECTEX;
2594 GUID GetAcceptExSockaddrsGUID = WSAID_GETACCEPTEXSOCKADDRS;
2595
2596 if (IsEqualGUID(&AcceptExGUID, lpvInBuffer))
2597 {
2598 *((PVOID *)lpvOutBuffer) = WSPAcceptEx;
2599 cbRet = sizeof(PVOID);
2600 Errno = NO_ERROR;
2601 Ret = NO_ERROR;
2602 }
2603 else if (IsEqualGUID(&ConnectExGUID, lpvInBuffer))
2604 {
2605 *((PVOID *)lpvOutBuffer) = WSPConnectEx;
2606 cbRet = sizeof(PVOID);
2607 Errno = NO_ERROR;
2608 Ret = NO_ERROR;
2609 }
2610 else if (IsEqualGUID(&DisconnectExGUID, lpvInBuffer))
2611 {
2612 *((PVOID *)lpvOutBuffer) = WSPDisconnectEx;
2613 cbRet = sizeof(PVOID);
2614 Errno = NO_ERROR;
2615 Ret = NO_ERROR;
2616 }
2617 else if (IsEqualGUID(&GetAcceptExSockaddrsGUID, lpvInBuffer))
2618 {
2619 *((PVOID *)lpvOutBuffer) = WSPGetAcceptExSockaddrs;
2620 cbRet = sizeof(PVOID);
2621 Errno = NO_ERROR;
2622 /* See CORE-14966 and associated commits.
2623 * Original line below was 'Ret = NO_ERROR:'.
2624 * This caused winetest ws2_32:sock to hang.
2625 * This new Ret value allows the test to complete. */
2626 ERR("SIO_GET_EXTENSION_FUNCTION_POINTER UNIMPLEMENTED\n");
2627 Ret = SOCKET_ERROR;
2628 }
2629 else
2630 {
2631 ERR("Querying unknown extension function: %x\n", ((GUID*)lpvInBuffer)->Data1);
2632 Errno = WSAEOPNOTSUPP;
2633 }
2634 }
2635
2636 break;
2638 if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
2639 {
2640 cbRet = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
2641 Errno = WSAEFAULT;
2642 break;
2643 }
2644 if (cbOutBuffer < sizeof(INT))
2645 {
2646 Errno = WSAEINVAL;
2647 break;
2648 }
2649
2650 cbRet = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
2651
2652 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->iAddressCount = 1;
2653
2654 if (cbOutBuffer < (sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress)))
2655 {
2656 Errno = WSAEFAULT;
2657 break;
2658 }
2659
2660 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].iSockaddrLength = sizeof(Socket->SharedData->WSLocalAddress);
2661 ((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].lpSockaddr = &Socket->SharedData->WSLocalAddress;
2662
2663 Errno = NO_ERROR;
2664 Ret = NO_ERROR;
2665 break;
2666 default:
2667 Errno = Socket->HelperData->WSHIoctl(Socket->HelperContext,
2668 Handle,
2669 Socket->TdiAddressHandle,
2670 Socket->TdiConnectionHandle,
2672 lpvInBuffer,
2673 cbInBuffer,
2674 lpvOutBuffer,
2675 cbOutBuffer,
2676 &cbRet,
2678 lpCompletionRoutine,
2679 &NeedsCompletion);
2680
2681 if (Errno == NO_ERROR)
2682 Ret = NO_ERROR;
2683 break;
2684 }
2685 if (lpOverlapped && NeedsCompletion)
2686 {
2687 lpOverlapped->Internal = Errno;
2688 lpOverlapped->InternalHigh = cbRet;
2689 if (lpCompletionRoutine != NULL)
2690 {
2691 lpCompletionRoutine(Errno, cbRet, lpOverlapped, 0);
2692 }
2693 if (lpOverlapped->hEvent)
2694 SetEvent(lpOverlapped->hEvent);
2696 {
2697 ERR("PostQueuedCompletionStatus failed %d\n", GetLastError());
2698 }
2699 return NO_ERROR;
2700 }
2701 if (lpErrno)
2702 *lpErrno = Errno;
2703 if (lpcbBytesReturned)
2704 *lpcbBytesReturned = cbRet;
2705 return Ret;
2706}
#define IS_INTRESOURCE(x)
Definition: loader.c:613
BOOL WSPAPI WSPConnectEx(IN SOCKET s, IN const struct sockaddr *name, IN int namelen, IN PVOID lpSendBuffer, IN DWORD dwSendDataLength, OUT LPDWORD lpdwBytesSent, IN OUT LPOVERLAPPED lpOverlapped)
Definition: stubs.c:75
BOOL WSPAPI WSPAcceptEx(IN SOCKET sListenSocket, IN SOCKET sAcceptSocket, OUT PVOID lpOutputBuffer, IN DWORD dwReceiveDataLength, IN DWORD dwLocalAddressLength, IN DWORD dwRemoteAddressLength, OUT LPDWORD lpdwBytesReceived, IN OUT LPOVERLAPPED lpOverlapped)
Definition: stubs.c:58
VOID WSPAPI WSPGetAcceptExSockaddrs(IN PVOID lpOutputBuffer, IN DWORD dwReceiveDataLength, IN DWORD dwLocalAddressLength, IN DWORD dwRemoteAddressLength, OUT struct sockaddr **LocalSockaddr, OUT LPINT LocalSockaddrLength, OUT struct sockaddr **RemoteSockaddr, OUT LPINT RemoteSockaddrLength)
Definition: stubs.c:104
BOOL WSPAPI WSPDisconnectEx(IN SOCKET hSocket, IN LPOVERLAPPED lpOverlapped, IN DWORD dwFlags, IN DWORD reserved)
Definition: stubs.c:91
#define SOCK_STREAM
Definition: tcpip.h:118
BOOL WINAPI PostQueuedCompletionStatus(IN HANDLE CompletionHandle, IN DWORD dwNumberOfBytesTransferred, IN ULONG_PTR dwCompletionKey, IN LPOVERLAPPED lpOverlapped)
Definition: iocompl.c:192
#define WSAID_GETACCEPTEXSOCKADDRS
Definition: mswsock.h:77
#define WSAID_ACCEPTEX
Definition: mswsock.h:74
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define AFD_INFO_RECEIVE_CONTENT_SIZE
Definition: shared.h:188
SOCKADDR WSLocalAddress
Definition: msafd.h:94
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
uint32_t * PULONG
Definition: typedefs.h:59
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 2887 of file dllmain.c.

2894{
2895 PSOCKET_INFORMATION Socket;
2896 INT Errno;
2897
2898 /* Get the Socket Structure associate to this Socket*/
2899 Socket = GetSocketStructure(s);
2900 if (Socket == NULL)
2901 {
2902 if (lpErrno) *lpErrno = WSAENOTSOCK;
2903 return SOCKET_ERROR;
2904 }
2905 if (!optval)
2906 {
2907 if (lpErrno) *lpErrno = WSAEFAULT;
2908 return SOCKET_ERROR;
2909 }
2910
2911
2912 /* FIXME: We should handle some more cases here */
2913 if (level == SOL_SOCKET)
2914 {
2915 switch (optname)
2916 {
2917 case SO_BROADCAST:
2918 if (optlen < sizeof(BOOL))
2919 {
2920 if (lpErrno) *lpErrno = WSAEFAULT;
2921 return SOCKET_ERROR;
2922 }
2923 Socket->SharedData->Broadcast = (*optval != 0) ? 1 : 0;
2924 return NO_ERROR;
2925
2926 case SO_OOBINLINE:
2927 if (optlen < sizeof(BOOL))
2928 {
2929 if (lpErrno) *lpErrno = WSAEFAULT;
2930 return SOCKET_ERROR;
2931 }
2932 Socket->SharedData->OobInline = (*optval != 0) ? 1 : 0;
2933 return NO_ERROR;
2934
2935 case SO_DONTLINGER:
2936 if (optlen < sizeof(BOOL))
2937 {
2938 if (lpErrno) *lpErrno = WSAEFAULT;
2939 return SOCKET_ERROR;
2940 }
2941 Socket->SharedData->LingerData.l_onoff = (*optval != 0) ? 0 : 1;
2942 return NO_ERROR;
2943
2944 case SO_REUSEADDR:
2945 if (optlen < sizeof(BOOL))
2946 {
2947 if (lpErrno) *lpErrno = WSAEFAULT;
2948 return SOCKET_ERROR;
2949 }
2950 Socket->SharedData->ReuseAddresses = (*optval != 0) ? 1 : 0;
2951 return NO_ERROR;
2952
2954 if (optlen < sizeof(BOOL))
2955 {
2956 if (lpErrno) *lpErrno = WSAEFAULT;
2957 return SOCKET_ERROR;
2958 }
2959 Socket->SharedData->ExclusiveAddressUse = (*optval != 0) ? 1 : 0;
2960 return NO_ERROR;
2961
2962 case SO_LINGER:
2963 if (optlen < sizeof(struct linger))
2964 {
2965 if (lpErrno) *lpErrno = WSAEFAULT;
2966 return SOCKET_ERROR;
2967 }
2969 optval,
2970 sizeof(struct linger));
2971 return NO_ERROR;
2972
2973 case SO_SNDBUF:
2974 if (optlen < sizeof(ULONG))
2975 {
2976 if (lpErrno) *lpErrno = WSAEFAULT;
2977 return SOCKET_ERROR;
2978 }
2979
2980 SetSocketInformation(Socket,
2982 NULL,
2983 (PULONG)optval,
2984 NULL,
2985 NULL,
2986 NULL);
2987 GetSocketInformation(Socket,
2989 NULL,
2990 &Socket->SharedData->SizeOfSendBuffer,
2991 NULL,
2992 NULL,
2993 NULL);
2994
2995 return NO_ERROR;
2996
2997 case SO_RCVBUF:
2998 if (optlen < sizeof(ULONG))
2999 {
3000 if (lpErrno) *lpErrno = WSAEFAULT;
3001 return SOCKET_ERROR;
3002 }
3003
3004 /* FIXME: We should not have to limit the packet receive buffer size like this. workaround for CORE-15804 */
3005 if (*(PULONG)optval > 0x2000)
3006 *(PULONG)optval = 0x2000;
3007
3008 SetSocketInformation(Socket,
3010 NULL,
3011 (PULONG)optval,
3012 NULL,
3013 NULL,
3014 NULL);
3015 GetSocketInformation(Socket,
3017 NULL,
3018 &Socket->SharedData->SizeOfRecvBuffer,
3019 NULL,
3020 NULL,
3021 NULL);
3022
3023 return NO_ERROR;
3024
3025 case SO_ERROR:
3026 if (optlen < sizeof(INT))
3027 {
3028 if (lpErrno) *lpErrno = WSAEFAULT;
3029 return SOCKET_ERROR;
3030 }
3031
3033 optval,
3034 sizeof(INT));
3035 return NO_ERROR;
3036
3037 case SO_SNDTIMEO:
3038 if (optlen < sizeof(DWORD))
3039 {
3040 if (lpErrno) *lpErrno = WSAEFAULT;
3041 return SOCKET_ERROR;
3042 }
3043
3045 optval,
3046 sizeof(DWORD));
3047 return NO_ERROR;
3048
3049 case SO_RCVTIMEO:
3050 if (optlen < sizeof(DWORD))
3051 {
3052 if (lpErrno) *lpErrno = WSAEFAULT;
3053 return SOCKET_ERROR;
3054 }
3055
3057 optval,
3058 sizeof(DWORD));
3059 return NO_ERROR;
3060
3061 case SO_KEEPALIVE:
3062 case SO_DONTROUTE:
3063 /* These go directly to the helper dll */
3064 goto SendToHelper;
3065
3066 default:
3067 /* Obviously this is a hack */
3068 ERR("MSAFD: Set unknown optname %x\n", optname);
3069 return NO_ERROR;
3070 }
3071 }
3072
3073SendToHelper:
3074 Errno = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext,
3075 s,
3076 Socket->TdiAddressHandle,
3077 Socket->TdiConnectionHandle,
3078 level,
3079 optname,
3080 (PCHAR)optval,
3081 optlen);
3082 if (lpErrno) *lpErrno = Errno;
3083 return (Errno == NO_ERROR) ? NO_ERROR : SOCKET_ERROR;
3084}
GLint level
Definition: gl.h:1546
#define AFD_INFO_SEND_WINDOW_SIZE
Definition: shared.h:186
#define AFD_INFO_RECEIVE_WINDOW_SIZE
Definition: shared.h:185
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 3225 of file dllmain.c.

3231{
3232 int numdots = 0;
3233 USHORT port;
3234 LONG inetaddr = 0, ip_part;
3235 LPWSTR *bp = NULL;
3237
3238 if (!lpAddressLength || !lpAddress || !AddressString)
3239 {
3240 if (lpErrno) *lpErrno = WSAEINVAL;
3241 return SOCKET_ERROR;
3242 }
3243
3244 sockaddr = (SOCKADDR_IN *)lpAddress;
3245
3246 /* Set right address family */
3247 if (lpProtocolInfo != NULL)
3248 {
3249 sockaddr->sin_family = lpProtocolInfo->iAddressFamily;
3250 }
3251 else
3252 {
3253 sockaddr->sin_family = AddressFamily;
3254 }
3255
3256 /* Report size */
3257 if (AddressFamily == AF_INET)
3258 {
3259 if (*lpAddressLength < (INT)sizeof(SOCKADDR_IN))
3260 {
3261 if (lpErrno) *lpErrno = WSAEFAULT;
3262 }
3263 else
3264 {
3265 // translate ip string to ip
3266
3267 /* Get ip number */
3268 bp = &AddressString;
3269 inetaddr = 0;
3270
3271 while (*bp < &AddressString[wcslen(AddressString)])
3272 {
3273 ip_part = wcstol(*bp, bp, 10);
3274 /* ip part number should be in range 0-255 */
3275 if (ip_part < 0 || ip_part > 255)
3276 {
3277 if (lpErrno) *lpErrno = WSAEINVAL;
3278 return SOCKET_ERROR;
3279 }
3280 inetaddr = (inetaddr << 8) + ip_part;
3281 /* we end on string end or port separator */
3282 if ((*bp)[0] == 0 || (*bp)[0] == L':')
3283 break;
3284 /* ip parts are dot separated. verify it */
3285 if ((*bp)[0] != L'.')
3286 {
3287 if (lpErrno) *lpErrno = WSAEINVAL;
3288 return SOCKET_ERROR;
3289 }
3290 /* count the dots */
3291 numdots++;
3292 /* move over the dot to next ip part */
3293 (*bp)++;
3294 }
3295
3296 /* check dots count */
3297 if (numdots != 3)
3298 {
3299 if (lpErrno) *lpErrno = WSAEINVAL;
3300 return SOCKET_ERROR;
3301 }
3302
3303 /* Get port number */
3304 if ((*bp)[0] == L':')
3305 {
3306 /* move over the column to port part */
3307 (*bp)++;
3308 /* next char should be numeric */
3309 if ((*bp)[0] < L'0' || (*bp)[0] > L'9')
3310 {
3311 if (lpErrno) *lpErrno = WSAEINVAL;
3312 return SOCKET_ERROR;
3313 }
3314 port = wcstol(*bp, bp, 10);
3315 }
3316 else
3317 {
3318 port = 0;
3319 }
3320
3321 if (lpErrno) *lpErrno = NO_ERROR;
3322 /* rest sockaddr.sin_addr.s_addr
3323 for we need to be sure it is zero when we come to while */
3324 *lpAddressLength = sizeof(*sockaddr);
3325 memset(lpAddress, 0, sizeof(*sockaddr));
3326 sockaddr->sin_family = AF_INET;
3327 sockaddr->sin_addr.s_addr = inetaddr;
3328 sockaddr->sin_port = port;
3329 }
3330 }
3331
3332 if (lpErrno && !*lpErrno)
3333 {
3334 return 0;
3335 }
3336
3337 return SOCKET_ERROR;
3338}
_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().