首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Packet32 列舉網卡介面完整流程與註冊表解析(一)

     編輯:關於VC++

PacketGetAdapterNames — 取得系統安裝的網卡清單


BOOLEAN PacketGetAdapterNames(PTSTR pStr, PULONG BufferSize);

參數:pStr 使用者配置緩衝區;BufferSize 緩衝區大小(輸入/輸出)。

返回:成功非零;失敗零(緩衝區不足時 BufferSize 回傳所需大小)。

返回緩衝區布局(平台差異)

Windows 9x / Me (ANSI)

[名稱1]\0[名稱2]\0...\0\0[描述1]\0[描述2]\0...\0\0

Windows NT / 2000 / XP+ (Unicode 名稱 + ANSI 描述)

[名稱1_U]\0[名稱2_U]\0...\0_U\0_U[描述1_A]\0[描述2_A]\0...\0_A\0_A

解析策略:先以 wchar_t 讀取名稱區(直到雙 \0),再以 char 讀取描述區。

註冊表掃描邏輯(核心來源)

  1. 開啟鍵值:HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318} (網卡類別 GUID)
  2. 列舉子鍵 (0000, 0001...),讀取 Linkage\UpperBind 是否含 NdisWan
  3. 若是 → 讀取 Linkage\Export 取得裝置名稱 (如 \Device\NPF_{GUID})
  4. 對每個裝置名 → PacketOpenAdapter → PacketRequest(OID_GEN_VENDOR_DESCRIPTION) 取得廠商描述 → PacketCloseAdapter

備援機制:TCP/IP 綁定路徑

若上述掃描無結果(舊版驅動/虛擬介面卡),改掃:


HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage\Bind

該值為 REG_MULTI_SZ,含所有綁定 TCP/IP 的介面卡裝置名稱,同樣走 OpenAdapter → Request → CloseAdapter 取得描述。

程式碼範例


char AdapterName[8192];
ULONG AdapterLength = sizeof(AdapterName);
if (PacketGetAdapterNames(AdapterName, &AdapterLength)) {
    // 解析邏輯...
}

開發注意事項

  • 緩衝區建議 ≥ 8 KB,避免多網卡環境溢位
  • Unicode/ANSI 混合布局需小心指標運算,建議封裝解析器類別
  • 該函數為**所有監聽程式的起點**,後續 PacketOpenAdapter 依賴其傳回的裝置名稱

參考文獻

  1. 鄒建平《如何編寫網路監視器》
  2. 北京銳信《Windows NT下開發網路監控程式》
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved