xref: /reactos/sdk/include/psdk/ws2def.h (revision 34593d93)
1 #pragma once
2 
3 #define _WS2DEF_
4 
5 #ifdef __cplusplus
6 extern "C" {
7 #endif
8 
9 #if !defined(_WINSOCK2API_) && defined(_WINSOCKAPI_)
10 #error Include only winsock2.h, not both winsock.h and ws2def.h in the same module.
11 #endif
12 
13 #if (_WIN32_WINNT >= 0x0600)
14 
15 #ifdef _MSC_VER
16 #define WS2DEF_INLINE __inline
17 #else
18 #define WS2DEF_INLINE extern inline
19 #endif
20 
21 #endif/* (_WIN32_WINNT >= 0x0600) */
22 
23 #include <inaddr.h>
24 
25 typedef USHORT ADDRESS_FAMILY;
26 
27 #define AF_UNSPEC       0
28 #define AF_UNIX         1
29 #define AF_INET         2
30 #define AF_IMPLINK      3
31 #define AF_PUP          4
32 #define AF_CHAOS        5
33 #define AF_NS           6
34 #define AF_IPX          AF_NS
35 #define AF_ISO          7
36 #define AF_OSI          AF_ISO
37 #define AF_ECMA         8
38 #define AF_DATAKIT      9
39 #define AF_CCITT        10
40 #define AF_SNA          11
41 #define AF_DECnet       12
42 #define AF_DLI          13
43 #define AF_LAT          14
44 #define AF_HYLINK       15
45 #define AF_APPLETALK    16
46 #define AF_NETBIOS      17
47 #define AF_VOICEVIEW    18
48 #define AF_FIREFOX      19
49 #define AF_UNKNOWN1     20
50 #define AF_BAN          21
51 #define AF_ATM          22
52 #define AF_INET6        23
53 #define AF_CLUSTER      24
54 #define AF_12844        25
55 #define AF_IRDA         26
56 #define AF_NETDES       28
57 
58 #if (_WIN32_WINNT < 0x0501)
59 
60 #define AF_MAX          29
61 
62 #else
63 
64 #define AF_TCNPROCESS   29
65 #define AF_TCNMESSAGE   30
66 #define AF_ICLFXBM      31
67 
68 #if(_WIN32_WINNT < 0x0600)
69 
70 #define AF_MAX          32
71 
72 #else
73 
74 #define AF_BTH          32
75 #if (_WIN32_WINNT < 0x0601)
76 #define AF_MAX          33
77 #else
78 #define AF_LINK         33
79 #define AF_MAX          34
80 #endif /* (_WIN32_WINNT < 0x0601) */
81 
82 #endif /* (_WIN32_WINNT < 0x0600) */
83 
84 #endif /* (_WIN32_WINNT < 0x0501) */
85 
86 #define SOCK_STREAM     1
87 #define SOCK_DGRAM      2
88 #define SOCK_RAW        3
89 #define SOCK_RDM        4
90 #define SOCK_SEQPACKET  5
91 
92 #define SOL_SOCKET      0xffff
93 
94 #define SO_DEBUG        0x0001
95 #define SO_ACCEPTCONN   0x0002
96 #define SO_REUSEADDR    0x0004
97 #define SO_KEEPALIVE    0x0008
98 #define SO_DONTROUTE    0x0010
99 #define SO_BROADCAST    0x0020
100 #define SO_USELOOPBACK  0x0040
101 #define SO_LINGER       0x0080
102 #define SO_OOBINLINE    0x0100
103 
104 #define SO_DONTLINGER (int)(~SO_LINGER)
105 #define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR))
106 
107 #define SO_SNDBUF       0x1001
108 #define SO_RCVBUF       0x1002
109 #define SO_SNDLOWAT     0x1003
110 #define SO_RCVLOWAT     0x1004
111 #define SO_SNDTIMEO     0x1005
112 #define SO_RCVTIMEO     0x1006
113 #define SO_ERROR        0x1007
114 #define SO_TYPE         0x1008
115 #define SO_BSP_STATE    0x1009
116 
117 #define SO_GROUP_ID          0x2001
118 #define SO_GROUP_PRIORITY    0x2002
119 #define SO_MAX_MSG_SIZE      0x2003
120 
121 #define SO_CONDITIONAL_ACCEPT 0x3002
122 #define SO_PAUSE_ACCEPT       0x3003
123 #define SO_COMPARTMENT_ID     0x3004
124 #if (_WIN32_WINNT >= 0x0600)
125 #define SO_RANDOMIZE_PORT     0x3005
126 #define SO_PORT_SCALABILITY   0x3006
127 #endif /* (_WIN32_WINNT >= 0x0600) */
128 
129 #define WSK_SO_BASE           0x4000
130 
131 #define TCP_NODELAY           0x0001
132 
133 #define _SS_MAXSIZE           128
134 #define _SS_ALIGNSIZE         (sizeof(__int64))
135 
136 #if (_WIN32_WINNT >= 0x0600)
137 
138 #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(USHORT))
139 #define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof(USHORT) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
140 
141 #else
142 
143 #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short))
144 #define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
145 
146 #endif /* (_WIN32_WINNT >= 0x0600) */
147 
148 #define IOC_UNIX                       0x00000000
149 #define IOC_WS2                        0x08000000
150 #define IOC_PROTOCOL                   0x10000000
151 #define IOC_VENDOR                     0x18000000
152 
153 #if (_WIN32_WINNT >= 0x0600)
154 #define IOC_WSK                        (IOC_WS2|0x07000000)
155 #endif
156 
157 #define _WSAIO(x,y)                    (IOC_VOID|(x)|(y))
158 #define _WSAIOR(x,y)                   (IOC_OUT|(x)|(y))
159 #define _WSAIOW(x,y)                   (IOC_IN|(x)|(y))
160 #define _WSAIORW(x,y)                  (IOC_INOUT|(x)|(y))
161 
162 #define SIO_ASSOCIATE_HANDLE                _WSAIOW(IOC_WS2,1)
163 #define SIO_ENABLE_CIRCULAR_QUEUEING        _WSAIO(IOC_WS2,2)
164 #define SIO_FIND_ROUTE                      _WSAIOR(IOC_WS2,3)
165 #define SIO_FLUSH                           _WSAIO(IOC_WS2,4)
166 #define SIO_GET_BROADCAST_ADDRESS           _WSAIOR(IOC_WS2,5)
167 #define SIO_GET_EXTENSION_FUNCTION_POINTER  _WSAIORW(IOC_WS2,6)
168 #define SIO_GET_QOS                         _WSAIORW(IOC_WS2,7)
169 #define SIO_GET_GROUP_QOS                   _WSAIORW(IOC_WS2,8)
170 #define SIO_MULTIPOINT_LOOPBACK             _WSAIOW(IOC_WS2,9)
171 #define SIO_MULTICAST_SCOPE                 _WSAIOW(IOC_WS2,10)
172 #define SIO_SET_QOS                         _WSAIOW(IOC_WS2,11)
173 #define SIO_SET_GROUP_QOS                   _WSAIOW(IOC_WS2,12)
174 #define SIO_TRANSLATE_HANDLE                _WSAIORW(IOC_WS2,13)
175 #define SIO_ROUTING_INTERFACE_QUERY         _WSAIORW(IOC_WS2,20)
176 #define SIO_ROUTING_INTERFACE_CHANGE        _WSAIOW(IOC_WS2,21)
177 #define SIO_ADDRESS_LIST_QUERY              _WSAIOR(IOC_WS2,22)
178 #define SIO_ADDRESS_LIST_CHANGE             _WSAIO(IOC_WS2,23)
179 #define SIO_QUERY_TARGET_PNP_HANDLE         _WSAIOR(IOC_WS2,24)
180 
181 #if(_WIN32_WINNT >= 0x0501)
182 #define SIO_ADDRESS_LIST_SORT               _WSAIORW(IOC_WS2,25)
183 #endif
184 
185 #if (_WIN32_WINNT >= 0x0600)
186 #define SIO_RESERVED_1                      _WSAIOW(IOC_WS2,26)
187 #define SIO_RESERVED_2                      _WSAIOW(IOC_WS2,33)
188 #endif
189 
190 #define IPPROTO_IP                          0
191 
192 #define IPPORT_TCPMUX           1
193 #define IPPORT_ECHO             7
194 #define IPPORT_DISCARD          9
195 #define IPPORT_SYSTAT           11
196 #define IPPORT_DAYTIME          13
197 #define IPPORT_NETSTAT          15
198 #define IPPORT_QOTD             17
199 #define IPPORT_MSP              18
200 #define IPPORT_CHARGEN          19
201 #define IPPORT_FTP_DATA         20
202 #define IPPORT_FTP              21
203 #define IPPORT_TELNET           23
204 #define IPPORT_SMTP             25
205 #define IPPORT_TIMESERVER       37
206 #define IPPORT_NAMESERVER       42
207 #define IPPORT_WHOIS            43
208 #define IPPORT_MTP              57
209 
210 #define IPPORT_TFTP             69
211 #define IPPORT_RJE              77
212 #define IPPORT_FINGER           79
213 #define IPPORT_TTYLINK          87
214 #define IPPORT_SUPDUP           95
215 
216 #define IPPORT_POP3             110
217 #define IPPORT_NTP              123
218 #define IPPORT_EPMAP            135
219 #define IPPORT_NETBIOS_NS       137
220 #define IPPORT_NETBIOS_DGM      138
221 #define IPPORT_NETBIOS_SSN      139
222 #define IPPORT_IMAP             143
223 #define IPPORT_SNMP             161
224 #define IPPORT_SNMP_TRAP        162
225 #define IPPORT_IMAP3            220
226 #define IPPORT_LDAP             389
227 #define IPPORT_HTTPS            443
228 #define IPPORT_MICROSOFT_DS     445
229 #define IPPORT_EXECSERVER       512
230 #define IPPORT_LOGINSERVER      513
231 #define IPPORT_CMDSERVER        514
232 #define IPPORT_EFSSERVER        520
233 
234 #define IPPORT_BIFFUDP          512
235 #define IPPORT_WHOSERVER        513
236 #define IPPORT_ROUTESERVER      520
237 #define IPPORT_RESERVED         1024
238 
239 #if (_WIN32_WINNT >= 0x0600)
240 
241 #define IPPORT_REGISTERED_MIN   IPPORT_RESERVED
242 #define IPPORT_REGISTERED_MAX   0xbfff
243 #define IPPORT_DYNAMIC_MIN      0xc000
244 #define IPPORT_DYNAMIC_MAX      0xffff
245 
246 #endif /* (_WIN32_WINNT >= 0x0600) */
247 
248 #define IN_CLASSA(i)            (((LONG)(i) & 0x80000000) == 0)
249 #define IN_CLASSA_NET           0xff000000
250 #define IN_CLASSA_NSHIFT        24
251 #define IN_CLASSA_HOST          0x00ffffff
252 #define IN_CLASSA_MAX           128
253 
254 #define IN_CLASSB(i)            (((LONG)(i) & 0xc0000000) == 0x80000000)
255 #define IN_CLASSB_NET           0xffff0000
256 #define IN_CLASSB_NSHIFT        16
257 #define IN_CLASSB_HOST          0x0000ffff
258 #define IN_CLASSB_MAX           65536
259 
260 #define IN_CLASSC(i)            (((LONG)(i) & 0xe0000000) == 0xc0000000)
261 #define IN_CLASSC_NET           0xffffff00
262 #define IN_CLASSC_NSHIFT        8
263 #define IN_CLASSC_HOST          0x000000ff
264 
265 #define IN_CLASSD(i)            (((long)(i) & 0xf0000000) == 0xe0000000)
266 #define IN_CLASSD_NET           0xf0000000
267 #define IN_CLASSD_NSHIFT        28
268 #define IN_CLASSD_HOST          0x0fffffff
269 #define IN_MULTICAST(i)         IN_CLASSD(i)
270 
271 #define INADDR_ANY              (ULONG)0x00000000
272 #define INADDR_LOOPBACK         0x7f000001
273 #define INADDR_BROADCAST        (ULONG)0xffffffff
274 #define INADDR_NONE             0xffffffff
275 
276 #define SCOPEID_UNSPECIFIED_INIT    {0}
277 
278 #define IOCPARM_MASK    0x7f
279 #define IOC_VOID        0x20000000
280 #define IOC_OUT         0x40000000
281 #define IOC_IN          0x80000000
282 #define IOC_INOUT       (IOC_IN|IOC_OUT)
283 
284 #define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))
285 #define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
286 #define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
287 
288 #define MSG_TRUNC       0x0100
289 #define MSG_CTRUNC      0x0200
290 #define MSG_BCAST       0x0400
291 #define MSG_MCAST       0x0800
292 
293 #define AI_PASSIVE                  0x00000001
294 #define AI_CANONNAME                0x00000002
295 #define AI_NUMERICHOST              0x00000004
296 #define AI_NUMERICSERV              0x00000008
297 
298 #define AI_ALL                      0x00000100
299 #define AI_ADDRCONFIG               0x00000400
300 #define AI_V4MAPPED                 0x00000800
301 
302 #define AI_NON_AUTHORITATIVE        0x00004000
303 #define AI_SECURE                   0x00008000
304 #define AI_RETURN_PREFERRED_NAMES   0x00010000
305 
306 #define AI_FQDN                     0x00020000
307 #define AI_FILESERVER               0x00040000
308 
309 #define AI_DISABLE_IDN_ENCODING 0x00080000
310 
311 #define NS_ALL                      0
312 
313 #define NS_SAP                      1
314 #define NS_NDS                      2
315 #define NS_PEER_BROWSE              3
316 #define NS_SLP                      5
317 #define NS_DHCP                     6
318 
319 #define NS_TCPIP_LOCAL              10
320 #define NS_TCPIP_HOSTS              11
321 #define NS_DNS                      12
322 #define NS_NETBT                    13
323 #define NS_WINS                     14
324 
325 #if(_WIN32_WINNT >= 0x0501)
326 #define NS_NLA                      15
327 #endif
328 
329 #if(_WIN32_WINNT >= 0x0600)
330 #define NS_BTH                      16
331 #endif
332 
333 #define NS_NBP                      20
334 
335 #define NS_MS                       30
336 #define NS_STDA                     31
337 #define NS_NTDS                     32
338 
339 #if(_WIN32_WINNT >= 0x0600)
340 #define NS_EMAIL                    37
341 #define NS_PNRPNAME                 38
342 #define NS_PNRPCLOUD                39
343 #endif
344 
345 #define NS_X500                     40
346 #define NS_NIS                      41
347 #define NS_NISPLUS                  42
348 
349 #define NS_WRQ                      50
350 
351 #define NS_NETDES                   60
352 
353 #define NI_NOFQDN       0x01
354 #define NI_NUMERICHOST  0x02
355 #define NI_NAMEREQD     0x04
356 #define NI_NUMERICSERV  0x08
357 #define NI_DGRAM        0x10
358 
359 #define NI_MAXHOST      1025
360 #define NI_MAXSERV      32
361 
362 typedef struct sockaddr {
363 #if (_WIN32_WINNT < 0x0600)
364   u_short sa_family;
365 #else
366   ADDRESS_FAMILY sa_family;
367 #endif
368   CHAR sa_data[14];
369 } SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;
370 
371 #ifndef __CSADDR_DEFINED__
372 #define __CSADDR_DEFINED__
373 
374 typedef struct _SOCKET_ADDRESS {
375   LPSOCKADDR lpSockaddr;
376   INT iSockaddrLength;
377 } SOCKET_ADDRESS, *PSOCKET_ADDRESS, *LPSOCKET_ADDRESS;
378 
379 typedef struct _SOCKET_ADDRESS_LIST {
380   INT iAddressCount;
381   SOCKET_ADDRESS Address[1];
382 } SOCKET_ADDRESS_LIST, *PSOCKET_ADDRESS_LIST, FAR *LPSOCKET_ADDRESS_LIST;
383 
384 #if (_WIN32_WINNT >= 0x0600)
385 #define SIZEOF_SOCKET_ADDRESS_LIST(AddressCount) \
386     (FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address) + \
387      AddressCount * sizeof(SOCKET_ADDRESS))
388 #endif
389 
390 typedef struct _CSADDR_INFO {
391   SOCKET_ADDRESS LocalAddr;
392   SOCKET_ADDRESS RemoteAddr;
393   INT iSocketType;
394   INT iProtocol;
395 } CSADDR_INFO, *PCSADDR_INFO, FAR *LPCSADDR_INFO ;
396 
397 #endif /* __CSADDR_DEFINED__ */
398 
399 typedef struct sockaddr_storage {
400   ADDRESS_FAMILY ss_family;
401   CHAR __ss_pad1[_SS_PAD1SIZE];
402   __int64 __ss_align;
403   CHAR __ss_pad2[_SS_PAD2SIZE];
404 } SOCKADDR_STORAGE_LH, *PSOCKADDR_STORAGE_LH, FAR *LPSOCKADDR_STORAGE_LH;
405 
406 typedef struct sockaddr_storage_xp {
407   short ss_family;
408   CHAR __ss_pad1[_SS_PAD1SIZE];
409   __int64 __ss_align;
410   CHAR __ss_pad2[_SS_PAD2SIZE];
411 } SOCKADDR_STORAGE_XP, *PSOCKADDR_STORAGE_XP, FAR *LPSOCKADDR_STORAGE_XP;
412 
413 #if (_WIN32_WINNT >= 0x0600)
414 
415 typedef SOCKADDR_STORAGE_LH SOCKADDR_STORAGE;
416 typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
417 
418 #elif (_WIN32_WINNT >= 0x0501)
419 
420 typedef SOCKADDR_STORAGE_XP SOCKADDR_STORAGE;
421 typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
422 
423 #endif /* (_WIN32_WINNT >= 0x0600) */
424 
425 typedef enum {
426 #if (_WIN32_WINNT >= 0x0501)
427   IPPROTO_HOPOPTS = 0,
428 #endif
429   IPPROTO_ICMP = 1,
430   IPPROTO_IGMP = 2,
431   IPPROTO_GGP = 3,
432 #if (_WIN32_WINNT >= 0x0501)
433   IPPROTO_IPV4 = 4,
434 #endif
435 #if (_WIN32_WINNT >= 0x0600)
436   IPPROTO_ST = 5,
437 #endif
438   IPPROTO_TCP = 6,
439 #if (_WIN32_WINNT >= 0x0600)
440   IPPROTO_CBT = 7,
441   IPPROTO_EGP = 8,
442   IPPROTO_IGP = 9,
443 #endif
444   IPPROTO_PUP = 12,
445   IPPROTO_UDP = 17,
446   IPPROTO_IDP = 22,
447 #if (_WIN32_WINNT >= 0x0600)
448   IPPROTO_RDP = 27,
449 #endif
450 #if (_WIN32_WINNT >= 0x0501)
451   IPPROTO_IPV6 = 41,
452   IPPROTO_ROUTING = 43,
453   IPPROTO_FRAGMENT = 44,
454   IPPROTO_ESP = 50,
455   IPPROTO_AH = 51,
456   IPPROTO_ICMPV6 = 58,
457   IPPROTO_NONE = 59,
458   IPPROTO_DSTOPTS = 60,
459 #endif /* (_WIN32_WINNT >= 0x0501) */
460   IPPROTO_ND = 77,
461 #if(_WIN32_WINNT >= 0x0501)
462   IPPROTO_ICLFXBM = 78,
463 #endif
464 #if (_WIN32_WINNT >= 0x0600)
465   IPPROTO_PIM = 103,
466   IPPROTO_PGM = 113,
467   IPPROTO_L2TP = 115,
468   IPPROTO_SCTP = 132,
469 #endif /* (_WIN32_WINNT >= 0x0600) */
470   IPPROTO_RAW = 255,
471   IPPROTO_MAX = 256,
472   IPPROTO_RESERVED_RAW = 257,
473   IPPROTO_RESERVED_IPSEC = 258,
474   IPPROTO_RESERVED_IPSECOFFLOAD = 259,
475   IPPROTO_RESERVED_MAX = 260
476 } IPPROTO, *PIPROTO;
477 
478 typedef enum {
479   ScopeLevelInterface = 1,
480   ScopeLevelLink = 2,
481   ScopeLevelSubnet = 3,
482   ScopeLevelAdmin = 4,
483   ScopeLevelSite = 5,
484   ScopeLevelOrganization = 8,
485   ScopeLevelGlobal = 14,
486   ScopeLevelCount = 16
487 } SCOPE_LEVEL;
488 
489 typedef struct {
490   union {
491     struct {
492       ULONG Zone:28;
493       ULONG Level:4;
494     };
495     ULONG Value;
496   };
497 } SCOPE_ID, *PSCOPE_ID;
498 
499 typedef struct sockaddr_in {
500 #if(_WIN32_WINNT < 0x0600)
501   short sin_family;
502 #else
503   ADDRESS_FAMILY sin_family;
504 #endif
505   USHORT sin_port;
506   IN_ADDR sin_addr;
507   CHAR sin_zero[8];
508 } SOCKADDR_IN, *PSOCKADDR_IN;
509 
510 #if(_WIN32_WINNT >= 0x0601)
511 typedef struct sockaddr_dl {
512   ADDRESS_FAMILY sdl_family;
513   UCHAR sdl_data[8];
514   UCHAR sdl_zero[4];
515 } SOCKADDR_DL, *PSOCKADDR_DL;
516 #endif
517 
518 typedef struct _WSABUF {
519   ULONG len;
520   CHAR FAR *buf;
521 } WSABUF, FAR * LPWSABUF;
522 
523 typedef struct _WSAMSG {
524   LPSOCKADDR name;
525   INT namelen;
526   LPWSABUF lpBuffers;
527 #if (_WIN32_WINNT >= 0x0600)
528   ULONG dwBufferCount;
529 #else
530   DWORD dwBufferCount;
531 #endif
532   WSABUF Control;
533 #if (_WIN32_WINNT >= 0x0600)
534   ULONG dwFlags;
535 #else
536   DWORD dwFlags;
537 #endif
538 } WSAMSG, *PWSAMSG, *FAR LPWSAMSG;
539 
540 #if (_WIN32_WINNT >= 0x0600)
541 #define _WSACMSGHDR cmsghdr
542 #endif
543 
544 typedef struct _WSACMSGHDR {
545   SIZE_T cmsg_len;
546   INT cmsg_level;
547   INT cmsg_type;
548 } WSACMSGHDR, *PWSACMSGHDR, FAR *LPWSACMSGHDR;
549 
550 #if (_WIN32_WINNT >= 0x0600)
551 typedef WSACMSGHDR CMSGHDR, *PCMSGHDR;
552 #endif
553 
554 #define WSA_CMSGHDR_ALIGN(length) (((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) &  \
555                                    (~(TYPE_ALIGNMENT(WSACMSGHDR)-1)))
556 
557 #define WSA_CMSGDATA_ALIGN(length) (((length) + MAX_NATURAL_ALIGNMENT-1) &      \
558                                     (~(MAX_NATURAL_ALIGNMENT-1)))
559 
560 #if(_WIN32_WINNT >= 0x0600)
561 #define CMSGHDR_ALIGN WSA_CMSGHDR_ALIGN
562 #define CMSGDATA_ALIGN WSA_CMSGDATA_ALIGN
563 #endif
564 
565 /*
566  *  WSA_CMSG_FIRSTHDR
567  *
568  *  Returns a pointer to the first ancillary data object,
569  *  or a null pointer if there is no ancillary data in the
570  *  control buffer of the WSAMSG structure.
571  *
572  *  LPCMSGHDR
573  *  WSA_CMSG_FIRSTHDR (
574  *      LPWSAMSG    msg
575  *      );
576  */
577 #define WSA_CMSG_FIRSTHDR(msg) (((msg)->Control.len >= sizeof(WSACMSGHDR))  \
578                                 ? (LPWSACMSGHDR)(msg)->Control.buf          \
579                                 : (LPWSACMSGHDR)NULL)
580 
581 #if(_WIN32_WINNT >= 0x0600)
582 #define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
583 #endif
584 
585 /*
586  *  WSA_CMSG_NXTHDR
587  *
588  *  Returns a pointer to the next ancillary data object,
589  *  or a null if there are no more data objects.
590  *
591  *  LPCMSGHDR
592  *  WSA_CMSG_NEXTHDR (
593  *      LPWSAMSG        msg,
594  *      LPWSACMSGHDR    cmsg
595  *      );
596  */
597 #define WSA_CMSG_NXTHDR(msg, cmsg)                          \
598     ( ((cmsg) == NULL)                                      \
599         ? WSA_CMSG_FIRSTHDR(msg)                            \
600         : ( ( ((PUCHAR)(cmsg) +                             \
601                     WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) +   \
602                     sizeof(WSACMSGHDR) ) >                  \
603                 (PUCHAR)((msg)->Control.buf) +              \
604                     (msg)->Control.len )                    \
605             ? (LPWSACMSGHDR)NULL                            \
606             : (LPWSACMSGHDR)((PUCHAR)(cmsg) +               \
607                 WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) )
608 
609 #if(_WIN32_WINNT >= 0x0600)
610 #define CMSG_NXTHDR WSA_CMSG_NXTHDR
611 #endif
612 
613 /*
614  *  WSA_CMSG_DATA
615  *
616  *  Returns a pointer to the first byte of data (what is referred
617  *  to as the cmsg_data member though it is not defined in
618  *  the structure).
619  *
620  *  Note that RFC 2292 defines this as CMSG_DATA, but that name
621  *  is already used by wincrypt.h, and so Windows has used WSA_CMSG_DATA.
622  *
623  *  PUCHAR
624  *  WSA_CMSG_DATA (
625  *      LPWSACMSGHDR   pcmsg
626  *      );
627  */
628 #define WSA_CMSG_DATA(cmsg) ((PUCHAR)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)))
629 
630 /*
631  *  WSA_CMSG_SPACE
632  *
633  *  Returns total size of an ancillary data object given
634  *  the amount of data. Used to allocate the correct amount
635  *  of space.
636  *
637  *  SIZE_T
638  *  WSA_CMSG_SPACE (
639  *      SIZE_T length
640  *      );
641  */
642 #define WSA_CMSG_SPACE(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
643 
644 #if(_WIN32_WINNT >= 0x0600)
645 #define CMSG_SPACE WSA_CMSG_SPACE
646 #endif
647 
648 /*
649  *  WSA_CMSG_LEN
650  *
651  *  Returns the value to store in cmsg_len given the amount of data.
652  *
653  *  SIZE_T
654  *  WSA_CMSG_LEN (
655  *      SIZE_T length
656  *  );
657  */
658 #define WSA_CMSG_LEN(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
659 
660 #if(_WIN32_WINNT >= 0x0600)
661 #define CMSG_LEN WSA_CMSG_LEN
662 #endif
663 
664 typedef struct addrinfo {
665   int ai_flags;
666   int ai_family;
667   int ai_socktype;
668   int ai_protocol;
669   size_t ai_addrlen;
670   char *ai_canonname;
671   struct sockaddr *ai_addr;
672   struct addrinfo *ai_next;
673 } ADDRINFOA, *PADDRINFOA;
674 
675 typedef struct addrinfoW {
676   int ai_flags;
677   int ai_family;
678   int ai_socktype;
679   int ai_protocol;
680   size_t ai_addrlen;
681   PWSTR ai_canonname;
682   struct sockaddr *ai_addr;
683   struct addrinfoW *ai_next;
684 } ADDRINFOW, *PADDRINFOW;
685 
686 #if (_WIN32_WINNT >= 0x0600)
687 
688 typedef struct addrinfoexA {
689   int ai_flags;
690   int ai_family;
691   int ai_socktype;
692   int ai_protocol;
693   size_t ai_addrlen;
694   char *ai_canonname;
695   struct sockaddr *ai_addr;
696   void *ai_blob;
697   size_t ai_bloblen;
698   LPGUID ai_provider;
699   struct addrinfoexA *ai_next;
700 } ADDRINFOEXA, *PADDRINFOEXA, *LPADDRINFOEXA;
701 
702 typedef struct addrinfoexW {
703   int ai_flags;
704   int ai_family;
705   int ai_socktype;
706   int ai_protocol;
707   size_t ai_addrlen;
708   PWSTR ai_canonname;
709   struct sockaddr *ai_addr;
710   void *ai_blob;
711   size_t ai_bloblen;
712   LPGUID ai_provider;
713   struct addrinfoexW *ai_next;
714 } ADDRINFOEXW, *PADDRINFOEXW, *LPADDRINFOEXW;
715 
716 #endif /* (_WIN32_WINNT >= 0x0600) */
717 
718 #ifdef __cplusplus
719 }
720 #endif
721