4 * Windows Sockets Kernel-Mode Interface
6 * This file is part of the ReactOS DDK package.
9 * Timo Kreuzer (timo.kreuzer@reactos.org)
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
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.
31 #include <mswsockdef.h>
33 extern CONST NPIID NPI_WSK_INTERFACE_ID
;
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
74 #define WSK_INFINITE_WAIT 0xffffffff
82 } WSK_INSPECT_ACTION
, *PWSK_INSPECT_ACTION
;
90 } WSK_CONTROL_SOCKET_TYPE
, *PWSK_CONTROL_SOCKET_TYPE
;
92 typedef PVOID PWSK_CLIENT
;
94 typedef struct _WSK_SOCKET
97 } WSK_SOCKET
, *PWSK_SOCKET
;
99 typedef struct _WSK_BUF
104 } WSK_BUF
, *PWSK_BUF
;
106 typedef struct _WSK_INSPECT_ID
110 } WSK_INSPECT_ID
, *PWSK_INSPECT_ID
;
112 typedef struct _WSK_DATAGRAM_INDICATION
114 struct _WSK_DATAGRAM_INDICATION
*Next
;
116 _Field_size_bytes_(ControlInfoLength
) PCMSGHDR ControlInfo
;
117 ULONG ControlInfoLength
;
118 PSOCKADDR RemoteAddress
;
119 } WSK_DATAGRAM_INDICATION
, *PWSK_DATAGRAM_INDICATION
;
122 _Must_inspect_result_
124 (WSKAPI
* PFN_WSK_RECEIVE_FROM_EVENT
)(
125 _In_opt_ PVOID SocketContext
,
127 _In_opt_ PWSK_DATAGRAM_INDICATION DataIndication
);
129 typedef struct _WSK_DATA_INDICATION
131 struct _WSK_DATA_INDICATION
*Next
;
133 } WSK_DATA_INDICATION
, *PWSK_DATA_INDICATION
;
136 _Must_inspect_result_
138 (WSKAPI
* PFN_WSK_RECEIVE_EVENT
)(
139 _In_opt_ PVOID SocketContext
,
141 _In_opt_ PWSK_DATA_INDICATION DataIndication
,
142 _In_ SIZE_T BytesIndicated
,
143 _Inout_ SIZE_T
*BytesAccepted
);
147 (WSKAPI
* PFN_WSK_DISCONNECT_EVENT
)(
148 _In_opt_ PVOID SocketContext
,
153 (WSKAPI
* PFN_WSK_SEND_BACKLOG_EVENT
)(
154 _In_opt_ PVOID SocketContext
,
155 _In_ SIZE_T IdealBacklogSize
);
157 typedef struct _WSK_CLIENT_CONNECTION_DISPATCH
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
;
165 _Must_inspect_result_
166 _At_(AcceptSocket
, __drv_aliasesMem
)
168 (WSKAPI
* PFN_WSK_ACCEPT_EVENT
)(
169 _In_opt_ PVOID SocketContext
,
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
);
178 _At_(Irp
->IoStatus
.Information
, __drv_allocatesMem(Mem
))
180 (WSKAPI
* PFN_WSK_SOCKET_CONNECT
)(
181 _In_ PWSK_CLIENT Client
,
182 _In_ USHORT SocketType
,
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
,
196 (WSKAPI
* PFN_WSK_CONTROL_SOCKET
)(
197 _In_ PWSK_SOCKET Socket
,
198 _In_ WSK_CONTROL_SOCKET_TYPE RequestType
,
199 _In_ ULONG ControlCode
,
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
);
209 _At_(Socket
, __drv_freesMem(Mem
))
211 (WSKAPI
* PFN_WSK_CLOSE_SOCKET
)(
212 _In_ PWSK_SOCKET Socket
,
215 typedef struct _WSK_PROVIDER_BASIC_DISPATCH
217 PFN_WSK_CONTROL_SOCKET WskControlSocket
;
218 PFN_WSK_CLOSE_SOCKET WskCloseSocket
;
219 } WSK_PROVIDER_BASIC_DISPATCH
, *PWSK_PROVIDER_BASIC_DISPATCH
;
223 (WSKAPI
* PFN_WSK_BIND
) (
224 _In_ PWSK_SOCKET Socket
,
225 _In_ PSOCKADDR LocalAddress
,
226 _Reserved_ ULONG Flags
,
230 _At_(Irp
->IoStatus
.Information
, __drv_allocatesMem(Mem
))
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
,
243 (WSKAPI
* PFN_WSK_INSPECT_COMPLETE
)(
244 _In_ PWSK_SOCKET ListenSocket
,
245 _In_ PWSK_INSPECT_ID InspectID
,
246 _In_ WSK_INSPECT_ACTION Action
,
251 (WSKAPI
* PFN_WSK_GET_LOCAL_ADDRESS
)(
252 _In_ PWSK_SOCKET Socket
,
253 _Out_ PSOCKADDR LocalAddress
,
256 typedef struct _WSK_PROVIDER_LISTEN_DISPATCH
259 WSK_PROVIDER_BASIC_DISPATCH Basic
;
261 WSK_PROVIDER_BASIC_DISPATCH
;
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
;
269 #if (NTDDI_VERSION >= NTDDI_WIN8)
270 typedef struct _WSK_BUF_LIST
{
271 struct _WSK_BUF_LIST
*Next
;
273 } WSK_BUF_LIST
, *PWSK_BUF_LIST
;
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
,
285 #endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
287 typedef struct _WSK_PROVIDER_DATAGRAM_DISPATCH
290 WSK_PROVIDER_BASIC_DISPATCH Basic
;
292 WSK_PROVIDER_BASIC_DISPATCH
;
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
;
302 } WSK_PROVIDER_DATAGRAM_DISPATCH
, *PWSK_PROVIDER_DATAGRAM_DISPATCH
;
306 (WSKAPI
* PFN_WSK_CONNECT
) (
307 _In_ PWSK_SOCKET Socket
,
308 _In_ PSOCKADDR RemoteAddress
,
309 _Reserved_ ULONG Flags
,
314 (WSKAPI
* PFN_WSK_GET_REMOTE_ADDRESS
)(
315 _In_ PWSK_SOCKET Socket
,
316 _Out_ PSOCKADDR RemoteAddress
,
321 (WSKAPI
* PFN_WSK_SEND
)(
322 _In_ PWSK_SOCKET Socket
,
323 _In_ PWSK_BUF Buffer
,
329 (WSKAPI
* PFN_WSK_RECEIVE
)(
330 _In_ PWSK_SOCKET Socket
,
331 _In_ PWSK_BUF Buffer
,
337 (WSKAPI
* PFN_WSK_DISCONNECT
)(
338 _In_ PWSK_SOCKET Socket
,
339 _In_opt_ PWSK_BUF Buffer
,
345 (WSKAPI
* PFN_WSK_RELEASE_DATA_INDICATION_LIST
)(
346 _In_ PWSK_SOCKET Socket
,
347 _In_ PWSK_DATA_INDICATION DataIndication
);
349 typedef struct _WSK_PROVIDER_CONNECTION_DISPATCH
352 WSK_PROVIDER_BASIC_DISPATCH Basic
;
354 WSK_PROVIDER_BASIC_DISPATCH
;
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
;
367 _Must_inspect_result_
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
);
377 (WSKAPI
* PFN_WSK_ABORT_EVENT
) (
378 _In_opt_ PVOID SocketContext
,
379 _In_ PWSK_INSPECT_ID InspectID
);
382 _At_(Irp
->IoStatus
.Information
, __drv_allocatesMem(Mem
))
384 (WSKAPI
* PFN_WSK_SOCKET
)(
385 _In_ PWSK_CLIENT Client
,
386 _In_ ADDRESS_FAMILY AddressFamily
,
387 _In_ USHORT SocketType
,
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
,
397 typedef struct _WSK_TDI_MAP
400 ADDRESS_FAMILY AddressFamily
;
402 PCWSTR TdiDeviceName
;
403 } WSK_TDI_MAP
, *PWSK_TDI_MAP
;
405 typedef struct _WSK_TDI_MAP_INFO
407 const ULONG ElementCount
;
408 _Field_size_(ElementCount
) const WSK_TDI_MAP
*Map
;
409 } WSK_TDI_MAP_INFO
, *PWSK_TDI_MAP_INFO
;
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
);
423 #if (NTDDI_VERSION >= NTDDI_WIN7)
426 _At_(*Result
, __drv_allocatesMem(Mem
))
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
,
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
,
449 _In_opt_ PEPROCESS OwningProcess
,
450 _In_opt_ PETHREAD OwningThread
,
454 _At_(AddrInfo
, __drv_freesMem(Mem
))
456 (WSKAPI
* PFN_WSK_FREE_ADDRESS_INFO
)(
457 _In_ PWSK_CLIENT Client
,
458 _In_ PADDRINFOEXW AddrInfo
);
460 #endif /* if (NTDDI_VERSION >= NTDDI_WIN7) */
462 typedef struct _WSK_EVENT_CALLBACK_CONTROL
466 } WSK_EVENT_CALLBACK_CONTROL
, *PWSK_EVENT_CALLBACK_CONTROL
;
468 typedef struct _WSK_EXTENSION_CONTROL_IN
472 const VOID
* ClientDispatch
;
473 } WSK_EXTENSION_CONTROL_IN
, *PWSK_EXTENSION_CONTROL_IN
;
475 typedef struct _WSK_EXTENSION_CONTROL_OUT
477 PVOID ProviderContext
;
478 const VOID
* ProviderDispatch
;
479 } WSK_EXTENSION_CONTROL_OUT
, *PWSK_EXTENSION_CONTROL_OUT
;
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
,
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
,
506 (WSKAPI
* PFN_WSK_RELEASE_DATAGRAM_INDICATION_LIST
)(
507 _In_ PWSK_SOCKET Socket
,
508 _In_ PWSK_DATAGRAM_INDICATION DatagramIndication
);
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
);
518 typedef struct _WSK_CLIENT_DISPATCH
522 PFN_WSK_CLIENT_EVENT WskClientEvent
;
523 } WSK_CLIENT_DISPATCH
, *PWSK_CLIENT_DISPATCH
;
525 typedef struct _WSK_CLIENT_LISTEN_DISPATCH
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
;
532 typedef struct _WSK_CLIENT_DATAGRAM_DISPATCH
534 PFN_WSK_RECEIVE_FROM_EVENT WskReceiveFromEvent
;
535 } WSK_CLIENT_DATAGRAM_DISPATCH
, *PWSK_CLIENT_DATAGRAM_DISPATCH
;
537 typedef struct _WSK_PROVIDER_DISPATCH
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
;
549 } WSK_PROVIDER_DISPATCH
, *PWSK_PROVIDER_DISPATCH
;
552 typedef struct _WSK_CLIENT_NPI
555 const WSK_CLIENT_DISPATCH
*Dispatch
;
556 } WSK_CLIENT_NPI
, *PWSK_CLIENT_NPI
;
558 typedef struct _WSK_PROVIDER_NPI
561 const WSK_PROVIDER_DISPATCH
*Dispatch
;
562 } WSK_PROVIDER_NPI
, *PWSK_PROVIDER_NPI
;
564 typedef struct _WSK_REGISTRATION
566 ULONGLONG ReservedRegistrationState
;
567 PVOID ReservedRegistrationContext
;
568 KSPIN_LOCK ReservedRegistrationLock
;
569 } WSK_REGISTRATION
, *PWSK_REGISTRATION
;
571 typedef struct _WSK_PROVIDER_CHARACTERISTICS
573 USHORT HighestVersion
;
574 USHORT LowestVersion
;
575 } WSK_PROVIDER_CHARACTERISTICS
, *PWSK_PROVIDER_CHARACTERISTICS
;
577 typedef struct _WSK_TRANSPORT
582 ADDRESS_FAMILY AddressFamily
;
584 } WSK_TRANSPORT
, *PWSK_TRANSPORT
;
586 _Must_inspect_result_
589 _In_ PWSK_CLIENT_NPI WskClientNpi
,
590 _Out_ PWSK_REGISTRATION WskRegistration
);
592 _Must_inspect_result_
594 WskCaptureProviderNPI(
595 _In_ PWSK_REGISTRATION WskRegistration
,
596 _In_ ULONG WaitTimeout
,
597 _Out_ PWSK_PROVIDER_NPI WskProviderNpi
);
600 WskReleaseProviderNPI(
601 _In_ PWSK_REGISTRATION WskRegistration
);
603 _Must_inspect_result_
605 WskQueryProviderCharacteristics(
606 _In_ PWSK_REGISTRATION WskRegistration
,
607 _Out_ PWSK_PROVIDER_CHARACTERISTICS WskProviderCharacteristics
);
611 _In_ PWSK_REGISTRATION WskRegistration
);