生而自由

自由而无用的灵魂

VC GetAdaptersInfo获取网络连接信息

记录一下VC通过GetAdaptersInfo获取网络连接信息的代码,注意已经禁用的网络连接无法通过该接口获取到。 而且获取到的连接不一定是物理网卡,可以通过读取对应的注册表项中的“PnpInstanceID”来判断,一般情况下如果是“PCI”或者“USB”开头的设备,可以认为是物理设备。

如果想获取禁用了的网络连接,可以尝试用WMI来获取,但用WMI仍然无法获取到禁用的网卡的MAC地址,据网上的资料描述是因为网卡被禁用后其驱动也被卸载、因此无法获取到MAC地址。

#include <Windows.h>
#include <iphlpapi.h>

#pragma comment(lib, "IPHLPAPI.lib")

int test()
{
	PIP_ADAPTER_INFO pAdapterInfo;
	PIP_ADAPTER_INFO pAdapter = NULL;
	DWORD dwRetVal = 0;

	pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
	ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);

	if (ERROR_BUFFER_OVERFLOW == GetAdaptersInfo(pAdapterInfo, &ulOutBufLen))
	{
		free(pAdapterInfo);
		pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
	}

	if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
	{
		USES_CONVERSION;

		pAdapter = pAdapterInfo;
		while (pAdapter)
		{
			CString strName = A2W(pAdapter->AdapterName);

			wcout << strName.GetString() << endl;

			/*
			//从注册表或者网卡的更多信息,尤其是可以通过PnpInstanceID判断是否是物理网卡
			CString strRegPath;
			strRegPath.Format(_T("SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection"), strName);

			CString strPnp = readRegValue(HKEY_LOCAL_MACHINE, strRegPath, _T("PnpInstanceID"));
			*/

			pAdapter = pAdapter->Next;
		}

		free(pAdapterInfo);
	}

	return 0;
}

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code