Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenws2tcpip.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
1.7.6.1
|