2 * PROJECT: ReactOS ipconfig utility
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/network/ipconfig/ipconfig.c
5 * PURPOSE: Display IP info for net adapters
6 * PROGRAMMERS: Copyright 2005 - 2006 Ged Murphy (gedmurphy@gmail.com)
11 * implement registerdns, showclassid, setclassid
12 * allow globbing on adapter names
15 #define WIN32_NO_STATUS
25 #include <ndk/rtlfuncs.h>
28 #include <windns_undoc.h>
32 typedef struct _RECORDTYPE
36 } RECORDTYPE
, *PRECORDTYPE
;
43 RECORDTYPE TypeArray
[] =
45 {DNS_TYPE_ZERO
, _T("ZERO")},
46 {DNS_TYPE_A
, _T("A")},
47 {DNS_TYPE_NS
, _T("NS")},
48 {DNS_TYPE_MD
, _T("MD")},
49 {DNS_TYPE_MF
, _T("MF")},
50 {DNS_TYPE_CNAME
, _T("CNAME")},
51 {DNS_TYPE_SOA
, _T("SOA")},
52 {DNS_TYPE_MB
, _T("MB")},
53 {DNS_TYPE_MG
, _T("MG")},
54 {DNS_TYPE_MR
, _T("MR")},
55 {DNS_TYPE_NULL
, _T("NULL")},
56 {DNS_TYPE_WKS
, _T("WKS")},
57 {DNS_TYPE_PTR
, _T("PTR")},
58 {DNS_TYPE_HINFO
, _T("HINFO")},
59 {DNS_TYPE_MINFO
, _T("MINFO")},
60 {DNS_TYPE_MX
, _T("MX")},
61 {DNS_TYPE_TEXT
, _T("TXT")},
62 {DNS_TYPE_RP
, _T("RP")},
63 {DNS_TYPE_AFSDB
, _T("AFSDB")},
64 {DNS_TYPE_X25
, _T("X25")},
65 {DNS_TYPE_ISDN
, _T("ISDN")},
66 {DNS_TYPE_RT
, _T("RT")},
67 {DNS_TYPE_NSAP
, _T("NSAP")},
68 {DNS_TYPE_NSAPPTR
, _T("NSAPPTR")},
69 {DNS_TYPE_SIG
, _T("SIG")},
70 {DNS_TYPE_KEY
, _T("KEY")},
71 {DNS_TYPE_PX
, _T("PX")},
72 {DNS_TYPE_GPOS
, _T("GPOS")},
73 {DNS_TYPE_AAAA
, _T("AAAA")},
74 {DNS_TYPE_LOC
, _T("LOC")},
75 {DNS_TYPE_NXT
, _T("NXT")},
76 {DNS_TYPE_EID
, _T("EID")},
77 {DNS_TYPE_NIMLOC
, _T("NIMLOC")},
78 {DNS_TYPE_SRV
, _T("SRV")},
79 {DNS_TYPE_ATMA
, _T("ATMA")},
80 {DNS_TYPE_NAPTR
, _T("NAPTR")},
81 {DNS_TYPE_KX
, _T("KX")},
82 {DNS_TYPE_CERT
, _T("CERT")},
83 {DNS_TYPE_A6
, _T("A6")},
84 {DNS_TYPE_DNAME
, _T("DNAME")},
85 {DNS_TYPE_SINK
, _T("SINK")},
86 {DNS_TYPE_OPT
, _T("OPT")},
87 {DNS_TYPE_UINFO
, _T("UINFO")},
88 {DNS_TYPE_UID
, _T("UID")},
89 {DNS_TYPE_GID
, _T("GID")},
90 {DNS_TYPE_UNSPEC
, _T("UNSPEC")},
91 {DNS_TYPE_ADDRS
, _T("ADDRS")},
92 {DNS_TYPE_TKEY
, _T("TKEY")},
93 {DNS_TYPE_TSIG
, _T("TSIG")},
94 {DNS_TYPE_IXFR
, _T("IXFR")},
95 {DNS_TYPE_AXFR
, _T("AXFR")},
96 {DNS_TYPE_MAILB
, _T("MAILB")},
97 {DNS_TYPE_MAILA
, _T("MAILA")},
98 {DNS_TYPE_ALL
, _T("ALL")},
103 GetRecordTypeName(WORD wType
)
105 static TCHAR szType
[8];
110 if (TypeArray
[i
].pszRecordName
== NULL
)
113 if (TypeArray
[i
].wRecordType
== wType
)
114 return TypeArray
[i
].pszRecordName
;
117 _stprintf(szType
, _T("%hu"), wType
);
122 int LoadStringAndOem(HINSTANCE hInst
,
130 szTmp
= (LPTSTR
)HeapAlloc(ProcessHeap
, 0, byteSize
);
136 res
= LoadString(hInst
, uID
, szTmp
, byteSize
);
137 CharToOem(szTmp
, szNode
);
138 HeapFree(ProcessHeap
, 0, szTmp
);
142 LPTSTR
GetNodeTypeName(UINT NodeType
)
144 static TCHAR szNode
[14];
149 if (!LoadStringAndOem(hInstance
, IDS_BCAST
, szNode
, sizeof(szNode
)))
154 if (!LoadStringAndOem(hInstance
, IDS_P2P
, szNode
, sizeof(szNode
)))
159 if (!LoadStringAndOem(hInstance
, IDS_MIXED
, szNode
, sizeof(szNode
)))
164 if (!LoadStringAndOem(hInstance
, IDS_HYBRID
, szNode
, sizeof(szNode
)))
169 if (!LoadStringAndOem(hInstance
, IDS_UNKNOWN
, szNode
, sizeof(szNode
)))
178 LPTSTR
GetInterfaceTypeName(UINT InterfaceType
)
180 static TCHAR szIntType
[25];
182 switch (InterfaceType
)
184 case MIB_IF_TYPE_OTHER
:
185 if (!LoadStringAndOem(hInstance
, IDS_OTHER
, szIntType
, sizeof(szIntType
)))
189 case MIB_IF_TYPE_ETHERNET
:
190 if (!LoadStringAndOem(hInstance
, IDS_ETH
, szIntType
, sizeof(szIntType
)))
194 case MIB_IF_TYPE_TOKENRING
:
195 if (!LoadStringAndOem(hInstance
, IDS_TOKEN
, szIntType
, sizeof(szIntType
)))
199 case MIB_IF_TYPE_FDDI
:
200 if (!LoadStringAndOem(hInstance
, IDS_FDDI
, szIntType
, sizeof(szIntType
)))
204 case MIB_IF_TYPE_PPP
:
205 if (!LoadStringAndOem(hInstance
, IDS_PPP
, szIntType
, sizeof(szIntType
)))
209 case MIB_IF_TYPE_LOOPBACK
:
210 if (!LoadStringAndOem(hInstance
, IDS_LOOP
, szIntType
, sizeof(szIntType
)))
214 case MIB_IF_TYPE_SLIP
:
215 if (!LoadStringAndOem(hInstance
, IDS_SLIP
, szIntType
, sizeof(szIntType
)))
220 if (!LoadStringAndOem(hInstance
, IDS_UNKNOWN
, szIntType
, sizeof(szIntType
)))
229 /* print MAC address */
230 PTCHAR
PrintMacAddr(PBYTE Mac
)
232 static TCHAR MacAddr
[20];
234 _stprintf(MacAddr
, _T("%02x-%02x-%02x-%02x-%02x-%02x"),
235 Mac
[0], Mac
[1], Mac
[2], Mac
[3], Mac
[4], Mac
[5]);
241 VOID
DoFormatMessage(LONG ErrorCode
)
247 ErrorCode
= GetLastError();
249 if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
|
250 FORMAT_MESSAGE_FROM_SYSTEM
|
251 FORMAT_MESSAGE_IGNORE_INSERTS
,
254 MAKELANGID(LANG_NEUTRAL
, SUBLANG_DEFAULT
), /* Default language */
259 _tprintf(_T("%s"), (LPTSTR
)lpMsgBuf
);
265 LPTSTR
GetConnectionType(LPTSTR lpClass
)
268 LPTSTR ConType
= NULL
;
269 LPTSTR ConTypeTmp
= NULL
;
271 LPTSTR PrePath
= _T("SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\");
272 LPTSTR PostPath
= _T("\\Connection");
277 /* don't overflow the buffer */
278 PathSize
= lstrlen(PrePath
) + lstrlen(lpClass
) + lstrlen(PostPath
) + 1;
282 wsprintf(Path
, _T("%s%s%s"), PrePath
, lpClass
, PostPath
);
284 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
288 &hKey
) == ERROR_SUCCESS
)
290 if (RegQueryValueEx(hKey
,
295 &dwDataSize
) == ERROR_SUCCESS
)
297 ConTypeTmp
= (LPTSTR
)HeapAlloc(ProcessHeap
,
301 if (ConTypeTmp
== NULL
)
304 ConType
= (LPTSTR
)HeapAlloc(ProcessHeap
,
310 HeapFree(ProcessHeap
, 0, ConTypeTmp
);
314 if (RegQueryValueEx(hKey
,
319 &dwDataSize
) != ERROR_SUCCESS
)
321 HeapFree(ProcessHeap
,
329 CharToOem(ConTypeTmp
, ConType
);
330 HeapFree(ProcessHeap
, 0, ConTypeTmp
);
341 LPTSTR
GetConnectionDescription(LPTSTR lpClass
)
343 HKEY hBaseKey
= NULL
;
344 HKEY hClassKey
= NULL
;
345 LPTSTR lpKeyClass
= NULL
;
346 LPTSTR lpConDesc
= NULL
;
347 LPTSTR lpPath
= NULL
;
348 TCHAR szPrePath
[] = _T("SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\");
353 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
357 &hBaseKey
) != ERROR_SUCCESS
)
369 if ((Status
= RegEnumKeyEx(hBaseKey
,
376 NULL
)) != ERROR_SUCCESS
)
378 if (Status
== ERROR_NO_MORE_ITEMS
)
380 DoFormatMessage(Status
);
388 PathSize
= lstrlen(szPrePath
) + lstrlen(szName
) + 1;
389 lpPath
= (LPTSTR
)HeapAlloc(ProcessHeap
,
391 PathSize
* sizeof(TCHAR
));
395 wsprintf(lpPath
, _T("%s%s"), szPrePath
, szName
);
397 //MessageBox(NULL, lpPath, NULL, 0);
399 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
403 &hClassKey
) != ERROR_SUCCESS
)
408 HeapFree(ProcessHeap
, 0, lpPath
);
411 if (RegQueryValueEx(hClassKey
,
412 _T("NetCfgInstanceId"),
416 &dwDataSize
) == ERROR_SUCCESS
)
418 lpKeyClass
= (LPTSTR
)HeapAlloc(ProcessHeap
,
421 if (lpKeyClass
== NULL
)
424 if (RegQueryValueEx(hClassKey
,
425 _T("NetCfgInstanceId"),
429 &dwDataSize
) != ERROR_SUCCESS
)
431 HeapFree(ProcessHeap
, 0, lpKeyClass
);
439 if (!lstrcmp(lpClass
, lpKeyClass
))
441 HeapFree(ProcessHeap
, 0, lpKeyClass
);
444 if (RegQueryValueEx(hClassKey
,
449 &dwDataSize
) == ERROR_SUCCESS
)
451 lpConDesc
= (LPTSTR
)HeapAlloc(ProcessHeap
,
454 if (lpConDesc
== NULL
)
457 if (RegQueryValueEx(hClassKey
,
462 &dwDataSize
) != ERROR_SUCCESS
)
464 HeapFree(ProcessHeap
, 0, lpConDesc
);
479 if (hBaseKey
!= NULL
)
480 RegCloseKey(hBaseKey
);
481 if (hClassKey
!= NULL
)
482 RegCloseKey(hClassKey
);
484 HeapFree(ProcessHeap
, 0, lpPath
);
485 if (lpKeyClass
!= NULL
)
486 HeapFree(ProcessHeap
, 0, lpKeyClass
);
492 VOID
ShowInfo(BOOL bAll
)
495 PIP_ADAPTER_INFO pAdapterInfo
= NULL
;
496 PIP_ADAPTER_INFO pAdapter
= NULL
;
497 ULONG adaptOutBufLen
= 0;
498 PFIXED_INFO pFixedInfo
= NULL
;
499 ULONG netOutBufLen
= 0;
500 PIP_PER_ADAPTER_INFO pPerAdapterInfo
= NULL
;
501 ULONG ulPerAdapterInfoLength
= 0;
502 PSTR pszDomainName
= NULL
;
503 DWORD dwDomainNameSize
= 0;
506 GetComputerNameExA(ComputerNameDnsDomain
,
509 if (dwDomainNameSize
> 0)
511 pszDomainName
= HeapAlloc(ProcessHeap
,
513 dwDomainNameSize
* sizeof(TCHAR
));
514 if (pszDomainName
!= NULL
)
515 GetComputerNameExA(ComputerNameDnsDomain
,
520 /* call GetAdaptersInfo to obtain the adapter info */
521 ret
= GetAdaptersInfo(pAdapterInfo
, &adaptOutBufLen
);
522 if (ret
== ERROR_BUFFER_OVERFLOW
)
524 pAdapterInfo
= (IP_ADAPTER_INFO
*)HeapAlloc(ProcessHeap
, 0, adaptOutBufLen
);
525 if (pAdapterInfo
== NULL
)
528 ret
= GetAdaptersInfo(pAdapterInfo
, &adaptOutBufLen
);
537 if (ret
!= ERROR_NO_DATA
)
544 /* call GetNetworkParams to obtain the network info */
545 if (GetNetworkParams(pFixedInfo
, &netOutBufLen
) == ERROR_BUFFER_OVERFLOW
)
547 pFixedInfo
= (FIXED_INFO
*)HeapAlloc(ProcessHeap
, 0, netOutBufLen
);
548 if (pFixedInfo
== NULL
)
552 if (GetNetworkParams(pFixedInfo
, &netOutBufLen
) != NO_ERROR
)
564 pAdapter
= pAdapterInfo
;
566 _tprintf(_T("\nReactOS IP Configuration\n\n"));
569 _tprintf(_T("\tHost Name . . . . . . . . . . . . : %s\n"), pFixedInfo
->HostName
);
570 _tprintf(_T("\tPrimary DNS Suffix. . . . . . . . : %s\n"), (pszDomainName
!= NULL
) ? pszDomainName
: "");
571 _tprintf(_T("\tNode Type . . . . . . . . . . . . : %s\n"), GetNodeTypeName(pFixedInfo
->NodeType
));
572 if (pFixedInfo
->EnableRouting
)
573 _tprintf(_T("\tIP Routing Enabled. . . . . . . . : Yes\n"));
575 _tprintf(_T("\tIP Routing Enabled. . . . . . . . : No\n"));
576 if (pAdapter
&& pAdapter
->HaveWins
)
577 _tprintf(_T("\tWINS Proxy enabled. . . . . . . . : Yes\n"));
579 _tprintf(_T("\tWINS Proxy enabled. . . . . . . . : No\n"));
580 if (pszDomainName
!= NULL
&& pszDomainName
[0] != 0)
582 _tprintf(_T("\tDNS Suffix Search List. . . . . . : %s\n"), pszDomainName
);
583 _tprintf(_T("\t %s\n"), pFixedInfo
->DomainName
);
587 _tprintf(_T("\tDNS Suffix Search List. . . . . . : %s\n"), pFixedInfo
->DomainName
);
593 LPTSTR IntType
, myConType
;
594 BOOLEAN bConnected
= TRUE
;
596 mibEntry
.dwIndex
= pAdapter
->Index
;
597 GetIfEntry(&mibEntry
);
599 IntType
= GetInterfaceTypeName(pAdapter
->Type
);
600 myConType
= GetConnectionType(pAdapter
->AdapterName
);
602 _tprintf(_T("\n%s %s: \n\n"), IntType
, myConType
);
604 if (myConType
!= NULL
) HeapFree(ProcessHeap
, 0, myConType
);
606 if (GetPerAdapterInfo(pAdapter
->Index
, pPerAdapterInfo
, &ulPerAdapterInfoLength
) == ERROR_BUFFER_OVERFLOW
)
608 pPerAdapterInfo
= (PIP_PER_ADAPTER_INFO
)HeapAlloc(ProcessHeap
, 0, ulPerAdapterInfoLength
);
609 if (pPerAdapterInfo
!= NULL
)
611 GetPerAdapterInfo(pAdapter
->Index
, pPerAdapterInfo
, &ulPerAdapterInfoLength
);
615 /* check if the adapter is connected to the media */
616 if (mibEntry
.dwOperStatus
!= MIB_IF_OPER_STATUS_CONNECTED
&& mibEntry
.dwOperStatus
!= MIB_IF_OPER_STATUS_OPERATIONAL
)
619 _tprintf(_T("\tMedia State . . . . . . . . . . . : Media disconnected\n"));
623 _tprintf(_T("\tConnection-specific DNS Suffix. . : %s\n"), pFixedInfo
->DomainName
);
628 LPTSTR lpDesc
= GetConnectionDescription(pAdapter
->AdapterName
);
629 _tprintf(_T("\tDescription . . . . . . . . . . . : %s\n"), lpDesc
);
630 HeapFree(ProcessHeap
, 0, lpDesc
);
631 _tprintf(_T("\tPhysical Address. . . . . . . . . : %s\n"), PrintMacAddr(pAdapter
->Address
));
634 if (pAdapter
->DhcpEnabled
)
636 _tprintf(_T("\tDHCP Enabled. . . . . . . . . . . : Yes\n"));
637 if (pPerAdapterInfo
!= NULL
)
639 if (pPerAdapterInfo
->AutoconfigEnabled
)
640 _tprintf(_T("\tAutoconfiguration Enabled . . . . : Yes\n"));
642 _tprintf(_T("\tAutoconfiguration Enabled . . . . : No\n"));
647 _tprintf(_T("\tDHCP Enabled. . . . . . . . . . . : No\n"));
654 pAdapter
= pAdapter
->Next
;
658 _tprintf(_T("\tIP Address. . . . . . . . . . . . : %s\n"), pAdapter
->IpAddressList
.IpAddress
.String
);
659 _tprintf(_T("\tSubnet Mask . . . . . . . . . . . : %s\n"), pAdapter
->IpAddressList
.IpMask
.String
);
660 if (pAdapter
->GatewayList
.IpAddress
.String
[0] != '0')
661 _tprintf(_T("\tDefault Gateway . . . . . . . . . : %s\n"), pAdapter
->GatewayList
.IpAddress
.String
);
663 _tprintf(_T("\tDefault Gateway . . . . . . . . . :\n"));
667 PIP_ADDR_STRING pIPAddr
;
669 if (pAdapter
->DhcpEnabled
)
670 _tprintf(_T("\tDHCP Server . . . . . . . . . . . : %s\n"), pAdapter
->DhcpServer
.IpAddress
.String
);
672 _tprintf(_T("\tDNS Servers . . . . . . . . . . . : "));
673 _tprintf(_T("%s\n"), pFixedInfo
->DnsServerList
.IpAddress
.String
);
674 pIPAddr
= pFixedInfo
->DnsServerList
.Next
;
677 _tprintf(_T("\t\t\t\t\t %s\n"), pIPAddr
->IpAddress
.String
);
678 pIPAddr
= pIPAddr
->Next
;
681 if (pAdapter
->HaveWins
)
683 _tprintf(_T("\tPrimary WINS Server . . . . . . . : %s\n"), pAdapter
->PrimaryWinsServer
.IpAddress
.String
);
684 _tprintf(_T("\tSecondary WINS Server . . . . . . : %s\n"), pAdapter
->SecondaryWinsServer
.IpAddress
.String
);
687 if (pAdapter
->DhcpEnabled
&& _tcscmp(pAdapter
->DhcpServer
.IpAddress
.String
, _T("255.255.255.255")))
689 _tprintf(_T("\tLease Obtained. . . . . . . . . . : %s"), _tasctime(localtime(&pAdapter
->LeaseObtained
)));
690 _tprintf(_T("\tLease Expires . . . . . . . . . . : %s"), _tasctime(localtime(&pAdapter
->LeaseExpires
)));
695 HeapFree(ProcessHeap
, 0, pPerAdapterInfo
);
696 pPerAdapterInfo
= NULL
;
698 pAdapter
= pAdapter
->Next
;
703 HeapFree(ProcessHeap
, 0, pszDomainName
);
705 HeapFree(ProcessHeap
, 0, pFixedInfo
);
707 HeapFree(ProcessHeap
, 0, pAdapterInfo
);
710 VOID
Release(LPTSTR Index
)
712 IP_ADAPTER_INDEX_MAP AdapterInfo
;
716 /* if interface is not given, query GetInterfaceInfo */
719 PIP_INTERFACE_INFO pInfo
= NULL
;
720 ULONG ulOutBufLen
= 0;
722 if (GetInterfaceInfo(pInfo
, &ulOutBufLen
) == ERROR_INSUFFICIENT_BUFFER
)
724 pInfo
= (IP_INTERFACE_INFO
*)HeapAlloc(ProcessHeap
, 0, ulOutBufLen
);
728 if (GetInterfaceInfo(pInfo
, &ulOutBufLen
) == NO_ERROR
)
730 for (i
= 0; i
< pInfo
->NumAdapters
; i
++)
732 CopyMemory(&AdapterInfo
, &pInfo
->Adapter
[i
], sizeof(IP_ADAPTER_INDEX_MAP
));
733 _tprintf(_T("name - %ls\n"), pInfo
->Adapter
[i
].Name
);
735 /* Call IpReleaseAddress to release the IP address on the specified adapter. */
736 if ((ret
= IpReleaseAddress(&AdapterInfo
)) != NO_ERROR
)
738 _tprintf(_T("\nAn error occured while releasing interface %ls : \n"), AdapterInfo
.Name
);
739 DoFormatMessage(ret
);
743 HeapFree(ProcessHeap
, 0, pInfo
);
748 HeapFree(ProcessHeap
, 0, pInfo
);
762 * we need to be able to release connections by name with support for globbing
763 * i.e. ipconfig /release Eth* will release all cards starting with Eth...
764 * ipconfig /release *con* will release all cards with 'con' in their name
772 VOID
Renew(LPTSTR Index
)
774 IP_ADAPTER_INDEX_MAP AdapterInfo
;
777 /* if interface is not given, query GetInterfaceInfo */
780 PIP_INTERFACE_INFO pInfo
;
781 ULONG ulOutBufLen
= 0;
783 pInfo
= (IP_INTERFACE_INFO
*)HeapAlloc(ProcessHeap
, 0, sizeof(IP_INTERFACE_INFO
));
786 _tprintf(_T("memory allocation error"));
790 /* Make an initial call to GetInterfaceInfo to get
791 * the necessary size into the ulOutBufLen variable */
792 if (GetInterfaceInfo(pInfo
, &ulOutBufLen
) == ERROR_INSUFFICIENT_BUFFER
)
794 HeapFree(ProcessHeap
, 0, pInfo
);
795 pInfo
= (IP_INTERFACE_INFO
*)HeapAlloc(ProcessHeap
, 0, ulOutBufLen
);
798 _tprintf(_T("memory allocation error"));
803 /* Make a second call to GetInterfaceInfo to get the actual data we want */
804 if (GetInterfaceInfo(pInfo
, &ulOutBufLen
) == NO_ERROR
)
806 for (i
= 0; i
< pInfo
->NumAdapters
; i
++)
808 CopyMemory(&AdapterInfo
, &pInfo
->Adapter
[i
], sizeof(IP_ADAPTER_INDEX_MAP
));
809 _tprintf(_T("name - %ls\n"), pInfo
->Adapter
[i
].Name
);
811 /* Call IpRenewAddress to renew the IP address on the specified adapter. */
812 if (IpRenewAddress(&AdapterInfo
) != NO_ERROR
)
814 _tprintf(_T("\nAn error occured while renew interface %s : "), _T("*name*"));
821 _tprintf(_T("\nGetInterfaceInfo failed : "));
825 HeapFree(ProcessHeap
, 0, pInfo
);
831 * we need to be able to renew connections by name with support for globbing
832 * i.e. ipconfig /renew Eth* will renew all cards starting with Eth...
833 * ipconfig /renew *con* will renew all cards with 'con' in their name
841 _tprintf(_T("\nReactOS IP Configuration\n\n"));
843 if (DnsFlushResolverCache())
844 _tprintf(_T("The DNS Resolver Cache has been deleted.\n"));
846 DoFormatMessage(GetLastError());
853 _tprintf(_T("\nSorry /registerdns is not implemented yet\n"));
862 PDNS_RECORDW pQueryResults
= NULL
, pThisRecord
, pNextRecord
;
868 pQueryResults
= NULL
;
869 Status
= DnsQuery_W(pszName
,
871 DNS_QUERY_NO_WIRE_QUERY
,
873 (PDNS_RECORD
*)&pQueryResults
,
875 if (Status
!= ERROR_SUCCESS
)
877 if (Status
== DNS_ERROR_RCODE_NAME_ERROR
)
879 _tprintf(_T("\t%S\n"), pszName
);
880 _tprintf(_T("\t----------------------------------------\n"));
881 _tprintf(_T("\tName does not exist\n\n"));
883 else if (Status
== DNS_INFO_NO_RECORDS
)
885 _tprintf(_T("\t%S\n"), pszName
);
886 _tprintf(_T("\t----------------------------------------\n"));
887 _tprintf(_T("\tNo records of type %s\n\n"), GetRecordTypeName(wType
));
892 _tprintf(_T("\t%S\n"), pszName
);
893 _tprintf(_T("\t----------------------------------------\n"));
895 pThisRecord
= pQueryResults
;
896 while (pThisRecord
!= NULL
)
898 pNextRecord
= pThisRecord
->pNext
;
900 _tprintf(_T("\tRecord Name . . . . . : %S\n"), pThisRecord
->pName
);
901 _tprintf(_T("\tRecord Type . . . . . : %hu\n"), pThisRecord
->wType
);
902 _tprintf(_T("\tTime To Live. . . . . : %lu\n"), pThisRecord
->dwTtl
);
903 _tprintf(_T("\tData Length . . . . . : %hu\n"), pThisRecord
->wDataLength
);
905 switch (pThisRecord
->Flags
.S
.Section
)
907 case DnsSectionQuestion
:
908 _tprintf(_T("\tSection . . . . . . . : Question\n"));
911 case DnsSectionAnswer
:
912 _tprintf(_T("\tSection . . . . . . . : Answer\n"));
915 case DnsSectionAuthority
:
916 _tprintf(_T("\tSection . . . . . . . : Authority\n"));
919 case DnsSectionAdditional
:
920 _tprintf(_T("\tSection . . . . . . . : Additional\n"));
924 switch (pThisRecord
->wType
)
927 Addr4
.S_un
.S_addr
= pThisRecord
->Data
.A
.IpAddress
;
928 RtlIpv4AddressToStringW(&Addr4
, szBuffer
);
929 _tprintf(_T("\tA (Host) Record . . . : %S\n"), szBuffer
);
933 _tprintf(_T("\tNS Record . . . . . . : %S\n"), pThisRecord
->Data
.NS
.pNameHost
);
937 _tprintf(_T("\tCNAME Record. . . . . : %S\n"), pThisRecord
->Data
.CNAME
.pNameHost
);
941 _tprintf(_T("\tSOA Record. . . . . . : \n"));
945 _tprintf(_T("\tPTR Record. . . . . . : %S\n"), pThisRecord
->Data
.PTR
.pNameHost
);
949 _tprintf(_T("\tMX Record . . . . . . : \n"));
953 RtlCopyMemory(&Addr6
, &pThisRecord
->Data
.AAAA
.Ip6Address
, sizeof(IN6_ADDR
));
954 RtlIpv6AddressToStringW(&Addr6
, szBuffer
);
955 _tprintf(_T("\tAAAA Record . . . . . : %S\n"), szBuffer
);
959 _tprintf(_T("\tATMA Record . . . . . : \n"));
963 _tprintf(_T("\tSRV Record. . . . . . : \n"));
966 _tprintf(_T("\n\n"));
968 pThisRecord
= pNextRecord
;
971 DnsRecordListFree((PDNS_RECORD
)pQueryResults
, DnsFreeRecordList
);
978 PDNS_CACHE_ENTRY DnsEntry
= NULL
, pThisEntry
, pNextEntry
;
980 _tprintf(_T("\nReactOS IP Configuration\n\n"));
982 if (!DnsGetCacheDataTable(&DnsEntry
))
984 DoFormatMessage(GetLastError());
988 if (DnsEntry
== NULL
)
991 pThisEntry
= DnsEntry
;
992 while (pThisEntry
!= NULL
)
994 pNextEntry
= pThisEntry
->pNext
;
996 if (pThisEntry
->wType1
!= 0)
997 DisplayDnsRecord(pThisEntry
->pszName
, pThisEntry
->wType1
);
999 if (pThisEntry
->wType2
!= 0)
1000 DisplayDnsRecord(pThisEntry
->pszName
, pThisEntry
->wType2
);
1002 if (pThisEntry
->pszName
)
1003 LocalFree(pThisEntry
->pszName
);
1004 LocalFree(pThisEntry
);
1006 pThisEntry
= pNextEntry
;
1016 LPTSTR lpName
= (LPTSTR
)MAKEINTRESOURCE((IDS_USAGE
>> 4) + 1);
1018 hRes
= FindResource(hInstance
,
1023 if ((Size
= SizeofResource(hInstance
,
1026 lpUsage
= (LPTSTR
)HeapAlloc(ProcessHeap
,
1029 if (lpUsage
== NULL
)
1032 if (LoadStringAndOem(hInstance
,
1037 _tprintf(_T("%s"), lpUsage
);
1040 HeapFree(ProcessHeap
, 0, lpUsage
);
1045 int main(int argc
, char *argv
[])
1049 BOOL DoRelease
=FALSE
;
1051 BOOL DoFlushdns
=FALSE
;
1052 BOOL DoRegisterdns
=FALSE
;
1053 BOOL DoDisplaydns
=FALSE
;
1054 BOOL DoShowclassid
=FALSE
;
1055 BOOL DoSetclassid
=FALSE
;
1057 hInstance
= GetModuleHandle(NULL
);
1058 ProcessHeap
= GetProcessHeap();
1060 /* Parse command line for options we have been given. */
1061 if ((argc
> 1) && (argv
[1][0]=='/' || argv
[1][0]=='-'))
1063 if (!_tcsicmp(&argv
[1][1], _T("?")))
1067 else if (!_tcsnicmp(&argv
[1][1], _T("ALL"), _tcslen(&argv
[1][1])))
1071 else if (!_tcsnicmp(&argv
[1][1], _T("RELEASE"), _tcslen(&argv
[1][1])))
1075 else if (!_tcsnicmp(&argv
[1][1], _T("RENEW"), _tcslen(&argv
[1][1])))
1079 else if (!_tcsnicmp(&argv
[1][1], _T("FLUSHDNS"), _tcslen(&argv
[1][1])))
1083 else if (!_tcsnicmp(&argv
[1][1], _T("FLUSHREGISTERDNS"), _tcslen(&argv
[1][1])))
1085 DoRegisterdns
= TRUE
;
1087 else if (!_tcsnicmp(&argv
[1][1], _T("DISPLAYDNS"), _tcslen(&argv
[1][1])))
1089 DoDisplaydns
= TRUE
;
1091 else if (!_tcsnicmp(&argv
[1][1], _T("SHOWCLASSID"), _tcslen(&argv
[1][1])))
1093 DoShowclassid
= TRUE
;
1095 else if (!_tcsnicmp(&argv
[1][1], _T("SETCLASSID"), _tcslen(&argv
[1][1])))
1097 DoSetclassid
= TRUE
;
1103 case 1: /* Default behaviour if no options are given*/
1106 case 2: /* Process all the options that take no parameters */
1115 else if (DoFlushdns
)
1117 else if (DoRegisterdns
)
1119 else if (DoDisplaydns
)
1124 case 3: /* Process all the options that can have 1 parameter */
1126 _tprintf(_T("\nSorry /release [adapter] is not implemented yet\n"));
1129 _tprintf(_T("\nSorry /renew [adapter] is not implemented yet\n"));
1130 else if (DoShowclassid
)
1131 _tprintf(_T("\nSorry /showclassid adapter is not implemented yet\n"));
1132 else if (DoSetclassid
)
1133 _tprintf(_T("\nSorry /setclassid adapter is not implemented yet\n"));
1137 case 4: /* Process all the options that can have 2 parameters */
1139 _tprintf(_T("\nSorry /setclassid adapter [classid]is not implemented yet\n"));