How does one specify a specific DNS server to query using DnsQuery?
The 4th argument of DnsQuery PVOID pExtra
accepts a PIP4_ARRAY
containing the specific DNS servers to be queried. This is combined with the 3rd argument DWORD Options
of DNS_QUERY_BYPASS_CACHE , in order to bypass the resolver cache.
This has worked since Windows 2000, and in Windows XP DnsQuery calls the function
called privateNarrowToWideQuery (in dnsapi.dll) and takes the pExtra
argument is as the PIP4_ARRAY.
The MSDN is inaccurate in this regard , resulting in this being an undocumented feature.
In older versions of the DnsQuery API Call pExtra
used to be called aipServers
.
Regarding the DNS of IPV6 AAAA records, you can try the function with the second argument
WORD wType
as DNS_TYPE_AAAA
and the fifth argument PDNS_RECORD *ppQueryResultsSet
as a pointer to DNS_AAAA_DATA
. Though this still forces you to pass in IPV4 IP address array and not IPV6.
Regarding Windows Version support for the IPV6 queries see the following references
- Domain Name Service (DNS)
- Domain Name System Client Behavior in Windows Vista
- Changes to IPv6 in Windows Vista and Windows Server 2008
In future Windows versions, I believe the correct way to do this for IPV6 will be using
DnsQueryEx
, with its first argument of PDNS_QUERY_REQUEST pQueryRequest
which contains
a member PDNS_ADDR_ARRAY pDnsServerList;
, which contains member WORD Family;
which specifies which type of IP address the DNS server is.
Whether DnsQuery already supports a pointer to PDNS_ADDR_ARRAY as an argument to PVOID pExtra
or will be modified in future Windows Versions to do so, I am not sure, but you are welcome to try and see.
See How to use the DnsQuery function to resolve host names and host addresses with Visual C++ .NET for sample code, as you have already discovered.
Also see the following similar SO Question.