/* WS2SPI.H -- definitions to be used with the WinSock service provider. * * Copyright (c) 1997-1999 Microsoft Corporation * * This header file corresponds to version 2.2.x of the WinSock SPI * specification. * * This file includes parts which are Copyright (c) 1982-1986 Regents * of the University of California. All rights reserved. The * Berkeley Software License Agreement specifies the terms and * conditions for redistribution. */ #ifndef _WINSOCK2SPI_ #pragma option push -b -a8 -pc -A- /*P_O_Push*/ #define _WINSOCK2SPI_ #if _MSC_VER > 1000 #pragma once #endif /* * Ensure structures are packed consistently. */ #if !defined(_WIN64) #include #endif /* * Pull in WINSOCK2.H if necessary */ #ifndef _WINSOCK2API_ #include #endif /* _WINSOCK2API_ */ #define WSPDESCRIPTION_LEN 255 #define WSS_OPERATION_IN_PROGRESS 0x00000103L typedef struct WSPData { WORD wVersion; WORD wHighVersion; WCHAR szDescription[WSPDESCRIPTION_LEN+1]; } WSPDATA, FAR * LPWSPDATA; typedef struct _WSATHREADID { HANDLE ThreadHandle; DWORD_PTR Reserved; } WSATHREADID, FAR * LPWSATHREADID; /* * SPI function linkage. */ #define WSPAPI WSAAPI #ifdef __cplusplus extern "C" { #endif /* * Pointer to a blocking callback. A pointer to a blocking callback is * returned from the WPUQueryBlockingCallback() upcall. Note that this * function's signature is not identical to an application's blocking * hook function. */ typedef BOOL (CALLBACK FAR * LPBLOCKINGCALLBACK)( DWORD_PTR dwContext ); /* * Pointer to a user APC function. This is used as a parameter to the * WPUQueueUserApc() upcall. Note that this function's signature is not * identical to an application's completion routine. */ typedef VOID (CALLBACK FAR * LPWSAUSERAPC)( DWORD_PTR dwContext ); /* * Pointers to the individual entries in a service provider's proc table. */ typedef SOCKET (WSPAPI * LPWSPACCEPT)( SOCKET s, struct sockaddr FAR * addr, LPINT addrlen, LPCONDITIONPROC lpfnCondition, DWORD_PTR dwCallbackData, LPINT lpErrno ); typedef INT (WSPAPI * LPWSPADDRESSTOSTRING)( LPSOCKADDR lpsaAddress, DWORD dwAddressLength, LPWSAPROTOCOL_INFOW lpProtocolInfo, LPWSTR lpszAddressString, LPDWORD lpdwAddressStringLength, LPINT lpErrno ); typedef int (WSPAPI * LPWSPASYNCSELECT)( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent, LPINT lpErrno ); typedef int (WSPAPI * LPWSPBIND)( SOCKET s, const struct sockaddr FAR * name, int namelen, LPINT lpErrno ); typedef int (WSPAPI * LPWSPCANCELBLOCKINGCALL)( LPINT lpErrno ); typedef int (WSPAPI * LPWSPCLEANUP)( LPINT lpErrno ); typedef int (WSPAPI * LPWSPCLOSESOCKET)( SOCKET s, LPINT lpErrno ); typedef int (WSPAPI * LPWSPCONNECT)( SOCKET s, const struct sockaddr FAR * name, int namelen, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS, LPINT lpErrno ); typedef int (WSPAPI * LPWSPDUPLICATESOCKET)( SOCKET s, DWORD dwProcessId, LPWSAPROTOCOL_INFOW lpProtocolInfo, LPINT lpErrno ); typedef int (WSPAPI * LPWSPENUMNETWORKEVENTS)( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents, LPINT lpErrno ); typedef int (WSPAPI * LPWSPEVENTSELECT)( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents, LPINT lpErrno ); typedef BOOL (WSPAPI * LPWSPGETOVERLAPPEDRESULT)( SOCKET s, LPWSAOVERLAPPED lpOverlapped, LPDWORD lpcbTransfer, BOOL fWait, LPDWORD lpdwFlags, LPINT lpErrno ); typedef int (WSPAPI * LPWSPGETPEERNAME)( SOCKET s, struct sockaddr FAR * name, LPINT namelen, LPINT lpErrno ); typedef int (WSPAPI * LPWSPGETSOCKNAME)( SOCKET s, struct sockaddr FAR * name, LPINT namelen, LPINT lpErrno ); typedef int (WSPAPI * LPWSPGETSOCKOPT)( SOCKET s, int level, int optname, char FAR * optval, LPINT optlen, LPINT lpErrno ); typedef BOOL (WSPAPI * LPWSPGETQOSBYNAME)( SOCKET s, LPWSABUF lpQOSName, LPQOS lpQOS, LPINT lpErrno ); typedef int (WSPAPI * LPWSPIOCTL)( SOCKET s, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno ); typedef SOCKET (WSPAPI * LPWSPJOINLEAF)( SOCKET s, const struct sockaddr FAR * name, int namelen, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS, DWORD dwFlags, LPINT lpErrno ); typedef int (WSPAPI * LPWSPLISTEN)( SOCKET s, int backlog, LPINT lpErrno ); typedef int (WSPAPI * LPWSPRECV)( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno ); typedef int (WSPAPI * LPWSPRECVDISCONNECT)( SOCKET s, LPWSABUF lpInboundDisconnectData, LPINT lpErrno ); typedef int (WSPAPI * LPWSPRECVFROM)( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, struct sockaddr FAR * lpFrom, LPINT lpFromlen, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno ); typedef int (WSPAPI * LPWSPSELECT)( int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout, LPINT lpErrno ); typedef int (WSPAPI * LPWSPSEND)( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno ); typedef int (WSPAPI * LPWSPSENDDISCONNECT)( SOCKET s, LPWSABUF lpOutboundDisconnectData, LPINT lpErrno ); typedef int (WSPAPI * LPWSPSENDTO)( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, const struct sockaddr FAR * lpTo, int iTolen, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno ); typedef int (WSPAPI * LPWSPSETSOCKOPT)( SOCKET s, int level, int optname, const char FAR * optval, int optlen, LPINT lpErrno ); typedef int (WSPAPI * LPWSPSHUTDOWN)( SOCKET s, int how, LPINT lpErrno ); typedef SOCKET (WSPAPI * LPWSPSOCKET)( int af, int type, int protocol, LPWSAPROTOCOL_INFOW lpProtocolInfo, GROUP g, DWORD dwFlags, LPINT lpErrno ); typedef INT (WSPAPI * LPWSPSTRINGTOADDRESS)( LPWSTR AddressString, INT AddressFamily, LPWSAPROTOCOL_INFOW lpProtocolInfo, LPSOCKADDR lpAddress, LPINT lpAddressLength, LPINT lpErrno ); /* * A service provider proc table. This structure is returned by value * from the service provider's WSPStartup() entrypoint. */ typedef struct _WSPPROC_TABLE { LPWSPACCEPT lpWSPAccept; LPWSPADDRESSTOSTRING lpWSPAddressToString; LPWSPASYNCSELECT lpWSPAsyncSelect; LPWSPBIND lpWSPBind; LPWSPCANCELBLOCKINGCALL lpWSPCancelBlockingCall; LPWSPCLEANUP lpWSPCleanup; LPWSPCLOSESOCKET lpWSPCloseSocket; LPWSPCONNECT lpWSPConnect; LPWSPDUPLICATESOCKET lpWSPDuplicateSocket; LPWSPENUMNETWORKEVENTS lpWSPEnumNetworkEvents; LPWSPEVENTSELECT lpWSPEventSelect; LPWSPGETOVERLAPPEDRESULT lpWSPGetOverlappedResult; LPWSPGETPEERNAME lpWSPGetPeerName; LPWSPGETSOCKNAME lpWSPGetSockName; LPWSPGETSOCKOPT lpWSPGetSockOpt; LPWSPGETQOSBYNAME lpWSPGetQOSByName; LPWSPIOCTL lpWSPIoctl; LPWSPJOINLEAF lpWSPJoinLeaf; LPWSPLISTEN lpWSPListen; LPWSPRECV lpWSPRecv; LPWSPRECVDISCONNECT lpWSPRecvDisconnect; LPWSPRECVFROM lpWSPRecvFrom; LPWSPSELECT lpWSPSelect; LPWSPSEND lpWSPSend; LPWSPSENDDISCONNECT lpWSPSendDisconnect; LPWSPSENDTO lpWSPSendTo; LPWSPSETSOCKOPT lpWSPSetSockOpt; LPWSPSHUTDOWN lpWSPShutdown; LPWSPSOCKET lpWSPSocket; LPWSPSTRINGTOADDRESS lpWSPStringToAddress; } WSPPROC_TABLE, FAR * LPWSPPROC_TABLE; /* * Pointers to the individual entries in the upcall table. */ typedef BOOL (WSPAPI * LPWPUCLOSEEVENT)( WSAEVENT hEvent, LPINT lpErrno ); typedef int (WSPAPI * LPWPUCLOSESOCKETHANDLE)( SOCKET s, LPINT lpErrno ); typedef WSAEVENT (WSPAPI * LPWPUCREATEEVENT)( LPINT lpErrno ); typedef SOCKET (WSPAPI * LPWPUCREATESOCKETHANDLE)( DWORD dwCatalogEntryId, DWORD_PTR dwContext, LPINT lpErrno ); typedef int (WSPAPI * LPWPUFDISSET)( SOCKET s, fd_set FAR * fdset ); typedef int (WSPAPI * LPWPUGETPROVIDERPATH)( LPGUID lpProviderId, WCHAR FAR * lpszProviderDllPath, LPINT lpProviderDllPathLen, LPINT lpErrno ); typedef SOCKET (WSPAPI * LPWPUMODIFYIFSHANDLE)( DWORD dwCatalogEntryId, SOCKET ProposedHandle, LPINT lpErrno ); typedef BOOL (WSPAPI * LPWPUPOSTMESSAGE)( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); typedef int (WSPAPI * LPWPUQUERYBLOCKINGCALLBACK)( DWORD dwCatalogEntryId, LPBLOCKINGCALLBACK FAR * lplpfnCallback, PDWORD_PTR lpdwContext, LPINT lpErrno ); typedef int (WSPAPI * LPWPUQUERYSOCKETHANDLECONTEXT)( SOCKET s, PDWORD_PTR lpContext, LPINT lpErrno ); typedef int (WSPAPI * LPWPUQUEUEAPC)( LPWSATHREADID lpThreadId, LPWSAUSERAPC lpfnUserApc, DWORD_PTR dwContext, LPINT lpErrno ); typedef BOOL (WSPAPI * LPWPURESETEVENT)( WSAEVENT hEvent, LPINT lpErrno ); typedef BOOL (WSPAPI * LPWPUSETEVENT)( WSAEVENT hEvent, LPINT lpErrno ); typedef int (WSPAPI * LPWPUOPENCURRENTTHREAD)( LPWSATHREADID lpThreadId, LPINT lpErrno ); typedef int (WSPAPI * LPWPUCLOSETHREAD)( LPWSATHREADID lpThreadId, LPINT lpErrno ); // Available only directly from ws2_32.dll typedef int (WSPAPI * LPWPUCOMPLETEOVERLAPPEDREQUEST) ( IN SOCKET s, LPWSAOVERLAPPED lpOverlapped, DWORD dwError, DWORD cbTransferred, LPINT lpErrno ); /* * The upcall table. This structure is passed by value to the service * provider's WSPStartup() entrypoint. */ typedef struct _WSPUPCALLTABLE { LPWPUCLOSEEVENT lpWPUCloseEvent; LPWPUCLOSESOCKETHANDLE lpWPUCloseSocketHandle; LPWPUCREATEEVENT lpWPUCreateEvent; LPWPUCREATESOCKETHANDLE lpWPUCreateSocketHandle; LPWPUFDISSET lpWPUFDIsSet; LPWPUGETPROVIDERPATH lpWPUGetProviderPath; LPWPUMODIFYIFSHANDLE lpWPUModifyIFSHandle; LPWPUPOSTMESSAGE lpWPUPostMessage; LPWPUQUERYBLOCKINGCALLBACK lpWPUQueryBlockingCallback; LPWPUQUERYSOCKETHANDLECONTEXT lpWPUQuerySocketHandleContext; LPWPUQUEUEAPC lpWPUQueueApc; LPWPURESETEVENT lpWPUResetEvent; LPWPUSETEVENT lpWPUSetEvent; LPWPUOPENCURRENTTHREAD lpWPUOpenCurrentThread; LPWPUCLOSETHREAD lpWPUCloseThread; } WSPUPCALLTABLE, FAR * LPWSPUPCALLTABLE; /* * WinSock 2 SPI socket function prototypes */ int WSPAPI WSPStartup( IN WORD wVersionRequested, OUT LPWSPDATA lpWSPData, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, IN WSPUPCALLTABLE UpcallTable, OUT LPWSPPROC_TABLE lpProcTable ); typedef int (WSPAPI * LPWSPSTARTUP)( WORD wVersionRequested, LPWSPDATA lpWSPData, LPWSAPROTOCOL_INFOW lpProtocolInfo, WSPUPCALLTABLE UpcallTable, LPWSPPROC_TABLE lpProcTable ); /* * Installation and configuration entrypoints. */ int WSPAPI WSCEnumProtocols( IN LPINT lpiProtocols, OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer, IN OUT LPDWORD lpdwBufferLength, OUT LPINT lpErrno ); typedef int (WSPAPI * LPWSCENUMPROTOCOLS)( LPINT lpiProtocols, LPWSAPROTOCOL_INFOW lpProtocolBuffer, LPDWORD lpdwBufferLength, LPINT lpErrno ); int WSPAPI WSCDeinstallProvider( IN LPGUID lpProviderId, OUT LPINT lpErrno ); typedef int (WSPAPI * LPWSCDEINSTALLPROVIDER)( LPGUID lpProviderId, LPINT lpErrno ); int WSPAPI WSCInstallProvider( IN LPGUID lpProviderId, IN const WCHAR FAR * lpszProviderDllPath, IN const LPWSAPROTOCOL_INFOW lpProtocolInfoList, IN DWORD dwNumberOfEntries, OUT LPINT lpErrno ); typedef int (WSPAPI * LPWSCINSTALLPROVIDER)( LPGUID lpProviderId, const WCHAR FAR * lpszProviderDllPath, const LPWSAPROTOCOL_INFOW lpProtocolInfoList, DWORD dwNumberOfEntries, LPINT lpErrno ); int WSPAPI WSCGetProviderPath( IN LPGUID lpProviderId, OUT WCHAR FAR * lpszProviderDllPath, IN OUT LPINT lpProviderDllPathLen, OUT LPINT lpErrno ); typedef int (WSPAPI * LPWSCGETPROVIDERPATH)( LPGUID lpProviderId, WCHAR FAR * lpszProviderDllPath, LPINT lpProviderDllPathLen, LPINT lpErrno ); int WSPAPI WSCInstallQOSTemplate ( IN const LPGUID Guid, IN LPWSABUF QosName, IN LPQOS Qos ); typedef int (WSPAPI * LPWSCINSTALLQOSTEMPLATE)( const LPGUID Guid, LPWSABUF QosName, LPQOS Qos ); int WSPAPI WSCRemoveQOSTemplate ( IN const LPGUID Guid, IN LPWSABUF QosName ); typedef int (WSPAPI * LPWSCREMOVEQOSTEMPLATE)( const LPGUID Guid, LPWSABUF QosName ); /* * The following upcall function prototypes are only used by WinSock 2 DLL and * should not be used by any service providers. */ BOOL WSPAPI WPUCloseEvent( IN WSAEVENT hEvent, OUT LPINT lpErrno ); int WSPAPI WPUCloseSocketHandle( IN SOCKET s, OUT LPINT lpErrno ); WSAEVENT WSPAPI WPUCreateEvent( OUT LPINT lpErrno ); SOCKET WSPAPI WPUCreateSocketHandle( IN DWORD dwCatalogEntryId, IN DWORD_PTR dwContext, OUT LPINT lpErrno ); int WSPAPI WPUFDIsSet( IN SOCKET s, IN fd_set FAR * fdset ); int WSPAPI WPUGetProviderPath( IN LPGUID lpProviderId, OUT WCHAR FAR * lpszProviderDllPath, IN OUT LPINT lpProviderDllPathLen, OUT LPINT lpErrno ); SOCKET WSPAPI WPUModifyIFSHandle( IN DWORD dwCatalogEntryId, IN SOCKET ProposedHandle, OUT LPINT lpErrno ); BOOL WSPAPI WPUPostMessage( IN HWND hWnd, IN UINT Msg, IN WPARAM wParam, IN LPARAM lParam ); int WSPAPI WPUQueryBlockingCallback( IN DWORD dwCatalogEntryId, OUT LPBLOCKINGCALLBACK FAR * lplpfnCallback, OUT PDWORD_PTR lpdwContext, OUT LPINT lpErrno ); int WSPAPI WPUQuerySocketHandleContext( IN SOCKET s, OUT PDWORD_PTR lpContext, OUT LPINT lpErrno ); int WSPAPI WPUQueueApc( IN LPWSATHREADID lpThreadId, IN LPWSAUSERAPC lpfnUserApc, IN DWORD_PTR dwContext, OUT LPINT lpErrno ); BOOL WSPAPI WPUResetEvent( IN WSAEVENT hEvent, OUT LPINT lpErrno ); BOOL WSPAPI WPUSetEvent( IN WSAEVENT hEvent, OUT LPINT lpErrno ); int WSPAPI WPUCompleteOverlappedRequest ( SOCKET s, LPWSAOVERLAPPED lpOverlapped, DWORD dwError, DWORD cbTransferred, LPINT lpErrno ); /* * Installing and uninstalling name space providers. */ INT WSPAPI WSCInstallNameSpace ( IN LPWSTR lpszIdentifier, IN LPWSTR lpszPathName, IN DWORD dwNameSpace, IN DWORD dwVersion, IN LPGUID lpProviderId ); typedef INT (WSPAPI * LPWSCINSTALLNAMESPACE)( LPWSTR lpszIdentifier, LPWSTR lpszPathName, DWORD dwNameSpace, DWORD dwVersion, LPGUID lpProviderId ); INT WSPAPI WSCUnInstallNameSpace ( IN LPGUID lpProviderId ); typedef INT (WSPAPI * LPWSCUNINSTALLNAMESPACE)( LPGUID lpProviderId ); INT WSPAPI WSCEnableNSProvider ( IN LPGUID lpProviderId, IN BOOL fEnable ); typedef INT (WSPAPI * LPWSCENABLENSPROVIDER)( LPGUID lpProviderId, BOOL fEnable ); /* * Pointers to the individual entries in the namespace proc table. */ typedef INT (WSAAPI * LPNSPCLEANUP)( LPGUID lpProviderId ); typedef INT (WSAAPI * LPNSPLOOKUPSERVICEBEGIN)( LPGUID lpProviderId, LPWSAQUERYSETW lpqsRestrictions, LPWSASERVICECLASSINFOW lpServiceClassInfo, DWORD dwControlFlags, LPHANDLE lphLookup ); typedef INT (WSAAPI * LPNSPLOOKUPSERVICENEXT)( HANDLE hLookup, DWORD dwControlFlags, LPDWORD lpdwBufferLength, LPWSAQUERYSETW lpqsResults ); typedef INT (WSAAPI * LPNSPLOOKUPSERVICEEND)( HANDLE hLookup ); typedef INT (WSAAPI * LPNSPSETSERVICE)( LPGUID lpProviderId, LPWSASERVICECLASSINFOW lpServiceClassInfo, LPWSAQUERYSETW lpqsRegInfo, WSAESETSERVICEOP essOperation, DWORD dwControlFlags ); typedef INT (WSAAPI * LPNSPINSTALLSERVICECLASS)( LPGUID lpProviderId, LPWSASERVICECLASSINFOW lpServiceClassInfo ); typedef INT (WSAAPI * LPNSPREMOVESERVICECLASS)( LPGUID lpProviderId, LPGUID lpServiceClassId ); typedef INT (WSAAPI * LPNSPGETSERVICECLASSINFO)( LPGUID lpProviderId, LPDWORD lpdwBufSize, LPWSASERVICECLASSINFOW lpServiceClassInfo ); /* * The name space service provider procedure table. */ typedef struct _NSP_ROUTINE { /* Structure version information: */ DWORD cbSize; DWORD dwMajorVersion; DWORD dwMinorVersion; /* Procedure-pointer table: */ LPNSPCLEANUP NSPCleanup; LPNSPLOOKUPSERVICEBEGIN NSPLookupServiceBegin; LPNSPLOOKUPSERVICENEXT NSPLookupServiceNext; LPNSPLOOKUPSERVICEEND NSPLookupServiceEnd; LPNSPSETSERVICE NSPSetService; LPNSPINSTALLSERVICECLASS NSPInstallServiceClass; LPNSPREMOVESERVICECLASS NSPRemoveServiceClass; LPNSPGETSERVICECLASSINFO NSPGetServiceClassInfo; } NSP_ROUTINE, FAR * LPNSP_ROUTINE; /* * Startup procedures. */ INT WSAAPI NSPStartup( LPGUID lpProviderId, LPNSP_ROUTINE lpnspRoutines ); typedef INT (WSAAPI * LPNSPSTARTUP)( LPGUID lpProviderId, LPNSP_ROUTINE lpnspRoutines ); #ifdef __cplusplus } #endif #if !defined(_WIN64) #include #endif #pragma option pop /*P_O_Pop*/ #endif /* _WINSOCK2SPI_ */