Demo程序下载: http://download.csdn.net/detail/ren0065/8320877
主要功能函数实现如下:
void CDnsQueryTestDlg::OnDnsQuery(__in WORD num_dns_type, __in DWORD num_dns_options, __in const PIP4_ARRAY p_ip4_array)
{
PDNS_RECORD p_dns_record;
DNS_FREE_TYPE dns_free_type = DnsFreeRecordList;
in_addr inaddr;
char c_str_digit[10];
CString cs_message;
CString cs_temp;
int num_res = 0;
if (num_res = DnsQuery(cs_dns_name_, num_dns_type, num_dns_options, p_ip4_array, &p_dns_record, 0))
{
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
0, num_res, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, 0))
{
cs_message.Format("-ERR: %s \r\n", (LPCTSTR)lpMsgBuf);
ct_output_.SetSel(ct_output_.GetWindowTextLength(), ct_output_.GetWindowTextLength());
ct_output_.ReplaceSel(cs_message);
LocalFree(lpMsgBuf);
}
else
{
ct_output_.SetSel(ct_output_.GetWindowTextLength(), ct_output_.GetWindowTextLength());
ct_output_.ReplaceSel("-ERR FormatMessage failed.?\r\n");
}
return;
}
do
{
switch (p_dns_record->wType)
{
case DNS_TYPE_A:
inaddr.S_un.S_addr = p_dns_record->Data.A.IpAddress;
cs_message.Format(" A %s [%s]", p_dns_record->pName, inet_ntoa(inaddr));
break;
case DNS_TYPE_NS:
cs_message.Format(" NS %s %s", p_dns_record->pName, p_dns_record->Data.NS.pNameHost);
break;
case DNS_TYPE_MD:
cs_message.Format(" MD %s %s", p_dns_record->pName, p_dns_record->Data.MD.pNameHost);
break;
case DNS_TYPE_MF:
cs_message.Format(" MF %s %s", p_dns_record->pName, p_dns_record->Data.MF.pNameHost);
break;
case DNS_TYPE_CNAME:
cs_message.Format(" CNAME %s %s", p_dns_record->pName, p_dns_record->Data.CNAME.pNameHost);
break;
case DNS_TYPE_SOA:
cs_message.Format(" SOA %s nameserv: %s\r\n", p_dns_record->pName, p_dns_record->Data.SOA.pNamePrimaryServer);
cs_temp.Format(" admin: %s\r\n", p_dns_record->Data.SOA.pNameAdministrator);
cs_message += cs_temp;
cs_temp.Format(" serial: %u\r\n", p_dns_record->Data.SOA.dwSerialNo);
cs_message += cs_temp;
cs_temp.Format(" refresh: %u\r\n", p_dns_record->Data.SOA.dwRefresh);
cs_message += cs_temp;
cs_temp.Format(" ttl: %u\r\n", p_dns_record->Data.SOA.dwDefaultTtl);
cs_message += cs_temp;
cs_temp.Format(" expire: %u\r\n", p_dns_record->Data.SOA.dwExpire);
cs_message += cs_temp;
cs_temp.Format(" retry: %u", p_dns_record->Data.SOA.dwRetry);
cs_message += cs_temp;
break;
case DNS_TYPE_MB:
cs_message.Format(" MB %s %s", p_dns_record->pName, p_dns_record->Data.MB.pNameHost);
break;
case DNS_TYPE_MG:
cs_message.Format(" MG %s %s", p_dns_record->pName, p_dns_record->Data.MG.pNameHost);
break;
case DNS_TYPE_MR:
cs_message.Format(" MR %s %s", p_dns_record->pName, p_dns_record->Data.MR.pNameHost);
break;
//case DNS_TYPE_NULL:
// message.Format(" MB %s %s",pdns->pName,pdns->Data.Null.MR.pNameHost);
//break;
case DNS_TYPE_WKS:
inaddr.S_un.S_addr = p_dns_record->Data.WKS.IpAddress;
cs_message.Format(" WKS %s [%s] proto: %d mask: %d", p_dns_record->pName, inet_ntoa(inaddr), p_dns_record->Data.WKS.chProtocol, p_dns_record->Data.WKS.BitMask);
break;
case DNS_TYPE_PTR:
cs_message.Format(" PTR %s %s", p_dns_record->pName, p_dns_record->Data.PTR.pNameHost);
break;
case DNS_TYPE_HINFO:
cs_message.Format(" HINFO %s", p_dns_record->pName);
for (u_int i = 0; i < p_dns_record->Data.HINFO.dwStringCount; i++)
{
cs_message += "\r\n ";
cs_message += p_dns_record->Data.HINFO.pStringArray[i];
}
break;
case DNS_TYPE_MINFO:
cs_message.Format(" MINFO %s err: %s name: %s", p_dns_record->pName, p_dns_record->Data.MINFO.pNameErrorsMailbox, p_dns_record->Data.MINFO.pNameMailbox);
break;
case DNS_TYPE_MX:
cs_message.Format(" MX %s %s pref: %d", p_dns_record->pName, p_dns_record->Data.MX.pNameExchange, p_dns_record->Data.MX.wPreference);
break;
case DNS_TYPE_TEXT:
cs_message.Format(" TEXT %s", p_dns_record->pName);
for (u_int i = 0; i < p_dns_record->Data.TXT.dwStringCount; i++)
{
cs_message += "\r\n ";
cs_message += p_dns_record->Data.TXT.pStringArray[i];
}
break;
case DNS_TYPE_RP:
cs_message.Format(" RP %s err: %s name: %s", p_dns_record->pName, p_dns_record->Data.RP.pNameErrorsMailbox, p_dns_record->Data.RP.pNameMailbox);
break;
case DNS_TYPE_AFSDB:
cs_message.Format(" AFSDB %s %s pref: %d", p_dns_record->pName, p_dns_record->Data.AFSDB.pNameExchange, p_dns_record->Data.AFSDB.wPreference);
break;
case DNS_TYPE_X25:
cs_message.Format(" X25 %s", p_dns_record->pName);
for (u_int i = 0; i < p_dns_record->Data.X25.dwStringCount; i++)
{
cs_message += "\r\n ";
cs_message += p_dns_record->Data.X25.pStringArray[i];
}
break;
case DNS_TYPE_ISDN:
cs_message.Format(" ISDN %s", p_dns_record->pName);
for (u_int i = 0; i < p_dns_record->Data.ISDN.dwStringCount; i++)
{
cs_message += "\r\n ";
cs_message += p_dns_record->Data.ISDN.pStringArray[i];
}
break;
case DNS_TYPE_RT:
cs_message.Format(" RT %s %s pref: %d", p_dns_record->pName, p_dns_record->Data.RT.pNameExchange, p_dns_record->Data.RT.wPreference);
break;
//case DNS_TYPE_SIG:
//break;
//case DNS_TYPE_KEY:
//break;
case DNS_TYPE_AAAA:
cs_message.Format(" AAAA %s %s pref: %d [", p_dns_record->pName);
for (int i = 0; i < 16; i++)
{
sprintf_s(c_str_digit, 10, "%d", p_dns_record->Data.AAAA.Ip6Address.IP6Byte[i]);
cs_message += c_str_digit;
if (i != 15)
cs_message += ".";
}
cs_message += "]";
break;
case DNS_TYPE_SRV:
cs_message.Format(" SRV %s %s port:%d prior:%d weight:%d", p_dns_record->pName, p_dns_record->Data.SRV.pNameTarget, p_dns_record->Data.SRV.wPort, p_dns_record->Data.SRV.wPriority, p_dns_record->Data.SRV.wWeight);
break;
//case DNS_TYPE_WINS:
//break;
case DNS_TYPE_WINSR:
cs_message.Format(" NBSTAT %s %s", p_dns_record->pName, p_dns_record->Data.WINSR.pNameResultDomain);
break;
default:
cs_message.Format(" unknown: %s type %d", p_dns_record->pName, p_dns_record->wType);
break;
}
if (p_dns_record->Flags.S.Section == DNSREC_AUTHORITY)
cs_message += " (authority)";
if (p_dns_record->Flags.S.Section == DNSREC_ADDITIONAL)
cs_message += " (additional)";
ct_output_.SetSel(ct_output_.GetWindowTextLength(), ct_output_.GetWindowTextLength());
ct_output_.ReplaceSel(cs_message + "\r\n");
p_dns_record = p_dns_record->pNext;
} while (p_dns_record);
ct_output_.SetSel(ct_output_.GetWindowTextLength(), ct_output_.GetWindowTextLength());
ct_output_.ReplaceSel("\r\n");
DnsRecordListFree(p_dns_record, dns_free_type);
}