8 #define MSTCPIP_ASSERT_UNDEFINED
9 #define ASSERT(exp) ((VOID) 0)
13 #define MSTCPIP_INLINE __inline
15 #define MSTCPIP_INLINE static inline
20 struct tcp_keepalive
{
23 ULONG keepaliveinterval
;
26 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
27 #define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2)
28 #define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3)
29 #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)
30 #define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5)
31 #define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6)
32 #define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7)
33 #define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8)
34 #define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9)
35 #define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10)
36 #define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11)
37 #define SIO_RCVALL_MCAST_IF _WSAIOW(IOC_VENDOR,13)
38 #define SIO_RCVALL_IF _WSAIOW(IOC_VENDOR,14)
43 RCVALL_SOCKETLEVELONLY
= 2,
45 } RCVALL_VALUE
, *PRCVALL_VALUE
;
47 #define RCVALL_MAX RCVALL_IPLEVEL
52 } RCVALL_IF
, *PRCVALL_IF
;
54 #if (NTDDI_VERSION >= NTDDI_WIN7)
55 DEFINE_GUID(SOCKET_DEFAULT2_QM_POLICY
, 0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47);
58 #define SIO_ACQUIRE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 100)
59 #define SIO_RELEASE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 101)
60 #define SIO_ASSOCIATE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 102)
62 typedef struct _INET_PORT_RANGE
{
65 } INET_PORT_RANGE
, *PINET_PORT_RANGE
;
66 typedef struct _INET_PORT_RANGE INET_PORT_RESERVATION
, *PINET_PORT_RESERVATION
;
70 } INET_PORT_RESERVATION_TOKEN
, *PINET_PORT_RESERVATION_TOKEN
;
72 #define INVALID_PORT_RESERVATION_TOKEN ((ULONG64)0)
76 INET_PORT_RESERVATION Reservation
;
77 INET_PORT_RESERVATION_TOKEN Token
;
79 INET_PORT_RESERVATION
;
80 INET_PORT_RESERVATION_TOKEN
;
82 } INET_PORT_RESERVATION_INSTANCE
, *PINET_PORT_RESERVATION_INSTANCE
;
85 ULONG AssignmentCount
;
87 } INET_PORT_RESERVATION_INFORMATION
, *PINET_PORT_RESERVATION_INFORMATION
;
91 #if (NTDDI_VERSION >= NTDDI_VISTA)
93 #define _SECURE_SOCKET_TYPES_DEFINED_
95 #define SIO_SET_SECURITY _WSAIOW(IOC_VENDOR, 200)
96 #define SIO_QUERY_SECURITY _WSAIORW(IOC_VENDOR, 201)
97 #define SIO_SET_PEER_TARGET_NAME _WSAIOW(IOC_VENDOR, 202)
98 #define SIO_DELETE_PEER_TARGET_NAME _WSAIOW(IOC_VENDOR, 203)
100 #define SIO_SOCKET_USAGE_NOTIFICATION _WSAIOW(IOC_VENDOR, 204)
102 typedef enum _SOCKET_USAGE_TYPE
{
103 SYSTEM_CRITICAL_SOCKET
= 1
106 typedef enum _SOCKET_SECURITY_PROTOCOL
{
107 SOCKET_SECURITY_PROTOCOL_DEFAULT
,
108 SOCKET_SECURITY_PROTOCOL_IPSEC
,
109 #if (NTDDI_VERSION >= NTDDI_WIN7)
110 SOCKET_SECURITY_PROTOCOL_IPSEC2
,
112 SOCKET_SECURITY_PROTOCOL_INVALID
113 } SOCKET_SECURITY_PROTOCOL
;
115 #define SOCKET_SETTINGS_GUARANTEE_ENCRYPTION 0x1
116 #define SOCKET_SETTINGS_ALLOW_INSECURE 0x2
118 typedef struct _SOCKET_SECURITY_SETTINGS
{
119 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
121 } SOCKET_SECURITY_SETTINGS
;
123 #define SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION 0x1
125 #if (NTDDI_VERSION >= NTDDI_WIN7)
127 #define SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION 0x2
128 #define SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED 0x4
129 #define SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT 0x8
131 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
133 typedef struct _SOCKET_SECURITY_SETTINGS_IPSEC
{
134 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
137 GUID AuthipMMPolicyKey
;
138 GUID AuthipQMPolicyKey
;
141 ULONG UserNameStringLen
;
142 ULONG DomainNameStringLen
;
143 ULONG PasswordStringLen
;
144 wchar_t AllStrings
[0];
145 } SOCKET_SECURITY_SETTINGS_IPSEC
;
147 typedef struct _SOCKET_PEER_TARGET_NAME
{
148 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
149 SOCKADDR_STORAGE PeerAddress
;
150 ULONG PeerTargetNameStringLen
;
151 wchar_t AllStrings
[0];
152 } SOCKET_PEER_TARGET_NAME
;
154 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE
{
155 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
156 SOCKADDR_STORAGE PeerAddress
;
157 ULONG PeerTokenAccessMask
;
158 } SOCKET_SECURITY_QUERY_TEMPLATE
;
160 #if (NTDDI_VERSION >= NTDDI_WIN7)
162 #define SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE 0x1
164 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID 0x1
165 #define SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID 0x2
167 typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2
{
168 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
169 SOCKADDR_STORAGE PeerAddress
;
170 ULONG PeerTokenAccessMask
;
173 } SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2
;
175 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
177 #define SOCKET_INFO_CONNECTION_SECURED 0x1
178 #define SOCKET_INFO_CONNECTION_ENCRYPTED 0x2
179 #define SOCKET_INFO_CONNECTION_IMPERSONATED 0x4
181 typedef struct _SOCKET_SECURITY_QUERY_INFO
{
182 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
184 UINT64 PeerApplicationAccessTokenHandle
;
185 UINT64 PeerMachineAccessTokenHandle
;
186 } SOCKET_SECURITY_QUERY_INFO
;
188 #if (NTDDI_VERSION >= NTDDI_WIN7)
189 typedef struct _SOCKET_SECURITY_QUERY_INFO_IPSEC2
{
190 SOCKET_SECURITY_PROTOCOL SecurityProtocol
;
192 UINT64 PeerApplicationAccessTokenHandle
;
193 UINT64 PeerMachineAccessTokenHandle
;
196 UINT32 NegotiationWinerr
;
197 GUID SaLookupContext
;
198 } SOCKET_SECURITY_QUERY_INFO_IPSEC2
;
201 #define SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE _WSAIOR(IOC_VENDOR, 205)
202 #define SIO_QUERY_RSS_SCALABILITY_INFO _WSAIOR(IOC_VENDOR, 210)
204 typedef struct _RSS_SCALABILITY_INFO
{
206 } RSS_SCALABILITY_INFO
, *PRSS_SCALABILITY_INFO
;
208 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
210 #define IN4_CLASSA(i) (((LONG)(i) & 0x00000080) == 0)
211 #define IN4_CLASSB(i) (((LONG)(i) & 0x000000c0) == 0x00000080)
212 #define IN4_CLASSC(i) (((LONG)(i) & 0x000000e0) == 0x000000c0)
213 #define IN4_CLASSD(i) (((LONG)(i) & 0x000000f0) == 0x000000e0)
214 #define IN4_MULTICAST(i) IN4_CLASSD(i)
216 #define IN4ADDR_ANY INADDR_ANY
217 #define IN4ADDR_LOOPBACK 0x0100007f
218 #define IN4ADDR_BROADCAST INADDR_BROADCAST
219 #define IN4ADDR_NONE INADDR_NONE
220 #define IN4ADDR_ANY_INIT { 0 }
221 #define IN4ADDR_LOOPBACK_INIT { 0x7f, 0, 0, 1 }
222 #define IN4ADDR_BROADCAST_INIT { 0xff, 0xff, 0xff, 0xff }
223 #define IN4ADDR_ALLNODESONLINK_INIT { 0xe0, 0, 0, 1 }
224 #define IN4ADDR_ALLROUTERSONLINK_INIT { 0xe0, 0, 0, 2 }
225 #define IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT { 0xe0, 0, 0, 0x16 }
226 #define IN4ADDR_ALLTEREDONODESONLINK_INIT { 0xe0, 0, 0, 0xfd }
227 #define IN4ADDR_LINKLOCALPREFIX_INIT { 0xa9, 0xfe, }
228 #define IN4ADDR_MULTICASTPREFIX_INIT { 0xe0, }
230 #define IN4ADDR_LOOPBACKPREFIX_LENGTH 8
231 #define IN4ADDR_LINKLOCALPREFIX_LENGTH 16
232 #define IN4ADDR_MULTICASTPREFIX_LENGTH 4
234 #if (NTDDI_VERSION >= NTDDI_WIN2KSP1)
239 _In_ CONST IN_ADDR
*a
,
240 _In_ CONST IN_ADDR
*b
)
242 return (BOOLEAN
)(a
->s_addr
== b
->s_addr
);
247 IN4_UNALIGNED_ADDR_EQUAL(
248 _In_ CONST IN_ADDR UNALIGNED
*a
,
249 _In_ CONST IN_ADDR UNALIGNED
*b
)
251 return (BOOLEAN
)(a
->s_addr
== b
->s_addr
);
256 IN4_IS_ADDR_UNSPECIFIED(
257 _In_ CONST IN_ADDR
*a
)
259 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_ANY
);
264 IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(
265 _In_ CONST IN_ADDR UNALIGNED
*a
)
267 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_ANY
);
272 IN4_IS_ADDR_LOOPBACK(
273 _In_ CONST IN_ADDR
*a
)
275 return (BOOLEAN
)(*((PUCHAR
) a
) == 0x7f);
280 IN4_IS_UNALIGNED_ADDR_LOOPBACK(
281 _In_ CONST IN_ADDR UNALIGNED
*a
)
283 return (BOOLEAN
)(*((PUCHAR
) a
) == 0x7f);
288 IN4_IS_ADDR_BROADCAST(
289 _In_ CONST IN_ADDR
*a
)
291 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_BROADCAST
);
296 IN4_IS_UNALIGNED_ADDR_BROADCAST(
297 _In_ CONST IN_ADDR UNALIGNED
*a
)
299 return (BOOLEAN
)(a
->s_addr
== IN4ADDR_BROADCAST
);
304 IN4_IS_ADDR_MULTICAST(
305 _In_ CONST IN_ADDR
*a
)
307 return (BOOLEAN
)IN4_MULTICAST(a
->s_addr
);
312 IN4_IS_UNALIGNED_ADDR_MULTICAST(
313 _In_ CONST IN_ADDR UNALIGNED
*a
)
315 return (BOOLEAN
)IN4_MULTICAST(a
->s_addr
);
320 IN4_IS_ADDR_LINKLOCAL(
321 _In_ CONST IN_ADDR
*a
)
323 return (BOOLEAN
)((a
->s_addr
& 0xffff) == 0xfea9);
328 IN4_IS_UNALIGNED_ADDR_LINKLOCAL(
329 _In_ CONST IN_ADDR UNALIGNED
*a
)
331 return (BOOLEAN
)((a
->s_addr
& 0xffff) == 0xfea9); // 169.254/16
336 IN4_IS_ADDR_SITELOCAL(
337 _In_ CONST IN_ADDR
*a
)
339 UNREFERENCED_PARAMETER(a
);
342 #define IN4_IS_UNALIGNED_ADDR_SITELOCAL IN4_IS_ADDR_SITELOCAL
347 _In_ CONST IN_ADDR
*a
)
349 return (BOOLEAN
)(((a
->s_addr
& 0x00ff) == 0x0a) ||
350 ((a
->s_addr
& 0xf0ff) == 0x10ac) ||
351 ((a
->s_addr
& 0xffff) == 0xa8c0));
356 IN4_IS_UNALIGNED_ADDR_RFC1918(
357 _In_ CONST IN_ADDR UNALIGNED
*a
)
359 IN_ADDR Ipv4Address
= *a
;
360 return IN4_IS_ADDR_RFC1918(&Ipv4Address
);
365 IN4_IS_ADDR_MC_LINKLOCAL(
366 _In_ CONST IN_ADDR
*a
)
368 return (BOOLEAN
)((a
->s_addr
& 0xffffff) == 0xe0);
373 IN4_IS_ADDR_MC_ADMINLOCAL(
374 _In_ CONST IN_ADDR
*a
)
376 return (BOOLEAN
)((a
->s_addr
& 0xffff) == 0xffef);
381 IN4_IS_ADDR_MC_SITELOCAL(
382 _In_ CONST IN_ADDR
*a
)
384 return (BOOLEAN
)((a
->s_addr
& 0xff) == 0xef) &&
385 !IN4_IS_ADDR_MC_ADMINLOCAL(a
);
391 _Out_ PSOCKADDR_IN a
,
392 _In_ CONST IN_ADDR
*addr
,
395 a
->sin_family
= AF_INET
;
398 memset(a
->sin_zero
, 0, sizeof(a
->sin_zero
));
404 _Out_ PSOCKADDR_IN a
)
406 a
->sin_family
= AF_INET
;
408 a
->sin_addr
.s_addr
= IN4ADDR_ANY
;
409 memset(a
->sin_zero
, 0, sizeof(a
->sin_zero
));
415 _Out_ PSOCKADDR_IN a
)
417 a
->sin_family
= AF_INET
;
419 a
->sin_addr
.s_addr
= IN4ADDR_LOOPBACK
;
420 memset(a
->sin_zero
, 0, sizeof(a
->sin_zero
));
426 _In_ CONST SOCKADDR_IN
*a
)
428 ASSERT(a
->sin_family
== AF_INET
);
429 return IN4_IS_ADDR_UNSPECIFIED(&a
->sin_addr
);
435 _In_ CONST SOCKADDR_IN
*a
)
437 ASSERT(a
->sin_family
== AF_INET
);
438 return IN4_IS_ADDR_LOOPBACK(&a
->sin_addr
);
444 _In_ CONST SOCKADDR_IN
*a
)
446 SCOPE_ID UnspecifiedScopeId
= {{{0}}};
447 UNREFERENCED_PARAMETER(a
);
448 return UnspecifiedScopeId
;
454 _In_ CONST SOCKADDR_IN
*a
,
455 _In_ CONST SOCKADDR_IN
*b
)
457 ASSERT(a
->sin_family
== AF_INET
);
458 return (BOOLEAN
)(IN4ADDR_SCOPE_ID(a
).Value
== IN4ADDR_SCOPE_ID(b
).Value
&&
459 IN4_ADDR_EQUAL(&a
->sin_addr
, &b
->sin_addr
));
464 IN4ADDR_ISUNSPECIFIED(
465 _In_ CONST SOCKADDR_IN
*a
)
467 ASSERT(a
->sin_family
== AF_INET
);
468 return (BOOLEAN
)(IN4ADDR_SCOPE_ID(a
).Value
== 0 &&
469 IN4_IS_ADDR_UNSPECIFIED(&a
->sin_addr
));
472 #define INET_IS_ALIGNED(Pointer, Type) \
473 (((ULONG_PTR)Pointer & (TYPE_ALIGNMENT(Type)-1)) == 0)
477 Ipv4UnicastAddressScope(
478 _In_ CONST UCHAR
*Address
)
482 if (!INET_IS_ALIGNED(Address
, IN_ADDR
)) {
483 Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*)Address
;
484 Address
= (CONST UCHAR
*) &Ipv4Address
;
486 if (IN4_IS_ADDR_LINKLOCAL((PIN_ADDR
) Address
) ||
487 IN4_IS_ADDR_LOOPBACK((PIN_ADDR
) Address
)) {
488 return ScopeLevelLink
;
490 return ScopeLevelGlobal
;
495 Ipv4MulticastAddressScope(
496 _In_ CONST UCHAR
*Address
)
500 if (!INET_IS_ALIGNED(Address
, IN_ADDR
)) {
501 Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*)Address
;
502 Address
= (CONST UCHAR
*) &Ipv4Address
;
504 if (IN4_IS_ADDR_MC_LINKLOCAL((PIN_ADDR
) Address
)) {
505 return ScopeLevelLink
;
506 } else if (IN4_IS_ADDR_MC_ADMINLOCAL((PIN_ADDR
) Address
)) {
507 return ScopeLevelAdmin
;
508 } else if (IN4_IS_ADDR_MC_SITELOCAL((PIN_ADDR
) Address
)) {
509 return ScopeLevelSite
;
511 return ScopeLevelGlobal
;
518 _In_ CONST UCHAR
*Address
)
520 CONST IN_ADDR Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*)Address
;
522 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address
)) {
523 return ScopeLevelLink
;
524 } else if (IN4_IS_ADDR_MULTICAST(&Ipv4Address
)) {
525 return Ipv4MulticastAddressScope((UCHAR
*) &Ipv4Address
);
527 return Ipv4UnicastAddressScope((UCHAR
*) &Ipv4Address
);
534 _In_ CONST UCHAR
*Address
)
536 IN_ADDR Ipv4Address
= *(CONST IN_ADDR UNALIGNED
*) Address
;
538 if (IN4_IS_ADDR_MULTICAST(&Ipv4Address
)) {
539 return NlatMulticast
;
541 if (IN4_IS_ADDR_BROADCAST(&Ipv4Address
)) {
542 return NlatBroadcast
;
544 if (IN4_IS_ADDR_UNSPECIFIED(&Ipv4Address
)) {
545 return NlatUnspecified
;
547 if (((Ipv4Address
.s_addr
& 0x000000ff) == 0) ||
548 ((Ipv4Address
.s_addr
& 0x000000f0) == 240)) {
556 IN4_UNCANONICALIZE_SCOPE_ID(
557 _In_ CONST IN_ADDR
*Address
,
558 _Inout_ SCOPE_ID
*ScopeId
)
560 SCOPE_LEVEL ScopeLevel
= Ipv4AddressScope((CONST UCHAR
*)Address
);
562 if ((IN4_IS_ADDR_LOOPBACK(Address
)) || (ScopeLevel
== ScopeLevelGlobal
)) {
565 if ((SCOPE_LEVEL
)ScopeId
->Level
== ScopeLevel
) {
572 IN4_IS_ADDR_6TO4ELIGIBLE(
573 _In_ CONST IN_ADDR
*a
)
575 return (BOOLEAN
)((Ipv4AddressType((CONST UCHAR
*) a
) == NlatUnicast
) &&
576 !(IN4_IS_ADDR_LOOPBACK(a
) ||
577 IN4_IS_ADDR_LINKLOCAL(a
) ||
578 IN4_IS_ADDR_SITELOCAL(a
) ||
579 IN4_IS_ADDR_RFC1918(a
)));
584 IN4_IS_UNALIGNED_ADDR_6TO4ELIGIBLE(
585 _In_ CONST IN_ADDR UNALIGNED
*a
)
587 IN_ADDR Ipv4Address
= *a
;
588 return IN4_IS_ADDR_6TO4ELIGIBLE(&Ipv4Address
);
591 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP1) */
593 #endif /* _WS2DEF_ */
600 _In_ CONST IN6_ADDR
*a
,
601 _In_ CONST IN6_ADDR
*b
,
604 UINT8 Bytes
= len
/ 8;
605 UINT8 Bits
= len
% 8;
606 UINT8 Mask
= 0xff << (8 - Bits
);
608 ASSERT(len
<= (sizeof(IN6_ADDR
) * 8));
609 return (BOOLEAN
) (((memcmp(a
, b
, Bytes
)) == 0) && ((Bits
== 0) ||
610 ((a
->s6_bytes
[Bytes
] | Mask
) == (b
->s6_bytes
[Bytes
] | Mask
))));
615 IN6_IS_ADDR_ALLNODESONNODE(
616 _In_ CONST IN6_ADDR
*a
)
618 return IN6_ADDR_EQUAL(a
, &in6addr_allnodesonnode
);
623 IN6_IS_ADDR_ALLNODESONLINK(
624 _In_ CONST IN6_ADDR
*a
)
626 return IN6_ADDR_EQUAL(a
, &in6addr_allnodesonlink
);
631 IN6_IS_ADDR_ALLROUTERSONLINK(
632 _In_ CONST IN6_ADDR
*a
)
634 return IN6_ADDR_EQUAL(a
, &in6addr_allroutersonlink
);
639 IN6_IS_ADDR_SOLICITEDNODE(
640 _In_ CONST IN6_ADDR
*a
)
642 return IN6_PREFIX_EQUAL(a
, &in6addr_solicitednodemulticastprefix
,
643 IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH
);
649 _In_ CONST IN6_ADDR
*a
)
651 return (BOOLEAN
)(((a
->s6_words
[4] & 0xfffd) == 0x0000) &&
652 (a
->s6_words
[5] == 0xfe5e));
658 _In_ CONST IN6_ADDR
*a
)
660 C_ASSERT(IN6ADDR_6TO4PREFIX_LENGTH
== RTL_BITS_OF(USHORT
));
661 return (BOOLEAN
)(a
->s6_words
[0] == in6addr_6to4prefix
.s6_words
[0]);
667 _In_ CONST IN6_ADDR
*a
)
669 C_ASSERT(IN6ADDR_TEREDOPREFIX_LENGTH
== 2 * RTL_BITS_OF(USHORT
));
671 (((a
->s6_words
[0] == in6addr_teredoprefix
.s6_words
[0]) &&
672 (a
->s6_words
[1] == in6addr_teredoprefix
.s6_words
[1])) ||
673 ((a
->s6_words
[0] == in6addr_teredoprefix_old
.s6_words
[0]) &&
674 (a
->s6_words
[1] == in6addr_teredoprefix_old
.s6_words
[1])));
680 _In_ CONST SOCKADDR_IN6
*a
)
682 ASSERT(a
->sin6_family
== AF_INET6
);
683 return IN6_IS_ADDR_V4MAPPED(&a
->sin6_addr
);
689 _In_ CONST SOCKADDR_IN6
*a
)
691 ASSERT(a
->sin6_family
== AF_INET6
);
692 return IN6_IS_ADDR_ISATAP(&a
->sin6_addr
);
698 _In_ CONST SOCKADDR_IN6
*a
)
700 ASSERT(a
->sin6_family
== AF_INET6
);
701 return IN6_IS_ADDR_6TO4(&a
->sin6_addr
);
707 _In_ CONST SOCKADDR_IN6
*a
)
709 ASSERT(a
->sin6_family
== AF_INET6
);
710 return IN6_IS_ADDR_TEREDO(&a
->sin6_addr
);
715 IN6_GET_ADDR_V4MAPPED(
716 _In_ CONST IN6_ADDR
*Ipv6Address
)
718 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 6);
723 IN6_GET_ADDR_V4COMPAT(
724 _In_ CONST IN6_ADDR
*Ipv6Address
)
726 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 6);
731 IN6_EXTRACT_V4ADDR_FROM_ISATAP(
732 _In_ CONST IN6_ADDR
*Ipv6Address
)
734 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 6);
739 IN6_EXTRACT_V4ADDR_FROM_6TO4(
740 _In_ CONST IN6_ADDR
*Ipv6Address
)
742 return (CONST UCHAR
*) (Ipv6Address
->s6_words
+ 1);
747 IN6_SET_ADDR_V4MAPPED(
749 _In_ CONST IN_ADDR
* a4
)
751 *a6
= in6addr_v4mappedprefix
;
752 a6
->s6_bytes
[12] = ((CONST UCHAR
*) a4
)[0];
753 a6
->s6_bytes
[13] = ((CONST UCHAR
*) a4
)[1];
754 a6
->s6_bytes
[14] = ((CONST UCHAR
*) a4
)[2];
755 a6
->s6_bytes
[15] = ((CONST UCHAR
*) a4
)[3];
760 IN6_SET_ADDR_V4COMPAT(
762 _In_ CONST IN_ADDR
* a4
)
765 a6
->s6_bytes
[12] = ((CONST UCHAR
*) a4
)[0];
766 a6
->s6_bytes
[13] = ((CONST UCHAR
*) a4
)[1];
767 a6
->s6_bytes
[14] = ((CONST UCHAR
*) a4
)[2];
768 a6
->s6_bytes
[15] = ((CONST UCHAR
*) a4
)[3];
773 IN6_SET_ADDR_SOLICITEDNODE(
774 _Out_ PIN6_ADDR Multicast
,
775 _In_ CONST IN6_ADDR
*Unicast
)
777 *Multicast
= in6addr_solicitednodemulticastprefix
;
778 Multicast
->s6_bytes
[13] = Unicast
->s6_bytes
[13];
779 Multicast
->s6_bytes
[14] = Unicast
->s6_bytes
[14];
780 Multicast
->s6_bytes
[15] = Unicast
->s6_bytes
[15];
785 IN6_SET_ISATAP_IDENTIFIER(
786 _Inout_ IN6_ADDR
*Ipv6Address
,
787 _In_ CONST IN_ADDR
*Ipv4Address
)
789 if (IN4_IS_ADDR_6TO4ELIGIBLE(Ipv4Address
)) {
790 Ipv6Address
->s6_words
[4] = 0x0002;
792 Ipv6Address
->s6_words
[4] = 0x0000;
794 Ipv6Address
->s6_words
[5] = 0xFE5E;
795 *((UNALIGNED IN_ADDR
*) (Ipv6Address
->s6_words
+ 6)) = *Ipv4Address
;
801 _Inout_ IN6_ADDR
*Ipv6Address
,
802 _In_ CONST IN_ADDR
*Ipv4Address
)
804 Ipv6Address
->s6_words
[0] = 0x0220;
805 *((UNALIGNED IN_ADDR
*) (Ipv6Address
->s6_words
+ 1)) = *Ipv4Address
;
806 Ipv6Address
->s6_words
[3] = 0x0000;
811 Ipv6UnicastAddressScope(
812 _In_ CONST UCHAR
*Address
)
814 IN6_ADDR Ipv6Address
;
816 if (!INET_IS_ALIGNED(Address
, IN6_ADDR
)) {
817 Ipv6Address
= *(CONST IN6_ADDR UNALIGNED
*)Address
;
818 Address
= (CONST UCHAR
*) &Ipv6Address
;
820 if (IN6_IS_ADDR_LINKLOCAL((PIN6_ADDR
) Address
) ||
821 IN6_IS_ADDR_LOOPBACK((PIN6_ADDR
) Address
)) {
822 return ScopeLevelLink
;
823 } else if (IN6_IS_ADDR_SITELOCAL((PIN6_ADDR
) Address
)) {
824 return ScopeLevelSite
;
826 return ScopeLevelGlobal
;
833 _In_ CONST UCHAR
*Address
)
835 PIN6_ADDR Ipv6Address
= (PIN6_ADDR
) Address
;
836 return (SCOPE_LEVEL
)(Ipv6Address
->s6_bytes
[1] & 0xf);
842 _In_ CONST UCHAR
*Address
)
844 if (IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR
*) Address
)) {
845 return IN6_MULTICAST_SCOPE(Address
);
847 return Ipv6UnicastAddressScope(Address
);
854 _In_ CONST UCHAR
*Address
)
856 CONST IN6_ADDR
*Ipv6Address
= (CONST IN6_ADDR
*) Address
;
857 CONST UCHAR
*Ipv4Address
;
859 if (IN6_IS_ADDR_MULTICAST(Ipv6Address
)) {
860 return NlatMulticast
;
862 if (IN6_IS_ADDR_UNSPECIFIED(Ipv6Address
)) {
863 return NlatUnspecified
;
865 if (IN6_IS_ADDR_ISATAP(Ipv6Address
) || IN6_IS_ADDR_V4COMPAT(Ipv6Address
) ||
866 IN6_IS_ADDR_V4MAPPED(Ipv6Address
) || IN6_IS_ADDR_V4TRANSLATED(Ipv6Address
)) {
867 Ipv4Address
= IN6_EXTRACT_V4ADDR_FROM_ISATAP(Ipv6Address
);
868 } else if (IN6_IS_ADDR_6TO4(Ipv6Address
)) {
869 Ipv4Address
= IN6_EXTRACT_V4ADDR_FROM_6TO4(Ipv6Address
);
873 if (Ipv4AddressType(Ipv4Address
) != NlatUnicast
) {
881 IN6_UNCANONICALIZE_SCOPE_ID(
882 _In_ CONST IN6_ADDR
*Address
,
883 _Inout_ SCOPE_ID
*ScopeId
)
885 SCOPE_LEVEL ScopeLevel
= Ipv6AddressScope((CONST UCHAR
*)Address
);
887 if ((IN6_IS_ADDR_LOOPBACK(Address
)) || (ScopeLevel
== ScopeLevelGlobal
)) {
890 if ((SCOPE_LEVEL
)ScopeId
->Level
== ScopeLevel
) {
895 #if (NTDDI_VERSION >= NTDDI_VISTA)
900 _Out_ PSOCKADDR_IN6 a
,
901 _In_ CONST IN6_ADDR
*addr
,
905 a
->sin6_family
= AF_INET6
;
907 a
->sin6_flowinfo
= 0;
908 RtlCopyMemory(&a
->sin6_addr
, addr
, sizeof(IN6_ADDR
));
909 a
->sin6_scope_struct
= scope
;
910 IN6_UNCANONICALIZE_SCOPE_ID(&a
->sin6_addr
, &a
->sin6_scope_struct
);
916 _Out_ PSOCKADDR_IN6 a6
,
917 _In_ CONST IN_ADDR
* a4
,
921 a6
->sin6_family
= AF_INET6
;
922 a6
->sin6_port
= port
;
923 a6
->sin6_flowinfo
= 0;
924 IN6_SET_ADDR_V4MAPPED(&a6
->sin6_addr
, a4
);
925 a6
->sin6_scope_struct
= scope
;
926 IN4_UNCANONICALIZE_SCOPE_ID(a4
, &a6
->sin6_scope_struct
);
929 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
934 _In_ ADDRESS_FAMILY af
,
938 if (af
== AF_INET6
) {
939 return IN6_ADDR_EQUAL((CONST IN6_ADDR
*)a
, (CONST IN6_ADDR
*)b
);
941 ASSERT(af
== AF_INET
);
942 return IN4_ADDR_EQUAL((CONST IN_ADDR
*)a
, (CONST IN_ADDR
*)b
);
948 INET_UNALIGNED_ADDR_EQUAL(
949 _In_ ADDRESS_FAMILY af
,
953 if (af
== AF_INET6
) {
954 return IN6_ADDR_EQUAL((CONST IN6_ADDR
*)a
, (CONST IN6_ADDR
*)b
);
956 ASSERT(af
== AF_INET
);
957 return IN4_UNALIGNED_ADDR_EQUAL((CONST IN_ADDR
*)a
, (CONST IN_ADDR
*)b
);
963 INET_IS_ADDR_UNSPECIFIED(
964 _In_ ADDRESS_FAMILY af
,
967 if (af
== AF_INET6
) {
968 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR
*)a
);
970 ASSERT(af
== AF_INET
);
971 return IN4_IS_ADDR_UNSPECIFIED((CONST IN_ADDR
*)a
);
977 INET_IS_UNALIGNED_ADDR_UNSPECIFIED(
978 _In_ ADDRESS_FAMILY af
,
981 if (af
== AF_INET6
) {
982 return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR
*)a
);
984 ASSERT(af
== AF_INET
);
985 return IN4_IS_UNALIGNED_ADDR_UNSPECIFIED((CONST IN_ADDR UNALIGNED
*)a
);
991 INET_IS_ADDR_LOOPBACK(
992 _In_ ADDRESS_FAMILY af
,
995 if (af
== AF_INET6
) {
996 return IN6_IS_ADDR_LOOPBACK((CONST IN6_ADDR
*)a
);
998 ASSERT(af
== AF_INET
);
999 return IN4_IS_ADDR_LOOPBACK((CONST IN_ADDR
*)a
);
1005 INET_IS_ADDR_BROADCAST(
1006 _In_ ADDRESS_FAMILY af
,
1009 if (af
== AF_INET6
) {
1012 ASSERT(af
== AF_INET
);
1013 return IN4_IS_ADDR_BROADCAST((CONST IN_ADDR
*)a
);
1019 INET_IS_ADDR_MULTICAST(
1020 _In_ ADDRESS_FAMILY af
,
1023 if (af
== AF_INET6
) {
1024 return IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR
*)a
);
1026 ASSERT(af
== AF_INET
);
1027 return IN4_IS_ADDR_MULTICAST((CONST IN_ADDR
*)a
);
1033 INET_ADDR_UNSPECIFIED(
1034 _In_ ADDRESS_FAMILY af
)
1036 if (af
== AF_INET6
) {
1037 return (CONST UCHAR
*)&in6addr_any
;
1039 ASSERT(af
== AF_INET
);
1040 return (CONST UCHAR
*)&in4addr_any
;
1047 _In_ ADDRESS_FAMILY Family
,
1048 _Out_ PUCHAR Address
,
1049 _In_ CONST UCHAR
*Value
)
1051 if (Family
== AF_INET6
) {
1052 *((PIN6_ADDR
)Address
) = *((PIN6_ADDR
)Value
);
1054 ASSERT(Family
== AF_INET
);
1055 *((PIN_ADDR
)Address
) = *((PIN_ADDR
)Value
);
1062 _In_ ADDRESS_FAMILY af
)
1064 if (af
== AF_INET6
) {
1065 return sizeof(IN6_ADDR
);
1067 ASSERT(af
== AF_INET
);
1068 return sizeof(IN_ADDR
);
1074 INET_SOCKADDR_LENGTH(
1075 _In_ ADDRESS_FAMILY af
)
1077 if (af
== AF_INET6
) {
1078 return sizeof(SOCKADDR_IN6
);
1080 ASSERT(af
== AF_INET
);
1081 return sizeof(SOCKADDR_IN
);
1085 #if (NTDDI_VERSION >= NTDDI_VISTA)
1088 INETADDR_SETSOCKADDR(
1089 _In_ ADDRESS_FAMILY af
,
1091 _In_ CONST VOID
* addr
,
1092 _In_ SCOPE_ID scope
,
1095 if (af
== AF_INET6
) {
1096 IN6ADDR_SETSOCKADDR((PSOCKADDR_IN6
) a
, (CONST IN6_ADDR
*) addr
, scope
, port
);
1098 CONST IN_ADDR addr4
= *((IN_ADDR UNALIGNED
*) addr
);
1099 ASSERT(af
== AF_INET
);
1100 IN4ADDR_SETSOCKADDR((PSOCKADDR_IN
) a
, (CONST IN_ADDR
*) &addr4
, port
);
1103 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1108 _Inout_ PSOCKADDR a
)
1110 if (a
->sa_family
== AF_INET6
) {
1111 IN6ADDR_SETANY((PSOCKADDR_IN6
)a
);
1113 ASSERT(a
->sa_family
== AF_INET
);
1114 IN4ADDR_SETANY((PSOCKADDR_IN
)a
);
1120 INETADDR_SETLOOPBACK(
1121 _Inout_ PSOCKADDR a
)
1123 if (a
->sa_family
== AF_INET6
) {
1124 IN6ADDR_SETLOOPBACK((PSOCKADDR_IN6
)a
);
1126 ASSERT(a
->sa_family
== AF_INET
);
1127 IN4ADDR_SETLOOPBACK((PSOCKADDR_IN
)a
);
1134 _In_ CONST SOCKADDR
*a
)
1136 if (a
->sa_family
== AF_INET6
) {
1137 return IN6ADDR_ISANY((CONST SOCKADDR_IN6
*)a
);
1139 ASSERT(a
->sa_family
== AF_INET
);
1140 return IN4ADDR_ISANY((CONST SOCKADDR_IN
*)a
);
1146 INETADDR_ISLOOPBACK(
1147 _In_ CONST SOCKADDR
*a
)
1149 if (a
->sa_family
== AF_INET6
) {
1150 return IN6ADDR_ISLOOPBACK((CONST SOCKADDR_IN6
*)a
);
1152 ASSERT(a
->sa_family
== AF_INET
);
1153 return IN4ADDR_ISLOOPBACK((CONST SOCKADDR_IN
*)a
);
1159 INETADDR_ISV4MAPPED(
1160 _In_ CONST SOCKADDR
*a
)
1162 if (a
->sa_family
== AF_INET6
) {
1163 return IN6ADDR_ISV4MAPPED((CONST SOCKADDR_IN6
*)a
);
1172 _In_ ADDRESS_FAMILY af
,
1174 _In_ CONST UCHAR
* aa
,
1176 _In_ CONST UCHAR
* ab
)
1178 return (BOOLEAN
)((sa
.Value
== sb
.Value
) && INET_ADDR_EQUAL(af
, aa
, ab
));
1183 NL_IS_ADDR_UNSPECIFIED(
1184 _In_ ADDRESS_FAMILY af
,
1186 _In_ CONST UCHAR
* a
)
1188 return (BOOLEAN
)((s
.Value
== 0) && INET_IS_ADDR_UNSPECIFIED(af
, a
));
1194 _In_ CONST SOCKADDR
*a
,
1195 _In_ CONST SOCKADDR
*b
)
1197 if (a
->sa_family
== AF_INET6
) {
1198 return (BOOLEAN
) (b
->sa_family
== AF_INET6
&&
1199 IN6ADDR_ISEQUAL((CONST SOCKADDR_IN6
*)a
, (CONST SOCKADDR_IN6
*)b
));
1201 ASSERT(a
->sa_family
== AF_INET
);
1202 return (BOOLEAN
) (b
->sa_family
== AF_INET
&&
1203 IN4ADDR_ISEQUAL((CONST SOCKADDR_IN
*)a
, (CONST SOCKADDR_IN
*)b
));
1209 INETADDR_ISUNSPECIFIED(
1210 _In_ CONST SOCKADDR
*a
)
1212 if (a
->sa_family
== AF_INET6
) {
1213 return IN6ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN6
*)a
);
1215 ASSERT(a
->sa_family
== AF_INET
);
1216 return IN4ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN
*)a
);
1220 #if (NTDDI_VERSION >= NTDDI_VISTA)
1224 _In_ CONST SOCKADDR
*a
)
1226 if (a
->sa_family
== AF_INET6
) {
1227 return ((CONST SOCKADDR_IN6
*)a
)->sin6_scope_struct
;
1229 ASSERT(a
->sa_family
== AF_INET
);
1230 return IN4ADDR_SCOPE_ID((CONST SOCKADDR_IN
*)a
);
1238 _In_ CONST SOCKADDR
*a
)
1240 if (a
->sa_family
== AF_INET6
) {
1241 return ((CONST SOCKADDR_IN6
*)a
)->sin6_port
;
1243 ASSERT(a
->sa_family
== AF_INET
);
1244 return ((CONST SOCKADDR_IN
*)a
)->sin_port
;
1251 _In_ CONST SOCKADDR
* a
)
1253 if (a
->sa_family
== AF_INET6
) {
1254 return (PUCHAR
)&((PSOCKADDR_IN6
)a
)->sin6_addr
;
1256 ASSERT(a
->sa_family
== AF_INET
);
1257 return (PUCHAR
)&((PSOCKADDR_IN
)a
)->sin_addr
;
1264 _Inout_ PSOCKADDR a
,
1272 INETADDR_SET_ADDRESS(
1273 _Inout_ PSOCKADDR a
,
1274 _In_ CONST UCHAR
*Address
)
1276 if (a
->sa_family
== AF_INET6
) {
1277 ((PSOCKADDR_IN6
)a
)->sin6_addr
= *((CONST IN6_ADDR
*)Address
);
1279 ASSERT(a
->sa_family
== AF_INET
);
1280 ((PSOCKADDR_IN
)a
)->sin_addr
= *((CONST IN_ADDR
*)Address
);
1286 INET_UNCANONICALIZE_SCOPE_ID(
1287 _In_ ADDRESS_FAMILY AddressFamily
,
1288 _In_ CONST UCHAR
*Address
,
1289 _Inout_ SCOPE_ID
*ScopeId
)
1291 if (AddressFamily
== AF_INET6
) {
1292 IN6_UNCANONICALIZE_SCOPE_ID((CONST IN6_ADDR
*) Address
, ScopeId
);
1294 IN4_UNCANONICALIZE_SCOPE_ID((CONST IN_ADDR
*) Address
, ScopeId
);
1298 #endif /* _WS2IPDEF_ */
1300 #ifndef __IP2STRING__
1301 #define __IP2STRING__
1303 #if (NTDDI_VERSION >= NTDDI_VISTA)
1310 RtlIpv4AddressToStringA(
1311 _In_
const struct in_addr
*Addr
,
1312 _Out_writes_(16) PSTR S
);
1317 RtlIpv4AddressToStringExA(
1318 _In_
const struct in_addr
*Address
,
1320 _Out_writes_to_(*AddressStringLength
, *AddressStringLength
) PSTR AddressString
,
1321 _Inout_ PULONG AddressStringLength
);
1326 RtlIpv4AddressToStringW(
1327 _In_
const struct in_addr
*Addr
,
1328 _Out_writes_(16) PWSTR S
);
1333 RtlIpv4AddressToStringExW(
1334 _In_
const struct in_addr
*Address
,
1336 _Out_writes_to_(*AddressStringLength
, *AddressStringLength
) PWSTR AddressString
,
1337 _Inout_ PULONG AddressStringLength
);
1342 RtlIpv4StringToAddressA(
1344 _In_ BOOLEAN Strict
,
1345 _Out_ PCSTR
*Terminator
,
1346 _Out_
struct in_addr
*Addr
);
1351 RtlIpv4StringToAddressExA(
1352 _In_ PCSTR AddressString
,
1353 _In_ BOOLEAN Strict
,
1354 _Out_
struct in_addr
*Address
,
1355 _Out_ PUSHORT Port
);
1360 RtlIpv4StringToAddressW(
1362 _In_ BOOLEAN Strict
,
1363 _Out_ PCWSTR
*Terminator
,
1364 _Out_
struct in_addr
*Addr
);
1369 RtlIpv4StringToAddressExW(
1370 _In_ PCWSTR AddressString
,
1371 _In_ BOOLEAN Strict
,
1372 _Out_
struct in_addr
*Address
,
1373 _Out_ PUSHORT Port
);
1376 #define RtlIpv4AddressToString RtlIpv4AddressToStringW
1377 #define RtlIpv4StringToAddress RtlIpv4StringToAddressW
1378 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExW
1379 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExW
1381 #define RtlIpv4AddressToString RtlIpv4AddressToStringA
1382 #define RtlIpv4StringToAddress RtlIpv4StringToAddressA
1383 #define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExA
1384 #define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExA
1387 #endif /* _WS2DEF_ */
1394 RtlIpv6AddressToStringA(
1395 _In_
const struct in6_addr
*Addr
,
1396 _Out_writes_(46) PSTR S
);
1401 RtlIpv6AddressToStringExA(
1402 _In_
const struct in6_addr
*Address
,
1405 _Out_writes_to_(*AddressStringLength
, *AddressStringLength
) PSTR AddressString
,
1406 _Inout_ PULONG AddressStringLength
);
1411 RtlIpv6AddressToStringW(
1412 _In_
const struct in6_addr
*Addr
,
1413 _Out_writes_(46) PWSTR S
);
1418 RtlIpv6AddressToStringExW(
1419 _In_
const struct in6_addr
*Address
,
1422 _Out_writes_to_(*AddressStringLength
, *AddressStringLength
) PWSTR AddressString
,
1423 _Inout_ PULONG AddressStringLength
);
1428 RtlIpv6StringToAddressA(
1430 _Out_ PCSTR
*Terminator
,
1431 _Out_
struct in6_addr
*Addr
);
1436 RtlIpv6StringToAddressExA(
1437 _In_ PCSTR AddressString
,
1438 _Out_
struct in6_addr
*Address
,
1439 _Out_ PULONG ScopeId
,
1440 _Out_ PUSHORT Port
);
1445 RtlIpv6StringToAddressW(
1447 _Out_ PCWSTR
*Terminator
,
1448 _Out_
struct in6_addr
*Addr
);
1453 RtlIpv6StringToAddressExW(
1454 _In_ PCWSTR AddressString
,
1455 _Out_
struct in6_addr
*Address
,
1456 _Out_ PULONG ScopeId
,
1457 _Out_ PUSHORT Port
);
1460 #define RtlIpv6AddressToString RtlIpv6AddressToStringW
1461 #define RtlIpv6StringToAddress RtlIpv6StringToAddressW
1462 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExW
1463 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExW
1465 #define RtlIpv6AddressToString RtlIpv6AddressToStringA
1466 #define RtlIpv6StringToAddress RtlIpv6StringToAddressA
1467 #define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExA
1468 #define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExA
1471 #endif /* __WS2IPDEF__ */
1476 typedef union _DL_EUI48 DL_EUI48
, *PDL_EUI48
;
1481 RtlEthernetAddressToStringA(
1482 _In_
const DL_EUI48
*Addr
,
1483 _Out_writes_(18) PSTR S
);
1488 RtlEthernetAddressToStringW(
1489 _In_
const DL_EUI48
*Addr
,
1490 _Out_writes_(18) PWSTR S
);
1495 RtlEthernetStringToAddressA(
1497 _Out_ PCSTR
*Terminator
,
1498 _Out_ DL_EUI48
*Addr
);
1503 RtlEthernetStringToAddressW(
1505 _Out_ LPCWSTR
*Terminator
,
1506 _Out_ DL_EUI48
*Addr
);
1509 #define RtlEthernetAddressToString RtlEthernetAddressToStringW
1510 #define RtlEthernetStringToAddress RtlEthernetStringToAddressW
1512 #define RtlEthernetAddressToString RtlEthernetAddressToStringA
1513 #define RtlEthernetStringToAddress RtlEthernetStringToAddressA
1516 #endif /* _WS2DEF_ */
1518 #endif /* (NTDDI >= NTDDI_VISTA) */
1520 #endif /* __IP2STRING__ */