ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ws2tcpip.h
Go to the documentation of this file.
00001 /*
00002  *  ws2tcpip.h : TCP/IP specific extensions in Windows Sockets 2
00003  *
00004  * Portions Copyright (c) 1980, 1983, 1988, 1993
00005  * The Regents of the University of California.  All rights reserved.
00006  *
00007  */
00008 
00009 #pragma once
00010 
00011 #define _WS2TCPIP_H
00012 
00013 #include <winsock2.h>
00014 #include <ws2ipdef.h>
00015 #include <limits.h>
00016 
00017 #ifdef __cplusplus
00018 extern "C" {
00019 #endif
00020 
00021 #define UDP_NOCHECKSUM 1
00022 #define UDP_CHECKSUM_COVERAGE 20
00023 
00024 #ifdef _MSC_VER
00025 #define WS2TCPIP_INLINE __inline
00026 #else
00027 #define WS2TCPIP_INLINE static inline
00028 #endif
00029 
00030 /* getaddrinfo error codes */
00031 #define EAI_AGAIN WSATRY_AGAIN
00032 #define EAI_BADFLAGS WSAEINVAL
00033 #define EAI_FAIL WSANO_RECOVERY
00034 #define EAI_FAMILY WSAEAFNOSUPPORT
00035 #define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY
00036 #define EAI_NODATA EAI_NONAME
00037 #define EAI_NOSECURENAME WSA_SECURE_HOST_NOT_FOUND
00038 #define EAI_NONAME WSAHOST_NOT_FOUND
00039 #define EAI_SERVICE WSATYPE_NOT_FOUND
00040 #define EAI_SOCKTYPE WSAESOCKTNOSUPPORT
00041 #define EAI_IPSECPOLICY WSA_IPSEC_NAME_POLICY_ERROR
00042 
00043 #ifdef UNICODE
00044 typedef ADDRINFOW ADDRINFOT,*PADDRINFOT;
00045 #else
00046 typedef ADDRINFOA ADDRINFOT,*PADDRINFOT;
00047 #endif
00048 
00049 typedef ADDRINFOA ADDRINFO, FAR *LPADDRINFO;
00050 
00051 #if (_WIN32_WINNT >= 0x0600)
00052 
00053 #ifdef UNICODE
00054 typedef ADDRINFOEXW ADDRINFOEX, *PADDRINFOEX;
00055 #else
00056 typedef ADDRINFOEXA ADDRINFOEX, *PADDRINFOEX;
00057 #endif
00058 
00059 #endif /* (_WIN32_WINNT >= 0x0600) */
00060 
00061 WINSOCK_API_LINKAGE
00062 INT
00063 WSAAPI
00064 getaddrinfo(
00065   IN PCSTR pNodeName OPTIONAL,
00066   IN PCSTR pServiceName OPTIONAL,
00067   IN const ADDRINFOA *pHints OPTIONAL,
00068   OUT PADDRINFOA *ppResult);
00069 
00070 #if (NTDDI_VERSION >= NTDDI_WINXPSP2) || (_WIN32_WINNT >= 0x0502)
00071 
00072 WINSOCK_API_LINKAGE
00073 INT
00074 WSAAPI
00075 GetAddrInfoW(
00076   IN PCWSTR pNodeName OPTIONAL,
00077   IN PCWSTR pServiceName OPTIONAL,
00078   IN const ADDRINFOW *pHints OPTIONAL,
00079   OUT PADDRINFOW *ppResult);
00080 
00081 #define GetAddrInfoA getaddrinfo
00082 
00083 #ifdef UNICODE
00084 #define GetAddrInfo GetAddrInfoW
00085 #else
00086 #define GetAddrInfo GetAddrInfoA
00087 #endif
00088 
00089 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) || (_WIN32_WINNT >= 0x0502) */
00090 
00091 #if INCL_WINSOCK_API_TYPEDEFS
00092 
00093 typedef INT
00094 (WSAAPI *LPFN_GETADDRINFO)(
00095   IN PCSTR pNodeName OPTIONAL,
00096   IN PCSTR pServiceName OPTIONAL,
00097   IN const ADDRINFOA *pHints OPTIONAL,
00098   OUT PADDRINFOA *ppResult);
00099 
00100 typedef INT
00101 (WSAAPI *LPFN_GETADDRINFOW)(
00102   IN PCWSTR pNodeName OPTIONAL,
00103   IN PCWSTR pServiceName OPTIONAL,
00104   IN const ADDRINFOW *pHints OPTIONAL,
00105   OUT PADDRINFOW *ppResult);
00106 
00107 #define LPFN_GETADDRINFOA LPFN_GETADDRINFO
00108 
00109 #ifdef UNICODE
00110 #define LPFN_GETADDRINFOT LPFN_GETADDRINFOW
00111 #else
00112 #define LPFN_GETADDRINFOT LPFN_GETADDRINFOA
00113 #endif
00114 
00115 #endif /* INCL_WINSOCK_API_TYPEDEFS */
00116 
00117 #if (_WIN32_WINNT >= 0x0600)
00118 
00119 typedef void
00120 (CALLBACK *LPLOOKUPSERVICE_COMPLETION_ROUTINE)(
00121   IN DWORD dwError,
00122   IN DWORD dwBytes,
00123   IN LPWSAOVERLAPPED lpOverlapped);
00124 
00125 WINSOCK_API_LINKAGE
00126 INT
00127 WSAAPI
00128 GetAddrInfoExA(
00129   IN PCSTR pName OPTIONAL,
00130   IN PCSTR pServiceName OPTIONAL,
00131   IN DWORD dwNameSpace,
00132   IN LPGUID lpNspId OPTIONAL,
00133   IN const ADDRINFOEXA *hints,
00134   OUT PADDRINFOEXA *ppResult,
00135   IN struct timeval *timeout OPTIONAL,
00136   IN LPOVERLAPPED lpOverlapped OPTIONAL,
00137   IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
00138   OUT LPHANDLE lpNameHandle OPTIONAL);
00139 
00140 WINSOCK_API_LINKAGE
00141 INT
00142 WSAAPI
00143 GetAddrInfoExW(
00144   IN PCWSTR pName OPTIONAL,
00145   IN PCWSTR pServiceName OPTIONAL,
00146   IN DWORD dwNameSpace,
00147   IN LPGUID lpNspId OPTIONAL,
00148   IN const ADDRINFOEXW *hints OPTIONAL,
00149   OUT PADDRINFOEXW *ppResult,
00150   IN struct timeval *timeout OPTIONAL,
00151   IN LPOVERLAPPED lpOverlapped OPTIONAL,
00152   IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
00153   OUT LPHANDLE lpHandle OPTIONAL);
00154 
00155 #ifdef UNICODE
00156 #define GetAddrInfoEx GetAddrInfoExW
00157 #else
00158 #define GetAddrInfoEx GetAddrInfoExA
00159 #endif
00160 
00161 #if INCL_WINSOCK_API_TYPEDEFS
00162 
00163 typedef INT
00164 (WSAAPI *LPFN_GETADDRINFOEXA)(
00165   IN PCSTR pName,
00166   IN PCSTR pServiceName OPTIONAL,
00167   IN DWORD dwNameSpace,
00168   IN LPGUID lpNspId OPTIONAL,
00169   IN const ADDRINFOEXA *hints OPTIONAL,
00170   OUT PADDRINFOEXA *ppResult,
00171   IN struct timeval *timeout OPTIONAL,
00172   IN LPOVERLAPPED lpOverlapped OPTIONAL,
00173   IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
00174   OUT LPHANDLE lpNameHandle OPTIONAL);
00175 
00176 typedef INT
00177 (WSAAPI *LPFN_GETADDRINFOEXW)(
00178   IN PCWSTR pName,
00179   IN PCWSTR pServiceName OPTIONAL,
00180   IN DWORD dwNameSpace,
00181   IN LPGUID lpNspId OPTIONAL,
00182   IN const ADDRINFOEXW *hints OPTIONAL,
00183   OUT PADDRINFOEXW *ppResult,
00184   IN struct timeval *timeout OPTIONAL,
00185   IN LPOVERLAPPED lpOverlapped OPTIONAL,
00186   IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
00187   OUT LPHANDLE lpHandle OPTIONAL);
00188 
00189 #ifdef UNICODE
00190 #define LPFN_GETADDRINFOEX LPFN_GETADDRINFOEXW
00191 #else
00192 #define LPFN_GETADDRINFOEX LPFN_GETADDRINFOEXA
00193 #endif
00194 #endif
00195 
00196 #endif
00197 
00198 #if (_WIN32_WINNT >= 0x0600)
00199 
00200 WINSOCK_API_LINKAGE
00201 INT
00202 WSAAPI
00203 SetAddrInfoExA(
00204   IN PCSTR pName,
00205   IN PCSTR pServiceName OPTIONAL,
00206   IN SOCKET_ADDRESS *pAddresses OPTIONAL,
00207   IN DWORD dwAddressCount,
00208   IN LPBLOB lpBlob OPTIONAL,
00209   IN DWORD dwFlags,
00210   IN DWORD dwNameSpace,
00211   IN LPGUID lpNspId OPTIONAL,
00212   IN struct timeval *timeout OPTIONAL,
00213   IN LPOVERLAPPED lpOverlapped OPTIONAL,
00214   IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
00215   OUT LPHANDLE lpNameHandle OPTIONAL);
00216 
00217 WINSOCK_API_LINKAGE
00218 INT
00219 WSAAPI
00220 SetAddrInfoExW(
00221   IN PCWSTR pName,
00222   IN PCWSTR pServiceName OPTIONAL,
00223   IN SOCKET_ADDRESS *pAddresses OPTIONAL,
00224   IN DWORD dwAddressCount,
00225   IN LPBLOB lpBlob OPTIONAL,
00226   IN DWORD dwFlags,
00227   IN DWORD dwNameSpace,
00228   IN LPGUID lpNspId OPTIONAL,
00229   IN struct timeval *timeout OPTIONAL,
00230   IN LPOVERLAPPED lpOverlapped OPTIONAL,
00231   IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
00232   OUT LPHANDLE lpNameHandle OPTIONAL);
00233 
00234 #ifdef UNICODE
00235 #define SetAddrInfoEx SetAddrInfoExW
00236 #else
00237 #define SetAddrInfoEx SetAddrInfoExA
00238 #endif
00239 
00240 #if INCL_WINSOCK_API_TYPEDEFS
00241 
00242 typedef INT
00243 (WSAAPI *LPFN_SETADDRINFOEXA)(
00244   IN PCSTR pName,
00245   IN PCSTR pServiceName OPTIONAL,
00246   IN SOCKET_ADDRESS *pAddresses OPTIONAL,
00247   IN DWORD dwAddressCount,
00248   IN LPBLOB lpBlob OPTIONAL,
00249   IN DWORD dwFlags,
00250   IN DWORD dwNameSpace,
00251   IN LPGUID lpNspId OPTIONAL,
00252   IN struct timeval *timeout OPTIONAL,
00253   IN LPOVERLAPPED lpOverlapped OPTIONAL,
00254   IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
00255   OUT LPHANDLE lpNameHandle OPTIONAL);
00256 
00257 typedef INT
00258 (WSAAPI *LPFN_SETADDRINFOEXW)(
00259   IN PCWSTR pName,
00260   IN PCWSTR pServiceName OPTIONAL,
00261   IN SOCKET_ADDRESS *pAddresses OPTIONAL,
00262   IN DWORD dwAddressCount,
00263   IN LPBLOB lpBlob OPTIONAL,
00264   IN DWORD dwFlags,
00265   IN DWORD dwNameSpace,
00266   IN LPGUID lpNspId OPTIONAL,
00267   IN struct timeval *timeout OPTIONAL,
00268   IN LPOVERLAPPED lpOverlapped OPTIONAL,
00269   IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
00270   OUT LPHANDLE lpNameHandle OPTIONAL);
00271 
00272 #ifdef UNICODE
00273 #define LPFN_SETADDRINFOEX LPFN_SETADDRINFOEXW
00274 #else
00275 #define LPFN_SETADDRINFOEX LPFN_SETADDRINFOEXA
00276 #endif
00277 #endif
00278 
00279 #endif
00280 
00281 WINSOCK_API_LINKAGE
00282 VOID
00283 WSAAPI
00284 freeaddrinfo(
00285   IN PADDRINFOA pAddrInfo OPTIONAL);
00286 
00287 #if (NTDDI_VERSION >= NTDDI_WINXPSP2) || (_WIN32_WINNT >= 0x0502)
00288 
00289 WINSOCK_API_LINKAGE
00290 VOID
00291 WSAAPI
00292 FreeAddrInfoW(
00293   IN PADDRINFOW pAddrInfo OPTIONAL);
00294 
00295 #define FreeAddrInfoA freeaddrinfo
00296 
00297 #ifdef UNICODE
00298 #define FreeAddrInfo FreeAddrInfoW
00299 #else
00300 #define FreeAddrInfo FreeAddrInfoA
00301 #endif
00302 #endif
00303 
00304 #if INCL_WINSOCK_API_TYPEDEFS
00305 
00306 typedef VOID
00307 (WSAAPI *LPFN_FREEADDRINFO)(
00308   IN PADDRINFOA pAddrInfo OPTIONAL);
00309 
00310 typedef VOID
00311 (WSAAPI *LPFN_FREEADDRINFOW)(
00312   IN PADDRINFOW pAddrInfo OPTIONAL);
00313 
00314 #define LPFN_FREEADDRINFOA LPFN_FREEADDRINFO
00315 
00316 #ifdef UNICODE
00317 #define LPFN_FREEADDRINFOT LPFN_FREEADDRINFOW
00318 #else
00319 #define LPFN_FREEADDRINFOT LPFN_FREEADDRINFOA
00320 #endif
00321 
00322 #endif
00323 
00324 #if (_WIN32_WINNT >= 0x0600)
00325 
00326 WINSOCK_API_LINKAGE
00327 void
00328 WSAAPI
00329 FreeAddrInfoEx(
00330   IN PADDRINFOEXA pAddrInfoEx OPTIONAL);
00331 
00332 WINSOCK_API_LINKAGE
00333 void
00334 WSAAPI
00335 FreeAddrInfoExW(
00336   IN PADDRINFOEXW pAddrInfoEx OPTIONAL);
00337 
00338 #define FreeAddrInfoExA FreeAddrInfoEx
00339 
00340 #ifdef UNICODE
00341 #define FreeAddrInfoEx FreeAddrInfoExW
00342 #endif
00343 
00344 #ifdef INCL_WINSOCK_API_TYPEDEFS
00345 
00346 typedef void
00347 (WSAAPI *LPFN_FREEADDRINFOEXA)(
00348   IN PADDRINFOEXA pAddrInfoEx);
00349 
00350 typedef void
00351 (WSAAPI *LPFN_FREEADDRINFOEXW)(
00352   IN PADDRINFOEXW pAddrInfoEx);
00353 
00354 
00355 #ifdef UNICODE
00356 #define LPFN_FREEADDRINFOEX LPFN_FREEADDRINFOEXW
00357 #else
00358 #define LPFN_FREEADDRINFOEX LPFN_FREEADDRINFOEXA
00359 #endif
00360 
00361 #endif
00362 #endif
00363 
00364 typedef int socklen_t;
00365 
00366 WINSOCK_API_LINKAGE
00367 INT
00368 WSAAPI
00369 getnameinfo(
00370   IN const SOCKADDR *pSockaddr,
00371   IN socklen_t SockaddrLength,
00372   OUT PCHAR pNodeBuffer OPTIONAL,
00373   IN DWORD NodeBufferSize,
00374   OUT PCHAR pServiceBuffer,
00375   IN DWORD ServiceBufferSize,
00376   IN INT Flags);
00377 
00378 #if (NTDDI_VERSION >= NTDDI_WINXPSP2) || (_WIN32_WINNT >= 0x0502)
00379 
00380 WINSOCK_API_LINKAGE
00381 INT
00382 WSAAPI
00383 GetNameInfoW(
00384   IN const SOCKADDR *pSockaddr,
00385   IN socklen_t SockaddrLength,
00386   OUT PWCHAR pNodeBuffer,
00387   IN DWORD NodeBufferSize,
00388   OUT PWCHAR pServiceBuffer OPTIONAL,
00389   IN DWORD ServiceBufferSize,
00390   IN INT Flags);
00391 
00392 #define GetNameInfoA getnameinfo
00393 
00394 #ifdef UNICODE
00395 #define GetNameInfo GetNameInfoW
00396 #else
00397 #define GetNameInfo GetNameInfoA
00398 #endif
00399 
00400 #endif
00401 
00402 #if INCL_WINSOCK_API_TYPEDEFS
00403 
00404 typedef int
00405 (WSAAPI *LPFN_GETNAMEINFO)(
00406   IN const SOCKADDR *pSockaddr,
00407   IN socklen_t SockaddrLength,
00408   OUT PCHAR pNodeBuffer,
00409   IN DWORD NodeBufferSize,
00410   OUT PCHAR pServiceBuffer OPTIONAL,
00411   IN DWORD ServiceBufferSize,
00412   IN INT Flags);
00413 
00414 typedef INT
00415 (WSAAPI *LPFN_GETNAMEINFOW)(
00416   IN const SOCKADDR *pSockaddr,
00417   IN socklen_t SockaddrLength,
00418   OUT PWCHAR pNodeBuffer,
00419   IN DWORD NodeBufferSize,
00420   OUT PWCHAR pServiceBuffer OPTIONAL,
00421   IN DWORD ServiceBufferSize,
00422   IN INT Flags);
00423 
00424 #define LPFN_GETNAMEINFOA LPFN_GETNAMEINFO
00425 
00426 #ifdef UNICODE
00427 #define LPFN_GETNAMEINFOT LPFN_GETNAMEINFOW
00428 #else
00429 #define LPFN_GETNAMEINFOT LPFN_GETNAMEINFOA
00430 #endif
00431 #endif
00432 
00433 #if (NTDDI_VERSION >= NTDDI_VISTA)
00434 
00435 WINSOCK_API_LINKAGE
00436 INT
00437 WSAAPI
00438 inet_pton(
00439   IN INT Family,
00440   IN PCSTR pszAddrString,
00441   OUT PVOID pAddrBuf);
00442 
00443 INT
00444 WSAAPI
00445 InetPtonW(
00446   IN INT Family,
00447   IN PCWSTR pszAddrString,
00448   OUT PVOID pAddrBuf);
00449 
00450 PCSTR
00451 WSAAPI
00452 inet_ntop(
00453   IN INT Family,
00454   IN PVOID pAddr,
00455   OUT PSTR pStringBuf,
00456   IN size_t StringBufSize);
00457 
00458 PCWSTR
00459 WSAAPI
00460 InetNtopW(
00461   IN INT Family,
00462   IN PVOID pAddr,
00463   OUT PWSTR pStringBuf,
00464   IN size_t StringBufSize);
00465 
00466 #define InetPtonA inet_pton
00467 #define InetNtopA inet_ntop
00468 
00469 #ifdef UNICODE
00470 #define InetPton InetPtonW
00471 #define InetNtop InetNtopW
00472 #else
00473 #define InetPton InetPtonA
00474 #define InetNtop InetNtopA
00475 #endif
00476 
00477 #if INCL_WINSOCK_API_TYPEDEFS
00478 
00479 typedef INT
00480 (WSAAPI *LPFN_INET_PTONA)(
00481   IN INT Family,
00482   IN PCSTR pszAddrString,
00483   OUT PVOID pAddrBuf);
00484 
00485 typedef INT
00486 (WSAAPI *LPFN_INET_PTONW)(
00487   IN INT Family,
00488   IN PCWSTR pszAddrString,
00489   OUT PVOID pAddrBuf);
00490 
00491 typedef PCSTR
00492 (WSAAPI *LPFN_INET_NTOPA)(
00493   IN INT Family,
00494   IN PVOID pAddr,
00495   OUT PSTR pStringBuf,
00496   IN size_t StringBufSize);
00497 
00498 typedef PCWSTR
00499 (WSAAPI *LPFN_INET_NTOPW)(
00500   IN INT Family,
00501   IN PVOID pAddr,
00502   OUT PWSTR pStringBuf,
00503   IN size_t StringBufSize);
00504 
00505 #ifdef UNICODE
00506 #define LPFN_INET_PTON LPFN_INET_PTONW
00507 #define LPFN_INET_NTOP LPFN_INET_NTOPW
00508 #else
00509 #define LPFN_INET_PTON LPFN_INET_PTONA
00510 #define LPFN_INET_NTOP LPFN_INET_NTOPA
00511 #endif
00512 
00513 #endif /* TYPEDEFS */
00514 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
00515 
00516 #if INCL_WINSOCK_API_PROTOTYPES
00517 
00518 #ifdef UNICODE
00519 #define gai_strerror gai_strerrorW
00520 #else
00521 #define gai_strerror gai_strerrorA
00522 #endif
00523 
00524 #define GAI_STRERROR_BUFFER_SIZE 1024
00525 
00526 static __inline
00527 char *
00528 gai_strerrorA(
00529   IN int ecode)
00530 {
00531   static char buff[GAI_STRERROR_BUFFER_SIZE + 1];
00532 
00533   FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM
00534                            |FORMAT_MESSAGE_IGNORE_INSERTS
00535                            |FORMAT_MESSAGE_MAX_WIDTH_MASK,
00536                             NULL,
00537                             ecode,
00538                             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
00539                             (LPSTR)buff,
00540                             GAI_STRERROR_BUFFER_SIZE,
00541                             NULL);
00542 
00543   return buff;
00544 }
00545 
00546 static __inline
00547 WCHAR *
00548 gai_strerrorW(
00549   IN int ecode)
00550 {
00551   static WCHAR buff[GAI_STRERROR_BUFFER_SIZE + 1];
00552 
00553   FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
00554                            |FORMAT_MESSAGE_IGNORE_INSERTS
00555                            |FORMAT_MESSAGE_MAX_WIDTH_MASK,
00556                             NULL,
00557                             ecode,
00558                             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
00559                             (LPWSTR)buff,
00560                             GAI_STRERROR_BUFFER_SIZE,
00561                             NULL);
00562 
00563   return buff;
00564 }
00565 
00566 #endif /* INCL_WINSOCK_API_PROTOTYPES */
00567 
00568 WS2TCPIP_INLINE
00569 int
00570 setipv4sourcefilter(
00571   IN SOCKET Socket,
00572   IN IN_ADDR Interface,
00573   IN IN_ADDR Group,
00574   IN MULTICAST_MODE_TYPE FilterMode,
00575   IN ULONG SourceCount,
00576   IN CONST IN_ADDR *SourceList)
00577 {
00578   int Error;
00579   DWORD Size, Returned;
00580   PIP_MSFILTER Filter;
00581 
00582   if (SourceCount >
00583     (((ULONG) (ULONG_MAX - sizeof(*Filter))) / sizeof(*SourceList))) {
00584     WSASetLastError(WSAENOBUFS);
00585     return SOCKET_ERROR;
00586   }
00587 
00588   Size = IP_MSFILTER_SIZE(SourceCount);
00589   Filter = (PIP_MSFILTER) HeapAlloc(GetProcessHeap(), 0, Size);
00590   if (Filter == NULL) {
00591     WSASetLastError(WSAENOBUFS);
00592     return SOCKET_ERROR;
00593   }
00594 
00595   Filter->imsf_multiaddr = Group;
00596   Filter->imsf_interface = Interface;
00597   Filter->imsf_fmode = FilterMode;
00598   Filter->imsf_numsrc = SourceCount;
00599   if (SourceCount > 0) {
00600     CopyMemory(Filter->imsf_slist, SourceList,
00601                SourceCount * sizeof(*SourceList));
00602   }
00603 
00604   Error = WSAIoctl(Socket, SIOCSIPMSFILTER, Filter, Size, NULL, 0,
00605                    &Returned, NULL, NULL);
00606 
00607   HeapFree(GetProcessHeap(), 0, Filter);
00608 
00609   return Error;
00610 }
00611 
00612 WS2TCPIP_INLINE
00613 int
00614 getipv4sourcefilter(
00615   IN SOCKET Socket,
00616   IN IN_ADDR Interface,
00617   IN IN_ADDR Group,
00618   OUT MULTICAST_MODE_TYPE *FilterMode,
00619   IN OUT ULONG *SourceCount,
00620   OUT IN_ADDR *SourceList)
00621 {
00622   int Error;
00623   DWORD Size, Returned;
00624   PIP_MSFILTER Filter;
00625 
00626   if (*SourceCount >
00627       (((ULONG) (ULONG_MAX - sizeof(*Filter))) / sizeof(*SourceList))) {
00628     WSASetLastError(WSAENOBUFS);
00629     return SOCKET_ERROR;
00630   }
00631 
00632   Size = IP_MSFILTER_SIZE(*SourceCount);
00633   Filter = (PIP_MSFILTER) HeapAlloc(GetProcessHeap(), 0, Size);
00634   if (Filter == NULL) {
00635     WSASetLastError(WSAENOBUFS);
00636     return SOCKET_ERROR;
00637   }
00638 
00639   Filter->imsf_multiaddr = Group;
00640   Filter->imsf_interface = Interface;
00641   Filter->imsf_numsrc = *SourceCount;
00642 
00643   Error = WSAIoctl(Socket, SIOCGIPMSFILTER, Filter, Size, Filter, Size,
00644                    &Returned, NULL, NULL);
00645 
00646   if (Error == 0) {
00647     if (*SourceCount > 0) {
00648         CopyMemory(SourceList, Filter->imsf_slist,
00649                    *SourceCount * sizeof(*SourceList));
00650         *SourceCount = Filter->imsf_numsrc;
00651     }
00652     *FilterMode = Filter->imsf_fmode;
00653   }
00654 
00655   HeapFree(GetProcessHeap(), 0, Filter);
00656 
00657   return Error;
00658 }
00659 
00660 #if (NTDDI_VERSION >= NTDDI_WINXP)
00661 
00662 WS2TCPIP_INLINE
00663 int
00664 setsourcefilter(
00665   IN SOCKET Socket,
00666   IN ULONG Interface,
00667   IN CONST SOCKADDR *Group,
00668   IN int GroupLength,
00669   IN MULTICAST_MODE_TYPE FilterMode,
00670   IN ULONG SourceCount,
00671   IN CONST SOCKADDR_STORAGE *SourceList)
00672 {
00673   int Error;
00674   DWORD Size, Returned;
00675   PGROUP_FILTER Filter;
00676 
00677   if (SourceCount >= (((ULONG) (ULONG_MAX - sizeof(*Filter))) / sizeof(*SourceList))) {
00678     WSASetLastError(WSAENOBUFS);
00679     return SOCKET_ERROR;
00680   }
00681 
00682   Size = GROUP_FILTER_SIZE(SourceCount);
00683   Filter = (PGROUP_FILTER) HeapAlloc(GetProcessHeap(), 0, Size);
00684   if (Filter == NULL) {
00685     WSASetLastError(WSAENOBUFS);
00686     return SOCKET_ERROR;
00687   }
00688 
00689   Filter->gf_interface = Interface;
00690   ZeroMemory(&Filter->gf_group, sizeof(Filter->gf_group));
00691   CopyMemory(&Filter->gf_group, Group, GroupLength);
00692   Filter->gf_fmode = FilterMode;
00693   Filter->gf_numsrc = SourceCount;
00694   if (SourceCount > 0) {
00695     CopyMemory(Filter->gf_slist, SourceList, SourceCount * sizeof(*SourceList));
00696   }
00697 
00698   Error = WSAIoctl(Socket, SIOCSMSFILTER, Filter, Size, NULL, 0, &Returned, NULL, NULL);
00699   HeapFree(GetProcessHeap(), 0, Filter);
00700 
00701   return Error;
00702 }
00703 
00704 WS2TCPIP_INLINE
00705 int
00706 getsourcefilter(
00707   IN SOCKET Socket,
00708   IN ULONG Interface,
00709   IN CONST SOCKADDR *Group,
00710   IN int GroupLength,
00711   OUT MULTICAST_MODE_TYPE *FilterMode,
00712   IN OUT ULONG *SourceCount,
00713   OUT SOCKADDR_STORAGE *SourceList)
00714 {
00715   int Error;
00716   DWORD Size, Returned;
00717   PGROUP_FILTER Filter;
00718 
00719   if (*SourceCount > (((ULONG) (ULONG_MAX - sizeof(*Filter))) / sizeof(*SourceList))) {
00720     WSASetLastError(WSAENOBUFS);
00721     return SOCKET_ERROR;
00722   }
00723 
00724   Size = GROUP_FILTER_SIZE(*SourceCount);
00725   Filter = (PGROUP_FILTER) HeapAlloc(GetProcessHeap(), 0, Size);
00726   if (Filter == NULL) {
00727     WSASetLastError(WSAENOBUFS);
00728     return SOCKET_ERROR;
00729   }
00730 
00731   Filter->gf_interface = Interface;
00732   ZeroMemory(&Filter->gf_group, sizeof(Filter->gf_group));
00733   CopyMemory(&Filter->gf_group, Group, GroupLength);
00734   Filter->gf_numsrc = *SourceCount;
00735 
00736   Error = WSAIoctl(Socket, SIOCGMSFILTER, Filter, Size, Filter, Size, &Returned, NULL, NULL);
00737   if (Error == 0) {
00738     if (*SourceCount > 0) {
00739       CopyMemory(SourceList, Filter->gf_slist, *SourceCount * sizeof(*SourceList));
00740       *SourceCount = Filter->gf_numsrc;
00741     }
00742     *FilterMode = Filter->gf_fmode;
00743   }
00744 
00745   HeapFree(GetProcessHeap(), 0, Filter);
00746 
00747   return Error;
00748 }
00749 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
00750 
00751 #ifdef IDEAL_SEND_BACKLOG_IOCTLS
00752 
00753 WS2TCPIP_INLINE
00754 int
00755 idealsendbacklogquery(
00756   IN SOCKET s,
00757   OUT ULONG *pISB)
00758 {
00759   DWORD bytes;
00760 
00761   return WSAIoctl(s, SIO_IDEAL_SEND_BACKLOG_QUERY, 
00762                   NULL, 0, pISB, sizeof(*pISB), &bytes, NULL, NULL);
00763 }
00764 
00765 WS2TCPIP_INLINE
00766 int
00767 idealsendbacklognotify(
00768   IN SOCKET s,
00769   IN LPWSAOVERLAPPED lpOverlapped OPTIONAL,
00770   IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL)
00771 {
00772   DWORD bytes;
00773 
00774   return WSAIoctl(s, SIO_IDEAL_SEND_BACKLOG_CHANGE, 
00775                   NULL, 0, NULL, 0, &bytes, 
00776                   lpOverlapped, lpCompletionRoutine);
00777 }
00778 
00779 #endif /* IDEAL_SEND_BACKLOG_IOCTLS */
00780 
00781 #if (_WIN32_WINNT >= 0x0600)
00782 
00783 #ifdef _SECURE_SOCKET_TYPES_DEFINED_
00784 
00785 WINSOCK_API_LINKAGE
00786 INT
00787 WSAAPI
00788 WSASetSocketSecurity(
00789   IN SOCKET Socket,
00790   IN const SOCKET_SECURITY_SETTINGS *SecuritySettings OPTIONAL,
00791   IN ULONG SecuritySettingsLen,
00792   IN LPWSAOVERLAPPED Overlapped OPTIONAL,
00793   IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL);
00794 
00795 WINSOCK_API_LINKAGE
00796 INT
00797 WSAAPI
00798 WSAQuerySocketSecurity(
00799   IN SOCKET Socket,
00800   IN const SOCKET_SECURITY_QUERY_TEMPLATE *SecurityQueryTemplate OPTIONAL,
00801   IN ULONG SecurityQueryTemplateLen,
00802   OUT SOCKET_SECURITY_QUERY_INFO* SecurityQueryInfo OPTIONAL,
00803   IN OUT ULONG *SecurityQueryInfoLen,
00804   IN LPWSAOVERLAPPED Overlapped OPTIONAL,
00805   IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL);
00806 
00807 WINSOCK_API_LINKAGE
00808 INT
00809 WSAAPI
00810 WSASetSocketPeerTargetName(
00811   IN SOCKET Socket,
00812   IN const SOCKET_PEER_TARGET_NAME *PeerTargetName,
00813   IN ULONG PeerTargetNameLen,
00814   IN LPWSAOVERLAPPED Overlapped OPTIONAL,
00815   IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL);
00816 
00817 WINSOCK_API_LINKAGE
00818 INT
00819 WSAAPI
00820 WSADeleteSocketPeerTargetName(
00821   IN SOCKET Socket,
00822   IN const struct sockaddr *PeerAddr,
00823   IN ULONG PeerAddrLen,
00824   IN LPWSAOVERLAPPED Overlapped OPTIONAL,
00825   IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL);
00826 
00827 WINSOCK_API_LINKAGE
00828 INT
00829 WSAAPI
00830 WSAImpersonateSocketPeer(
00831   IN SOCKET Socket,
00832   IN const struct sockaddr *PeerAddr OPTIONAL,
00833   IN ULONG PeerAddrLen);
00834 
00835 WINSOCK_API_LINKAGE
00836 INT
00837 WSAAPI
00838 WSARevertImpersonation(VOID);
00839 
00840 #endif /* _SECURE_SOCKET_TYPES_DEFINED_ */
00841 #endif /* (_WIN32_WINNT >= 0x0600) */
00842 
00843 #if !defined(_WIN32_WINNT) || (_WIN32_WINNT <= 0x0500)
00844 #include <wspiapi.h>
00845 #endif
00846 
00847 #ifdef __cplusplus
00848 }
00849 #endif

Generated on Fri May 25 2012 04:31:27 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.