18,363
社区成员




typedef struct _DnsCacheEntry
{
struct _DnsCacheEntry* pNext; // Pointer to next entry
PWSTR pszName; // DNS Record Name
unsigned short wType; // DNS Record Type
unsigned short wDataLength; // Not referenced
unsigned long dwFlags; // DNS Record Flags
}DNS_CACHE_ENTRY;
int main()
{
HMODULE hM = ::LoadLibrary(TEXT("dnsapi.dll"));
typedef int (WINAPI *_DnsGetCacheDataTable)(DNS_CACHE_ENTRY * par);
_DnsGetCacheDataTable dnsGetCacheDataTable = (_DnsGetCacheDataTable)::GetProcAddress(hM, "DnsGetCacheDataTable");
DNS_CACHE_ENTRY fooEntry = {};
int nRes = dnsGetCacheDataTable(&fooEntry);
DNS_CACHE_ENTRY* _fooEntry = &fooEntry;
while (_fooEntry)
{
PDNS_RECORD dnsr;
DNS_STATUS status = DnsQuery(_fooEntry->pszName, _fooEntry->wType, DNS_QUERY_BYPASS_CACHE, NULL, &dnsr, NULL);
if (status == 0)
{
printf("%S:%s,%d\n", _fooEntry->pszName, inet_ntoa(*(in_addr*)&(dnsr->Data.A.IpAddress)), _fooEntry->wType);
}
DnsRecordListFree(dnsr, DnsFreeRecordListDeep);
_fooEntry = _fooEntry->pNext;
}
//DNS_STATUS WINAPI DnsQuery(TEXT);
::FreeLibrary(hM);
system("pause");
return 0;
}
//微软定义了一个如下的结构体
typedef struct _DnsCacheEntry
{
struct _DnsCacheEntry* pNext; // Pointer to next entry
PWSTR pszName; // DNS Record Name
unsigned short wType; // DNS Record Type
unsigned short wDataLength; // Not referenced
unsigned long dwFlags; // DNS Record Flags
}DNS_CACHE_ENTRY;
DNS_CACHE_ENTRY fooEntry;
DnsGetCacheDataTable(&pEntry));
DNS_STATUS WINAPI DnsQuery(
__in PCSTR lpstrName,
__in WORD wType,
__in DWORD fOptions,
__in_out_opt PVOID pExtra,
__in_out PDNS_RECORD* ppQueryResultsSet,
__in_out PVOID* pReserved
);
PDNS_RECORD结构体中的内容很丰富,而且它是个链表,成员函数中有指向PDNS_RECORD结构体类型的指针