winapi_ui_automation/um/
ws2spi.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! Definitions to be used with the WinSock service provider.
7use ctypes::{c_char, c_int, c_long, c_uint};
8use shared::basetsd::{DWORD_PTR, PDWORD_PTR, ULONG_PTR};
9use shared::guiddef::{GUID, LPGUID};
10use shared::minwindef::{
11    BOOL, DWORD, INT, LPARAM, LPDWORD, LPHANDLE, LPINT, LPVOID, PBYTE, UINT, WORD, WPARAM,
12};
13use shared::windef::HWND;
14use shared::ws2def::{LPSOCKADDR, LPWSABUF, SOCKADDR};
15use shared::wtypesbase::LPBLOB;
16use um::winnt::{HANDLE, LPCWSTR, LPWSTR, PVOID, WCHAR};
17use um::winsock2::{
18    GROUP, LPCONDITIONPROC, LPQOS, LPWSACOMPLETION, LPWSANETWORKEVENTS, LPWSAOVERLAPPED,
19    LPWSAOVERLAPPED_COMPLETION_ROUTINE, LPWSAPROTOCOL_INFOW, LPWSAQUERYSET2W, LPWSAQUERYSETW,
20    LPWSASERVICECLASSINFOW, SOCKET, WSAESETSERVICEOP, WSAEVENT, fd_set, timeval,
21};
22#[cfg(target_pointer_width = "64")]
23use um::winsock2::{LPWSANAMESPACE_INFOEXW, LPWSANAMESPACE_INFOW};
24use vc::vcruntime::size_t;
25pub const WSPDESCRIPTION_LEN: usize = 255;
26pub const WSS_OPERATION_IN_PROGRESS: ULONG_PTR = 0x00000103;
27STRUCT!{struct WSPDATA {
28    wVersion: WORD,
29    wHighVersion: WORD,
30    szDescription: [WCHAR; WSPDESCRIPTION_LEN + 1],
31}}
32pub type LPWSPDATA = *mut WSPDATA;
33STRUCT!{struct WSATHREADID {
34    ThreadHandle: HANDLE,
35    Reserved: DWORD_PTR,
36}}
37pub type LPWSATHREADID = *mut WSATHREADID;
38FN!{stdcall LPBLOCKINGCALLBACK(
39    dwContext: DWORD_PTR,
40) -> BOOL}
41FN!{stdcall LPWSAUSERAPC(
42    dwContext: DWORD_PTR,
43) -> ()}
44FN!{stdcall LPWSPACCEPT(
45    s: SOCKET,
46    addr: *mut SOCKADDR,
47    addrlen: LPINT,
48    lpfnCondition: LPCONDITIONPROC,
49    dwCallbackData: DWORD_PTR,
50    lpErrno: LPINT,
51) -> SOCKET}
52FN!{stdcall LPWSPADDRESSTOSTRING(
53    lpsaAddress: LPSOCKADDR,
54    dwAddressLength: DWORD,
55    lpProtocolInfo: LPWSAPROTOCOL_INFOW,
56    lpszAddressString: LPWSTR,
57    lpdwAddressStringLength: LPDWORD,
58    lpErrno: LPINT,
59) -> INT}
60FN!{stdcall LPWSPASYNCSELECT(
61    s: SOCKET,
62    hWnd: HWND,
63    wMsg: c_uint,
64    lEvent: c_long,
65    lpErrno: LPINT,
66) -> c_int}
67FN!{stdcall LPWSPBIND(
68    s: SOCKET,
69    name: *mut SOCKADDR,
70    namelen: c_int,
71    lpErrno: LPINT,
72) -> c_int}
73FN!{stdcall LPWSPCANCELBLOCKINGCALL(
74    lpErrno: LPINT,
75) -> c_int}
76FN!{stdcall LPWSPCLEANUP(
77    lpErrno: LPINT,
78) -> c_int}
79FN!{stdcall LPWSPCLOSESOCKET(
80    s: SOCKET,
81    lpErrno: LPINT,
82) -> c_int}
83FN!{stdcall LPWSPCONNECT(
84    s: SOCKET,
85    name: *mut SOCKADDR,
86    namelen: c_int,
87    lpCallerData: LPWSABUF,
88    lpCalleeData: LPWSABUF,
89    lpSQOS: LPQOS,
90    lpGQOS: LPQOS,
91    lpErrno: LPINT,
92) -> c_int}
93FN!{stdcall LPWSPDUPLICATESOCKET(
94    s: SOCKET,
95    dwProcessId: DWORD,
96    lpProtocolInfo: LPWSAPROTOCOL_INFOW,
97    lpErrno: LPINT,
98) -> c_int}
99FN!{stdcall LPWSPENUMNETWORKEVENTS(
100    s: SOCKET,
101    hEventObject: WSAEVENT,
102    lpNetworkEvents: LPWSANETWORKEVENTS,
103    lpErrno: LPINT,
104) -> c_int}
105FN!{stdcall LPWSPEVENTSELECT(
106    s: SOCKET,
107    hEventObject: WSAEVENT,
108    lNetworkEvents: c_long,
109    lpErrno: LPINT,
110) -> c_int}
111FN!{stdcall LPWSPGETOVERLAPPEDRESULT(
112    s: SOCKET,
113    lpOverlapped: LPWSAOVERLAPPED,
114    lpcbTransfer: LPDWORD,
115    fWait: BOOL,
116    lpdwFlags: LPDWORD,
117    lpErrno: LPINT,
118) -> BOOL}
119FN!{stdcall LPWSPGETPEERNAME(
120    s: SOCKET,
121    name: *mut SOCKADDR,
122    namelen: LPINT,
123    lpErrno: LPINT,
124) -> c_int}
125FN!{stdcall LPWSPGETSOCKNAME(
126    s: SOCKET,
127    name: *mut SOCKADDR,
128    namelen: LPINT,
129    lpErrno: LPINT,
130) -> c_int}
131FN!{stdcall LPWSPGETSOCKOPT(
132    s: SOCKET,
133    level: c_int,
134    optname: c_int,
135    optval: *mut c_char,
136    optlen: LPINT,
137    lpErrno: LPINT,
138) -> c_int}
139FN!{stdcall LPWSPGETQOSBYNAME(
140    s: SOCKET,
141    lpQOSName: LPWSABUF,
142    lpQOS: LPQOS,
143    lpErrno: LPINT,
144) -> BOOL}
145FN!{stdcall LPWSPIOCTL(
146    s: SOCKET,
147    dwIoControlCode: DWORD,
148    lpvInBuffer: LPVOID,
149    cbInBuffer: DWORD,
150    lpvOutBuffer: LPVOID,
151    cbOutBuffer: DWORD,
152    lpcbBytesReturned: LPDWORD,
153    lpOverlapped: LPWSAOVERLAPPED,
154    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
155    lpThreadId: LPWSATHREADID,
156    lpErrno: LPINT,
157) -> c_int}
158FN!{stdcall LPWSPJOINLEAF(
159    s: SOCKET,
160    name: *mut SOCKADDR,
161    namelen: c_int,
162    lpCallerData: LPWSABUF,
163    lpCalleeData: LPWSABUF,
164    lpSQOS: LPQOS,
165    lpGQOS: LPQOS,
166    dwFlags: DWORD,
167    lpErrno: LPINT,
168) -> SOCKET}
169FN!{stdcall LPWSPLISTEN(
170    s: SOCKET,
171    backlog: c_int,
172    lpErrno: LPINT,
173) -> c_int}
174FN!{stdcall LPWSPRECV(
175    s: SOCKET,
176    lpBuffers: LPWSABUF,
177    dwBufferCount: DWORD,
178    lpNumberOfBytesRecvd: LPDWORD,
179    lpFlags: LPDWORD,
180    lpOverlapped: LPWSAOVERLAPPED,
181    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
182    lpThreadId: LPWSATHREADID,
183    lpErrno: LPINT,
184) -> c_int}
185FN!{stdcall LPWSPRECVDISCONNECT(
186    s: SOCKET,
187    lpInboundDisconnectData: LPWSABUF,
188    lpErrno: LPINT,
189) -> c_int}
190FN!{stdcall LPWSPRECVFROM(
191    s: SOCKET,
192    lpBuffers: LPWSABUF,
193    dwBufferCount: DWORD,
194    lpNumberOfBytesRecvd: LPDWORD,
195    lpFlags: LPDWORD,
196    lpFrom: *mut SOCKADDR,
197    lpFromlen: LPINT,
198    lpOverlapped: LPWSAOVERLAPPED,
199    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
200    lpThreadId: LPWSATHREADID,
201    lpErrno: LPINT,
202) -> c_int}
203FN!{stdcall LPWSPSELECT(
204    nfds: c_int,
205    readfds: *mut fd_set,
206    writefds: *mut fd_set,
207    exceptfds: *mut fd_set,
208    timeout: *const timeval,
209    lpErrno: LPINT,
210) -> c_int}
211FN!{stdcall LPWSPSEND(
212    s: SOCKET,
213    lpBuffers: LPWSABUF,
214    dwBufferCount: DWORD,
215    lpNumberOfBytesSent: LPDWORD,
216    dwFlags: DWORD,
217    lpOverlapped: LPWSAOVERLAPPED,
218    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
219    lpThreadId: LPWSATHREADID,
220    lpErrno: LPINT,
221) -> c_int}
222FN!{stdcall LPWSPSENDDISCONNECT(
223    s: SOCKET,
224    lpOutboundDisconnectData: LPWSABUF,
225    lpErrno: LPINT,
226) -> c_int}
227FN!{stdcall LPWSPSENDTO(
228    s: SOCKET,
229    lpBuffers: LPWSABUF,
230    dwBufferCount: DWORD,
231    lpNumberOfBytesSent: LPDWORD,
232    dwFlags: DWORD,
233    lpTo: *const SOCKADDR,
234    iTolen: c_int,
235    lpOverlapped: LPWSAOVERLAPPED,
236    lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
237    lpThreadId: LPWSATHREADID,
238    lpErrno: LPINT,
239) -> c_int}
240FN!{stdcall LPWSPSETSOCKOPT(
241    s: SOCKET,
242    level: c_int,
243    optname: c_int,
244    optval: *const c_char,
245    optlen: c_int,
246    lpErrno: LPINT,
247) -> c_int}
248FN!{stdcall LPWSPSHUTDOWN(
249    s: SOCKET,
250    how: c_int,
251    lpErrno: LPINT,
252) -> c_int}
253FN!{stdcall LPWSPSOCKET(
254    af: c_int,
255    _type: c_int,
256    protocol: c_int,
257    lpProtocolInfo: LPWSAPROTOCOL_INFOW,
258    g: GROUP,
259    dwFlags: DWORD,
260    lpErrno: LPINT,
261) -> SOCKET}
262FN!{stdcall LPWSPSTRINGTOADDRESS(
263    AddressString: LPWSTR,
264    AddressFamily: INT,
265    lpProtocolInfo: LPWSAPROTOCOL_INFOW,
266    lpAddress: LPSOCKADDR,
267    lpAddressLength: LPINT,
268    lpErrno: LPINT,
269) -> c_int}
270STRUCT!{struct WSPPROC_TABLE {
271    lpWSPAccept: LPWSPACCEPT,
272    lpWSPAddressToString: LPWSPADDRESSTOSTRING,
273    lpWSPAsyncSelect: LPWSPASYNCSELECT,
274    lpWSPBind: LPWSPBIND,
275    lpWSPCancelBlockingCall: LPWSPCANCELBLOCKINGCALL,
276    lpWSPCleanup: LPWSPCLEANUP,
277    lpWSPCloseSocket: LPWSPCLOSESOCKET,
278    lpWSPConnect: LPWSPCONNECT,
279    lpWSPDuplicateSocket: LPWSPDUPLICATESOCKET,
280    lpWSPEnumNetworkEvents: LPWSPENUMNETWORKEVENTS,
281    lpWSPEventSelect: LPWSPEVENTSELECT,
282    lpWSPGetOverlappedResult: LPWSPGETOVERLAPPEDRESULT,
283    lpWSPGetPeerName: LPWSPGETPEERNAME,
284    lpWSPGetSockName: LPWSPGETSOCKNAME,
285    lpWSPGetSockOpt: LPWSPGETSOCKOPT,
286    lpWSPGetQOSByName: LPWSPGETQOSBYNAME,
287    lpWSPIoctl: LPWSPIOCTL,
288    lpWSPJoinLeaf: LPWSPJOINLEAF,
289    lpWSPListen: LPWSPLISTEN,
290    lpWSPRecv: LPWSPRECV,
291    lpWSPRecvDisconnect: LPWSPRECVDISCONNECT,
292    lpWSPRecvFrom: LPWSPRECVFROM,
293    lpWSPSelect: LPWSPSELECT,
294    lpWSPSend: LPWSPSEND,
295    lpWSPSendDisconnect: LPWSPSENDDISCONNECT,
296    lpWSPSendTo: LPWSPSENDTO,
297    lpWSPSetSockOpt: LPWSPSETSOCKOPT,
298    lpWSPShutdown: LPWSPSHUTDOWN,
299    lpWSPSocket: LPWSPSOCKET,
300    lpWSPStringToAddress: LPWSPSTRINGTOADDRESS,
301}}
302pub type LPWSPPROC_TABLE = *mut WSPPROC_TABLE;
303FN!{stdcall LPWPUCLOSEEVENT(
304    hEvent: WSAEVENT,
305    lpErrno: LPINT,
306) -> c_int}
307FN!{stdcall LPWPUCLOSESOCKETHANDLE(
308    s: SOCKET,
309    lpErrno: LPINT,
310) -> c_int}
311FN!{stdcall LPWPUCREATEEVENT(
312    lpErrno: LPINT,
313) -> WSAEVENT}
314FN!{stdcall LPWPUCREATESOCKETHANDLE(
315    dwCatalogEntryId: DWORD,
316    dwContext: DWORD_PTR,
317    lpErrno: LPINT,
318) -> SOCKET}
319FN!{stdcall LPWPUFDISSET(
320    s: SOCKET,
321    fdset: *mut fd_set,
322) -> c_int}
323FN!{stdcall LPWPUGETPROVIDERPATH(
324    lpProviderId: LPGUID,
325    lpszProviderDllPath: *mut WCHAR,
326    lpProviderDllPathLen: LPINT,
327    lpErrno: LPINT,
328) -> c_int}
329FN!{stdcall LPWPUMODIFYIFSHANDLE(
330    dwCatalogEntryId: DWORD,
331    ProposedHandle: SOCKET,
332    lpErrno: LPINT,
333) -> SOCKET}
334FN!{stdcall LPWPUPOSTMESSAGE(
335    hWnd: HWND,
336    Msg: UINT,
337    wParam: WPARAM,
338    lParam: LPARAM,
339) -> BOOL}
340FN!{stdcall LPWPUQUERYBLOCKINGCALLBACK(
341    dwCatalogEntryId: DWORD,
342    lplpfnCallback: *mut LPBLOCKINGCALLBACK,
343    lpdwContext: PDWORD_PTR,
344    lpErrno: LPINT,
345) -> c_int}
346FN!{stdcall LPWPUQUERYSOCKETHANDLECONTEXT(
347    s: SOCKET,
348    lpContext: PDWORD_PTR,
349    lpErrno: LPINT,
350) -> c_int}
351FN!{stdcall LPWPUQUEUEAPC(
352    lpThreadId: LPWSATHREADID,
353    lpfnUserApc: LPWSAUSERAPC,
354    dwContext: DWORD_PTR,
355    lpErrno: LPINT,
356) -> c_int}
357FN!{stdcall LPWPURESETEVENT(
358    hEvent: WSAEVENT,
359    lpErrno: LPINT,
360) -> BOOL}
361FN!{stdcall LPWPUSETEVENT(
362    hEvent: WSAEVENT,
363    lpErrno: LPINT,
364) -> BOOL}
365FN!{stdcall LPWPUOPENCURRENTTHREAD(
366    lpThreadId: LPWSATHREADID,
367    lpErrno: LPINT,
368) -> c_int}
369FN!{stdcall LPWPUCLOSETHREAD(
370    lpThreadId: LPWSATHREADID,
371    lpErrno: LPINT,
372) -> c_int}
373FN!{stdcall LPWPUCOMPLETEOVERLAPPEDREQUEST(
374    s: SOCKET,
375    lpOverlapped: LPWSAOVERLAPPED,
376    dwError: DWORD,
377    cbTransferred: DWORD,
378    lpErrno: LPINT,
379) -> c_int}
380STRUCT!{struct WSPUPCALLTABLE {
381    lpWPUCloseEvent: LPWPUCLOSEEVENT,
382    lpWPUCloseSocketHandle: LPWPUCLOSESOCKETHANDLE,
383    lpWPUCreateEvent: LPWPUCREATEEVENT,
384    lpWPUCreateSocketHandle: LPWPUCREATESOCKETHANDLE,
385    lpWPUFDIsSet: LPWPUFDISSET,
386    lpWPUGetProviderPath: LPWPUGETPROVIDERPATH,
387    lpWPUModifyIFSHandle: LPWPUMODIFYIFSHANDLE,
388    lpWPUPostMessage: LPWPUPOSTMESSAGE,
389    lpWPUQueryBlockingCallback: LPWPUQUERYBLOCKINGCALLBACK,
390    lpWPUQuerySocketHandleContext: LPWPUQUERYSOCKETHANDLECONTEXT,
391    lpWPUQueueApc: LPWPUQUEUEAPC,
392    lpWPUResetEvent: LPWPURESETEVENT,
393    lpWPUSetEvent: LPWPUSETEVENT,
394    lpWPUOpenCurrentThread: LPWPUOPENCURRENTTHREAD,
395    lpWPUCloseThread: LPWPUCLOSETHREAD,
396}}
397pub type LPWSPUPCALLTABLE = *mut WSPUPCALLTABLE;
398extern "system" {
399    pub fn WSPStartup(
400        wVersionRequested: WORD,
401        lpWSPData: LPWSPDATA,
402        lpProtocolInfo: LPWSAPROTOCOL_INFOW,
403        UpcallTable: WSPUPCALLTABLE,
404        lpProcTable: LPWSPPROC_TABLE,
405    ) -> c_int;
406}
407FN!{stdcall LPWSPSTARTUP(
408    wVersionRequested: WORD,
409    lpWSPData: LPWSPDATA,
410    lpProtocolInfo: LPWSAPROTOCOL_INFOW,
411    UpcallTable: WSPUPCALLTABLE,
412    lpProcTable: LPWSPPROC_TABLE,
413) -> c_int}
414extern "system" {
415    pub fn WSCEnumProtocols(
416        lpiProtocols: LPINT,
417        lpProtocolBuffer: LPWSAPROTOCOL_INFOW,
418        lpdwBufferLength: LPDWORD,
419        lpErrno: LPINT,
420    ) -> c_int;
421}
422FN!{stdcall LPWSCENUMPROTOCOLS(
423    lpiProtocols: LPINT,
424    lpProtocolBuffer: LPWSAPROTOCOL_INFOW,
425    lpdwBufferLength: LPDWORD,
426    lpErrno: LPINT,
427) -> c_int}
428extern "system" {
429    #[cfg(target_pointer_width = "64")]
430    pub fn WSCEnumProtocols32(
431        lpiProtocols: LPINT,
432        lpProtocolBuffer: LPWSAPROTOCOL_INFOW,
433        lpdwBufferLength: LPDWORD,
434        lpErrno: LPINT,
435    ) -> c_int;
436    pub fn WSCDeinstallProvider(
437        lpProviderId: LPGUID,
438        lpErrno: LPINT,
439    ) -> c_int;
440}
441FN!{stdcall LPWSCDEINSTALLPROVIDER(
442    lpProviderId: LPGUID,
443    lpErrno: LPINT,
444) -> c_int}
445extern "system" {
446    #[cfg(target_pointer_width = "64")]
447    pub fn WSCDeinstallProvider32(
448        lpProviderId: LPGUID,
449        lpErrno: LPINT,
450    ) -> c_int;
451    pub fn WSCInstallProvider(
452        lpProviderId: LPGUID,
453        lpszProviderDllPath: *const WCHAR,
454        lpProtocolInfoList: LPWSAPROTOCOL_INFOW,
455        dwNumberOfEntries: DWORD,
456        lpErrno: LPINT,
457    ) -> c_int;
458}
459FN!{stdcall LPWSCINSTALLPROVIDER(
460    lpProviderId: LPGUID,
461    lpszProviderDllPath: *const WCHAR,
462    lpProtocolInfoList: LPWSAPROTOCOL_INFOW,
463    dwNumberOfEntries: DWORD,
464    lpErrno: LPINT,
465) -> c_int}
466extern "system" {
467    #[cfg(target_pointer_width = "64")]
468    pub fn WSCInstallProvider64_32(
469        lpProviderId: LPGUID,
470        lpszProviderDllPath: *const WCHAR,
471        lpProtocolInfoList: LPWSAPROTOCOL_INFOW,
472        dwNumberOfEntries: DWORD,
473        lpErrno: LPINT,
474    ) -> c_int;
475    pub fn WSCGetProviderPath(
476        lpProviderId: LPGUID,
477        lpszProviderDllPath: *mut WCHAR,
478        lpProviderDllPathLen: LPINT,
479        lpErrno: LPINT,
480    ) -> c_int;
481}
482FN!{stdcall LPWSCGETPROVIDERPATH(
483    lpProviderId: LPGUID,
484    lpszProviderDllPath: *mut WCHAR,
485    lpProviderDllPathLen: LPINT,
486    lpErrno: LPINT,
487) -> c_int}
488extern "system" {
489    #[cfg(target_pointer_width = "64")]
490    pub fn WSCGetProviderPath32(
491        lpProviderId: LPGUID,
492        lpszProviderDllPath: *mut WCHAR,
493        lpProviderDllPathLen: LPINT,
494        lpErrno: LPINT,
495    ) -> c_int;
496    pub fn WSCUpdateProvider(
497        lpProviderId: LPGUID,
498        lpszProviderDllPath: *const WCHAR,
499        lpProtocolInfoList: LPWSAPROTOCOL_INFOW,
500        dwNumberOfEntries: DWORD,
501        lpErrno: LPINT,
502    ) -> c_int;
503}
504FN!{stdcall LPWSCUPDATEPROVIDER(
505    lpProviderId: LPGUID,
506    lpszProviderDllPath: *const WCHAR,
507    lpProtocolInfoList: LPWSAPROTOCOL_INFOW,
508    dwNumberOfEntries: DWORD,
509    lpErrno: LPINT,
510) -> c_int}
511#[cfg(target_pointer_width = "64")]
512extern "system" {
513    pub fn WSCUpdateProvider32(
514        lpProviderId: LPGUID,
515        lpszProviderDllPath: *const WCHAR,
516        lpProtocolInfoList: LPWSAPROTOCOL_INFOW,
517        dwNumberOfEntries: DWORD,
518        lpErrno: LPINT,
519    ) -> c_int;
520}
521pub const LSP_SYSTEM: DWORD = 0x80000000;
522pub const LSP_INSPECTOR: DWORD = 0x00000001;
523pub const LSP_REDIRECTOR: DWORD = 0x00000002;
524pub const LSP_PROXY: DWORD = 0x00000004;
525pub const LSP_FIREWALL: DWORD = 0x00000008;
526pub const LSP_INBOUND_MODIFY: DWORD = 0x00000010;
527pub const LSP_OUTBOUND_MODIFY: DWORD = 0x00000020;
528pub const LSP_CRYPTO_COMPRESS: DWORD = 0x00000040;
529pub const LSP_LOCAL_CACHE: DWORD = 0x00000080;
530ENUM!{enum WSC_PROVIDER_INFO_TYPE {
531    ProviderInfoLspCategories,
532    ProviderInfoAudit,
533}}
534STRUCT!{struct WSC_PROVIDER_AUDIT_INFO {
535    RecordSize: DWORD,
536    Reserved: PVOID,
537}}
538extern "system" {
539    pub fn WSCSetProviderInfo(
540        lpProviderId: LPGUID,
541        InfoType: WSC_PROVIDER_INFO_TYPE,
542        Info: PBYTE,
543        InfoSize: size_t,
544        Flags: DWORD,
545        lpErrno: LPINT,
546    ) -> c_int;
547    pub fn WSCGetProviderInfo(
548        lpProviderId: LPGUID,
549        InfoType: WSC_PROVIDER_INFO_TYPE,
550        Info: PBYTE,
551        InfoSize: *mut size_t,
552        Flags: DWORD,
553        lpErrno: LPINT,
554    ) -> c_int;
555    #[cfg(target_pointer_width = "64")]
556    pub fn WSCSetProviderInfo32(
557        lpProviderId: LPGUID,
558        InfoType: WSC_PROVIDER_INFO_TYPE,
559        Info: PBYTE,
560        InfoSize: size_t,
561        Flags: DWORD,
562        lpErrno: LPINT,
563    ) -> c_int;
564    #[cfg(target_pointer_width = "64")]
565    pub fn WSCGetProviderInfo32(
566        lpProviderId: LPGUID,
567        InfoType: WSC_PROVIDER_INFO_TYPE,
568        Info: PBYTE,
569        InfoSize: *mut size_t,
570        Flags: DWORD,
571        lpErrno: LPINT,
572    ) -> c_int;
573    pub fn WSCSetApplicationCategory(
574        Path: LPCWSTR,
575        PathLength: DWORD,
576        Extra: LPCWSTR,
577        ExtraLength: DWORD,
578        PermittedLspCategories: DWORD,
579        pPrevPermLspCat: *mut DWORD,
580        lpErrno: LPINT,
581    ) -> c_int;
582    pub fn WSCGetApplicationCategory(
583        Path: LPCWSTR,
584        PathLength: DWORD,
585        Extra: LPCWSTR,
586        ExtraLength: DWORD,
587        pPermittedLspCategories: *mut DWORD,
588        lpErrno: LPINT,
589    ) -> c_int;
590    pub fn WPUCloseEvent(
591        hEvent: WSAEVENT,
592        lpErrno: LPINT,
593    ) -> BOOL;
594    pub fn WPUCloseSocketHandle(
595        s: SOCKET,
596        lpErrno: LPINT,
597    ) -> c_int;
598    pub fn WPUCreateEvent(
599        lpErrno: LPINT,
600    ) -> WSAEVENT;
601    pub fn WPUCreateSocketHandle(
602        dwCatalogEntryId: DWORD,
603        dwContext: DWORD_PTR,
604        lpErrno: LPINT,
605    ) -> SOCKET;
606    pub fn WPUFDIsSet(
607        s: SOCKET,
608        fdset: *mut fd_set,
609    ) -> c_int;
610    pub fn WPUGetProviderPath(
611        lpProviderId: LPGUID,
612        lpszProviderDllPath: *mut WCHAR,
613        lpProviderDllPathLen: LPINT,
614        lpErrno: LPINT,
615    ) -> c_int;
616    pub fn WPUModifyIFSHandle(
617        dwCatalogEntryId: DWORD,
618        ProposedHandle: SOCKET,
619        lpErrno: LPINT,
620    ) -> SOCKET;
621    pub fn WPUPostMessage(
622        hWnd: HWND,
623        Msg: UINT,
624        wParam: WPARAM,
625        lParam: LPARAM,
626    ) -> BOOL;
627    pub fn WPUQueryBlockingCallback(
628        dwCatalogEntryId: DWORD,
629        lplpfnCallback: *mut LPBLOCKINGCALLBACK,
630        lpdwContext: PDWORD_PTR,
631        lpErrno: LPINT,
632    ) -> c_int;
633    pub fn WPUQuerySocketHandleContext(
634        s: SOCKET,
635        lpContext: PDWORD_PTR,
636        lpErrno: LPINT,
637    ) -> c_int;
638    pub fn WPUQueueApc(
639        lpThreadId: LPWSATHREADID,
640        lpfnUserApc: LPWSAUSERAPC,
641        dwContext: DWORD_PTR,
642        lpErrno: LPINT,
643    ) -> c_int;
644    pub fn WPUResetEvent(
645        hEvent: WSAEVENT,
646        lpErrno: LPINT,
647    ) -> BOOL;
648    pub fn WPUSetEvent(
649        hEvent: WSAEVENT,
650        lpErrno: LPINT,
651    ) -> BOOL;
652    pub fn WPUCompleteOverlappedRequest(
653        s: SOCKET,
654        lpOverlapped: LPWSAOVERLAPPED,
655        dwError: DWORD,
656        cbTransferred: DWORD,
657        lpErrno: LPINT,
658    ) -> c_int;
659    pub fn WPUOpenCurrentThread(
660        lpThreadId: LPWSATHREADID,
661        lpErrno: LPINT,
662    ) -> c_int;
663    pub fn WPUCloseThread(
664        lpThreadId: LPWSATHREADID,
665        lpErrno: LPINT,
666    ) -> c_int;
667    #[cfg(target_pointer_width = "64")]
668    pub fn WSCEnumNameSpaceProviders32(
669        lpdwBufferLength: LPDWORD,
670        lpnspBuffer: LPWSANAMESPACE_INFOW,
671    ) -> INT;
672    #[cfg(target_pointer_width = "64")]
673    pub fn WSCEnumNameSpaceProvidersEx32(
674        lpdwBufferLength: LPDWORD,
675        lpnspBuffer: LPWSANAMESPACE_INFOEXW,
676    ) -> INT;
677    pub fn WSCInstallNameSpace(
678        lpszIdentifier: LPWSTR,
679        lpszPathName: LPWSTR,
680        dwNameSpace: DWORD,
681        dwVersion: DWORD,
682        lpProviderId: LPGUID,
683    ) -> INT;
684}
685FN!{stdcall LPWSCINSTALLNAMESPACE(
686    lpszIdentifier: LPWSTR,
687    lpszPathName: LPWSTR,
688    dwNameSpace: DWORD,
689    dwVersion: DWORD,
690    lpProviderId: LPGUID,
691) -> INT}
692extern "system" {
693    #[cfg(target_pointer_width = "64")]
694    pub fn WSCInstallNameSpace32(
695        lpszIdentifier: LPWSTR,
696        lpszPathName: LPWSTR,
697        dwNameSpace: DWORD,
698        dwVersion: DWORD,
699        lpProviderId: LPGUID,
700    ) -> INT;
701    pub fn WSCUnInstallNameSpace(
702        lpProviderId: LPGUID,
703    ) -> INT;
704}
705FN!{stdcall LPWSCUNINSTALLNAMESPACE(
706    lpProviderId: LPGUID,
707) -> INT}
708extern "system" {
709    pub fn WSCInstallNameSpaceEx(
710        lpszIdentifier: LPWSTR,
711        lpszPathName: LPWSTR,
712        dwNameSpace: DWORD,
713        dwVersion: DWORD,
714        lpProviderId: LPGUID,
715        lpProviderSpecific: LPBLOB,
716    ) -> INT;
717    #[cfg(target_pointer_width = "64")]
718    pub fn WSCInstallNameSpaceEx32(
719        lpszIdentifier: LPWSTR,
720        lpszPathName: LPWSTR,
721        dwNameSpace: DWORD,
722        dwVersion: DWORD,
723        lpProviderId: LPGUID,
724        lpProviderSpecific: LPBLOB,
725    ) -> INT;
726    #[cfg(target_pointer_width = "64")]
727    pub fn WSCUnInstallNameSpace32(
728        lpProviderId: LPGUID,
729    ) -> INT;
730    pub fn WSCEnableNSProvider(
731        lpProviderId: LPGUID,
732        fEnable: BOOL,
733    ) -> INT;
734}
735FN!{stdcall LPWSCENABLENSPROVIDER(
736    lpProviderId: LPGUID,
737    fEnable: BOOL,
738) -> INT}
739extern "system" {
740    #[cfg(target_pointer_width = "64")]
741    pub fn WSCEnableNSProvider32(
742        lpProviderId: LPGUID,
743        fEnable: BOOL,
744    ) -> INT;
745    #[cfg(target_pointer_width = "64")]
746    pub fn WSCInstallProviderAndChains64_32(
747        lpProviderId: LPGUID,
748        lpszProviderDllPath: LPWSTR,
749        lpszProviderDllPath32: LPWSTR,
750        lpszLspName: LPWSTR,
751        dwServiceFlags: DWORD,
752        lpProtocolInfoList: LPWSAPROTOCOL_INFOW,
753        dwNumberOfEntries: DWORD,
754        lpdwCatalogEntryId: LPDWORD,
755        lpErrno: LPINT,
756    ) -> c_int;
757    #[cfg(target_pointer_width = "32")]
758    pub fn WSCInstallProviderAndChains(
759        lpProviderId: LPGUID,
760        lpszProviderDllPath: LPWSTR,
761        lpszLspName: LPWSTR,
762        dwServiceFlags: DWORD,
763        lpProtocolInfoList: LPWSAPROTOCOL_INFOW,
764        dwNumberOfEntries: DWORD,
765        lpdwCatalogEntryId: LPDWORD,
766        lpErrno: LPINT,
767    ) -> c_int;
768}
769FN!{stdcall LPNSPCLEANUP(
770    lpProviderId: LPGUID,
771) -> INT}
772FN!{stdcall LPNSPLOOKUPSERVICEBEGIN(
773    lpProviderId: LPGUID,
774    lpqsRestrictions: LPWSAQUERYSETW,
775    lpServiceClassInfo: LPWSASERVICECLASSINFOW,
776    dwControlFlags: DWORD,
777    lphLookup: LPHANDLE,
778) -> INT}
779FN!{stdcall LPNSPLOOKUPSERVICENEXT(
780    hLookup: HANDLE,
781    dwControlFlags: DWORD,
782    lpdwBufferLength: LPDWORD,
783    lpqsResults: LPWSAQUERYSETW,
784) -> INT}
785FN!{stdcall LPNSPIOCTL(
786    hLookup: HANDLE,
787    dwControlCode: DWORD,
788    lpvInBuffer: LPVOID,
789    cbInBuffer: DWORD,
790    lpvOutBuffer: LPVOID,
791    cbOutBuffer: DWORD,
792    lpcbBytesReturned: LPDWORD,
793    lpCompletion: LPWSACOMPLETION,
794    lpThreadId: LPWSATHREADID,
795) -> INT}
796FN!{stdcall LPNSPLOOKUPSERVICEEND(
797    hLookup: HANDLE,
798) -> INT}
799FN!{stdcall LPNSPSETSERVICE(
800    lpProviderId: LPGUID,
801    lpServiceClassInfo: LPWSASERVICECLASSINFOW,
802    lpqsRegInfo: LPWSAQUERYSETW,
803    essOperation: WSAESETSERVICEOP,
804    dwControlFlags: DWORD,
805) -> INT}
806FN!{stdcall LPNSPINSTALLSERVICECLASS(
807    lpProviderId: LPGUID,
808    lpServiceClassInfo: LPWSASERVICECLASSINFOW,
809) -> INT}
810FN!{stdcall LPNSPREMOVESERVICECLASS(
811    lpProviderId: LPGUID,
812    lpServiceClassId: LPGUID,
813) -> INT}
814FN!{stdcall LPNSPGETSERVICECLASSINFO(
815    lpProviderId: LPGUID,
816    lpdwBufSize: LPDWORD,
817    lpServiceClassInfo: LPWSASERVICECLASSINFOW,
818) -> INT}
819STRUCT!{struct NSP_ROUTINE {
820    cbSize: DWORD,
821    dwMajorVersion: DWORD,
822    dwMinorVersion: DWORD,
823    NSPCleanup: LPNSPCLEANUP,
824    NSPLookupServiceBegin: LPNSPLOOKUPSERVICEBEGIN,
825    NSPLookupServiceNext: LPNSPLOOKUPSERVICENEXT,
826    NSPLookupServiceEnd: LPNSPLOOKUPSERVICEEND,
827    NSPSetService: LPNSPSETSERVICE,
828    NSPInstallServiceClass: LPNSPINSTALLSERVICECLASS,
829    NSPRemoveServiceClass: LPNSPREMOVESERVICECLASS,
830    NSPGetServiceClassInfo: LPNSPGETSERVICECLASSINFO,
831    NSPIoctl: LPNSPIOCTL,
832}}
833pub type LPNSP_ROUTINE = *mut NSP_ROUTINE;
834extern "system" {
835    pub fn NSPStartup(
836        lpProviderId: LPGUID,
837        lpnspRoutines: LPNSP_ROUTINE,
838    ) -> INT;
839}
840FN!{stdcall LPNSPSTARTUP(
841    lpProviderId: LPGUID,
842    lpnspRoutines: LPNSP_ROUTINE,
843) -> INT}
844FN!{stdcall LPNSPV2STARTUP(
845    lpProviderId: LPGUID,
846    ppvClientSessionArg: *mut LPVOID,
847) -> INT}
848FN!{stdcall LPNSPV2CLEANUP(
849    lpProviderId: LPGUID,
850    pvClientSessionArg: LPVOID,
851) -> INT}
852FN!{stdcall LPNSPV2LOOKUPSERVICEBEGIN(
853    lpProviderId: LPGUID,
854    lpqsRestrictions: LPWSAQUERYSET2W,
855    dwControlFlags: DWORD,
856    lpvClientSessionArg: LPVOID,
857    lphLookup: LPHANDLE,
858) -> INT}
859FN!{stdcall LPNSPV2LOOKUPSERVICENEXTEX(
860    hAsyncCall: HANDLE,
861    hLookup: HANDLE,
862    dwControlFlags: DWORD,
863    lpdwBufferLength: LPDWORD,
864    lpqsResults: LPWSAQUERYSET2W,
865) -> ()}
866FN!{stdcall LPNSPV2LOOKUPSERVICEEND(
867    hLookup: HANDLE,
868) -> INT}
869FN!{stdcall LPNSPV2SETSERVICEEX(
870    hAsyncCall: HANDLE,
871    lpProviderId: LPGUID,
872    lpqsRegInfo: LPWSAQUERYSET2W,
873    essOperation: WSAESETSERVICEOP,
874    dwControlFlags: DWORD,
875    lpvClientSessionArg: LPVOID,
876) -> ()}
877FN!{stdcall LPNSPV2CLIENTSESSIONRUNDOWN(
878    lpProviderId: LPGUID,
879    pvClientSessionArg: LPVOID,
880) -> ()}
881STRUCT!{struct NSPV2_ROUTINE {
882    cbSize: DWORD,
883    dwMajorVersion: DWORD,
884    dwMinorVersion: DWORD,
885    NSPv2Startup: LPNSPV2STARTUP,
886    NSPv2Cleanup: LPNSPV2CLEANUP,
887    NSPv2LookupServiceBegin: LPNSPV2LOOKUPSERVICEBEGIN,
888    NSPv2LookupServiceNextEx: LPNSPV2LOOKUPSERVICENEXTEX,
889    NSPv2LookupServiceEnd: LPNSPV2LOOKUPSERVICEEND,
890    NSPv2SetServiceEx: LPNSPV2SETSERVICEEX,
891    NSPv2ClientSessionRundown: LPNSPV2CLIENTSESSIONRUNDOWN,
892}}
893pub type PNSPV2_ROUTINE = *mut NSPV2_ROUTINE;
894pub type LPNSPV2_ROUTINE = *mut NSPV2_ROUTINE;
895pub type PCNSPV2_ROUTINE = *const NSPV2_ROUTINE;
896pub type LPCNSPV2_ROUTINE = *const NSPV2_ROUTINE;
897extern "system" {
898    pub fn WSAAdvertiseProvider(
899        puuidProviderId: *const GUID,
900        pNSPv2Routine: *const LPCNSPV2_ROUTINE,
901    ) -> INT;
902    pub fn WSAUnadvertiseProvider(
903        puuidProviderId: *const GUID,
904    ) -> INT;
905    pub fn WSAProviderCompleteAsyncCall(
906        hAsyncCall: HANDLE,
907        iRetCode: INT,
908    ) -> INT;
909}