1. 程式人生 > >區分虛擬網絡卡與物理網絡卡

區分虛擬網絡卡與物理網絡卡

若系統中安裝了 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