網上流傳的判斷虛擬網卡的方式通常是判斷網卡名稱,以PCI開頭
的網卡都是真實網卡。因為以前網卡都是PCI
網卡,不是的就是虛擬網卡。但是這種方式不一定全部正確,因為現在有些網卡不是PCI
網卡,例如USB
網卡,但是它依然是真實網卡。所以這種方法就不在可靠了。 最可靠的方法是讀取注冊表來判斷,是我目前發現的最可靠的方法。 首先要知道網卡的名字,可以通過GetAdaptersInfo
獲取到 然后用GetAdaptersInfo
獲取和此名字相同的網卡信息Pip_ADAPTER_INFO
結構中的AdapterName
字段。注意AdapterName
并不是指我們通常看到的名字,而是一段字符和數字組合的文字,我們通常看到的網卡的名字是Description
字段。 然后用AdapterName
字段中的內容找到注冊表中的對應的位置,可以讓我們找到網卡的相信信息。 網卡信息存在注冊表的HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control//Class/{4D36E972-E325-11CE-BFC1-08002bE10318}
中,這個鍵下面有一些子鍵,這些子鍵中的NetCfgInstanceId
的值對應的就是我們剛才查找到的AdapterName
。這個子鍵中的Characteristics
的值就可以判斷是否是虛擬網卡,Characteristics
本質是一些按位存儲的值得集合:
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
的值就可以判斷網卡是虛擬網卡還是物理網卡。 看一下這個值和4進行與運算是否大于0,大于0的就是物理的網卡。
新聞熱點
疑難解答