[CLASSPNP] Fix MSVC build. Brought to you by Timo.
[reactos.git] / reactos / sdk / include / ddk / wsk.h
1 /*
2 * wsk.h
3 *
4 * Windows Sockets Kernel-Mode Interface
5 *
6 * This file is part of the ReactOS DDK package.
7 *
8 * Contributors:
9 * Timo Kreuzer (timo.kreuzer@reactos.org)
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 */
22 #pragma once
23 #define _WSK_
24
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28
29 #include <netioddk.h>
30 #include <ws2def.h>
31 #include <mswsockdef.h>
32
33 extern CONST NPIID NPI_WSK_INTERFACE_ID;
34
35 #define WSKAPI NTAPI
36
37 #define MAKE_WSK_VERSION(Mj, Mn) ((USHORT)((Mj) << 8) | (USHORT)((Mn) & 0xff))
38 #define WSK_MAJOR_VERSION(V) ((UCHAR)((V) >> 8))
39 #define WSK_MINOR_VERSION(V) ((UCHAR)(V))
40 #define WSK_FLAG_AT_DISPATCH_LEVEL 0x00000008
41 #define WSK_FLAG_RELEASE_ASAP 0x00000002
42 #define WSK_FLAG_ENTIRE_MESSAGE 0x00000004
43 #define WSK_FLAG_ABORTIVE 0x00000001
44 #define WSK_FLAG_BASIC_SOCKET 0x00000000
45 #define WSK_FLAG_LISTEN_SOCKET 0x00000001
46 #define WSK_FLAG_CONNECTION_SOCKET 0x00000002
47 #define WSK_FLAG_DATAGRAM_SOCKET 0x00000004
48 #define WSK_TRANSPORT_LIST_QUERY 2
49 #define WSK_TRANSPORT_LIST_CHANGE 3
50 #define WSK_CACHE_SD 4
51 #define WSK_RELEASE_SD 5
52 #define WSK_TDI_DEVICENAME_MAPPING 6
53 #define WSK_SET_STATIC_EVENT_CALLBACKS 7
54 #define WSK_TDI_BEHAVIOR 8
55 #define WSK_TDI_BEHAVIOR_BYPASS_TDI 0x00000001
56 #define SO_WSK_SECURITY (WSK_SO_BASE+1)
57 #define SO_WSK_EVENT_CALLBACK (WSK_SO_BASE+2)
58 #define WSK_EVENT_RECEIVE_FROM 0x00000100
59 #define WSK_EVENT_ACCEPT 0x00000200
60 #define WSK_EVENT_SEND_BACKLOG 0x00000010
61 #define WSK_EVENT_RECEIVE 0x00000040
62 #define WSK_EVENT_DISCONNECT 0x00000080
63 #define WSK_EVENT_DISABLE 0x80000000
64 #define SIO_WSK_SET_REMOTE_ADDRESS _WSAIOW(IOC_WSK,0x1)
65 #define SIO_WSK_REGISTER_EXTENSION _WSAIORW(IOC_WSK,0x2)
66 #define SIO_WSK_QUERY_IDEAL_SEND_BACKLOG _WSAIOR(IOC_WSK,0x3)
67 #define SIO_WSK_QUERY_RECEIVE_BACKLOG _WSAIOR(IOC_WSK,0x4)
68 #define SIO_WSK_QUERY_INSPECT_ID _WSAIOR(IOC_WSK,0x5)
69 #define SIO_WSK_SET_SENDTO_ADDRESS _WSAIOW(IOC_WSK,0x6)
70 #define WSK_FLAG_NODELAY 0x00000002
71 #define WSK_FLAG_WAITALL 0x00000002
72 #define WSK_FLAG_DRAIN 0x00000004
73 #define WSK_NO_WAIT 0
74 #define WSK_INFINITE_WAIT 0xffffffff
75
76 typedef enum
77 {
78 WskInspectReject,
79 WskInspectAccept,
80 WskInspectPend,
81 WskInspectMax
82 } WSK_INSPECT_ACTION, *PWSK_INSPECT_ACTION;
83
84 typedef enum
85 {
86 WskSetOption,
87 WskGetOption,
88 WskIoctl,
89 WskControlMax
90 } WSK_CONTROL_SOCKET_TYPE, *PWSK_CONTROL_SOCKET_TYPE;
91
92 typedef PVOID PWSK_CLIENT;
93
94 typedef struct _WSK_SOCKET
95 {
96 const VOID *Dispatch;
97 } WSK_SOCKET, *PWSK_SOCKET;
98
99 typedef struct _WSK_BUF
100 {
101 PMDL Mdl;
102 ULONG Offset;
103 SIZE_T Length;
104 } WSK_BUF, *PWSK_BUF;
105
106 typedef struct _WSK_INSPECT_ID
107 {
108 ULONG_PTR Key;
109 ULONG SerialNumber;
110 } WSK_INSPECT_ID, *PWSK_INSPECT_ID;
111
112 typedef struct _WSK_DATAGRAM_INDICATION
113 {
114 struct _WSK_DATAGRAM_INDICATION *Next;
115 WSK_BUF Buffer;
116 _Field_size_bytes_(ControlInfoLength) PCMSGHDR ControlInfo;
117 ULONG ControlInfoLength;
118 PSOCKADDR RemoteAddress;
119 } WSK_DATAGRAM_INDICATION, *PWSK_DATAGRAM_INDICATION;
120
121 typedef
122 _Must_inspect_result_
123 NTSTATUS
124 (WSKAPI * PFN_WSK_RECEIVE_FROM_EVENT)(
125 _In_opt_ PVOID SocketContext,
126 _In_ ULONG Flags,
127 _In_opt_ PWSK_DATAGRAM_INDICATION DataIndication);
128
129 typedef struct _WSK_DATA_INDICATION
130 {
131 struct _WSK_DATA_INDICATION *Next;
132 WSK_BUF Buffer;
133 } WSK_DATA_INDICATION, *PWSK_DATA_INDICATION;
134
135 typedef
136 _Must_inspect_result_
137 NTSTATUS
138 (WSKAPI * PFN_WSK_RECEIVE_EVENT)(
139 _In_opt_ PVOID SocketContext,
140 _In_ ULONG Flags,
141 _In_opt_ PWSK_DATA_INDICATION DataIndication,
142 _In_ SIZE_T BytesIndicated,
143 _Inout_ SIZE_T *BytesAccepted);
144
145 typedef
146 NTSTATUS
147 (WSKAPI * PFN_WSK_DISCONNECT_EVENT)(
148 _In_opt_ PVOID SocketContext,
149 _In_ ULONG Flags);
150
151 typedef
152 NTSTATUS
153 (WSKAPI * PFN_WSK_SEND_BACKLOG_EVENT)(
154 _In_opt_ PVOID SocketContext,
155 _In_ SIZE_T IdealBacklogSize);
156
157 typedef struct _WSK_CLIENT_CONNECTION_DISPATCH
158 {
159 PFN_WSK_RECEIVE_EVENT WskReceiveEvent;
160 PFN_WSK_DISCONNECT_EVENT WskDisconnectEvent;
161 PFN_WSK_SEND_BACKLOG_EVENT WskSendBacklogEvent;
162 } WSK_CLIENT_CONNECTION_DISPATCH, *PWSK_CLIENT_CONNECTION_DISPATCH;
163
164 typedef
165 _Must_inspect_result_
166 _At_(AcceptSocket, __drv_aliasesMem)
167 NTSTATUS
168 (WSKAPI * PFN_WSK_ACCEPT_EVENT)(
169 _In_opt_ PVOID SocketContext,
170 _In_ ULONG Flags,
171 _In_ PSOCKADDR LocalAddress,
172 _In_ PSOCKADDR RemoteAddress,
173 _In_opt_ PWSK_SOCKET AcceptSocket,
174 _Outptr_result_maybenull_ PVOID *AcceptSocketContext,
175 _Outptr_result_maybenull_ const WSK_CLIENT_CONNECTION_DISPATCH **AcceptSocketDispatch);
176
177 typedef
178 _At_(Irp->IoStatus.Information, __drv_allocatesMem(Mem))
179 NTSTATUS
180 (WSKAPI * PFN_WSK_SOCKET_CONNECT)(
181 _In_ PWSK_CLIENT Client,
182 _In_ USHORT SocketType,
183 _In_ ULONG Protocol,
184 _In_ PSOCKADDR LocalAddress,
185 _In_ PSOCKADDR RemoteAddress,
186 _Reserved_ ULONG Flags,
187 _In_opt_ PVOID SocketContext,
188 _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH *Dispatch,
189 _In_opt_ PEPROCESS OwningProcess,
190 _In_opt_ PETHREAD OwningThread,
191 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,
192 _Inout_ PIRP Irp);
193
194 typedef
195 NTSTATUS
196 (WSKAPI * PFN_WSK_CONTROL_SOCKET)(
197 _In_ PWSK_SOCKET Socket,
198 _In_ WSK_CONTROL_SOCKET_TYPE RequestType,
199 _In_ ULONG ControlCode,
200 _In_ ULONG Level,
201 _In_ SIZE_T InputSize,
202 _In_reads_bytes_opt_(InputSize) PVOID InputBuffer,
203 _In_ SIZE_T OutputSize,
204 _Out_writes_bytes_opt_(OutputSize) PVOID OutputBuffer,
205 _Out_opt_ SIZE_T *OutputSizeReturned,
206 _Inout_opt_ PIRP Irp);
207
208 typedef
209 _At_(Socket, __drv_freesMem(Mem))
210 NTSTATUS
211 (WSKAPI * PFN_WSK_CLOSE_SOCKET)(
212 _In_ PWSK_SOCKET Socket,
213 _Inout_ PIRP Irp);
214
215 typedef struct _WSK_PROVIDER_BASIC_DISPATCH
216 {
217 PFN_WSK_CONTROL_SOCKET WskControlSocket;
218 PFN_WSK_CLOSE_SOCKET WskCloseSocket;
219 } WSK_PROVIDER_BASIC_DISPATCH, *PWSK_PROVIDER_BASIC_DISPATCH;
220
221 typedef
222 NTSTATUS
223 (WSKAPI * PFN_WSK_BIND) (
224 _In_ PWSK_SOCKET Socket,
225 _In_ PSOCKADDR LocalAddress,
226 _Reserved_ ULONG Flags,
227 _Inout_ PIRP Irp);
228
229 typedef
230 _At_(Irp->IoStatus.Information, __drv_allocatesMem(Mem))
231 NTSTATUS
232 (WSKAPI * PFN_WSK_ACCEPT)(
233 _In_ PWSK_SOCKET ListenSocket,
234 _Reserved_ ULONG Flags,
235 _In_opt_ PVOID AcceptSocketContext,
236 _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH *AcceptSocketDispatch,
237 _Out_opt_ PSOCKADDR LocalAddress,
238 _Out_opt_ PSOCKADDR RemoteAddress,
239 _Inout_ PIRP Irp);
240
241 typedef
242 NTSTATUS
243 (WSKAPI * PFN_WSK_INSPECT_COMPLETE)(
244 _In_ PWSK_SOCKET ListenSocket,
245 _In_ PWSK_INSPECT_ID InspectID,
246 _In_ WSK_INSPECT_ACTION Action,
247 _Inout_ PIRP Irp);
248
249 typedef
250 NTSTATUS
251 (WSKAPI * PFN_WSK_GET_LOCAL_ADDRESS)(
252 _In_ PWSK_SOCKET Socket,
253 _Out_ PSOCKADDR LocalAddress,
254 _Inout_ PIRP Irp);
255
256 typedef struct _WSK_PROVIDER_LISTEN_DISPATCH
257 {
258 #ifdef __cplusplus
259 WSK_PROVIDER_BASIC_DISPATCH Basic;
260 #else
261 WSK_PROVIDER_BASIC_DISPATCH;
262 #endif
263 PFN_WSK_BIND WskBind;
264 PFN_WSK_ACCEPT WskAccept;
265 PFN_WSK_INSPECT_COMPLETE WskInspectComplete;
266 PFN_WSK_GET_LOCAL_ADDRESS WskGetLocalAddress;
267 } WSK_PROVIDER_LISTEN_DISPATCH, *PWSK_PROVIDER_LISTEN_DISPATCH;
268
269 #if (NTDDI_VERSION >= NTDDI_WIN8)
270 typedef struct _WSK_BUF_LIST {
271 struct _WSK_BUF_LIST *Next;
272 WSK_BUF Buffer;
273 } WSK_BUF_LIST, *PWSK_BUF_LIST;
274
275 typedef
276 NTSTATUS
277 (WSKAPI * PFN_WSK_SEND_MESSAGES)(
278 _In_ PWSK_SOCKET Socket,
279 _In_ PWSK_BUF_LIST BufferList,
280 _Reserved_ ULONG Flags,
281 _In_opt_ PSOCKADDR RemoteAddress,
282 _In_ ULONG ControlInfoLength,
283 _In_reads_bytes_opt_(ControlInfoLength) PCMSGHDR ControlInfo,
284 _Inout_ PIRP Irp);
285 #endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
286
287 typedef struct _WSK_PROVIDER_DATAGRAM_DISPATCH
288 {
289 #ifdef __cplusplus
290 WSK_PROVIDER_BASIC_DISPATCH Basic;
291 #else
292 WSK_PROVIDER_BASIC_DISPATCH;
293 #endif
294 PFN_WSK_BIND WskBind;
295 PFN_WSK_SEND_TO WskSendTo;
296 PFN_WSK_RECEIVE_FROM WskReceiveFrom;
297 PFN_WSK_RELEASE_DATAGRAM_INDICATION_LIST WskRelease;
298 PFN_WSK_GET_LOCAL_ADDRESS WskGetLocalAddress;
299 #if (NTDDI_VERSION >= NTDDI_WIN8)
300 PFN_WSK_SEND_MESSAGES WskSendMessages;
301 #endif
302 } WSK_PROVIDER_DATAGRAM_DISPATCH, *PWSK_PROVIDER_DATAGRAM_DISPATCH;
303
304 typedef
305 NTSTATUS
306 (WSKAPI * PFN_WSK_CONNECT) (
307 _In_ PWSK_SOCKET Socket,
308 _In_ PSOCKADDR RemoteAddress,
309 _Reserved_ ULONG Flags,
310 _Inout_ PIRP Irp);
311
312 typedef
313 NTSTATUS
314 (WSKAPI * PFN_WSK_GET_REMOTE_ADDRESS)(
315 _In_ PWSK_SOCKET Socket,
316 _Out_ PSOCKADDR RemoteAddress,
317 _Inout_ PIRP Irp);
318
319 typedef
320 NTSTATUS
321 (WSKAPI * PFN_WSK_SEND)(
322 _In_ PWSK_SOCKET Socket,
323 _In_ PWSK_BUF Buffer,
324 _In_ ULONG Flags,
325 _Inout_ PIRP Irp);
326
327 typedef
328 NTSTATUS
329 (WSKAPI * PFN_WSK_RECEIVE)(
330 _In_ PWSK_SOCKET Socket,
331 _In_ PWSK_BUF Buffer,
332 _In_ ULONG Flags,
333 _Inout_ PIRP Irp);
334
335 typedef
336 NTSTATUS
337 (WSKAPI * PFN_WSK_DISCONNECT)(
338 _In_ PWSK_SOCKET Socket,
339 _In_opt_ PWSK_BUF Buffer,
340 _In_ ULONG Flags,
341 _Inout_ PIRP Irp);
342
343 typedef
344 NTSTATUS
345 (WSKAPI * PFN_WSK_RELEASE_DATA_INDICATION_LIST)(
346 _In_ PWSK_SOCKET Socket,
347 _In_ PWSK_DATA_INDICATION DataIndication);
348
349 typedef struct _WSK_PROVIDER_CONNECTION_DISPATCH
350 {
351 #ifdef __cplusplus
352 WSK_PROVIDER_BASIC_DISPATCH Basic;
353 #else
354 WSK_PROVIDER_BASIC_DISPATCH;
355 #endif
356 PFN_WSK_BIND WskBind;
357 PFN_WSK_CONNECT WskConnect;
358 PFN_WSK_GET_LOCAL_ADDRESS WskGetLocalAddress;
359 PFN_WSK_GET_REMOTE_ADDRESS WskGetRemoteAddress;
360 PFN_WSK_SEND WskSend;
361 PFN_WSK_RECEIVE WskReceive;
362 PFN_WSK_DISCONNECT WskDisconnect;
363 PFN_WSK_RELEASE_DATA_INDICATION_LIST WskRelease;
364 } WSK_PROVIDER_CONNECTION_DISPATCH, *PWSK_PROVIDER_CONNECTION_DISPATCH;
365
366 typedef
367 _Must_inspect_result_
368 WSK_INSPECT_ACTION
369 (WSKAPI * PFN_WSK_INSPECT_EVENT)(
370 _In_opt_ PVOID SocketContext,
371 _In_ PSOCKADDR LocalAddress,
372 _In_ PSOCKADDR RemoteAddress,
373 _In_opt_ PWSK_INSPECT_ID InspectID);
374
375 typedef
376 NTSTATUS
377 (WSKAPI * PFN_WSK_ABORT_EVENT) (
378 _In_opt_ PVOID SocketContext,
379 _In_ PWSK_INSPECT_ID InspectID);
380
381 typedef
382 _At_(Irp->IoStatus.Information, __drv_allocatesMem(Mem))
383 NTSTATUS
384 (WSKAPI * PFN_WSK_SOCKET)(
385 _In_ PWSK_CLIENT Client,
386 _In_ ADDRESS_FAMILY AddressFamily,
387 _In_ USHORT SocketType,
388 _In_ ULONG Protocol,
389 _In_ ULONG Flags,
390 _In_opt_ PVOID SocketContext,
391 _In_opt_ const VOID *Dispatch,
392 _In_opt_ PEPROCESS OwningProcess,
393 _In_opt_ PETHREAD OwningThread,
394 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,
395 _Inout_ PIRP Irp);
396
397 typedef struct _WSK_TDI_MAP
398 {
399 USHORT SocketType;
400 ADDRESS_FAMILY AddressFamily;
401 ULONG Protocol;
402 PCWSTR TdiDeviceName;
403 } WSK_TDI_MAP, *PWSK_TDI_MAP;
404
405 typedef struct _WSK_TDI_MAP_INFO
406 {
407 const ULONG ElementCount;
408 _Field_size_(ElementCount) const WSK_TDI_MAP *Map;
409 } WSK_TDI_MAP_INFO, *PWSK_TDI_MAP_INFO;
410
411 typedef
412 NTSTATUS
413 (WSKAPI * PFN_WSK_CONTROL_CLIENT)(
414 _In_ PWSK_CLIENT Client,
415 _In_ ULONG ControlCode,
416 _In_ SIZE_T InputSize,
417 _In_reads_bytes_opt_(InputSize) PVOID InputBuffer,
418 _In_ SIZE_T OutputSize,
419 _Out_writes_bytes_opt_(OutputSize) PVOID OutputBuffer,
420 _Out_opt_ SIZE_T *OutputSizeReturned,
421 _Inout_opt_ PIRP Irp);
422
423 #if (NTDDI_VERSION >= NTDDI_WIN7)
424
425 typedef
426 _At_(*Result, __drv_allocatesMem(Mem))
427 NTSTATUS
428 (WSKAPI * PFN_WSK_GET_ADDRESS_INFO)(
429 _In_ PWSK_CLIENT Client,
430 _In_opt_ PUNICODE_STRING NodeName,
431 _In_opt_ PUNICODE_STRING ServiceName,
432 _In_opt_ ULONG NameSpace,
433 _In_opt_ GUID *Provider,
434 _In_opt_ PADDRINFOEXW Hints,
435 _Outptr_ PADDRINFOEXW *Result,
436 _In_opt_ PEPROCESS OwningProcess,
437 _In_opt_ PETHREAD OwningThread,
438 _Inout_ PIRP Irp);
439
440 typedef
441 NTSTATUS
442 (WSKAPI * PFN_WSK_GET_NAME_INFO)(
443 _In_ PWSK_CLIENT Client,
444 _In_ PSOCKADDR SockAddr,
445 _In_ ULONG SockAddrLength,
446 _Out_opt_ PUNICODE_STRING NodeName,
447 _Out_opt_ PUNICODE_STRING ServiceName,
448 _In_ ULONG Flags,
449 _In_opt_ PEPROCESS OwningProcess,
450 _In_opt_ PETHREAD OwningThread,
451 _Inout_ PIRP Irp);
452
453 typedef
454 _At_(AddrInfo, __drv_freesMem(Mem))
455 VOID
456 (WSKAPI * PFN_WSK_FREE_ADDRESS_INFO)(
457 _In_ PWSK_CLIENT Client,
458 _In_ PADDRINFOEXW AddrInfo);
459
460 #endif /* if (NTDDI_VERSION >= NTDDI_WIN7) */
461
462 typedef struct _WSK_EVENT_CALLBACK_CONTROL
463 {
464 PNPIID NpiId;
465 ULONG EventMask;
466 } WSK_EVENT_CALLBACK_CONTROL, *PWSK_EVENT_CALLBACK_CONTROL;
467
468 typedef struct _WSK_EXTENSION_CONTROL_IN
469 {
470 PNPIID NpiId;
471 PVOID ClientContext;
472 const VOID* ClientDispatch;
473 } WSK_EXTENSION_CONTROL_IN, *PWSK_EXTENSION_CONTROL_IN;
474
475 typedef struct _WSK_EXTENSION_CONTROL_OUT
476 {
477 PVOID ProviderContext;
478 const VOID* ProviderDispatch;
479 } WSK_EXTENSION_CONTROL_OUT, *PWSK_EXTENSION_CONTROL_OUT;
480
481 typedef
482 NTSTATUS
483 (WSKAPI * PFN_WSK_SEND_TO)(
484 _In_ PWSK_SOCKET Socket,
485 _In_ PWSK_BUF Buffer,
486 _Reserved_ ULONG Flags,
487 _In_opt_ PSOCKADDR RemoteAddress,
488 _In_ ULONG ControlInfoLength,
489 _In_reads_bytes_opt_(ControlInfoLength) PCMSGHDR ControlInfo,
490 _Inout_ PIRP Irp);
491
492 typedef
493 NTSTATUS
494 (WSKAPI * PFN_WSK_RECEIVE_FROM)(
495 _In_ PWSK_SOCKET Socket,
496 _In_ PWSK_BUF Buffer,
497 _Reserved_ ULONG Flags,
498 _Out_opt_ PSOCKADDR RemoteAddress,
499 _Inout_ PULONG ControlLength,
500 _Out_writes_bytes_opt_(*ControlLength) PCMSGHDR ControlInfo,
501 _Out_opt_ PULONG ControlFlags,
502 _Inout_ PIRP Irp);
503
504 typedef
505 NTSTATUS
506 (WSKAPI * PFN_WSK_RELEASE_DATAGRAM_INDICATION_LIST)(
507 _In_ PWSK_SOCKET Socket,
508 _In_ PWSK_DATAGRAM_INDICATION DatagramIndication);
509
510 typedef
511 NTSTATUS
512 (WSKAPI * PFN_WSK_CLIENT_EVENT)(
513 _In_opt_ PVOID ClientContext,
514 _In_ ULONG EventType,
515 _In_reads_bytes_opt_(InformationLength) PVOID Information,
516 _In_ SIZE_T InformationLength);
517
518 typedef struct _WSK_CLIENT_DISPATCH
519 {
520 USHORT Version;
521 USHORT Reserved;
522 PFN_WSK_CLIENT_EVENT WskClientEvent;
523 } WSK_CLIENT_DISPATCH, *PWSK_CLIENT_DISPATCH;
524
525 typedef struct _WSK_CLIENT_LISTEN_DISPATCH
526 {
527 PFN_WSK_ACCEPT_EVENT WskAcceptEvent;
528 PFN_WSK_INSPECT_EVENT WskInspectEvent;
529 PFN_WSK_ABORT_EVENT WskAbortEvent;
530 } WSK_CLIENT_LISTEN_DISPATCH, *PWSK_CLIENT_LISTEN_DISPATCH;
531
532 typedef struct _WSK_CLIENT_DATAGRAM_DISPATCH
533 {
534 PFN_WSK_RECEIVE_FROM_EVENT WskReceiveFromEvent;
535 } WSK_CLIENT_DATAGRAM_DISPATCH, *PWSK_CLIENT_DATAGRAM_DISPATCH;
536
537 typedef struct _WSK_PROVIDER_DISPATCH
538 {
539 USHORT Version;
540 USHORT Reserved;
541 PFN_WSK_SOCKET WskSocket;
542 PFN_WSK_SOCKET_CONNECT WskSocketConnect;
543 PFN_WSK_CONTROL_CLIENT WskControlClient;
544 #if (NTDDI_VERSION >= NTDDI_WIN7)
545 PFN_WSK_GET_ADDRESS_INFO WskGetAddressInfo;
546 PFN_WSK_FREE_ADDRESS_INFO WskFreeAddressInfo;
547 PFN_WSK_GET_NAME_INFO WskGetNameInfo;
548 #endif
549 } WSK_PROVIDER_DISPATCH, *PWSK_PROVIDER_DISPATCH;
550
551
552 typedef struct _WSK_CLIENT_NPI
553 {
554 PVOID ClientContext;
555 const WSK_CLIENT_DISPATCH *Dispatch;
556 } WSK_CLIENT_NPI, *PWSK_CLIENT_NPI;
557
558 typedef struct _WSK_PROVIDER_NPI
559 {
560 PWSK_CLIENT Client;
561 const WSK_PROVIDER_DISPATCH *Dispatch;
562 } WSK_PROVIDER_NPI, *PWSK_PROVIDER_NPI;
563
564 typedef struct _WSK_REGISTRATION
565 {
566 ULONGLONG ReservedRegistrationState;
567 PVOID ReservedRegistrationContext;
568 KSPIN_LOCK ReservedRegistrationLock;
569 } WSK_REGISTRATION, *PWSK_REGISTRATION;
570
571 typedef struct _WSK_PROVIDER_CHARACTERISTICS
572 {
573 USHORT HighestVersion;
574 USHORT LowestVersion;
575 } WSK_PROVIDER_CHARACTERISTICS, *PWSK_PROVIDER_CHARACTERISTICS;
576
577 typedef struct _WSK_TRANSPORT
578 {
579 USHORT Version;
580 USHORT SocketType;
581 ULONG Protocol;
582 ADDRESS_FAMILY AddressFamily;
583 GUID ProviderId;
584 } WSK_TRANSPORT, *PWSK_TRANSPORT;
585
586 _Must_inspect_result_
587 NTSTATUS
588 WskRegister(
589 _In_ PWSK_CLIENT_NPI WskClientNpi,
590 _Out_ PWSK_REGISTRATION WskRegistration);
591
592 _Must_inspect_result_
593 NTSTATUS
594 WskCaptureProviderNPI(
595 _In_ PWSK_REGISTRATION WskRegistration,
596 _In_ ULONG WaitTimeout,
597 _Out_ PWSK_PROVIDER_NPI WskProviderNpi);
598
599 VOID
600 WskReleaseProviderNPI(
601 _In_ PWSK_REGISTRATION WskRegistration);
602
603 _Must_inspect_result_
604 NTSTATUS
605 WskQueryProviderCharacteristics(
606 _In_ PWSK_REGISTRATION WskRegistration,
607 _Out_ PWSK_PROVIDER_CHARACTERISTICS WskProviderCharacteristics);
608
609 VOID
610 WskDeregister(
611 _In_ PWSK_REGISTRATION WskRegistration);
612
613 #ifdef __cplusplus
614 }
615 #endif
616
617