1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifndef _WINSOCK2SPI_
7 #define _WINSOCK2SPI_
8 
9 #ifndef _WIN64
10 #include <pshpack4.h>
11 #endif
12 
13 #include <winsock2.h>
14 
15 #define WSPDESCRIPTION_LEN 255
16 
17 #define WSS_OPERATION_IN_PROGRESS __MSABI_LONG(0x00000103)
18 
19 typedef struct WSPData {
20   WORD wVersion;
21   WORD wHighVersion;
22   WCHAR szDescription[WSPDESCRIPTION_LEN+1];
23 } WSPDATA,*LPWSPDATA;
24 
25 typedef struct _WSATHREADID {
26   HANDLE ThreadHandle;
27   DWORD_PTR Reserved;
28 } WSATHREADID,*LPWSATHREADID;
29 
30 #define WSPAPI WSAAPI
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36   typedef WINBOOL (CALLBACK *LPBLOCKINGCALLBACK)(DWORD_PTR dwContext);
37   typedef VOID (CALLBACK *LPWSAUSERAPC)(DWORD_PTR dwContext);
38   typedef SOCKET (WSPAPI *LPWSPACCEPT)(SOCKET s,struct sockaddr *addr,LPINT addrlen,LPCONDITIONPROC lpfnCondition,DWORD_PTR dwCallbackData,LPINT lpErrno);
39   typedef INT (WSPAPI *LPWSPADDRESSTOSTRING)(LPSOCKADDR lpsaAddress,DWORD dwAddressLength,LPWSAPROTOCOL_INFOW lpProtocolInfo,LPWSTR lpszAddressString,LPDWORD lpdwAddressStringLength,LPINT lpErrno);
40   typedef int (WSPAPI *LPWSPASYNCSELECT)(SOCKET s,HWND hWnd,unsigned int wMsg,__LONG32 lEvent,LPINT lpErrno);
41   typedef int (WSPAPI *LPWSPBIND)(SOCKET s,const struct sockaddr *name,int namelen,LPINT lpErrno);
42   typedef int (WSPAPI *LPWSPCANCELBLOCKINGCALL)(LPINT lpErrno);
43   typedef int (WSPAPI *LPWSPCLEANUP)(LPINT lpErrno);
44   typedef int (WSPAPI *LPWSPCLOSESOCKET)(SOCKET s,LPINT lpErrno);
45   typedef int (WSPAPI *LPWSPCONNECT)(SOCKET s,const struct sockaddr *name,int namelen,LPWSABUF lpCallerData,LPWSABUF lpCalleeData,LPQOS lpSQOS,LPQOS lpGQOS,LPINT lpErrno);
46   typedef int (WSPAPI *LPWSPDUPLICATESOCKET)(SOCKET s,DWORD dwProcessId,LPWSAPROTOCOL_INFOW lpProtocolInfo,LPINT lpErrno);
47   typedef int (WSPAPI *LPWSPENUMNETWORKEVENTS)(SOCKET s,WSAEVENT hEventObject,LPWSANETWORKEVENTS lpNetworkEvents,LPINT lpErrno);
48   typedef int (WSPAPI *LPWSPEVENTSELECT)(SOCKET s,WSAEVENT hEventObject,__LONG32 lNetworkEvents,LPINT lpErrno);
49   typedef WINBOOL (WSPAPI *LPWSPGETOVERLAPPEDRESULT)(SOCKET s,LPWSAOVERLAPPED lpOverlapped,LPDWORD lpcbTransfer,WINBOOL fWait,LPDWORD lpdwFlags,LPINT lpErrno);
50   typedef int (WSPAPI *LPWSPGETPEERNAME)(SOCKET s,struct sockaddr *name,LPINT namelen,LPINT lpErrno);
51   typedef int (WSPAPI *LPWSPGETSOCKNAME)(SOCKET s,struct sockaddr *name,LPINT namelen,LPINT lpErrno);
52   typedef int (WSPAPI *LPWSPGETSOCKOPT)(SOCKET s,int level,int optname,char *optval,LPINT optlen,LPINT lpErrno);
53   typedef WINBOOL (WSPAPI *LPWSPGETQOSBYNAME)(SOCKET s,LPWSABUF lpQOSName,LPQOS lpQOS,LPINT lpErrno);
54   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);
55   typedef SOCKET (WSPAPI *LPWSPJOINLEAF)(SOCKET s,const struct sockaddr *name,int namelen,LPWSABUF lpCallerData,LPWSABUF lpCalleeData,LPQOS lpSQOS,LPQOS lpGQOS,DWORD dwFlags,LPINT lpErrno);
56   typedef int (WSPAPI *LPWSPLISTEN)(SOCKET s,int backlog,LPINT lpErrno);
57   typedef int (WSPAPI *LPWSPRECV)(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd,LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,LPWSATHREADID lpThreadId,LPINT lpErrno);
58   typedef int (WSPAPI *LPWSPRECVDISCONNECT)(SOCKET s,LPWSABUF lpInboundDisconnectData,LPINT lpErrno);
59   typedef int (WSPAPI *LPWSPRECVFROM)(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd,LPDWORD lpFlags,struct sockaddr *lpFrom,LPINT lpFromlen,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,LPWSATHREADID lpThreadId,LPINT lpErrno);
60   typedef int (WSPAPI *LPWSPSELECT)(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,const PTIMEVAL timeout,LPINT lpErrno);
61   typedef int (WSPAPI *LPWSPSEND)(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,LPWSATHREADID lpThreadId,LPINT lpErrno);
62   typedef int (WSPAPI *LPWSPSENDDISCONNECT)(SOCKET s,LPWSABUF lpOutboundDisconnectData,LPINT lpErrno);
63   typedef int (WSPAPI *LPWSPSENDTO)(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,const struct sockaddr *lpTo,int iTolen,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,LPWSATHREADID lpThreadId,LPINT lpErrno);
64   typedef int (WSPAPI *LPWSPSETSOCKOPT)(SOCKET s,int level,int optname,const char *optval,int optlen,LPINT lpErrno);
65   typedef int (WSPAPI *LPWSPSHUTDOWN)(SOCKET s,int how,LPINT lpErrno);
66   typedef SOCKET (WSPAPI *LPWSPSOCKET)(int af,int type,int protocol,LPWSAPROTOCOL_INFOW lpProtocolInfo,GROUP g,DWORD dwFlags,LPINT lpErrno);
67   typedef INT (WSPAPI *LPWSPSTRINGTOADDRESS)(LPWSTR AddressString,INT AddressFamily,LPWSAPROTOCOL_INFOW lpProtocolInfo,LPSOCKADDR lpAddress,LPINT lpAddressLength,LPINT lpErrno);
68 
69   typedef struct _WSPPROC_TABLE {
70 
71     LPWSPACCEPT lpWSPAccept;
72     LPWSPADDRESSTOSTRING lpWSPAddressToString;
73     LPWSPASYNCSELECT lpWSPAsyncSelect;
74     LPWSPBIND lpWSPBind;
75     LPWSPCANCELBLOCKINGCALL lpWSPCancelBlockingCall;
76     LPWSPCLEANUP lpWSPCleanup;
77     LPWSPCLOSESOCKET lpWSPCloseSocket;
78     LPWSPCONNECT lpWSPConnect;
79     LPWSPDUPLICATESOCKET lpWSPDuplicateSocket;
80     LPWSPENUMNETWORKEVENTS lpWSPEnumNetworkEvents;
81     LPWSPEVENTSELECT lpWSPEventSelect;
82     LPWSPGETOVERLAPPEDRESULT lpWSPGetOverlappedResult;
83     LPWSPGETPEERNAME lpWSPGetPeerName;
84     LPWSPGETSOCKNAME lpWSPGetSockName;
85     LPWSPGETSOCKOPT lpWSPGetSockOpt;
86     LPWSPGETQOSBYNAME lpWSPGetQOSByName;
87     LPWSPIOCTL lpWSPIoctl;
88     LPWSPJOINLEAF lpWSPJoinLeaf;
89     LPWSPLISTEN lpWSPListen;
90     LPWSPRECV lpWSPRecv;
91     LPWSPRECVDISCONNECT lpWSPRecvDisconnect;
92     LPWSPRECVFROM lpWSPRecvFrom;
93     LPWSPSELECT lpWSPSelect;
94     LPWSPSEND lpWSPSend;
95     LPWSPSENDDISCONNECT lpWSPSendDisconnect;
96     LPWSPSENDTO lpWSPSendTo;
97     LPWSPSETSOCKOPT lpWSPSetSockOpt;
98     LPWSPSHUTDOWN lpWSPShutdown;
99     LPWSPSOCKET lpWSPSocket;
100     LPWSPSTRINGTOADDRESS lpWSPStringToAddress;
101   } WSPPROC_TABLE,*LPWSPPROC_TABLE;
102 
103   typedef WINBOOL (WSPAPI *LPWPUCLOSEEVENT)(WSAEVENT hEvent,LPINT lpErrno);
104   typedef int (WSPAPI *LPWPUCLOSESOCKETHANDLE)(SOCKET s,LPINT lpErrno);
105   typedef WSAEVENT (WSPAPI *LPWPUCREATEEVENT)(LPINT lpErrno);
106   typedef SOCKET (WSPAPI *LPWPUCREATESOCKETHANDLE)(DWORD dwCatalogEntryId,DWORD_PTR dwContext,LPINT lpErrno);
107   typedef int (WSPAPI *LPWPUFDISSET)(SOCKET s,fd_set *fdset);
108   typedef int (WSPAPI *LPWPUGETPROVIDERPATH)(LPGUID lpProviderId,WCHAR *lpszProviderDllPath,LPINT lpProviderDllPathLen,LPINT lpErrno);
109   typedef SOCKET (WSPAPI *LPWPUMODIFYIFSHANDLE)(DWORD dwCatalogEntryId,SOCKET ProposedHandle,LPINT lpErrno);
110   typedef WINBOOL (WSPAPI *LPWPUPOSTMESSAGE)(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
111   typedef int (WSPAPI *LPWPUQUERYBLOCKINGCALLBACK)(DWORD dwCatalogEntryId,LPBLOCKINGCALLBACK *lplpfnCallback,PDWORD_PTR lpdwContext,LPINT lpErrno);
112   typedef int (WSPAPI *LPWPUQUERYSOCKETHANDLECONTEXT)(SOCKET s,PDWORD_PTR lpContext,LPINT lpErrno);
113   typedef int (WSPAPI *LPWPUQUEUEAPC)(LPWSATHREADID lpThreadId,LPWSAUSERAPC lpfnUserApc,DWORD_PTR dwContext,LPINT lpErrno);
114   typedef WINBOOL (WSPAPI *LPWPURESETEVENT)(WSAEVENT hEvent,LPINT lpErrno);
115   typedef WINBOOL (WSPAPI *LPWPUSETEVENT)(WSAEVENT hEvent,LPINT lpErrno);
116   typedef int (WSPAPI *LPWPUOPENCURRENTTHREAD)(LPWSATHREADID lpThreadId,LPINT lpErrno);
117   typedef int (WSPAPI *LPWPUCLOSETHREAD)(LPWSATHREADID lpThreadId,LPINT lpErrno);
118   typedef int (WSPAPI *LPWPUCOMPLETEOVERLAPPEDREQUEST)(SOCKET s,LPWSAOVERLAPPED lpOverlapped,DWORD dwError,DWORD cbTransferred,LPINT lpErrno);
119 
120   typedef struct _WSPUPCALLTABLE {
121     LPWPUCLOSEEVENT lpWPUCloseEvent;
122     LPWPUCLOSESOCKETHANDLE lpWPUCloseSocketHandle;
123     LPWPUCREATEEVENT lpWPUCreateEvent;
124     LPWPUCREATESOCKETHANDLE lpWPUCreateSocketHandle;
125     LPWPUFDISSET lpWPUFDIsSet;
126     LPWPUGETPROVIDERPATH lpWPUGetProviderPath;
127     LPWPUMODIFYIFSHANDLE lpWPUModifyIFSHandle;
128     LPWPUPOSTMESSAGE lpWPUPostMessage;
129     LPWPUQUERYBLOCKINGCALLBACK lpWPUQueryBlockingCallback;
130     LPWPUQUERYSOCKETHANDLECONTEXT lpWPUQuerySocketHandleContext;
131     LPWPUQUEUEAPC lpWPUQueueApc;
132     LPWPURESETEVENT lpWPUResetEvent;
133     LPWPUSETEVENT lpWPUSetEvent;
134     LPWPUOPENCURRENTTHREAD lpWPUOpenCurrentThread;
135     LPWPUCLOSETHREAD lpWPUCloseThread;
136   } WSPUPCALLTABLE,*LPWSPUPCALLTABLE;
137 
138   typedef int (WSPAPI *LPWSPSTARTUP)(WORD wVersionRequested,LPWSPDATA lpWSPData,LPWSAPROTOCOL_INFOW lpProtocolInfo,WSPUPCALLTABLE UpcallTable,LPWSPPROC_TABLE lpProcTable);
139   typedef int (WSPAPI *LPWSCENUMPROTOCOLS)(LPINT lpiProtocols,LPWSAPROTOCOL_INFOW lpProtocolBuffer,LPDWORD lpdwBufferLength,LPINT lpErrno);
140   typedef int (WSPAPI *LPWSCDEINSTALLPROVIDER)(LPGUID lpProviderId,LPINT lpErrno);
141   typedef int (WSPAPI *LPWSCINSTALLPROVIDER)(LPGUID lpProviderId,const WCHAR *lpszProviderDllPath,const LPWSAPROTOCOL_INFOW lpProtocolInfoList,DWORD dwNumberOfEntries,LPINT lpErrno);
142   typedef int (WSPAPI *LPWSCGETPROVIDERPATH)(LPGUID lpProviderId,WCHAR *lpszProviderDllPath,LPINT lpProviderDllPathLen,LPINT lpErrno);
143   typedef int (WSPAPI *LPWSCUPDATEPROVIDER)(LPGUID lpProviderId,const WCHAR *lpszProviderDllPath,const LPWSAPROTOCOL_INFOW lpProtocolInfoList,DWORD dwNumberOfEntries,LPINT lpErrno);
144   typedef int (WSPAPI *LPWSCINSTALLQOSTEMPLATE)(const LPGUID Guid,LPWSABUF QosName,LPQOS Qos);
145   typedef int (WSPAPI *LPWSCREMOVEQOSTEMPLATE)(const LPGUID Guid,LPWSABUF QosName);
146 
147   int WSPAPI WSPStartup(WORD wVersionRequested,LPWSPDATA lpWSPData,LPWSAPROTOCOL_INFOW lpProtocolInfo,WSPUPCALLTABLE UpcallTable,LPWSPPROC_TABLE lpProcTable);
148   int WSPAPI WSCEnumProtocols(LPINT lpiProtocols,LPWSAPROTOCOL_INFOW lpProtocolBuffer,LPDWORD lpdwBufferLength,LPINT lpErrno);
149   int WSPAPI WSCDeinstallProvider(LPGUID lpProviderId,LPINT lpErrno);
150   int WSPAPI WSCInstallProvider(LPGUID lpProviderId,const WCHAR *lpszProviderDllPath,const LPWSAPROTOCOL_INFOW lpProtocolInfoList,DWORD dwNumberOfEntries,LPINT lpErrno);
151   int WSPAPI WSCGetProviderPath(LPGUID lpProviderId,WCHAR *lpszProviderDllPath,LPINT lpProviderDllPathLen,LPINT lpErrno);
152   int WSPAPI WSCUpdateProvider(LPGUID lpProviderId,const WCHAR *lpszProviderDllPath,const LPWSAPROTOCOL_INFOW lpProtocolInfoList,DWORD dwNumberOfEntries,LPINT lpErrno);
153   int WSPAPI WSCInstallQOSTemplate (const LPGUID Guid,LPWSABUF QosName,LPQOS Qos);
154   int WSPAPI WSCRemoveQOSTemplate (const LPGUID Guid,LPWSABUF QosName);
155 
156 #ifdef _WIN64
157   int WSPAPI WSCEnumProtocols32(LPINT lpiProtocols,LPWSAPROTOCOL_INFOW lpProtocolBuffer,LPDWORD lpdwBufferLength,LPINT lpErrno);
158   int WSPAPI WSCDeinstallProvider32(LPGUID lpProviderId,LPINT lpErrno);
159   int WSPAPI WSCInstallProvider64_32(LPGUID lpProviderId,const WCHAR *lpszProviderDllPath,const LPWSAPROTOCOL_INFOW lpProtocolInfoList,DWORD dwNumberOfEntries,LPINT lpErrno);
160   int WSPAPI WSCGetProviderPath32(LPGUID lpProviderId,WCHAR *lpszProviderDllPath,LPINT lpProviderDllPathLen,LPINT lpErrno);
161   int WSPAPI WSCUpdateProvider32(LPGUID lpProviderId,const WCHAR *lpszProviderDllPath,const LPWSAPROTOCOL_INFOW lpProtocolInfoList,DWORD dwNumberOfEntries,LPINT lpErrno);
162 #endif
163 
164   WINBOOL WSPAPI WPUCloseEvent(WSAEVENT hEvent,LPINT lpErrno);
165   int WSPAPI WPUCloseSocketHandle(SOCKET s,LPINT lpErrno);
166   WSAEVENT WSPAPI WPUCreateEvent(LPINT lpErrno);
167   SOCKET WSPAPI WPUCreateSocketHandle(DWORD dwCatalogEntryId,DWORD_PTR dwContext,LPINT lpErrno);
168   int WSPAPI WPUFDIsSet(SOCKET s,fd_set *fdset);
169   int WSPAPI WPUGetProviderPath(LPGUID lpProviderId,WCHAR *lpszProviderDllPath,LPINT lpProviderDllPathLen,LPINT lpErrno);
170   SOCKET WSPAPI WPUModifyIFSHandle(DWORD dwCatalogEntryId,SOCKET ProposedHandle,LPINT lpErrno);
171   WINBOOL WSPAPI WPUPostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
172   int WSPAPI WPUQueryBlockingCallback(DWORD dwCatalogEntryId,LPBLOCKINGCALLBACK *lplpfnCallback,PDWORD_PTR lpdwContext,LPINT lpErrno);
173   int WSPAPI WPUQuerySocketHandleContext(SOCKET s,PDWORD_PTR lpContext,LPINT lpErrno);
174   int WSPAPI WPUQueueApc(LPWSATHREADID lpThreadId,LPWSAUSERAPC lpfnUserApc,DWORD_PTR dwContext,LPINT lpErrno);
175   WINBOOL WSPAPI WPUResetEvent(WSAEVENT hEvent,LPINT lpErrno);
176   WINBOOL WSPAPI WPUSetEvent(WSAEVENT hEvent,LPINT lpErrno);
177   int WSPAPI WPUCompleteOverlappedRequest (SOCKET s,LPWSAOVERLAPPED lpOverlapped,DWORD dwError,DWORD cbTransferred,LPINT lpErrno);
178   int WSPAPI WPUOpenCurrentThread(LPWSATHREADID lpThreadId,LPINT lpErrno);
179   int WSPAPI WPUCloseThread(LPWSATHREADID lpThreadId,LPINT lpErrno);
180 #define WSCEnumNameSpaceProviders WSAEnumNameSpaceProvidersW
181 #define LPFN_WSCENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSW
182 
183 #ifdef _WIN64
184   INT WSAAPI WSCEnumNameSpaceProviders32(LPDWORD lpdwBufferLength,LPWSANAMESPACE_INFOW lpnspBuffer);
185 #endif
186 
187   typedef INT (WSPAPI *LPWSCINSTALLNAMESPACE)(LPWSTR lpszIdentifier,LPWSTR lpszPathName,DWORD dwNameSpace,DWORD dwVersion,LPGUID lpProviderId);
188   typedef INT (WSPAPI *LPWSCUNINSTALLNAMESPACE)(LPGUID lpProviderId);
189   typedef INT (WSPAPI *LPWSCENABLENSPROVIDER)(LPGUID lpProviderId,WINBOOL fEnable);
190 
191   INT WSPAPI WSCInstallNameSpace (LPWSTR lpszIdentifier,LPWSTR lpszPathName,DWORD dwNameSpace,DWORD dwVersion,LPGUID lpProviderId);
192   INT WSPAPI WSCUnInstallNameSpace (LPGUID lpProviderId);
193   INT WSPAPI WSCEnableNSProvider (LPGUID lpProviderId,WINBOOL fEnable);
194 
195 #ifdef _WIN64
196   INT WSPAPI WSCInstallNameSpace32 (LPWSTR lpszIdentifier,LPWSTR lpszPathName,DWORD dwNameSpace,DWORD dwVersion,LPGUID lpProviderId);
197   INT WSPAPI WSCUnInstallNameSpace32 (LPGUID lpProviderId);
198   INT WSPAPI WSCEnableNSProvider32 (LPGUID lpProviderId,WINBOOL fEnable);
199 #endif
200 
201   typedef INT (WSAAPI *LPNSPCLEANUP)(LPGUID lpProviderId);
202   typedef INT (WSAAPI *LPNSPLOOKUPSERVICEBEGIN)(LPGUID lpProviderId,LPWSAQUERYSETW lpqsRestrictions,LPWSASERVICECLASSINFOW lpServiceClassInfo,DWORD dwControlFlags,LPHANDLE lphLookup);
203   typedef INT (WSAAPI *LPNSPLOOKUPSERVICENEXT)(HANDLE hLookup,DWORD dwControlFlags,LPDWORD lpdwBufferLength,LPWSAQUERYSETW lpqsResults);
204   typedef INT (WSAAPI *LPNSPIOCTL)(HANDLE hLookup,DWORD dwControlCode,LPVOID lpvInBuffer,DWORD cbInBuffer,LPVOID lpvOutBuffer,DWORD cbOutBuffer,LPDWORD lpcbBytesReturned,LPWSACOMPLETION lpCompletion,LPWSATHREADID lpThreadId);
205   typedef INT (WSAAPI *LPNSPLOOKUPSERVICEEND)(HANDLE hLookup);
206   typedef INT (WSAAPI *LPNSPSETSERVICE)(LPGUID lpProviderId,LPWSASERVICECLASSINFOW lpServiceClassInfo,LPWSAQUERYSETW lpqsRegInfo,WSAESETSERVICEOP essOperation,DWORD dwControlFlags);
207   typedef INT (WSAAPI *LPNSPINSTALLSERVICECLASS)(LPGUID lpProviderId,LPWSASERVICECLASSINFOW lpServiceClassInfo);
208   typedef INT (WSAAPI *LPNSPREMOVESERVICECLASS)(LPGUID lpProviderId,LPGUID lpServiceClassId);
209   typedef INT (WSAAPI *LPNSPGETSERVICECLASSINFO)(LPGUID lpProviderId,LPDWORD lpdwBufSize,LPWSASERVICECLASSINFOW lpServiceClassInfo);
210 
211   typedef struct _NSP_ROUTINE {
212     DWORD cbSize;
213     DWORD dwMajorVersion;
214     DWORD dwMinorVersion;
215     LPNSPCLEANUP NSPCleanup;
216     LPNSPLOOKUPSERVICEBEGIN NSPLookupServiceBegin;
217     LPNSPLOOKUPSERVICENEXT NSPLookupServiceNext;
218     LPNSPLOOKUPSERVICEEND NSPLookupServiceEnd;
219     LPNSPSETSERVICE NSPSetService;
220     LPNSPINSTALLSERVICECLASS NSPInstallServiceClass;
221     LPNSPREMOVESERVICECLASS NSPRemoveServiceClass;
222     LPNSPGETSERVICECLASSINFO NSPGetServiceClassInfo;
223     LPNSPIOCTL NSPIoctl;
224   } NSP_ROUTINE,*LPNSP_ROUTINE;
225 
226   typedef INT (WSAAPI *LPNSPSTARTUP)(LPGUID lpProviderId,LPNSP_ROUTINE lpnspRoutines);
227 
228   INT WSAAPI NSPStartup(LPGUID lpProviderId,LPNSP_ROUTINE lpnspRoutines);
229 
230 #if (_WIN32_WINNT >= 0x0600)
231 
232 typedef int (WSAAPI *LPNSPV2CLEANUP)(
233   LPGUID lpProviderId,
234   LPVOID pvClientSessionArg
235 );
236 
237 typedef int (WSAAPI *LPNSPV2CLIENTSESSIONRUNDOWN)(
238   LPGUID lpProviderId,
239   LPVOID pvClientSessionArg
240 );
241 
242 typedef int (WSAAPI *LPNSPV2LOOKUPSERVICEBEGIN)(
243   LPGUID lpProviderId,
244   LPWSAQUERYSET2W lpqsRestrictions,
245   DWORD dwControlFlags,
246   LPVOID lpvClientSessionArg,
247   LPHANDLE lphLookup
248 );
249 
250 typedef int (WSAAPI *LPNSPV2LOOKUPSERVICEEND)(
251   HANDLE hLookup
252 );
253 
254 typedef int (WSAAPI *LPNSPV2LOOKUPSERVICENEXTEX)(
255   HANDLE hAsyncCall,
256   HANDLE hLookup,
257   DWORD dwControlFlags,
258   LPDWORD lpdwBufferLength,
259   LPWSAQUERYSET2W lpqsResults
260 );
261 
262 typedef int (WSAAPI *LPNSPV2SETSERVICEEX)(
263   HANDLE hAsyncCall,
264   LPGUID lpProviderId,
265   LPWSAQUERYSET2W lpqsRegInfo,
266   WSAESETSERVICEOP essOperation,
267   DWORD dwControlFlags,
268   LPVOID lpvClientSessionArg
269 );
270 
271 typedef int (WSAAPI *LPNSPV2STARTUP)(
272   LPGUID lpProviderId,
273   LPVOID *ppvClientSessionArg
274 );
275 
276 typedef struct _NSPV2_ROUTINE {
277   DWORD                       cbSize;
278   DWORD                       dwMajorVersion;
279   DWORD                       dwMinorVersion;
280   LPNSPV2STARTUP              NSPv2Startup;
281   LPNSPV2CLEANUP              NSPv2Cleanup;
282   LPNSPV2LOOKUPSERVICEBEGIN   NSPv2LookupServiceBegin;
283   LPNSPV2LOOKUPSERVICENEXTEX  NSPv2LookupServiceNextEx;
284   LPNSPV2LOOKUPSERVICEEND     NSPv2LookupServiceEnd;
285   LPNSPV2SETSERVICEEX         NSPv2SetServiceEx;
286   LPNSPV2CLIENTSESSIONRUNDOWN NSPv2ClientSessionRundown;
287 } NSPV2_ROUTINE, *PNSPV2_ROUTINE, *LPCNSPV2_ROUTINE;
288 
289 #define LSP_SYSTEM          0x80000000
290 #define LSP_INSPECTOR       0x00000001
291 #define LSP_REDIRECTOR      0x00000002
292 #define LSP_PROXY           0x00000004
293 #define LSP_FIREWALL        0x00000008
294 #define LSP_INBOUND_MODIFY  0x00000010
295 #define LSP_OUTBOUND_MODIFY 0x00000020
296 #define LSP_CRYPTO_COMPRESS 0x00000040
297 #define LSP_LOCAL_CACHE     0x00000080
298 
299 typedef enum _WSC_PROVIDER_INFO_TYPE {
300   ProviderInfoLspCategories = 0,
301   ProviderInfoAudit
302 } WSC_PROVIDER_INFO_TYPE;
303 
304 typedef struct _WSC_PROVIDER_AUDIT_INFO {
305   DWORD RecordSize;
306   PVOID Reserved;
307 } WSC_PROVIDER_AUDIT_INFO, *PWSC_PROVIDER_AUDIT_INFO;
308 
309 INT WSAAPI WSAAdvertiseProvider(
310   const GUID *puuidProviderId,
311   const LPCNSPV2_ROUTINE *pNSPv2Routine
312 );
313 
314 INT WSPAPI WSAProviderCompleteAsyncCall(
315   HANDLE hAsyncCall,
316   INT iRetCode
317 );
318 
319 INT WSPAPI WSAUnadvertiseProvider(
320   const GUID *puuidProviderId
321 );
322 
323 int WSPAPI WSCGetApplicationCategory(
324   LPCWSTR Path,
325   DWORD PathLength,
326   LPCWSTR Extra,
327   DWORD ExtraLength,
328   DWORD *pPermittedLspCategories,
329   LPINT lpErrno
330 );
331 
332 int WSPAPI WSCGetProviderInfo(
333   LPGUID lpProviderId,
334   WSC_PROVIDER_INFO_TYPE InfoType,
335   PBYTE Info,
336   size_t *InfoSize,
337   DWORD Flags,
338   LPINT lpErrno
339 );
340 
341 #ifndef _WIN64
342 int WSPAPI WSCInstallProviderAndChains(
343   const LPGUID lpProviderId,
344   const LPWSTR lpszProviderDllPath,
345   const LPWSTR lpszLspName,
346   DWORD dwServiceFlags,
347   const LPWSAPROTOCOL_INFO lpProtocolInfoList,
348   DWORD dwNumberOfEntries,
349   LPDWORD lpdwCatalogEntryId,
350   LPINT lpErrno
351 );
352 #endif /* !_WIN64 */
353 
354 int WSPAPI WSCSetApplicationCategory(
355   LPCWSTR Path,
356   DWORD PathLength,
357   LPCWSTR Extra,
358   DWORD ExtraLength,
359   DWORD PermittedLspCategories,
360   DWORD *pPrevPermLspCat,
361   LPINT lpErrno
362 );
363 
364 int WSPAPI WSCSetProviderInfo(
365   LPGUID lpProviderId,
366   WSC_PROVIDER_INFO_TYPE InfoType,
367   PBYTE Info,
368   size_t InfoSize,
369   DWORD Flags,
370   LPINT lpErrno
371 );
372 
373 int WSAAPI WSCInstallNameSpaceEx(
374   LPWSTR lpszIdentifier,
375   LPWSTR lpszPathName,
376   DWORD dwNameSpace,
377   DWORD dwVersion,
378   LPGUID lpProviderId,
379   LPBLOB lpProviderInfo
380 );
381 
382 #define WSCEnumNameSpaceProvidersEx WSAEnumNameSpaceProvidersExW
383 #define LPFN_WSCENUMNAMESPACEPROVIDERSEX LPFN_WSAENUMNAMESPACEPROVIDERSEXW
384 
385 #ifdef _WIN64
386 INT WSPAPI WSCEnumNameSpaceProvidersEx32(
387   LPDWORD lpdwBufferLength,
388   LPWSANAMESPACE_INFOEXW lpnspBuffer
389 );
390 
391 int WSPAPI WSCGetProviderInfo32(
392   LPGUID lpProviderId,
393   WSC_PROVIDER_INFO_TYPE InfoType,
394   PBYTE Info,
395   size_t *InfoSize,
396   DWORD Flags,
397   LPINT lpErrno
398 );
399 
400 int WSAAPI WSCInstallNameSpaceEx32(
401   LPWSTR lpszIdentifier,
402   LPWSTR lpszPathName,
403   DWORD dwNameSpace,
404   DWORD dwVersion,
405   LPGUID lpProviderId,
406   LPBLOB lpProviderInfo
407 );
408 
409 int WSPAPI WSCInstallProviderAndChains64_32(
410   const LPGUID lpProviderId,
411   const LPWSTR lpszProviderDllPath,
412   const LPWSTR lpszProviderDllPath32,
413   const LPWSTR lpszLspName,
414   DWORD dwServiceFlags,
415   const LPWSAPROTOCOL_INFO lpProtocolInfoList,
416   DWORD dwNumberOfEntries,
417   LPDWORD lpdwCatalogEntryId,
418   LPINT lpErrno
419 );
420 
421 int WSPAPI WSCSetProviderInfo32(
422   LPGUID lpProviderId,
423   WSC_PROVIDER_INFO_TYPE InfoType,
424   PBYTE Info,
425   size_t InfoSize,
426   DWORD Flags,
427   LPINT lpErrno
428 );
429 
430 #endif /* _WIN64*/
431 
432 #endif /*(_WIN32_WINNT >= 0x0600)*/
433 
434 #ifdef __cplusplus
435 }
436 #endif
437 
438 #if !defined(_WIN64)
439 #include <poppack.h>
440 #endif
441 #endif
442