ipconfig.c
来自「这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统」· C语言 代码 · 共 761 行 · 第 1/2 页
C
761 行
/*
* PROJECT: ReactOS ipconfig utility
* LICENSE: GPL - See COPYING in the top level directory
* FILE: apps/utils/net/ipconfig/ipconfig.c
* PURPOSE: Display IP info for net adapters
* PROGRAMMERS: Copyright 2005 - 2006 Ged Murphy (gedmurphy@gmail.com)
*/
/*
* TODO:
* fix renew / release
* implement flushdns, registerdns, displaydns, showclassid, setclassid
* allow globbing on adapter names
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <time.h>
#include <iphlpapi.h>
#include "resource.h"
#define GUID_LEN 40
HINSTANCE hInstance;
HANDLE ProcessHeap;
LPTSTR GetNodeTypeName(UINT NodeType)
{
static TCHAR szNode[14];
switch (NodeType)
{
case 1:
if (!LoadString(hInstance, IDS_BCAST, szNode, sizeof(szNode)))
return NULL;
break;
case 2:
if (!LoadString(hInstance, IDS_P2P, szNode, sizeof(szNode)))
return NULL;
break;
case 4:
if (!LoadString(hInstance, IDS_MIXED, szNode, sizeof(szNode)))
return NULL;
break;
case 8:
if (!LoadString(hInstance, IDS_HYBRID, szNode, sizeof(szNode)))
return NULL;
break;
default :
if (!LoadString(hInstance, IDS_UNKNOWN, szNode, sizeof(szNode)))
return NULL;
break;
}
return szNode;
}
LPTSTR GetInterfaceTypeName(UINT InterfaceType)
{
static TCHAR szIntType[25];
switch (InterfaceType)
{
case MIB_IF_TYPE_OTHER:
if (!LoadString(hInstance, IDS_OTHER, szIntType, sizeof(szIntType)))
return NULL;
break;
case MIB_IF_TYPE_ETHERNET:
if (!LoadString(hInstance, IDS_ETH, szIntType, sizeof(szIntType)))
return NULL;
break;
case MIB_IF_TYPE_TOKENRING:
if (!LoadString(hInstance, IDS_TOKEN, szIntType, sizeof(szIntType)))
return NULL;
break;
case MIB_IF_TYPE_FDDI:
if (!LoadString(hInstance, IDS_FDDI, szIntType, sizeof(szIntType)))
return NULL;
break;
case MIB_IF_TYPE_PPP:
if (!LoadString(hInstance, IDS_PPP, szIntType, sizeof(szIntType)))
return NULL;
break;
case MIB_IF_TYPE_LOOPBACK:
if (!LoadString(hInstance, IDS_LOOP, szIntType, sizeof(szIntType)))
return NULL;
break;
case MIB_IF_TYPE_SLIP:
if (!LoadString(hInstance, IDS_SLIP, szIntType, sizeof(szIntType)))
return NULL;
break;
default:
if (!LoadString(hInstance, IDS_UNKNOWN, szIntType, sizeof(szIntType)))
return NULL;
break;
}
return szIntType;
}
/* print MAC address */
PTCHAR PrintMacAddr(PBYTE Mac)
{
static TCHAR MacAddr[20];
_stprintf(MacAddr, _T("%02x-%02x-%02x-%02x-%02x-%02x"),
Mac[0], Mac[1], Mac[2], Mac[3], Mac[4], Mac[5]);
return MacAddr;
}
VOID DoFormatMessage(LONG ErrorCode)
{
LPVOID lpMsgBuf;
//DWORD ErrorCode;
if (ErrorCode == 0)
ErrorCode = GetLastError();
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
ErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
(LPTSTR) &lpMsgBuf,
0,
NULL))
{
_tprintf(_T("%s"), (LPTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
}
}
LPTSTR GetConnectionType(LPTSTR lpClass)
{
HKEY hKey = NULL;
LPTSTR ConType = NULL;
TCHAR Path[256];
LPTSTR PrePath = _T("SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\");
LPTSTR PostPath = _T("\\Connection");
DWORD PathSize;
DWORD dwType;
DWORD dwDataSize;
/* don't overflow the buffer */
PathSize = lstrlen(PrePath) + lstrlen(lpClass) + lstrlen(PostPath) + 1;
if (PathSize >= 255)
return NULL;
wsprintf(Path, _T("%s%s%s"), PrePath, lpClass, PostPath);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
Path,
0,
KEY_READ,
&hKey) == ERROR_SUCCESS)
{
if(RegQueryValueEx(hKey,
_T("Name"),
NULL,
&dwType,
NULL,
&dwDataSize) == ERROR_SUCCESS)
{
ConType = (LPTSTR)HeapAlloc(ProcessHeap,
0,
dwDataSize);
if (ConType == NULL)
return NULL;
if(RegQueryValueEx(hKey,
_T("Name"),
NULL,
&dwType,
(PBYTE)ConType,
&dwDataSize) != ERROR_SUCCESS)
{
ConType = NULL;
}
}
}
if (hKey != NULL)
RegCloseKey(hKey);
return ConType;
}
LPTSTR GetConnectionDescription(LPTSTR lpClass)
{
HKEY hBaseKey = NULL;
HKEY hClassKey = NULL;
LPTSTR lpKeyClass = NULL;
LPTSTR lpConDesc = NULL;
LPTSTR lpPath = NULL;
TCHAR szPrePath[] = _T("SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\");
DWORD dwType;
DWORD dwDataSize;
INT i;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
szPrePath,
0,
KEY_READ,
&hBaseKey) != ERROR_SUCCESS)
{
return NULL;
}
for (i=0; ; i++)
{
DWORD PathSize;
LONG Status;
TCHAR szName[10];
DWORD NameLen = 9;
if ((Status = RegEnumKeyEx(hBaseKey,
i,
szName,
&NameLen,
NULL,
NULL,
NULL,
NULL)) != ERROR_SUCCESS)
{
if (Status == ERROR_NO_MORE_ITEMS)
{
DoFormatMessage(Status);
lpConDesc = NULL;
goto CLEANUP;
}
else
continue;
}
PathSize = lstrlen(szPrePath) + lstrlen(szName) + 1;
lpPath = (LPTSTR)HeapAlloc(ProcessHeap,
0,
PathSize * sizeof(TCHAR));
if (lpPath == NULL)
goto CLEANUP;
wsprintf(lpPath, _T("%s%s"), szPrePath, szName);
//MessageBox(NULL, lpPath, NULL, 0);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
lpPath,
0,
KEY_READ,
&hClassKey) != ERROR_SUCCESS)
{
goto CLEANUP;
}
HeapFree(ProcessHeap, 0, lpPath);
lpPath = NULL;
if(RegQueryValueEx(hClassKey,
_T("NetCfgInstanceId"),
NULL,
&dwType,
NULL,
&dwDataSize) == ERROR_SUCCESS)
{
lpKeyClass = (LPTSTR)HeapAlloc(ProcessHeap,
0,
dwDataSize);
if (lpKeyClass == NULL)
goto CLEANUP;
if(RegQueryValueEx(hClassKey,
_T("NetCfgInstanceId"),
NULL,
&dwType,
(PBYTE)lpKeyClass,
&dwDataSize) != ERROR_SUCCESS)
{
lpKeyClass = NULL;
HeapFree(ProcessHeap, 0, lpKeyClass);
continue;
}
}
else
continue;
if (!lstrcmp(lpClass, lpKeyClass))
{
HeapFree(ProcessHeap, 0, lpKeyClass);
lpKeyClass = NULL;
if(RegQueryValueEx(hClassKey,
_T("DriverDesc"),
NULL,
&dwType,
NULL,
&dwDataSize) == ERROR_SUCCESS)
{
lpConDesc = (LPTSTR)HeapAlloc(ProcessHeap,
0,
dwDataSize);
if (lpConDesc == NULL)
goto CLEANUP;
if(RegQueryValueEx(hClassKey,
_T("DriverDesc"),
NULL,
&dwType,
(PBYTE)lpConDesc,
&dwDataSize) != ERROR_SUCCESS)
{
lpConDesc = NULL;
goto CLEANUP;
}
}
else
lpConDesc = NULL;
break;
}
}
CLEANUP:
if (hBaseKey != NULL)
RegCloseKey(hBaseKey);
if (hClassKey != NULL)
RegCloseKey(hClassKey);
if (lpConDesc != NULL)
HeapFree(ProcessHeap, 0, lpPath);
if (lpConDesc != NULL)
HeapFree(ProcessHeap, 0, lpKeyClass);
return lpConDesc;
}
VOID ShowInfo(BOOL bAll)
{
PIP_ADAPTER_INFO pAdapterInfo = NULL;
PIP_ADAPTER_INFO pAdapter = NULL;
ULONG adaptOutBufLen = 0;
PFIXED_INFO pFixedInfo = NULL;
ULONG netOutBufLen = 0;
/* call GetAdaptersInfo to obtain the adapter info */
if (GetAdaptersInfo(pAdapterInfo, &adaptOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
pAdapterInfo = (IP_ADAPTER_INFO *)HeapAlloc(ProcessHeap, 0, adaptOutBufLen);
if (pAdapterInfo == NULL)
return;
if (GetAdaptersInfo(pAdapterInfo, &adaptOutBufLen) != NO_ERROR)
{
DoFormatMessage(0);
HeapFree(ProcessHeap, 0, pAdapterInfo);
return;
}
}
else
{
DoFormatMessage(0);
return;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?