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