1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
//! Core definitions for the Winsock2 specification
use ctypes::{__int64, c_char, c_int, c_long, c_short, c_void};
use shared::basetsd::SIZE_T;
use shared::guiddef::LPGUID;
use shared::inaddr::IN_ADDR;
use shared::minwindef::{DWORD, INT, UCHAR, ULONG, USHORT};
use um::winnt::{CHAR, HANDLE, LONG, PROCESSOR_NUMBER, PWSTR};
use vc::vcruntime::size_t;
pub type ADDRESS_FAMILY = USHORT;
pub const AF_UNSPEC: c_int = 0;
pub const AF_UNIX: c_int = 1;
pub const AF_INET: c_int = 2;
pub const AF_IMPLINK: c_int = 3;
pub const AF_PUP: c_int = 4;
pub const AF_CHAOS: c_int = 5;
pub const AF_NS: c_int = 6;
pub const AF_IPX: c_int = AF_NS;
pub const AF_ISO: c_int = 7;
pub const AF_OSI: c_int = AF_ISO;
pub const AF_ECMA: c_int = 8;
pub const AF_DATAKIT: c_int = 9;
pub const AF_CCITT: c_int = 10;
pub const AF_SNA: c_int = 11;
pub const AF_DECnet: c_int = 12;
pub const AF_DLI: c_int = 13;
pub const AF_LAT: c_int = 14;
pub const AF_HYLINK: c_int = 15;
pub const AF_APPLETALK: c_int = 16;
pub const AF_NETBIOS: c_int = 17;
pub const AF_VOICEVIEW: c_int = 18;
pub const AF_FIREFOX: c_int = 19;
pub const AF_UNKNOWN1: c_int = 20;
pub const AF_BAN: c_int = 21;
pub const AF_ATM: c_int = 22;
pub const AF_INET6: c_int = 23;
pub const AF_CLUSTER: c_int = 24;
pub const AF_12844: c_int = 25;
pub const AF_IRDA: c_int = 26;
pub const AF_NETDES: c_int = 28;
pub const AF_TCNPROCESS: c_int = 29;
pub const AF_TCNMESSAGE: c_int = 30;
pub const AF_ICLFXBM: c_int = 31;
pub const AF_BTH: c_int = 32;
pub const AF_LINK: c_int = 33;
pub const AF_HYPERV: c_int = 34;
pub const AF_MAX: c_int = 35;
pub const SOCK_STREAM: c_int = 1;
pub const SOCK_DGRAM: c_int = 2;
pub const SOCK_RAW: c_int = 3;
pub const SOCK_RDM: c_int = 4;
pub const SOCK_SEQPACKET: c_int = 5;
pub const SOL_SOCKET: c_int = 0xffff;
pub const SO_DEBUG: c_int = 0x0001;
pub const SO_ACCEPTCONN: c_int = 0x0002;
pub const SO_REUSEADDR: c_int = 0x0004;
pub const SO_KEEPALIVE: c_int = 0x0008;
pub const SO_DONTROUTE: c_int = 0x0010;
pub const SO_BROADCAST: c_int = 0x0020;
pub const SO_USELOOPBACK: c_int = 0x0040;
pub const SO_LINGER: c_int = 0x0080;
pub const SO_OOBINLINE: c_int = 0x0100;
pub const SO_DONTLINGER: c_int = !SO_LINGER;
pub const SO_EXCLUSIVEADDRUSE: c_int = !SO_REUSEADDR;
pub const SO_SNDBUF: c_int = 0x1001;
pub const SO_RCVBUF: c_int = 0x1002;
pub const SO_SNDLOWAT: c_int = 0x1003;
pub const SO_RCVLOWAT: c_int = 0x1004;
pub const SO_SNDTIMEO: c_int = 0x1005;
pub const SO_RCVTIMEO: c_int = 0x1006;
pub const SO_ERROR: c_int = 0x1007;
pub const SO_TYPE: c_int = 0x1008;
pub const SO_BSP_STATE: c_int = 0x1009;
pub const SO_GROUP_ID: c_int = 0x2001;
pub const SO_GROUP_PRIORITY: c_int = 0x2002;
pub const SO_MAX_MSG_SIZE: c_int = 0x2003;
pub const SO_CONDITIONAL_ACCEPT: c_int = 0x3002;
pub const SO_PAUSE_ACCEPT: c_int = 0x3003;
pub const SO_COMPARTMENT_ID: c_int = 0x3004;
pub const SO_RANDOMIZE_PORT: c_int = 0x3005;
pub const SO_PORT_SCALABILITY: c_int = 0x3006;
pub const SO_REUSE_UNICASTPORT: c_int = 0x3007;
pub const SO_REUSE_MULTICASTPORT: c_int = 0x3008;
pub const WSK_SO_BASE: c_int = 0x4000;
pub const TCP_NODELAY: c_int = 0x0001;
STRUCT!{struct SOCKADDR {
    sa_family: ADDRESS_FAMILY,
    sa_data: [CHAR; 14],
}}
pub type PSOCKADDR = *mut SOCKADDR;
pub type LPSOCKADDR = *mut SOCKADDR;
STRUCT!{struct SOCKET_ADDRESS {
    lpSockaddr: LPSOCKADDR,
    iSockaddrLength: INT,
}}
pub type PSOCKET_ADDRESS = *mut SOCKET_ADDRESS;
pub type LPSOCKET_ADDRESS = *mut SOCKET_ADDRESS;
STRUCT!{struct SOCKET_ADDRESS_LIST {
    iAddressCount: INT,
    Address: [SOCKET_ADDRESS; 1],
}}
pub type PSOCKET_ADDRESS_LIST = *mut SOCKET_ADDRESS_LIST;
pub type LPSOCKET_ADDRESS_LIST = *mut SOCKET_ADDRESS_LIST;
STRUCT!{struct CSADDR_INFO {
    LocalAddr: SOCKET_ADDRESS,
    RemoteAddr: SOCKET_ADDRESS,
    iSocketType: INT,
    iProtocol: INT,
}}
pub type PCSADDR_INFO = *mut CSADDR_INFO;
pub type LPCSADDR_INFO = *mut CSADDR_INFO;
STRUCT!{struct SOCKADDR_STORAGE_LH {
    ss_family: ADDRESS_FAMILY,
    __ss_pad1: [CHAR; 6],
    __ss_align: __int64,
    __ss_pad2: [CHAR; 112],
}}
pub type PSOCKADDR_STORAGE_LH = *mut SOCKADDR_STORAGE_LH;
pub type LPSOCKADDR_STORAGE_LH = *mut SOCKADDR_STORAGE_LH;
STRUCT!{struct SOCKADDR_STORAGE_XP {
    ss_family: c_short,
    __ss_pad1: [CHAR; 6],
    __ss_align: __int64,
    __ss_pad2: [CHAR; 112],
}}
pub type PSOCKADDR_STORAGE_XP = *mut SOCKADDR_STORAGE_XP;
pub type LPSOCKADDR_STORAGE_XP = *mut SOCKADDR_STORAGE_XP;
pub type SOCKADDR_STORAGE = SOCKADDR_STORAGE_LH;
pub type PSOCKADDR_STORAGE = *mut SOCKADDR_STORAGE;
pub type LPSOCKADDR_STORAGE = *mut SOCKADDR_STORAGE;
STRUCT!{struct SOCKET_PROCESSOR_AFFINITY {
    Processor: PROCESSOR_NUMBER,
    NumaNodeId: USHORT,
    Reserved: USHORT,
}}
pub type PSOCKET_PROCESSOR_AFFINITY = *mut SOCKET_PROCESSOR_AFFINITY;
pub const IOC_UNIX: DWORD = 0x00000000;
pub const IOC_WS2: DWORD = 0x08000000;
pub const IOC_PROTOCOL: DWORD = 0x10000000;
pub const IOC_VENDOR: DWORD = 0x18000000;
pub const IOC_WSK: DWORD = IOC_WS2 | 0x07000000;
pub const SIO_ASSOCIATE_HANDLE: DWORD = _WSAIOW!(IOC_WS2, 1);
pub const SIO_ENABLE_CIRCULAR_QUEUEING: DWORD = _WSAIO!(IOC_WS2, 2);
pub const SIO_FIND_ROUTE: DWORD = _WSAIOR!(IOC_WS2, 3);
pub const SIO_FLUSH: DWORD = _WSAIO!(IOC_WS2, 4);
pub const SIO_GET_BROADCAST_ADDRESS: DWORD = _WSAIOR!(IOC_WS2, 5);
pub const SIO_GET_EXTENSION_FUNCTION_POINTER: DWORD = _WSAIORW!(IOC_WS2, 6);
pub const SIO_GET_QOS: DWORD = _WSAIORW!(IOC_WS2, 7);
pub const SIO_GET_GROUP_QOS: DWORD = _WSAIORW!(IOC_WS2, 8);
pub const SIO_MULTIPOINT_LOOPBACK: DWORD = _WSAIOW!(IOC_WS2, 9);
pub const SIO_MULTICAST_SCOPE: DWORD = _WSAIOW!(IOC_WS2, 10);
pub const SIO_SET_QOS: DWORD = _WSAIOW!(IOC_WS2, 11);
pub const SIO_SET_GROUP_QOS: DWORD = _WSAIOW!(IOC_WS2, 12);
pub const SIO_TRANSLATE_HANDLE: DWORD = _WSAIORW!(IOC_WS2, 13);
pub const SIO_ROUTING_INTERFACE_QUERY: DWORD = _WSAIORW!(IOC_WS2, 20);
pub const SIO_ROUTING_INTERFACE_CHANGE: DWORD = _WSAIOW!(IOC_WS2, 21);
pub const SIO_ADDRESS_LIST_QUERY: DWORD = _WSAIOR!(IOC_WS2, 22);
pub const SIO_ADDRESS_LIST_CHANGE: DWORD = _WSAIO!(IOC_WS2, 23);
pub const SIO_QUERY_TARGET_PNP_HANDLE: DWORD = _WSAIOR!(IOC_WS2, 24);
pub const SIO_QUERY_RSS_PROCESSOR_INFO: DWORD = _WSAIOR!(IOC_WS2, 37);
pub const SIO_ADDRESS_LIST_SORT: DWORD = _WSAIORW!(IOC_WS2, 25);
pub const SIO_RESERVED_1: DWORD = _WSAIOW!(IOC_WS2, 26);
pub const SIO_RESERVED_2: DWORD = _WSAIOW!(IOC_WS2, 33);
pub const SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER: DWORD = _WSAIORW!(IOC_WS2, 36);
pub const IPPROTO_IP: c_int = 0;
ENUM!{enum IPPROTO {
    IPPROTO_HOPOPTS = 0, // IPv6 Hop-by-Hop options
    IPPROTO_ICMP = 1,
    IPPROTO_IGMP = 2,
    IPPROTO_GGP = 3,
    IPPROTO_IPV4 = 4,
    IPPROTO_ST = 5,
    IPPROTO_TCP = 6,
    IPPROTO_CBT = 7,
    IPPROTO_EGP = 8,
    IPPROTO_IGP = 9,
    IPPROTO_PUP = 12,
    IPPROTO_UDP = 17,
    IPPROTO_IDP = 22,
    IPPROTO_RDP = 27,
    IPPROTO_IPV6 = 41, // IPv6 header
    IPPROTO_ROUTING = 43, // IPv6 Routing header
    IPPROTO_FRAGMENT = 44, // IPv6 fragmentation header
    IPPROTO_ESP = 50, // encapsulating security payload
    IPPROTO_AH = 51, // authentication header
    IPPROTO_ICMPV6 = 58, // ICMPv6
    IPPROTO_NONE = 59, // IPv6 no next header
    IPPROTO_DSTOPTS = 60, // IPv6 Destination options
    IPPROTO_ND = 77,
    IPPROTO_ICLFXBM = 78,
    IPPROTO_PIM = 103,
    IPPROTO_PGM = 113,
    IPPROTO_L2TP = 115,
    IPPROTO_SCTP = 132,
    IPPROTO_RAW = 255,
    IPPROTO_MAX = 256,
    IPPROTO_RESERVED_RAW = 257,
    IPPROTO_RESERVED_IPSEC = 258,
    IPPROTO_RESERVED_IPSECOFFLOAD = 259,
    IPPROTO_RESERVED_WNV = 260,
    IPPROTO_RESERVED_MAX = 261,
}}
pub type PIPPROTO = *mut IPPROTO;
pub const IPPORT_TCPMUX: USHORT = 1;
pub const IPPORT_ECHO: USHORT = 7;
pub const IPPORT_DISCARD: USHORT = 9;
pub const IPPORT_SYSTAT: USHORT = 11;
pub const IPPORT_DAYTIME: USHORT = 13;
pub const IPPORT_NETSTAT: USHORT = 15;
pub const IPPORT_QOTD: USHORT = 17;
pub const IPPORT_MSP: USHORT = 18;
pub const IPPORT_CHARGEN: USHORT = 19;
pub const IPPORT_FTP_DATA: USHORT = 20;
pub const IPPORT_FTP: USHORT = 21;
pub const IPPORT_TELNET: USHORT = 23;
pub const IPPORT_SMTP: USHORT = 25;
pub const IPPORT_TIMESERVER: USHORT = 37;
pub const IPPORT_NAMESERVER: USHORT = 42;
pub const IPPORT_WHOIS: USHORT = 43;
pub const IPPORT_MTP: USHORT = 57;
pub const IPPORT_TFTP: USHORT = 69;
pub const IPPORT_RJE: USHORT = 77;
pub const IPPORT_FINGER: USHORT = 79;
pub const IPPORT_TTYLINK: USHORT = 87;
pub const IPPORT_SUPDUP: USHORT = 95;
pub const IPPORT_POP3: USHORT = 110;
pub const IPPORT_NTP: USHORT = 123;
pub const IPPORT_EPMAP: USHORT = 135;
pub const IPPORT_NETBIOS_NS: USHORT = 137;
pub const IPPORT_NETBIOS_DGM: USHORT = 138;
pub const IPPORT_NETBIOS_SSN: USHORT = 139;
pub const IPPORT_IMAP: USHORT = 143;
pub const IPPORT_SNMP: USHORT = 161;
pub const IPPORT_SNMP_TRAP: USHORT = 162;
pub const IPPORT_IMAP3: USHORT = 220;
pub const IPPORT_LDAP: USHORT = 389;
pub const IPPORT_HTTPS: USHORT = 443;
pub const IPPORT_MICROSOFT_DS: USHORT = 445;
pub const IPPORT_EXECSERVER: USHORT = 512;
pub const IPPORT_LOGINSERVER: USHORT = 513;
pub const IPPORT_CMDSERVER: USHORT = 514;
pub const IPPORT_EFSSERVER: USHORT = 520;
pub const IPPORT_BIFFUDP: USHORT = 512;
pub const IPPORT_WHOSERVER: USHORT = 513;
pub const IPPORT_ROUTESERVER: USHORT = 520;
pub const IPPORT_RESERVED: USHORT = 1024;
pub const IPPORT_REGISTERED_MIN: USHORT = IPPORT_RESERVED;
pub const IPPORT_REGISTERED_MAX: USHORT = 0xbfff;
pub const IPPORT_DYNAMIC_MIN: USHORT = 0xc000;
pub const IPPORT_DYNAMIC_MAX: USHORT = 0xffff;
#[inline]
pub fn IN_CLASSA(i: LONG) -> bool {
    (i & 0x80000000) == 0
}
pub const IN_CLASSA_NET: LONG = 0xff000000;
pub const IN_CLASSA_NSHIFT: LONG = 24;
pub const IN_CLASSA_HOST: LONG = 0x00ffffff;
pub const IN_CLASSA_MAX: LONG = 128;
#[inline]
pub fn IN_CLASSB(i: LONG) -> bool {
    (i as u32 & 0xc0000000) == 0x80000000
}
pub const IN_CLASSB_NET: LONG = 0xffff0000;
pub const IN_CLASSB_NSHIFT: LONG = 16;
pub const IN_CLASSB_HOST: LONG = 0x0000ffff;
pub const IN_CLASSB_MAX: LONG = 65536;
#[inline]
pub fn IN_CLASSC(i: LONG) -> bool {
    (i as u32 & 0xe0000000) == 0xc0000000
}
pub const IN_CLASSC_NET: LONG = 0xffffff00;
pub const IN_CLASSC_NSHIFT: LONG = 8;
pub const IN_CLASSC_HOST: LONG = 0x000000ff;
#[inline]
pub fn IN_CLASSD(i: c_long) -> bool {
    (i as u32 & 0xf0000000) == 0xe0000000
}
pub const IN_CLASSD_NET: LONG = 0xf0000000;
pub const IN_CLASSD_NSHIFT: LONG = 28;
pub const IN_CLASSD_HOST: LONG = 0x0fffffff;
#[inline]
pub fn IN_MULTICAST(i: c_long) -> bool {
    IN_CLASSD(i)
}
pub const INADDR_ANY: ULONG = 0x00000000;
pub const INADDR_LOOPBACK: ULONG = 0x7f000001;
pub const INADDR_BROADCAST: ULONG = 0xffffffff;
pub const INADDR_NONE: ULONG = 0xffffffff;
ENUM!{enum SCOPE_LEVEL {
    ScopeLevelInterface = 1,
    ScopeLevelLink = 2,
    ScopeLevelSubnet = 3,
    ScopeLevelAdmin = 4,
    ScopeLevelSite = 5,
    ScopeLevelOrganization = 8,
    ScopeLevelGlobal = 14,
    ScopeLevelCount = 16,
}}
STRUCT!{struct SCOPE_ID_u_s {
    bitfield: ULONG,
}}
BITFIELD!{SCOPE_ID_u_s bitfield: ULONG [
    Zone set_Zone[0..28],
    Level set_Level[28..32],
]}
UNION!{union SCOPE_ID_u {
    [u32; 1],
    s s_mut: SCOPE_ID_u_s,
    Value Value_mut: ULONG,
}}
STRUCT!{struct SCOPE_ID {
    u: SCOPE_ID_u,
}}
pub type PSCOPE_ID = *mut SCOPE_ID;
STRUCT!{struct SOCKADDR_IN {
    sin_family: ADDRESS_FAMILY,
    sin_port: USHORT,
    sin_addr: IN_ADDR,
    sin_zero: [CHAR; 8],
}}
pub type PSOCKADDR_IN = *mut SOCKADDR_IN;
STRUCT!{struct SOCKADDR_DL {
    sdl_family: ADDRESS_FAMILY,
    sdl_data: [UCHAR; 8],
    sdl_zero: [UCHAR; 4],
}}
pub type PSOCKADDR_DL = *mut SOCKADDR_DL;
pub const IOCPARM_MASK: DWORD = 0x7f;
pub const IOC_VOID: DWORD = 0x20000000;
pub const IOC_OUT: DWORD = 0x40000000;
pub const IOC_IN: DWORD = 0x80000000;
pub const IOC_INOUT: DWORD = IOC_IN | IOC_OUT;
STRUCT!{struct WSABUF {
    len: ULONG,
    buf: *mut CHAR,
}}
pub type LPWSABUF = *mut WSABUF;
STRUCT!{struct WSAMSG {
    name: LPSOCKADDR,
    namelen: INT,
    lpBuffers: LPWSABUF,
    dwBufferCount: ULONG,
    Control: WSABUF,
    dwFlags: ULONG,
}}
pub type PWSAMSG = *mut WSAMSG;
pub type LPWSAMSG = *mut WSAMSG;
STRUCT!{struct WSACMSGHDR {
    cmsg_len: SIZE_T,
    cmsg_level: INT,
    cmsg_type: INT,
}}
pub type PWSACMSGHDR = *mut WSACMSGHDR;
pub type LPWSACMSGHDR = *mut WSACMSGHDR;
pub type CMSGHDR = WSACMSGHDR;
pub type PCMSGHDR = *mut WSACMSGHDR;
pub const MSG_TRUNC: ULONG = 0x0100;
pub const MSG_CTRUNC: ULONG = 0x0200;
pub const MSG_BCAST: ULONG = 0x0400;
pub const MSG_MCAST: ULONG = 0x0800;
pub const AI_PASSIVE: c_int = 0x00000001;
pub const AI_CANONNAME: c_int = 0x00000002;
pub const AI_NUMERICHOST: c_int = 0x00000004;
pub const AI_NUMERICSERV: c_int = 0x00000008;
pub const AI_DNS_ONLY: c_int = 0x00000010;
pub const AI_ALL: c_int = 0x00000100;
pub const AI_ADDRCONFIG: c_int = 0x00000400;
pub const AI_V4MAPPED: c_int = 0x00000800;
pub const AI_NON_AUTHORITATIVE: c_int = 0x00004000;
pub const AI_SECURE: c_int = 0x00008000;
pub const AI_RETURN_PREFERRED_NAMES: c_int = 0x00010000;
pub const AI_FQDN: c_int = 0x00020000;
pub const AI_FILESERVER: c_int = 0x00040000;
pub const AI_DISABLE_IDN_ENCODING: c_int = 0x00080000;
pub const AI_EXTENDED: c_int = 0x80000000;
pub const AI_RESOLUTION_HANDLE: c_int = 0x40000000;
STRUCT!{struct ADDRINFOA {
    ai_flags: c_int,
    ai_family: c_int,
    ai_socktype: c_int,
    ai_protocol: c_int,
    ai_addrlen: size_t,
    ai_canonname: *mut c_char,
    ai_addr: *mut SOCKADDR,
    ai_next: *mut ADDRINFOA,
}}
pub type PADDRINFOA = *mut ADDRINFOA;
STRUCT!{struct ADDRINFOW {
    ai_flags: c_int,
    ai_family: c_int,
    ai_socktype: c_int,
    ai_protocol: c_int,
    ai_addrlen: size_t,
    ai_canonname: PWSTR,
    ai_addr: *mut SOCKADDR,
    ai_next: *mut ADDRINFOW,
}}
pub type PADDRINFOW = *mut ADDRINFOW;
STRUCT!{struct ADDRINFOEXA {
    ai_flags: c_int,
    ai_family: c_int,
    ai_socktype: c_int,
    ai_protocol: c_int,
    ai_addrlen: size_t,
    ai_canonname: *mut c_char,
    ai_addr: *mut SOCKADDR,
    ai_blob: *mut c_void,
    ai_bloblen: size_t,
    ai_provider: LPGUID,
    ai_next: *mut ADDRINFOEXA,
}}
pub type PADDRINFOEXA = *mut ADDRINFOEXA;
pub type LPADDRINFOEXA = *mut ADDRINFOEXA;
STRUCT!{struct ADDRINFOEXW {
    ai_flags: c_int,
    ai_family: c_int,
    ai_socktype: c_int,
    ai_protocol: c_int,
    ai_addrlen: size_t,
    ai_canonname: PWSTR,
    ai_addr: *mut SOCKADDR,
    ai_blob: *mut c_void,
    ai_bloblen: size_t,
    ai_provider: LPGUID,
    ai_next: *mut ADDRINFOEXW,
}}
pub type PADDRINFOEXW = *mut ADDRINFOEXW;
pub type LPADDRINFOEXW = *mut ADDRINFOEXW;
pub const ADDRINFOEX_VERSION_2: c_int = 2;
pub const ADDRINFOEX_VERSION_3: c_int = 3;
pub const ADDRINFOEX_VERSION_4: c_int = 4;
STRUCT!{struct ADDRINFOEX2A {
    ai_flags: c_int,
    ai_family: c_int,
    ai_socktype: c_int,
    ai_protocol: c_int,
    ai_addrlen: size_t,
    ai_canonname: *mut c_char,
    ai_addr: *mut SOCKADDR,
    ai_blob: *mut c_void,
    ai_bloblen: size_t,
    ai_provider: LPGUID,
    ai_next: *mut ADDRINFOEX2W,
    ai_version: c_int,
    ai_fqdn: *mut c_char,
}}
pub type PADDRINFOEX2A = *mut ADDRINFOEX2A;
pub type LPADDRINFOEX2A = *mut ADDRINFOEX2A;
STRUCT!{struct ADDRINFOEX2W {
    ai_flags: c_int,
    ai_family: c_int,
    ai_socktype: c_int,
    ai_protocol: c_int,
    ai_addrlen: size_t,
    ai_canonname: PWSTR,
    ai_addr: *mut SOCKADDR,
    ai_blob: *mut c_void,
    ai_bloblen: size_t,
    ai_provider: LPGUID,
    ai_next: *mut ADDRINFOEX2W,
    ai_version: c_int,
    ai_fqdn: PWSTR,
}}
pub type PADDRINFOEX2W = *mut ADDRINFOEX2W;
pub type LPADDRINFOEX2W = *mut ADDRINFOEX2W;
STRUCT!{struct ADDRINFOEX3A {
    ai_flags: c_int,
    ai_family: c_int,
    ai_socktype: c_int,
    ai_protocol: c_int,
    ai_addrlen: size_t,
    ai_canonname: *mut c_char,
    ai_addr: *mut SOCKADDR,
    ai_blob: *mut c_void,
    ai_bloblen: size_t,
    ai_provider: LPGUID,
    ai_next: *mut ADDRINFOEX3W,
    ai_version: c_int,
    ai_fqdn: *mut c_char,
    ai_interfaceindex: c_int,
}}
pub type PADDRINFOEX3A = *mut ADDRINFOEX3A;
pub type LPADDRINFOEX3A = *mut ADDRINFOEX3A;
STRUCT!{struct ADDRINFOEX3W {
    ai_flags: c_int,
    ai_family: c_int,
    ai_socktype: c_int,
    ai_protocol: c_int,
    ai_addrlen: size_t,
    ai_canonname: PWSTR,
    ai_addr: *mut SOCKADDR,
    ai_blob: *mut c_void,
    ai_bloblen: size_t,
    ai_provider: LPGUID,
    ai_next: *mut ADDRINFOEX3W,
    ai_version: c_int,
    ai_fqdn: PWSTR,
    ai_interfaceindex: c_int,
}}
pub type PADDRINFOEX3W = *mut ADDRINFOEX3W;
pub type LPADDRINFOEX3W = *mut ADDRINFOEX3W;
STRUCT!{struct ADDRINFOEX4 {
    ai_flags: c_int,
    ai_family: c_int,
    ai_socktype: c_int,
    ai_protocol: c_int,
    ai_addrlen: size_t,
    ai_canonname: PWSTR,
    ai_addr: *mut SOCKADDR,
    ai_blob: *mut c_void,
    ai_bloblen: size_t,
    ai_provider: LPGUID,
    ai_next: *mut ADDRINFOEX4,
    ai_version: c_int,
    ai_fqdn: PWSTR,
    ai_interfaceindex: c_int,
    ai_resolutionhandle: HANDLE,
}}
pub type PADDRINFOEX4 = *mut ADDRINFOEX4;
pub type LPADDRINFOEX4 = *mut ADDRINFOEX4;
pub const NS_ALL: DWORD = 0;
pub const NS_SAP: DWORD = 1;
pub const NS_NDS: DWORD = 2;
pub const NS_PEER_BROWSE: DWORD = 3;
pub const NS_SLP: DWORD = 5;
pub const NS_DHCP: DWORD = 6;
pub const NS_TCPIP_LOCAL: DWORD = 10;
pub const NS_TCPIP_HOSTS: DWORD = 11;
pub const NS_DNS: DWORD = 12;
pub const NS_NETBT: DWORD = 13;
pub const NS_WINS: DWORD = 14;
pub const NS_NLA: DWORD = 15;
pub const NS_BTH: DWORD = 16;
pub const NS_NBP: DWORD = 20;
pub const NS_MS: DWORD = 30;
pub const NS_STDA: DWORD = 31;
pub const NS_NTDS: DWORD = 32;
pub const NS_EMAIL: DWORD = 37;
pub const NS_PNRPNAME: DWORD = 38;
pub const NS_PNRPCLOUD: DWORD = 39;
pub const NS_X500: DWORD = 40;
pub const NS_NIS: DWORD = 41;
pub const NS_NISPLUS: DWORD = 42;
pub const NS_WRQ: DWORD = 50;
pub const NS_NETDES: DWORD = 60;
pub const NI_NOFQDN: c_int = 0x01;
pub const NI_NUMERICHOST: c_int = 0x02;
pub const NI_NAMEREQD: c_int = 0x04;
pub const NI_NUMERICSERV: c_int = 0x08;
pub const NI_DGRAM: c_int = 0x10;
pub const NI_MAXHOST: c_int = 1025;
pub const NI_MAXSERV: c_int = 32;