若系統中安裝了 VMWare 或者某些 VPN 客戶端軟件,則會出現若干虛擬網卡。它們在形式上與物理網卡幾乎沒有區別。 ipconfig 將它們與本地物理網卡等同對待。 那如何在如何區分虛擬網卡還是物理網卡呢?
有些人建議使用 MAC 地址中的 "locally administread bit" 來區分。但是事實上不能100%區分,在win2000之后的系統基本是行不通的。
http://hi.baidu.com/xzq2000/blog/item/43b686d672cd762f07088b95.html
有人用GetAdaptersInfo 可以獲得本機所有網卡的信息,然后通過判斷是否“pci”開頭來區分是否虛擬網卡。http://blog.csdn.net/aseity/archive/2007/12/11/1929948.aspx 具體代碼如下:(以下代碼引用別處)
bool IsLocalAdapter ( const char *pAdapterName ) const
...{
?BOOL ret_value = FALSE;
#define NET_CARD_KEY "System\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}"
?char szDataBuf[MAX_PATH+1];
?DWORD dwDataLen = MAX_PATH;
?DWORD dwType = REG_SZ;
?HKEY hNetKey = NULL;
?HKEY hLocalNet = NULL;
?if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, NET_CARD_KEY, 0, KEY_READ, &hNetKey))
?return FALSE;
?sprintf(szDataBuf, "%s\Connection", pAdapterName);
?if(ERROR_SUCCESS != RegOpenKeyEx(hNetKey ,szDataBuf ,0 ,KEY_READ, &hLocalNet))
?...{
?RegCloseKey(hNetKey);
?return FALSE;
?}
?if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "MediaSubType", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
?...{
?goto ret;
?}
?if (*((DWORD *)szDataBuf)!=0x01)
?goto ret;
?dwDataLen = MAX_PATH;
?if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "PnpInstanceID", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
?...{
?goto ret;
?}
?if (strncmp(szDataBuf, "PCI", strlen("PCI")))
?goto ret;
?ret_value = TRUE;
ret:
?RegCloseKey(hLocalNet);
?RegCloseKey(hNetKey);
?return ret_value!=0;
}
這樣方法基本可以達到目標,但是也存在不能識別所有網卡類型。
還有一種更簡單,而且可以100%識別的方法,就是通過“Characteristics”這個值來確定網卡的類型是虛擬網卡還是物理網卡。
Characteristics 值在注冊表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\數字下。
在windows中,Characteristics 的取值如下,Characteristics項可以有1個或多個如下的值(多值應計算總和):
十六進制值 名字 描述
ox1 NCF_VIRTUAL 說明組件是個虛擬適配器
ox2 NCF_SOFTWARE_ENUMERATED 說明組件是一個軟件模擬的適配器
ox4 NCF_PHYSICAL 說明組件是一個物理適配器
ox8 NCF_HIDDEN 說明組件不顯示用戶接口
ox10 NCF_NO_SERVICE 說明組件沒有相關的服務(設
備驅動程序)
ox20 NCF_NOT_USER_REMOVABLE 說明不能被用戶刪除(例如,
通過控制面板或設備管理器)
ox40 NCF_MULTIPORT_INSTANCED_ADAPTER 說明組件有多個端口,每個端
口作為單獨的設備安裝。每個
端口有自己的hw_id(組件ID)
并可被單獨安裝,這只適合于
EISA適配器
ox80 NCF_HAS_UI 說明組件支持用戶接口(例如,
Advanced Page或Customer
Properties Sheet)
ox400 NCF_FILTER 說明組件是一個過濾器
從上面可以看出來,只要用戶判斷“Characteristics ”的值就可以判斷網卡是虛擬網卡還是物理網卡。
如果是虛擬網卡:Characteristics & NCF_VIRTUAL ==NCF_VIRTUAL
如果是物理網卡:Characteristics & NCF_PHYSICAL ==NCF_PHYSICAL
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jianghui3132749/archive/2009/11/25/4868350.aspx