xpmgr/BuildTools/Include/ws2def.h

969 lines
31 KiB
C

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
ws2def.h
Abstract:
This file contains the core definitions for the Winsock2
specification that can be used by both user-mode and
kernel mode modules.
This file is included in WINSOCK2.H. User mode applications
should include WINSOCK2.H rather than including this file
directly. This file can not be included by a module that also
includes WINSOCK.H.
Environment:
user mode or kernel mode
--*/
#ifndef _WS2DEF_
#define _WS2DEF_
#if _MSC_VER > 1000
#pragma once
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(_WINSOCK2API_) && defined(_WINSOCKAPI_)
#error Do not include winsock.h and ws2def.h in the same module. Instead include only winsock2.h.
#endif
#pragma warning(push)
#pragma warning(disable:4201)
#pragma warning(disable:4214) // bit field types other than int
//
// Allow Winsock components to disable PREfast errors.
//
#if defined(_PREFAST_) && defined(IPV6_PREFAST_SAFE)
#include <ipv6prefast.h>
#endif // _PREFAST_
#if(_WIN32_WINNT >= 0x0600)
#ifdef _MSC_VER
#define WS2DEF_INLINE __inline
#else
#define WS2DEF_INLINE extern inline /* GNU style */
#endif
#endif//(_WIN32_WINNT >= 0x0600)
#include <inaddr.h>
//#if(_WIN32_WINNT >= 0x0600)
//
// Address families.
//
typedef USHORT ADDRESS_FAMILY;
//#endif//(_WIN32_WINNT >= 0x0600)
//
// Although AF_UNSPEC is defined for backwards compatibility, using
// AF_UNSPEC for the "af" parameter when creating a socket is STRONGLY
// DISCOURAGED. The interpretation of the "protocol" parameter
// depends on the actual address family chosen. As environments grow
// to include more and more address families that use overlapping
// protocol values there is more and more chance of choosing an
// undesired address family when AF_UNSPEC is used.
//
#define AF_UNSPEC 0 // unspecified
#define AF_UNIX 1 // local to host (pipes, portals)
#define AF_INET 2 // internetwork: UDP, TCP, etc.
#define AF_IMPLINK 3 // arpanet imp addresses
#define AF_PUP 4 // pup protocols: e.g. BSP
#define AF_CHAOS 5 // mit CHAOS protocols
#define AF_NS 6 // XEROX NS protocols
#define AF_IPX AF_NS // IPX protocols: IPX, SPX, etc.
#define AF_ISO 7 // ISO protocols
#define AF_OSI AF_ISO // OSI is ISO
#define AF_ECMA 8 // european computer manufacturers
#define AF_DATAKIT 9 // datakit protocols
#define AF_CCITT 10 // CCITT protocols, X.25 etc
#define AF_SNA 11 // IBM SNA
#define AF_DECnet 12 // DECnet
#define AF_DLI 13 // Direct data link interface
#define AF_LAT 14 // LAT
#define AF_HYLINK 15 // NSC Hyperchannel
#define AF_APPLETALK 16 // AppleTalk
#define AF_NETBIOS 17 // NetBios-style addresses
#define AF_VOICEVIEW 18 // VoiceView
#define AF_FIREFOX 19 // Protocols from Firefox
#define AF_UNKNOWN1 20 // Somebody is using this!
#define AF_BAN 21 // Banyan
#define AF_ATM 22 // Native ATM Services
#define AF_INET6 23 // Internetwork Version 6
#define AF_CLUSTER 24 // Microsoft Wolfpack
#define AF_12844 25 // IEEE 1284.4 WG AF
#define AF_IRDA 26 // IrDA
#define AF_NETDES 28 // Network Designers OSI & gateway
#if(_WIN32_WINNT < 0x0501)
#define AF_MAX 29
#else //(_WIN32_WINNT < 0x0501)
#define AF_TCNPROCESS 29
#define AF_TCNMESSAGE 30
#define AF_ICLFXBM 31
#if(_WIN32_WINNT < 0x0600)
#define AF_MAX 32
#else //(_WIN32_WINNT < 0x0600)
#define AF_BTH 32 // Bluetooth RFCOMM/L2CAP protocols
#if(_WIN32_WINNT < 0x0601)
#define AF_MAX 33
#else //(_WIN32_WINNT < 0x0601)
#define AF_LINK 33
#define AF_MAX 34
#endif //(_WIN32_WINNT < 0x0601)
#endif //(_WIN32_WINNT < 0x0600)
#endif //(_WIN32_WINNT < 0x0501)
//
// Socket types.
//
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define SOCK_RAW 3
#define SOCK_RDM 4
#define SOCK_SEQPACKET 5
//
// Define a level for socket I/O controls in the same numbering space as
// IPPROTO_TCP, IPPROTO_IP, etc.
//
#define SOL_SOCKET 0xffff
//
// Define socket-level options.
//
#define SO_DEBUG 0x0001 // turn on debugging info recording
#define SO_ACCEPTCONN 0x0002 // socket has had listen()
#define SO_REUSEADDR 0x0004 // allow local address reuse
#define SO_KEEPALIVE 0x0008 // keep connections alive
#define SO_DONTROUTE 0x0010 // just use interface addresses
#define SO_BROADCAST 0x0020 // permit sending of broadcast msgs
#define SO_USELOOPBACK 0x0040 // bypass hardware when possible
#define SO_LINGER 0x0080 // linger on close if data present
#define SO_OOBINLINE 0x0100 // leave received OOB data in line
#define SO_DONTLINGER (int)(~SO_LINGER)
#define SO_EXCLUSIVEADDRUSE \
((int)(~SO_REUSEADDR)) // disallow local address reuse
#define SO_SNDBUF 0x1001 // send buffer size
#define SO_RCVBUF 0x1002 // receive buffer size
#define SO_SNDLOWAT 0x1003 // send low-water mark
#define SO_RCVLOWAT 0x1004 // receive low-water mark
#define SO_SNDTIMEO 0x1005 // send timeout
#define SO_RCVTIMEO 0x1006 // receive timeout
#define SO_ERROR 0x1007 // get error status and clear
#define SO_TYPE 0x1008 // get socket type
#define SO_BSP_STATE 0x1009 // get socket 5-tuple state
#define SO_GROUP_ID 0x2001 // ID of a socket group
#define SO_GROUP_PRIORITY 0x2002 // the relative priority within a group
#define SO_MAX_MSG_SIZE 0x2003 // maximum message size
#define SO_CONDITIONAL_ACCEPT 0x3002 // enable true conditional accept:
// connection is not ack-ed to the
// other side until conditional
// function returns CF_ACCEPT
#define SO_PAUSE_ACCEPT 0x3003 // pause accepting new connections
#define SO_COMPARTMENT_ID 0x3004 // get/set the compartment for a socket
#if (_WIN32_WINNT >= 0x0600)
#define SO_RANDOMIZE_PORT 0x3005 // randomize assignment of wildcard ports
#define SO_PORT_SCALABILITY 0x3006 // enable port scalability
#endif //(_WIN32_WINNT >= 0x0600)
//
// Base constant used for defining WSK-specific options.
//
#define WSK_SO_BASE 0x4000
//
// Options to use with [gs]etsockopt at the IPPROTO_TCP level.
//
#define TCP_NODELAY 0x0001
//
// Structure used to store most addresses.
//
typedef struct sockaddr {
#if (_WIN32_WINNT < 0x0600)
u_short sa_family;
#else
ADDRESS_FAMILY sa_family; // Address family.
#endif //(_WIN32_WINNT < 0x0600)
CHAR sa_data[14]; // Up to 14 bytes of direct address.
} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;
#ifndef __CSADDR_DEFINED__
#define __CSADDR_DEFINED__
/*
* SockAddr Information
*/
typedef struct _SOCKET_ADDRESS {
__field_bcount(iSockaddrLength) LPSOCKADDR lpSockaddr;
INT iSockaddrLength;
} SOCKET_ADDRESS, *PSOCKET_ADDRESS, *LPSOCKET_ADDRESS;
/*
* Address list returned via SIO_ADDRESS_LIST_QUERY
*/
typedef struct _SOCKET_ADDRESS_LIST {
INT iAddressCount;
SOCKET_ADDRESS Address[1];
} SOCKET_ADDRESS_LIST, *PSOCKET_ADDRESS_LIST, FAR *LPSOCKET_ADDRESS_LIST;
#if (_WIN32_WINNT >= 0x0600)
#define SIZEOF_SOCKET_ADDRESS_LIST(AddressCount) \
(FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address) + \
AddressCount * sizeof(SOCKET_ADDRESS))
#endif //(_WIN32_WINNT >= 0x0600)
/*
* CSAddr Information
*/
typedef struct _CSADDR_INFO {
SOCKET_ADDRESS LocalAddr ;
SOCKET_ADDRESS RemoteAddr ;
INT iSocketType ;
INT iProtocol ;
} CSADDR_INFO, *PCSADDR_INFO, FAR * LPCSADDR_INFO ;
#endif /* __CSADDR_DEFINED__ */
//
// Portable socket structure (RFC 2553).
//
//
// Desired design of maximum size and alignment.
// These are implementation specific.
//
#define _SS_MAXSIZE 128 // Maximum size
#define _SS_ALIGNSIZE (sizeof(__int64)) // Desired alignment
//
// Definitions used for sockaddr_storage structure paddings design.
//
#if(_WIN32_WINNT >= 0x0600)
#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(USHORT))
#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof(USHORT) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
#else
#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short))
#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) + _SS_PAD1SIZE \
+ _SS_ALIGNSIZE))
#endif //(_WIN32_WINNT >= 0x0600)
typedef struct sockaddr_storage {
ADDRESS_FAMILY ss_family; // address family
CHAR __ss_pad1[_SS_PAD1SIZE]; // 6 byte pad, this is to make
// implementation specific pad up to
// alignment field that follows explicit
// in the data structure
__int64 __ss_align; // Field to force desired structure
CHAR __ss_pad2[_SS_PAD2SIZE]; // 112 byte pad to achieve desired size;
// _SS_MAXSIZE value minus size of
// ss_family, __ss_pad1, and
// __ss_align fields is 112
} SOCKADDR_STORAGE_LH, *PSOCKADDR_STORAGE_LH, FAR *LPSOCKADDR_STORAGE_LH;
typedef struct sockaddr_storage_xp {
short ss_family; // Address family.
CHAR __ss_pad1[_SS_PAD1SIZE]; // 6 byte pad, this is to make
// implementation specific pad up to
// alignment field that follows explicit
// in the data structure
__int64 __ss_align; // Field to force desired structure
CHAR __ss_pad2[_SS_PAD2SIZE]; // 112 byte pad to achieve desired size;
// _SS_MAXSIZE value minus size of
// ss_family, __ss_pad1, and
// __ss_align fields is 112
} SOCKADDR_STORAGE_XP, *PSOCKADDR_STORAGE_XP, FAR *LPSOCKADDR_STORAGE_XP;
#if(_WIN32_WINNT >= 0x0600)
typedef SOCKADDR_STORAGE_LH SOCKADDR_STORAGE;
typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
#elif (_WIN32_WINNT >= 0x0501)
typedef SOCKADDR_STORAGE_XP SOCKADDR_STORAGE;
typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
#endif
/*
* WinSock 2 extension -- manifest constants for WSAIoctl()
*/
#define IOC_UNIX 0x00000000
#define IOC_WS2 0x08000000
#define IOC_PROTOCOL 0x10000000
#define IOC_VENDOR 0x18000000
#if (_WIN32_WINNT >= 0x0600)
/*
* WSK-specific IO control codes are Winsock2 codes with the highest-order
* 3 bits of the Vendor/AddressFamily-specific field set to 1.
*/
#define IOC_WSK (IOC_WS2|0x07000000)
#endif //(_WIN32_WINNT >= 0x0600)
#define _WSAIO(x,y) (IOC_VOID|(x)|(y))
#define _WSAIOR(x,y) (IOC_OUT|(x)|(y))
#define _WSAIOW(x,y) (IOC_IN|(x)|(y))
#define _WSAIORW(x,y) (IOC_INOUT|(x)|(y))
#define SIO_ASSOCIATE_HANDLE _WSAIOW(IOC_WS2,1)
#define SIO_ENABLE_CIRCULAR_QUEUEING _WSAIO(IOC_WS2,2)
#define SIO_FIND_ROUTE _WSAIOR(IOC_WS2,3)
#define SIO_FLUSH _WSAIO(IOC_WS2,4)
#define SIO_GET_BROADCAST_ADDRESS _WSAIOR(IOC_WS2,5)
#define SIO_GET_EXTENSION_FUNCTION_POINTER _WSAIORW(IOC_WS2,6)
#define SIO_GET_QOS _WSAIORW(IOC_WS2,7)
#define SIO_GET_GROUP_QOS _WSAIORW(IOC_WS2,8)
#define SIO_MULTIPOINT_LOOPBACK _WSAIOW(IOC_WS2,9)
#define SIO_MULTICAST_SCOPE _WSAIOW(IOC_WS2,10)
#define SIO_SET_QOS _WSAIOW(IOC_WS2,11)
#define SIO_SET_GROUP_QOS _WSAIOW(IOC_WS2,12)
#define SIO_TRANSLATE_HANDLE _WSAIORW(IOC_WS2,13)
#define SIO_ROUTING_INTERFACE_QUERY _WSAIORW(IOC_WS2,20)
#define SIO_ROUTING_INTERFACE_CHANGE _WSAIOW(IOC_WS2,21)
#define SIO_ADDRESS_LIST_QUERY _WSAIOR(IOC_WS2,22)
#define SIO_ADDRESS_LIST_CHANGE _WSAIO(IOC_WS2,23)
#define SIO_QUERY_TARGET_PNP_HANDLE _WSAIOR(IOC_WS2,24)
#if(_WIN32_WINNT >= 0x0501)
#define SIO_ADDRESS_LIST_SORT _WSAIORW(IOC_WS2,25)
#endif //(_WIN32_WINNT >= 0x0501)
#if (_WIN32_WINNT >= 0x0600)
#define SIO_RESERVED_1 _WSAIOW(IOC_WS2,26)
#define SIO_RESERVED_2 _WSAIOW(IOC_WS2,33)
#endif //(_WIN32_WINNT >= 0x0600)
//
// Constants and structures defined by the internet system (RFC 790)
//
//
// N.B. required for backwards compatability to support 0 = IP for the
// level argument to get/setsockopt.
//
#define IPPROTO_IP 0
//
// Protocols. The IPv6 defines are specified in RFC 2292.
//
typedef enum {
#if(_WIN32_WINNT >= 0x0501)
IPPROTO_HOPOPTS = 0, // IPv6 Hop-by-Hop options
#endif//(_WIN32_WINNT >= 0x0501)
IPPROTO_ICMP = 1,
IPPROTO_IGMP = 2,
IPPROTO_GGP = 3,
#if(_WIN32_WINNT >= 0x0501)
IPPROTO_IPV4 = 4,
#endif//(_WIN32_WINNT >= 0x0501)
#if(_WIN32_WINNT >= 0x0600)
IPPROTO_ST = 5,
#endif//(_WIN32_WINNT >= 0x0600)
IPPROTO_TCP = 6,
#if(_WIN32_WINNT >= 0x0600)
IPPROTO_CBT = 7,
IPPROTO_EGP = 8,
IPPROTO_IGP = 9,
#endif//(_WIN32_WINNT >= 0x0600)
IPPROTO_PUP = 12,
IPPROTO_UDP = 17,
IPPROTO_IDP = 22,
#if(_WIN32_WINNT >= 0x0600)
IPPROTO_RDP = 27,
#endif//(_WIN32_WINNT >= 0x0600)
#if(_WIN32_WINNT >= 0x0501)
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
#endif//(_WIN32_WINNT >= 0x0501)
IPPROTO_ND = 77,
#if(_WIN32_WINNT >= 0x0501)
IPPROTO_ICLFXBM = 78,
#endif//(_WIN32_WINNT >= 0x0501)
#if(_WIN32_WINNT >= 0x0600)
IPPROTO_PIM = 103,
IPPROTO_PGM = 113,
IPPROTO_L2TP = 115,
IPPROTO_SCTP = 132,
#endif//(_WIN32_WINNT >= 0x0600)
IPPROTO_RAW = 255,
IPPROTO_MAX = 256,
//
// These are reserved for internal use by Windows.
//
IPPROTO_RESERVED_RAW = 257,
IPPROTO_RESERVED_IPSEC = 258,
IPPROTO_RESERVED_IPSECOFFLOAD = 259,
IPPROTO_RESERVED_MAX = 260
} IPPROTO, *PIPROTO;
//
// Port/socket numbers: network standard functions
//
#define IPPORT_TCPMUX 1
#define IPPORT_ECHO 7
#define IPPORT_DISCARD 9
#define IPPORT_SYSTAT 11
#define IPPORT_DAYTIME 13
#define IPPORT_NETSTAT 15
#define IPPORT_QOTD 17
#define IPPORT_MSP 18
#define IPPORT_CHARGEN 19
#define IPPORT_FTP_DATA 20
#define IPPORT_FTP 21
#define IPPORT_TELNET 23
#define IPPORT_SMTP 25
#define IPPORT_TIMESERVER 37
#define IPPORT_NAMESERVER 42
#define IPPORT_WHOIS 43
#define IPPORT_MTP 57
/*
* Port/socket numbers: host specific functions
*/
#define IPPORT_TFTP 69
#define IPPORT_RJE 77
#define IPPORT_FINGER 79
#define IPPORT_TTYLINK 87
#define IPPORT_SUPDUP 95
/*
* UNIX TCP sockets
*/
#define IPPORT_POP3 110
#define IPPORT_NTP 123
#define IPPORT_EPMAP 135
#define IPPORT_NETBIOS_NS 137
#define IPPORT_NETBIOS_DGM 138
#define IPPORT_NETBIOS_SSN 139
#define IPPORT_IMAP 143
#define IPPORT_SNMP 161
#define IPPORT_SNMP_TRAP 162
#define IPPORT_IMAP3 220
#define IPPORT_LDAP 389
#define IPPORT_HTTPS 443
#define IPPORT_MICROSOFT_DS 445
#define IPPORT_EXECSERVER 512
#define IPPORT_LOGINSERVER 513
#define IPPORT_CMDSERVER 514
#define IPPORT_EFSSERVER 520
/*
* UNIX UDP sockets
*/
#define IPPORT_BIFFUDP 512
#define IPPORT_WHOSERVER 513
#define IPPORT_ROUTESERVER 520
/* 520+1 also used */
/*
* Ports < IPPORT_RESERVED are reserved for
* privileged processes (e.g. root).
*/
#define IPPORT_RESERVED 1024
#if (_WIN32_WINNT >= 0x0600)
#define IPPORT_REGISTERED_MIN IPPORT_RESERVED
#define IPPORT_REGISTERED_MAX 0xbfff
#define IPPORT_DYNAMIC_MIN 0xc000
#define IPPORT_DYNAMIC_MAX 0xffff
#endif //(_WIN32_WINNT >= 0x0600)
/*
* Definitions of bits in internet address integers.
* On subnets, the decomposition of addresses to host and net parts
* is done according to subnet mask, not the masks here.
*
* N.B. RFC-compliant definitions for host-order elements are named IN_xxx,
* while network-order elements are named IN4_xxx.
*/
#define IN_CLASSA(i) (((LONG)(i) & 0x80000000) == 0)
#define IN_CLASSA_NET 0xff000000
#define IN_CLASSA_NSHIFT 24
#define IN_CLASSA_HOST 0x00ffffff
#define IN_CLASSA_MAX 128
#define IN_CLASSB(i) (((LONG)(i) & 0xc0000000) == 0x80000000)
#define IN_CLASSB_NET 0xffff0000
#define IN_CLASSB_NSHIFT 16
#define IN_CLASSB_HOST 0x0000ffff
#define IN_CLASSB_MAX 65536
#define IN_CLASSC(i) (((LONG)(i) & 0xe0000000) == 0xc0000000)
#define IN_CLASSC_NET 0xffffff00
#define IN_CLASSC_NSHIFT 8
#define IN_CLASSC_HOST 0x000000ff
#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000)
#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */
#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */
#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */
#define IN_MULTICAST(i) IN_CLASSD(i)
#define INADDR_ANY (ULONG)0x00000000
#define INADDR_LOOPBACK 0x7f000001
#define INADDR_BROADCAST (ULONG)0xffffffff
#define INADDR_NONE 0xffffffff
//
// Scope ID definition
//
typedef enum {
ScopeLevelInterface = 1,
ScopeLevelLink = 2,
ScopeLevelSubnet = 3,
ScopeLevelAdmin = 4,
ScopeLevelSite = 5,
ScopeLevelOrganization = 8,
ScopeLevelGlobal = 14,
ScopeLevelCount = 16
} SCOPE_LEVEL;
typedef struct {
union {
struct {
ULONG Zone : 28;
ULONG Level : 4;
};
ULONG Value;
};
} SCOPE_ID, *PSCOPE_ID;
#define SCOPEID_UNSPECIFIED_INIT { 0 }
//
// IPv4 Socket address, Internet style
//
typedef struct sockaddr_in {
#if(_WIN32_WINNT < 0x0600)
short sin_family;
#else //(_WIN32_WINNT < 0x0600)
ADDRESS_FAMILY sin_family;
#endif //(_WIN32_WINNT < 0x0600)
USHORT sin_port;
IN_ADDR sin_addr;
CHAR sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN;
//
// Datalink (MAC) address
//
// If you don't use the entire sdl_data field, then fill it starting with the low
// bytes...
//
#if(_WIN32_WINNT >= 0x0601)
typedef struct sockaddr_dl {
ADDRESS_FAMILY sdl_family;
UCHAR sdl_data[8];
UCHAR sdl_zero[4];
} SOCKADDR_DL, *PSOCKADDR_DL;
#endif //(_WIN32_WINNT >= 0x0601)
#define IOCPARM_MASK 0x7f /* parameters must be < 128 bytes */
#define IOC_VOID 0x20000000 /* no parameters */
#define IOC_OUT 0x40000000 /* copy out parameters */
#define IOC_IN 0x80000000 /* copy in parameters */
#define IOC_INOUT (IOC_IN|IOC_OUT)
/* 0x20000000 distinguishes new &
old ioctl's */
#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
/*
* WinSock 2 extension -- WSABUF and QOS struct, include qos.h
* to pull in FLOWSPEC and related definitions
*/
typedef struct _WSABUF {
ULONG len; /* the length of the buffer */
__field_bcount(len) CHAR FAR *buf; /* the pointer to the buffer */
} WSABUF, FAR * LPWSABUF;
/*
* WSAMSG -- for WSASendMsg
*/
typedef struct _WSAMSG {
__field_bcount(namelen) LPSOCKADDR name; /* Remote address */
INT namelen; /* Remote address length */
LPWSABUF lpBuffers; /* Data buffer array */
#if(_WIN32_WINNT >= 0x0600)
ULONG dwBufferCount; /* Number of elements in the array */
#else
DWORD dwBufferCount; /* Number of elements in the array */
#endif //(_WIN32_WINNT>=0x0600)
WSABUF Control; /* Control buffer */
#if(_WIN32_WINNT >= 0x0600)
ULONG dwFlags; /* Flags */
#else
DWORD dwFlags; /* Flags */
#endif //(_WIN32_WINNT>=0x0600)
} WSAMSG, *PWSAMSG, * FAR LPWSAMSG;
/*
* Layout of ancillary data objects in the control buffer (RFC 2292).
*/
#if(_WIN32_WINNT >= 0x0600)
#define _WSACMSGHDR cmsghdr
#endif //(_WIN32_WINNT>=0x0600)
typedef struct _WSACMSGHDR {
SIZE_T cmsg_len;
INT cmsg_level;
INT cmsg_type;
/* followed by UCHAR cmsg_data[] */
} WSACMSGHDR, *PWSACMSGHDR, FAR *LPWSACMSGHDR;
#if(_WIN32_WINNT >= 0x0600)
typedef WSACMSGHDR CMSGHDR, *PCMSGHDR;
#endif //(_WIN32_WINNT>=0x0600)
/*
* Alignment macros for header and data members of
* the control buffer.
*/
#define WSA_CMSGHDR_ALIGN(length) \
( ((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) & \
(~(TYPE_ALIGNMENT(WSACMSGHDR)-1)) ) \
#define WSA_CMSGDATA_ALIGN(length) \
( ((length) + MAX_NATURAL_ALIGNMENT-1) & \
(~(MAX_NATURAL_ALIGNMENT-1)) )
#if(_WIN32_WINNT >= 0x0600)
#define CMSGHDR_ALIGN WSA_CMSGHDR_ALIGN
#define CMSGDATA_ALIGN WSA_CMSGDATA_ALIGN
#endif //(_WIN32_WINNT>=0x0600)
/*
* WSA_CMSG_FIRSTHDR
*
* Returns a pointer to the first ancillary data object,
* or a null pointer if there is no ancillary data in the
* control buffer of the WSAMSG structure.
*
* LPCMSGHDR
* WSA_CMSG_FIRSTHDR (
* LPWSAMSG msg
* );
*/
#define WSA_CMSG_FIRSTHDR(msg) \
( ((msg)->Control.len >= sizeof(WSACMSGHDR)) \
? (LPWSACMSGHDR)(msg)->Control.buf \
: (LPWSACMSGHDR)NULL )
#if(_WIN32_WINNT >= 0x0600)
#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
#endif //(_WIN32_WINNT>=0x0600)
/*
* WSA_CMSG_NXTHDR
*
* Returns a pointer to the next ancillary data object,
* or a null if there are no more data objects.
*
* LPCMSGHDR
* WSA_CMSG_NEXTHDR (
* LPWSAMSG msg,
* LPWSACMSGHDR cmsg
* );
*/
#define WSA_CMSG_NXTHDR(msg, cmsg) \
( ((cmsg) == NULL) \
? WSA_CMSG_FIRSTHDR(msg) \
: ( ( ((PUCHAR)(cmsg) + \
WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + \
sizeof(WSACMSGHDR) ) > \
(PUCHAR)((msg)->Control.buf) + \
(msg)->Control.len ) \
? (LPWSACMSGHDR)NULL \
: (LPWSACMSGHDR)((PUCHAR)(cmsg) + \
WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) )
#if(_WIN32_WINNT >= 0x0600)
#define CMSG_NXTHDR WSA_CMSG_NXTHDR
#endif //(_WIN32_WINNT>=0x0600)
/*
* WSA_CMSG_DATA
*
* Returns a pointer to the first byte of data (what is referred
* to as the cmsg_data member though it is not defined in
* the structure).
*
* Note that RFC 2292 defines this as CMSG_DATA, but that name
* is already used by wincrypt.h, and so Windows has used WSA_CMSG_DATA.
*
* PUCHAR
* WSA_CMSG_DATA (
* LPWSACMSGHDR pcmsg
* );
*/
#define WSA_CMSG_DATA(cmsg) \
( (PUCHAR)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) )
/*
* WSA_CMSG_SPACE
*
* Returns total size of an ancillary data object given
* the amount of data. Used to allocate the correct amount
* of space.
*
* SIZE_T
* WSA_CMSG_SPACE (
* SIZE_T length
* );
*/
#define WSA_CMSG_SPACE(length) \
(WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
#if(_WIN32_WINNT >= 0x0600)
#define CMSG_SPACE WSA_CMSG_SPACE
#endif //(_WIN32_WINNT>=0x0600)
/*
* WSA_CMSG_LEN
*
* Returns the value to store in cmsg_len given the amount of data.
*
* SIZE_T
* WSA_CMSG_LEN (
* SIZE_T length
* );
*/
#define WSA_CMSG_LEN(length) \
(WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
#if(_WIN32_WINNT >= 0x0600)
#define CMSG_LEN WSA_CMSG_LEN
#endif //(_WIN32_WINNT>=0x0600)
/*
* Definition for flags member of the WSAMSG structure
* This is in addition to other MSG_xxx flags defined
* for recv/recvfrom/send/sendto.
*/
#define MSG_TRUNC 0x0100
#define MSG_CTRUNC 0x0200
#define MSG_BCAST 0x0400
#define MSG_MCAST 0x0800
//
// Flags used in "hints" argument to getaddrinfo()
// - AI_ADDRCONFIG is supported starting with Vista
// - default is AI_ADDRCONFIG ON whether the flag is set or not
// because the performance penalty in not having ADDRCONFIG in
// the multi-protocol stack environment is severe;
// this defaulting may be disabled by specifying the AI_ALL flag,
// in that case AI_ADDRCONFIG must be EXPLICITLY specified to
// enable ADDRCONFIG behavior
//
#define AI_PASSIVE 0x00000001 // Socket address will be used in bind() call
#define AI_CANONNAME 0x00000002 // Return canonical name in first ai_canonname
#define AI_NUMERICHOST 0x00000004 // Nodename must be a numeric address string
#define AI_NUMERICSERV 0x00000008 // Servicename must be a numeric port number
#define AI_ALL 0x00000100 // Query both IP6 and IP4 with AI_V4MAPPED
#define AI_ADDRCONFIG 0x00000400 // Resolution only if global address configured
#define AI_V4MAPPED 0x00000800 // On v6 failure, query v4 and convert to V4MAPPED format
#define AI_NON_AUTHORITATIVE 0x00004000 // LUP_NON_AUTHORITATIVE
#define AI_SECURE 0x00008000 // LUP_SECURE
#define AI_RETURN_PREFERRED_NAMES 0x00010000 // LUP_RETURN_PREFERRED_NAMES
#define AI_FQDN 0x00020000 // Return the FQDN in ai_canonname
#define AI_FILESERVER 0x00040000 // Resolving fileserver name resolution
//
// Structure used in getaddrinfo() call
//
typedef struct addrinfo
{
int ai_flags; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
int ai_family; // PF_xxx
int ai_socktype; // SOCK_xxx
int ai_protocol; // 0 or IPPROTO_xxx for IPv4 and IPv6
size_t ai_addrlen; // Length of ai_addr
char * ai_canonname; // Canonical name for nodename
__field_bcount(ai_addrlen) struct sockaddr * ai_addr; // Binary address
struct addrinfo * ai_next; // Next structure in linked list
}
ADDRINFOA, *PADDRINFOA;
typedef struct addrinfoW
{
int ai_flags; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
int ai_family; // PF_xxx
int ai_socktype; // SOCK_xxx
int ai_protocol; // 0 or IPPROTO_xxx for IPv4 and IPv6
size_t ai_addrlen; // Length of ai_addr
PWSTR ai_canonname; // Canonical name for nodename
__field_bcount(ai_addrlen) struct sockaddr * ai_addr; // Binary address
struct addrinfoW * ai_next; // Next structure in linked list
}
ADDRINFOW, *PADDRINFOW;
#if (_WIN32_WINNT >= 0x0600)
typedef struct addrinfoexA
{
int ai_flags; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
int ai_family; // PF_xxx
int ai_socktype; // SOCK_xxx
int ai_protocol; // 0 or IPPROTO_xxx for IPv4 and IPv6
size_t ai_addrlen; // Length of ai_addr
char *ai_canonname; // Canonical name for nodename
struct sockaddr *ai_addr; // Binary address
void *ai_blob;
size_t ai_bloblen;
LPGUID ai_provider;
struct addrinfoexA *ai_next; // Next structure in linked list
} ADDRINFOEXA, *PADDRINFOEXA, *LPADDRINFOEXA;
typedef struct addrinfoexW
{
int ai_flags; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST
int ai_family; // PF_xxx
int ai_socktype; // SOCK_xxx
int ai_protocol; // 0 or IPPROTO_xxx for IPv4 and IPv6
size_t ai_addrlen; // Length of ai_addr
PWSTR ai_canonname; // Canonical name for nodename
__field_bcount(ai_addrlen) struct sockaddr *ai_addr; // Binary address
__field_ecount(ai_bloblen) void *ai_blob;
size_t ai_bloblen;
LPGUID ai_provider;
struct addrinfoexW *ai_next; // Next structure in linked list
} ADDRINFOEXW, *PADDRINFOEXW, *LPADDRINFOEXW;
#endif
//
// Flags for getaddrinfo()
//
// Name Spaces
#define NS_ALL (0)
#define NS_SAP (1)
#define NS_NDS (2)
#define NS_PEER_BROWSE (3)
#define NS_SLP (5)
#define NS_DHCP (6)
#define NS_TCPIP_LOCAL (10)
#define NS_TCPIP_HOSTS (11)
#define NS_DNS (12)
#define NS_NETBT (13)
#define NS_WINS (14)
#if(_WIN32_WINNT >= 0x0501)
#define NS_NLA (15) /* Network Location Awareness */
#endif //(_WIN32_WINNT >= 0x0501)
#if(_WIN32_WINNT >= 0x0600)
#define NS_BTH (16) /* Bluetooth SDP Namespace */
#endif //(_WIN32_WINNT >= 0x0600)
#define NS_NBP (20)
#define NS_MS (30)
#define NS_STDA (31)
#define NS_NTDS (32)
#if(_WIN32_WINNT >= 0x0600)
#define NS_EMAIL (37)
#define NS_PNRPNAME (38)
#define NS_PNRPCLOUD (39)
#endif //(_WIN32_WINNT >= 0x0600)
#define NS_X500 (40)
#define NS_NIS (41)
#define NS_NISPLUS (42)
#define NS_WRQ (50)
#define NS_NETDES (60) /* Network Designers Limited */
//
// Flags for getnameinfo()
//
#define NI_NOFQDN 0x01 /* Only return nodename portion for local hosts */
#define NI_NUMERICHOST 0x02 /* Return numeric form of the host's address */
#define NI_NAMEREQD 0x04 /* Error if the host's name not in DNS */
#define NI_NUMERICSERV 0x08 /* Return numeric form of the service (port #) */
#define NI_DGRAM 0x10 /* Service is a datagram service */
#define NI_MAXHOST 1025 /* Max size of a fully-qualified domain name */
#define NI_MAXSERV 32 /* Max size of a service name */
#pragma warning(pop)
#ifdef __cplusplus
}
#endif
#endif