网卡别名就是网卡上显示的名字,如下图所示的VMnet0,VMnet1,本地连接,以太网,以太网2等,那么该如何获取网卡的别名呢?
代码如下所示,主要思路是,首先获得网卡的AdapterName,然后读取注册表"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\AdapterName\Connection\"中的Name键值即可。其中,AdapterName是IP_ADAPTER_INFO结构体的成员,每个网卡都有一个IP_ADAPTER_INFO结构体来保存信息,通过调用API函数GetAdaptersInfo可以获得所有网卡的结构体的链表指针。
注册表的键值如下图所示:
示例代码:
PIP_ADAPTER_INFO NetCardInfo::ShowNetCardInfo(int* count) {
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO*)GlobalAlloc(GPTR, sizeof(IP_ADAPTER_INFO));
if (pAdapterInfo == NULL)
{
printf("ShowNetCardInfo GlobalAlloc error\r\n");
return FALSE;
}
if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
GlobalFree((char*)pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO*)GlobalAlloc(GPTR, ulOutBufLen);
if (pAdapterInfo == NULL)
{
printf("ShowNetCardInfo GlobalAlloc error\r\n");
return FALSE;
}
}
if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == NO_ERROR)
{
int number = 0;
PIP_ADAPTER_INFO pAdapter = 0;
printf("本机安装的网卡列表如下:\r\n");
for (pAdapter = pAdapterInfo; pAdapter != NULL; pAdapter = pAdapter->Next)
{
number++;
string aliasname = getAdapterAlias(pAdapter->AdapterName);
printf("网卡号码:\t%d\r\n网卡名称:\t%s\r\n网卡别名:\t%s\r\n网卡描述:\t%s\r\n网卡类型:\t%d\r\n网卡IP地址:\t%s\r\n网关IP地址:\t%s\r\n\r\n",
number, pAdapter->AdapterName, aliasname.c_str(), pAdapter->Description, pAdapter->Type, pAdapter->IpAddressList.IpAddress.String,
pAdapter->GatewayList.IpAddress.String);
}
*count = number;
return pAdapterInfo;
}
else
{
printf("GetNetCardInfo GetAdaptersInfo error\r\n");
GlobalFree((char*)pAdapterInfo);
return FALSE;
}
}
string NetCardInfo::getAdapterAlias(string adaptername) {
unsigned char szalias[MAX_PATH] = { 0 };
//subkey can not be \\SYSTEM\\xxx,why?
string subkey = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\" + adaptername + "\\Connection\\";
int cpubits = Tools::GetCpuBits();
int ret = Tools::QueryRegistryValue(HKEY_LOCAL_MACHINE, (char*)subkey.c_str(), "Name", szalias, cpubits);
if (ret)
{
return string((char*)szalias);
}
return "";
}