Home | History | Annotate | Download | only in include
      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifndef _WS2TCPIP_H_
      7 #define _WS2TCPIP_H_
      8 
      9 #include <_mingw_unicode.h>
     10 
     11 #ifdef __LP64__
     12 #pragma push_macro("u_long")
     13 #undef u_long
     14 #define u_long __ms_u_long
     15 #endif
     16 
     17 #include <winsock2.h>
     18 #include <ws2ipdef.h>
     19 #include <psdk_inc/_ip_mreq1.h>
     20 #include <winapifamily.h>
     21 
     22 struct ip_mreq_source {
     23   struct in_addr imr_multiaddr;
     24   struct in_addr imr_sourceaddr;
     25   struct in_addr imr_interface;
     26 };
     27 
     28 struct ip_msfilter {
     29   struct in_addr imsf_multiaddr;
     30   struct in_addr imsf_interface;
     31   u_long imsf_fmode;
     32   u_long imsf_numsrc;
     33   struct in_addr imsf_slist[1];
     34 };
     35 
     36 #define IP_MSFILTER_SIZE(numsrc) (sizeof(struct ip_msfilter)-sizeof(struct in_addr) + (numsrc)*sizeof(struct in_addr))
     37 
     38 #define SIO_GET_INTERFACE_LIST _IOR('t',127,u_long)
     39 
     40 #define SIO_GET_INTERFACE_LIST_EX _IOR('t',126,u_long)
     41 #define SIO_SET_MULTICAST_FILTER _IOW('t',125,u_long)
     42 #define SIO_GET_MULTICAST_FILTER _IOW('t',124 | IOC_IN,u_long)
     43 
     44 #define IP_OPTIONS 1
     45 #define IP_HDRINCL 2
     46 #define IP_TOS 3
     47 #define IP_TTL 4
     48 #define IP_MULTICAST_IF 9
     49 #define IP_MULTICAST_TTL 10
     50 #define IP_MULTICAST_LOOP 11
     51 #define IP_ADD_MEMBERSHIP 12
     52 #define IP_DROP_MEMBERSHIP 13
     53 #define IP_DONTFRAGMENT 14
     54 #define IP_ADD_SOURCE_MEMBERSHIP 15
     55 #define IP_DROP_SOURCE_MEMBERSHIP 16
     56 #define IP_BLOCK_SOURCE 17
     57 #define IP_UNBLOCK_SOURCE 18
     58 #define IP_PKTINFO 19
     59 #define IP_RECEIVE_BROADCAST 22
     60 
     61 #define PROTECTION_LEVEL_UNRESTRICTED 10
     62 #define PROTECTION_LEVEL_DEFAULT 20
     63 #define PROTECTION_LEVEL_RESTRICTED 30
     64 
     65 #define UDP_NOCHECKSUM 1
     66 #define UDP_CHECKSUM_COVERAGE 20
     67 
     68 #define TCP_EXPEDITED_1122 0x0002
     69 
     70 
     71 #include <ws2ipdef.h>
     72 
     73 
     74 #define SS_PORT(ssp) (((struct sockaddr_in*)(ssp))->sin_port)
     75 
     76 #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
     77 #define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
     78 
     79 #ifdef __cplusplus
     80 extern "C" {
     81 #endif
     82 
     83   extern const struct in6_addr in6addr_any;
     84   extern const struct in6_addr in6addr_loopback;
     85 
     86 int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *);
     87 int IN6_IS_ADDR_LOOPBACK(const struct in6_addr *);
     88 int IN6_IS_ADDR_MULTICAST(const struct in6_addr *);
     89 int IN6_IS_ADDR_LINKLOCAL(const struct in6_addr *);
     90 int IN6_IS_ADDR_SITELOCAL(const struct in6_addr *);
     91 int IN6_IS_ADDR_V4MAPPED(const struct in6_addr *);
     92 int IN6_IS_ADDR_V4COMPAT(const struct in6_addr *);
     93 int IN6_IS_ADDR_MC_NODELOCAL(const struct in6_addr *);
     94 int IN6_IS_ADDR_MC_LINKLOCAL(const struct in6_addr *);
     95 int IN6_IS_ADDR_MC_SITELOCAL(const struct in6_addr *);
     96 int IN6_IS_ADDR_MC_ORGLOCAL(const struct in6_addr *);
     97 int IN6_IS_ADDR_MC_GLOBAL(const struct in6_addr *);
     98 int IN6ADDR_ISANY(const struct sockaddr_in6 *);
     99 int IN6ADDR_ISLOOPBACK(const struct sockaddr_in6 *);
    100 void IN6_SET_ADDR_UNSPECIFIED(struct in6_addr *);
    101 void IN6_SET_ADDR_LOOPBACK(struct in6_addr *);
    102 void IN6ADDR_SETANY(struct sockaddr_in6 *);
    103 void IN6ADDR_SETLOOPBACK(struct sockaddr_in6 *);
    104 
    105 WS2TCPIP_INLINE int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *a) { return ((a->s6_words[0]==0) && (a->s6_words[1]==0) && (a->s6_words[2]==0) && (a->s6_words[3]==0) && (a->s6_words[4]==0) && (a->s6_words[5]==0) && (a->s6_words[6]==0) && (a->s6_words[7]==0)); }
    106 WS2TCPIP_INLINE int IN6_IS_ADDR_LOOPBACK(const struct in6_addr *a) { return ((a->s6_words[0]==0) && (a->s6_words[1]==0) && (a->s6_words[2]==0) && (a->s6_words[3]==0) && (a->s6_words[4]==0) && (a->s6_words[5]==0) && (a->s6_words[6]==0) && (a->s6_words[7]==0x0100)); }
    107 WS2TCPIP_INLINE int IN6_IS_ADDR_MULTICAST(const struct in6_addr *a) { return (a->s6_bytes[0]==0xff); }
    108 WS2TCPIP_INLINE int IN6_IS_ADDR_LINKLOCAL(const struct in6_addr *a) { return ((a->s6_bytes[0]==0xfe) && ((a->s6_bytes[1] & 0xc0)==0x80)); }
    109 WS2TCPIP_INLINE int IN6_IS_ADDR_SITELOCAL(const struct in6_addr *a) { return ((a->s6_bytes[0]==0xfe) && ((a->s6_bytes[1] & 0xc0)==0xc0)); }
    110 WS2TCPIP_INLINE int IN6_IS_ADDR_V4MAPPED(const struct in6_addr *a) { return ((a->s6_words[0]==0) && (a->s6_words[1]==0) && (a->s6_words[2]==0) && (a->s6_words[3]==0) && (a->s6_words[4]==0) && (a->s6_words[5]==0xffff)); }
    111 WS2TCPIP_INLINE int IN6_IS_ADDR_V4COMPAT(const struct in6_addr *a) { return ((a->s6_words[0]==0) && (a->s6_words[1]==0) && (a->s6_words[2]==0) && (a->s6_words[3]==0) && (a->s6_words[4]==0) && (a->s6_words[5]==0) && !((a->s6_words[6]==0) && (a->s6_addr[14]==0) && ((a->s6_addr[15]==0) || (a->s6_addr[15]==1)))); }
    112 WS2TCPIP_INLINE int IN6_IS_ADDR_MC_NODELOCAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf)==1); }
    113 WS2TCPIP_INLINE int IN6_IS_ADDR_MC_LINKLOCAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf)==2); }
    114 WS2TCPIP_INLINE int IN6_IS_ADDR_MC_SITELOCAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf)==5); }
    115 WS2TCPIP_INLINE int IN6_IS_ADDR_MC_ORGLOCAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf)==8); }
    116 WS2TCPIP_INLINE int IN6_IS_ADDR_MC_GLOBAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf)==0xe); }
    117 WS2TCPIP_INLINE int IN6ADDR_ISANY(const struct sockaddr_in6 *a) { return ((a->sin6_family==AF_INET6) && IN6_IS_ADDR_UNSPECIFIED(&a->sin6_addr)); }
    118 WS2TCPIP_INLINE int IN6ADDR_ISLOOPBACK(const struct sockaddr_in6 *a) { return ((a->sin6_family==AF_INET6) && IN6_IS_ADDR_LOOPBACK(&a->sin6_addr)); }
    119 WS2TCPIP_INLINE void IN6_SET_ADDR_UNSPECIFIED(struct in6_addr *a) { memset(a->s6_bytes,0,sizeof(struct in6_addr)); }
    120 WS2TCPIP_INLINE void IN6_SET_ADDR_LOOPBACK(struct in6_addr *a) {
    121   memset(a->s6_bytes,0,sizeof(struct in6_addr));
    122   a->s6_bytes[15] = 1;
    123 }
    124 WS2TCPIP_INLINE void IN6ADDR_SETANY(struct sockaddr_in6 *a) {
    125   a->sin6_family = AF_INET6;
    126   a->sin6_port = 0;
    127   a->sin6_flowinfo = 0;
    128   IN6_SET_ADDR_UNSPECIFIED(&a->sin6_addr);
    129   a->sin6_scope_id = 0;
    130 }
    131 WS2TCPIP_INLINE void IN6ADDR_SETLOOPBACK(struct sockaddr_in6 *a) {
    132   a->sin6_family = AF_INET6;
    133   a->sin6_port = 0;
    134   a->sin6_flowinfo = 0;
    135   IN6_SET_ADDR_LOOPBACK(&a->sin6_addr);
    136   a->sin6_scope_id = 0;
    137 }
    138 
    139 #ifdef __cplusplus
    140 }
    141 #endif
    142 
    143 typedef struct _INTERFACE_INFO_EX {
    144   u_long iiFlags;
    145   SOCKET_ADDRESS iiAddress;
    146   SOCKET_ADDRESS iiBroadcastAddress;
    147   SOCKET_ADDRESS iiNetmask;
    148 } INTERFACE_INFO_EX,*LPINTERFACE_INFO_EX;
    149 
    150 #define IFF_UP 0x00000001
    151 #define IFF_BROADCAST 0x00000002
    152 #define IFF_LOOPBACK 0x00000004
    153 #define IFF_POINTTOPOINT 0x00000008
    154 #define IFF_MULTICAST 0x00000010
    155 
    156 typedef struct in_pktinfo {
    157   IN_ADDR ipi_addr;
    158   UINT ipi_ifindex;
    159 } IN_PKTINFO;
    160 
    161 C_ASSERT(sizeof(IN_PKTINFO)==8);
    162 
    163 typedef struct in6_pktinfo {
    164   IN6_ADDR ipi6_addr;
    165   UINT ipi6_ifindex;
    166 } IN6_PKTINFO;
    167 
    168 C_ASSERT(sizeof(IN6_PKTINFO)==20);
    169 
    170 #define EAI_AGAIN WSATRY_AGAIN
    171 #define EAI_BADFLAGS WSAEINVAL
    172 #define EAI_FAIL WSANO_RECOVERY
    173 #define EAI_FAMILY WSAEAFNOSUPPORT
    174 #define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY
    175 
    176 #define EAI_NONAME WSAHOST_NOT_FOUND
    177 #define EAI_SERVICE WSATYPE_NOT_FOUND
    178 #define EAI_SOCKTYPE WSAESOCKTNOSUPPORT
    179 
    180 #define EAI_NODATA 11004 /* WSANO_DATA */
    181 
    182 typedef struct addrinfo {
    183   int ai_flags;
    184   int ai_family;
    185   int ai_socktype;
    186   int ai_protocol;
    187   size_t ai_addrlen;
    188   char *ai_canonname;
    189   struct sockaddr *ai_addr;
    190   struct addrinfo *ai_next;
    191 } ADDRINFOA,*PADDRINFOA;
    192 
    193 typedef struct addrinfoW {
    194   int ai_flags;
    195   int ai_family;
    196   int ai_socktype;
    197   int ai_protocol;
    198   size_t ai_addrlen;
    199   PWSTR ai_canonname;
    200   struct sockaddr *ai_addr;
    201   struct addrinfoW *ai_next;
    202 } ADDRINFOW,*PADDRINFOW;
    203 
    204 typedef __MINGW_NAME_AW(ADDRINFO) ADDRINFOT,*PADDRINFOT;
    205 
    206 typedef ADDRINFOA ADDRINFO,*LPADDRINFO;
    207 
    208 #define AI_PASSIVE                  0x00000001
    209 #define AI_CANONNAME                0x00000002
    210 #define AI_NUMERICHOST              0x00000004
    211 #if (_WIN32_WINNT >= 0x0600)
    212 #define AI_NUMERICSERV              0x00000008
    213 #define AI_ALL                      0x00000100
    214 #define AI_ADDRCONFIG               0x00000400
    215 #define AI_V4MAPPED                 0x00000800
    216 #define AI_NON_AUTHORITATIVE        0x00004000
    217 #define AI_SECURE                   0x00008000
    218 #define AI_RETURN_PREFERRED_NAMES   0x00010000
    219 #endif
    220 #if (_WIN32_WINNT >= 0x0601)
    221 #define AI_FQDN                     0x00020000
    222 #define AI_FILESERVER               0x00040000
    223 #endif
    224 #if (_WIN32_WINNT >= 0x0602)
    225 #define AI_DISABLE_IDN_ENCODING     0x00080000
    226 #endif
    227 
    228 #ifdef __cplusplus
    229 extern "C" {
    230 #endif
    231 
    232 #define GetAddrInfo __MINGW_NAME_AW(GetAddrInfo)
    233 
    234   WINSOCK_API_LINKAGE int WSAAPI getaddrinfo(const char *nodename,const char *servname,const struct addrinfo *hints,struct addrinfo **res);
    235   WINSOCK_API_LINKAGE int WSAAPI GetAddrInfoW(PCWSTR pNodeName,PCWSTR pServiceName,const ADDRINFOW *pHints,PADDRINFOW *ppResult);
    236 
    237 #define GetAddrInfoA getaddrinfo
    238 
    239 #if INCL_WINSOCK_API_TYPEDEFS
    240   typedef int (WSAAPI *LPFN_GETADDRINFO)(const char *nodename,const char *servname,const struct addrinfo *hints,struct addrinfo **res);
    241   typedef int (WSAAPI *LPFN_GETADDRINFOW)(PCWSTR pNodeName,PCWSTR pServiceName,const ADDRINFOW *pHints,PADDRINFOW *ppResult);
    242 
    243 #define LPFN_GETADDRINFOA LPFN_GETADDRINFO
    244 
    245 #define LPFN_GETADDRINFOT __MINGW_NAME_AW(LPFN_GETADDRINFO)
    246 #endif
    247 
    248 #define FreeAddrInfo __MINGW_NAME_AW(FreeAddrInfo)
    249 
    250   WINSOCK_API_LINKAGE void WSAAPI freeaddrinfo(LPADDRINFO pAddrInfo);
    251   WINSOCK_API_LINKAGE void WSAAPI FreeAddrInfoW(PADDRINFOW pAddrInfo);
    252 
    253 #define FreeAddrInfoA freeaddrinfo
    254 
    255 #if INCL_WINSOCK_API_TYPEDEFS
    256   typedef void (WSAAPI *LPFN_FREEADDRINFO)(struct addrinfo *ai);
    257   typedef void (WSAAPI *LPFN_FREEADDRINFOW)(PADDRINFOW pAddrInfo);
    258 
    259 #define LPFN_FREEADDRINFOA LPFN_FREEADDRINFO
    260 
    261 #define LPFN_FREEADDRINFOT __MINGW_NAME_AW(LPFN_FREEADDRINFO)
    262 #endif
    263 
    264   typedef int socklen_t;
    265 
    266 #define GetNameInfo __MINGW_NAME_AW(GetNameInfo)
    267 
    268   WINSOCK_API_LINKAGE int WSAAPI getnameinfo(const struct sockaddr *sa,socklen_t salen,char *host,DWORD hostlen,char *serv,DWORD servlen,int flags);
    269   WINSOCK_API_LINKAGE INT WSAAPI GetNameInfoW(const SOCKADDR *pSockaddr,socklen_t SockaddrLength,PWCHAR pNodeBuffer,DWORD NodeBufferSize,PWCHAR pServiceBuffer,DWORD ServiceBufferSize,INT Flags);
    270 
    271 #define GetNameInfoA getnameinfo
    272 
    273 #if INCL_WINSOCK_API_TYPEDEFS
    274   typedef int (WSAAPI *LPFN_GETNAMEINFO)(const struct sockaddr *sa,socklen_t salen,char *host,DWORD hostlen,char *serv,DWORD servlen,int flags);
    275   typedef INT (WSAAPI *LPFN_GETNAMEINFOW)(const SOCKADDR *pSockaddr,socklen_t SockaddrLength,PWCHAR pNodeBuffer,DWORD NodeBufferSize,PWCHAR pServiceBuffer,DWORD ServiceBufferSize,INT Flags);
    276 
    277 #define LPFN_GETNAMEINFOA LPFN_GETNAMEINFO
    278 
    279 #define LPFN_GETNAMEINFOT __MINGW_NAME_AW(LPFN_GETNAMEINFO)
    280 #endif
    281 
    282 #define gai_strerror __MINGW_NAME_AW(gai_strerror)
    283 
    284 #define GAI_STRERROR_BUFFER_SIZE 1024
    285 
    286 char *gai_strerrorA (int);
    287 WCHAR *gai_strerrorW(int);
    288 
    289 #define NI_MAXHOST 1025
    290 #define NI_MAXSERV 32
    291 
    292 #define INET_ADDRSTRLEN 22
    293 #define INET6_ADDRSTRLEN 65
    294 
    295 #define NI_NOFQDN 0x01
    296 #define NI_NUMERICHOST 0x02
    297 #define NI_NAMEREQD 0x04
    298 #define NI_NUMERICSERV 0x08
    299 #define NI_DGRAM 0x10
    300 
    301 #include <mstcpip.h>
    302 
    303 #if (_WIN32_WINNT >= 0x0600)
    304 #define addrinfoEx __MINGW_NAME_AW(addrinfoEx)
    305 #define PADDRINFOEX __MINGW_NAME_AW(PADDRINFOEX)
    306 #define GetAddrInfoEx __MINGW_NAME_AW(GetAddrInfoEx)
    307 #define SetAddrInfoEx __MINGW_NAME_AW(SetAddrInfoEx)
    308 #define FreeAddrInfoEx __MINGW_NAME_AW(FreeAddrInfoEx)
    309 
    310   typedef struct addrinfoExA {
    311     int                ai_flags;
    312     int                ai_family;
    313     int                ai_socktype;
    314     int                ai_protocol;
    315     size_t             ai_addrlen;
    316     LPCSTR             ai_canonname;
    317     struct sockaddr    *ai_addr;
    318     void               *ai_blob;
    319     size_t             ai_bloblen;
    320     LPGUID             ai_provider;
    321     struct addrinfoexA *ai_next;
    322   } ADDRINFOEXA, *PADDRINFOEXA;
    323 
    324   typedef struct addrinfoExW {
    325     int                ai_flags;
    326     int                ai_family;
    327     int                ai_socktype;
    328     int                ai_protocol;
    329     size_t             ai_addrlen;
    330     LPCWSTR            ai_canonname;
    331     struct sockaddr    *ai_addr;
    332     void               *ai_blob;
    333     size_t             ai_bloblen;
    334     LPGUID             ai_provider;
    335     struct addrinfoexW *ai_next;
    336   } ADDRINFOEXW, *PADDRINFOEXW;
    337 
    338 typedef PVOID LPLOOKUPSERVICE_COMPLETION_ROUTINE; /*reserved*/
    339 
    340 WINSOCK_API_LINKAGE int WSAAPI GetAddrInfoExA(PCSTR pName, PCSTR pServiceName, DWORD dwNameSpace,
    341 					      LPGUID lpNspId,const ADDRINFOEXA *pHints,PADDRINFOEXA *ppResult,
    342 					      PTIMEVAL timeout,LPOVERLAPPED lpOverlapped,
    343 					      LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine,
    344 					      LPHANDLE lpNameHandle);
    345 WINSOCK_API_LINKAGE int WSAAPI GetAddrInfoExW(PCWSTR pName,PCWSTR pServiceName,DWORD dwNameSpace,
    346 					      LPGUID lpNspId,const ADDRINFOEXW *pHints,PADDRINFOEXW *ppResult,
    347 					      PTIMEVAL timeout,LPOVERLAPPED lpOverlapped,
    348 					      LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine,
    349 					      LPHANDLE lpNameHandle);
    350 
    351 WINSOCK_API_LINKAGE int WSAAPI SetAddrInfoExA(PCSTR pName, PCSTR pServiceName, SOCKET_ADDRESS *pAddresses,
    352 					      DWORD dwAddressCount,LPBLOB lpBlob,DWORD dwFlags,DWORD dwNameSpace,
    353 					      LPGUID lpNspId,PTIMEVAL timeout,LPOVERLAPPED lpOverlapped,
    354 					      LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine,
    355 					      LPHANDLE lpNameHandle);
    356 WINSOCK_API_LINKAGE int WSAAPI SetAddrInfoExW(PCWSTR pName,PCWSTR pServiceName,SOCKET_ADDRESS *pAddresses,
    357 					      DWORD dwAddressCount,LPBLOB lpBlob,DWORD dwFlags,DWORD dwNameSpace,
    358 					      LPGUID lpNspId,PTIMEVAL timeout,LPOVERLAPPED lpOverlapped,
    359 					      LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine,
    360 					      LPHANDLE lpNameHandle);
    361 
    362 WINSOCK_API_LINKAGE void WSAAPI FreeAddrInfoExA(PADDRINFOEXA pAddrInfo);
    363 WINSOCK_API_LINKAGE void WSAAPI FreeAddrInfoExW(PADDRINFOEXW pAddrInfo);
    364 
    365 #if INCL_WINSOCK_API_TYPEDEFS
    366 #define LPFN_GETADDRINFOEX __MINGW_NAME_AW(LPFN_GETADDRINFOEX)
    367   typedef int (WSAAPI *LPFN_GETADDRINFOEXA)(PCSTR pName, PCSTR pServiceName, DWORD dwNameSpace,
    368 					    LPGUID lpNspId,const ADDRINFOEXA *pHints,PADDRINFOEXA *ppResult,
    369 					    PTIMEVAL timeout,LPOVERLAPPED lpOverlapped,
    370 					    LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine,
    371 					    LPHANDLE lpNameHandle);
    372   typedef int (WSAAPI *LPFN_GETADDRINFOEXW)(PCWSTR pName,PCWSTR pServiceName,DWORD dwNameSpace,
    373 					    LPGUID lpNspId,const ADDRINFOEXW *pHints,PADDRINFOEXW *ppResult,
    374 					    PTIMEVAL timeout,LPOVERLAPPED lpOverlapped,
    375 					    LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine,
    376 					    LPHANDLE lpNameHandle);
    377 
    378 #define LPFN_SETADDRINFOEX __MINGW_NAME_AW(LPFN_SETADDRINFOEX)
    379   typedef int (WSAAPI *LPFN_SETADDRINFOEXA)(PCSTR pName, PCSTR pServiceName, SOCKET_ADDRESS *pAddresses,
    380 					    DWORD dwAddressCount,LPBLOB lpBlob,DWORD dwFlags,DWORD dwNameSpace,
    381 					    LPGUID lpNspId,PTIMEVAL timeout,LPOVERLAPPED lpOverlapped,
    382 					    LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine,
    383 					    LPHANDLE lpNameHandle);
    384   typedef int (WSAAPI *LPFN_SETADDRINFOEXW)(PCWSTR pName,PCWSTR pServiceName,SOCKET_ADDRESS *pAddresses,
    385 					    DWORD dwAddressCount,LPBLOB lpBlob,DWORD dwFlags,DWORD dwNameSpace,
    386 					    LPGUID lpNspId,PTIMEVAL timeout,LPOVERLAPPED lpOverlapped,
    387 					    LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine,
    388 					    LPHANDLE lpNameHandle);
    389 
    390 #define LPFN_FREEADDRINFOEX __MINGW_NAME_AW(LPFN_FREEADDRINFOEX)
    391   typedef void (WSAAPI *LPFN_FREEADDRINFOEXA)(PADDRINFOEXA pAddrInfo);
    392   typedef void (WSAAPI *LPFN_FREEADDRINFOEXW)(PADDRINFOEXW pAddrInfo);
    393 #endif /* INCL_WINSOCK_API_TYPEDEFS */
    394 
    395 
    396 WINSOCK_API_LINKAGE int WSAAPI WSAImpersonateSocketPeer(
    397   SOCKET Socket,
    398   const struct sockaddr *PeerAddress,
    399   ULONG peerAddressLen
    400 );
    401 
    402 WINSOCK_API_LINKAGE int WSAAPI WSAQuerySocketSecurity(
    403   SOCKET Socket,
    404   const SOCKET_SECURITY_QUERY_TEMPLATE *SecurityQueryTemplate,
    405   ULONG SecurityQueryTemplateLen,
    406   SOCKET_SECURITY_QUERY_INFO *SecurityQueryInfo,
    407   ULONG *SecurityQueryInfoLen,
    408   LPWSAOVERLAPPED Overlapped,
    409   LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
    410 );
    411 
    412 WINSOCK_API_LINKAGE int WSAAPI WSARevertImpersonation(void);
    413 
    414 WINSOCK_API_LINKAGE int WSAAPI WSASetSocketPeerTargetName(
    415   SOCKET Socket,
    416   const SOCKET_PEER_TARGET_NAME *PeerTargetName,
    417   ULONG PeerTargetNameLen,
    418   LPWSAOVERLAPPED Overlapped,
    419   LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
    420 );
    421 
    422 WINSOCK_API_LINKAGE int WSAAPI WSASetSocketSecurity(
    423   SOCKET Socket,
    424   const SOCKET_SECURITY_SETTINGS *SecuritySettings,
    425   ULONG SecuritySettingsLen,
    426   LPWSAOVERLAPPED Overlapped,
    427   LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
    428 );
    429 
    430 #define InetNtopA inet_ntop
    431 
    432 WINSOCK_API_LINKAGE LPCWSTR WSAAPI InetNtopW(INT Family, PVOID pAddr, LPWSTR pStringBuf, size_t StringBufSIze);
    433 WINSOCK_API_LINKAGE LPCSTR WSAAPI InetNtopA(INT Family, PVOID pAddr, LPSTR pStringBuf, size_t StringBufSize);
    434 
    435 #define InetNtop __MINGW_NAME_AW(InetNtop)
    436 
    437 #define InetPtonA inet_pton
    438 
    439 WINSOCK_API_LINKAGE INT WSAAPI InetPtonW(INT Family, LPCWSTR pStringBuf, PVOID pAddr);
    440 WINSOCK_API_LINKAGE INT WSAAPI InetPtonA(INT Family, LPCSTR pStringBuf, PVOID pAddr);
    441 
    442 #define InetPton __MINGW_NAME_AW(InetPton)
    443 
    444 #endif /*(_WIN32_WINNT >= 0x0600)*/
    445 
    446 #ifdef __cplusplus
    447 }
    448 #endif
    449 
    450 #ifdef __LP64__
    451 #pragma pop_macro("u_long")
    452 #endif
    453 
    454 #endif /* _WS2TCPIP_H_ */
    455