Free Source Code and Program Tips
How to get the local DNS server record
If you don’t have Iphlpapi.lib installed, you can retrieve the local DNS server in the following way.
The main step is load “Iphlpapi.dll” with ::LoadLibary method and call ::GetProcAddress to get the “GetNetworkParams”.
Here is the full source:
#include “stdafx.h”
#include
#include
#define MAX_HOSTNAME_LEN 128
#define MAX_DOMAIN_NAME_LEN 128
#define MAX_SCOPE_ID_LEN 256
typedef struct _IP_ADDR_STRING {
struct _IP_ADDR_STRING* Next;
BYTE IpAddress[16];
BYTE IpMask[16];
DWORD Context;
}IP_ADDR_STRING, *PIP_ADDR_STRING;
typedef struct {
char HostName [MAX_HOSTNAME_LEN + 4] ;
char DomainName [MAX_DOMAIN_NAME_LEN + 4] ;
PIP_ADDR_STRING CurrentDnsServer ;
IP_ADDR_STRING DnsServerList ;
UINT NodeType ;
char ScopeId [MAX_SCOPE_ID_LEN + 4] ;
UINT EnableRouting ;
UINT EnableProxy ;
UINT EnableDns ;
} FIXED_INFO, *PFIXED_INFO ;
typedef DWORD (__stdcall *pGetNetworkParams)(PFIXED_INFO,PULONG);
int main()
{
FIXED_INFO * FixedInfo;
ULONG ulOutBufLen;
HINSTANCE hIphlpapiDll;
pGetNetworkParams p;
__try
{
hIphlpapiDll=::LoadLibrary(“Iphlpapi.dll”);
p=(pGetNetworkParams)::GetProcAddress(hIphlpapiDll,
“GetNetworkParams”);
FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) );
ulOutBufLen = sizeof( FIXED_INFO );
if( ERROR_BUFFER_OVERFLOW ==(*p)( FixedInfo, &ulOutBufLen ) )
{
GlobalFree( FixedInfo );
FixedInfo = (FIXED_INFO *)GlobalAlloc( GPTR, ulOutBufLen );
}
(*p)( FixedInfo, &ulOutBufLen );
printf( “Host Name: %s\n”, FixedInfo->HostName );
printf( “DNS Servers: %s\n”,FixedInfo->DnsServerList.IpAddress )
;
}
__except( EXCEPTION_EXECUTE_HANDLER){}
::FreeLibrary(hIphlpapiDll);
::GlobalFree( FixedInfo );
return 1;
}
| Print article | This entry was posted by hamo on January 2, 2007 at 11:48 pm, and is filed under General. Follow any responses to this post through RSS 2.0. You can leave a response or trackback from your own site. |