From: Alex Henrie Subject: [PATCH 3/3] iphlpapi: Implement ParseNetworkString for IPv6 addresses and services Message-Id: <20200319030638.43405-3-alexhenrie24@gmail.com> Date: Wed, 18 Mar 2020 21:06:17 -0600 In-Reply-To: <20200319030638.43405-1-alexhenrie24@gmail.com> References: <20200319030638.43405-1-alexhenrie24@gmail.com> Signed-off-by: Alex Henrie --- dlls/iphlpapi/iphlpapi_main.c | 38 ++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index 9ee85caeb3..cb4ffce408 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -3357,6 +3357,8 @@ DWORD WINAPI ParseNetworkString(const WCHAR *str, DWORD type, NET_ADDRESS_INFO *info, USHORT *port, BYTE *prefix_len) { IN_ADDR temp_addr4; + IN6_ADDR temp_addr6; + ULONG temp_scope; USHORT temp_port = 0; NTSTATUS status; @@ -3397,10 +3399,44 @@ DWORD WINAPI ParseNetworkString(const WCHAR *str, DWORD type, return ERROR_SUCCESS; } } + if (type & NET_STRING_IPV6_ADDRESS) + { + status = RtlIpv6StringToAddressExW(str, &temp_addr6, &temp_scope, &temp_port); + if (SUCCEEDED(status) && !temp_port) + { + if (info) + { + info->Format = NET_ADDRESS_IPV6; + info->u.Ipv6Address.sin6_addr = temp_addr6; + info->u.Ipv6Address.sin6_scope_id = temp_scope; + info->u.Ipv6Address.sin6_port = 0; + } + if (port) *port = 0; + if (prefix_len) *prefix_len = 255; + return ERROR_SUCCESS; + } + } + if (type & NET_STRING_IPV6_SERVICE) + { + status = RtlIpv6StringToAddressExW(str, &temp_addr6, &temp_scope, &temp_port); + if (SUCCEEDED(status) && temp_port) + { + if (info) + { + info->Format = NET_ADDRESS_IPV6; + info->u.Ipv6Address.sin6_addr = temp_addr6; + info->u.Ipv6Address.sin6_scope_id = temp_scope; + info->u.Ipv6Address.sin6_port = temp_port; + } + if (port) *port = ntohs(temp_port); + if (prefix_len) *prefix_len = 255; + return ERROR_SUCCESS; + } + } if (info) info->Format = NET_ADDRESS_FORMAT_UNSPECIFIED; - if (type & ~(NET_STRING_IPV4_ADDRESS|NET_STRING_IPV4_SERVICE)) + if (type & ~(NET_STRING_IPV4_ADDRESS|NET_STRING_IPV4_SERVICE|NET_STRING_IPV6_ADDRESS|NET_STRING_IPV6_SERVICE)) { FIXME("Unimplemented type 0x%x\n", type); return ERROR_NOT_SUPPORTED; -- 2.25.1