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

Packet32 開啟介面卡完整流程與實作細節(二)

     編輯:關於VC++

PacketOpenAdapter — 從裝置名稱到可用句柄


LPADAPTER PacketOpenAdapter(LPTSTR AdapterName);

參數:AdapterName 格式如 \Device\NPF_{GUID} (由 PacketGetAdapterNames 取得)。

返回:成功 → 指向完整初始化 ADAPTER 的指標;失敗 → NULL。

編碼相容性處理

  • Win9x:ANSI 編碼
  • NT 系:Unicode,但函數內部偵測 ANSI 輸入並自動轉 Unicode

內部執行流程(關鍵步驟)

  1. 連線 SCM:OpenSCManager(..., SC_MANAGER_ALL_ACCESS) → 需 Administrators 權限
  2. 檢查 NPF 服務:註冊表 HKLM\SYSTEM\CurrentControlSet\Services\NPF 是否存在
  3. 不存在 → 安裝驅動:PacketInstallDriver("npf.sys") → 先找當前目錄,再找系統目錄
  4. 開啟服務:OpenService → QueryServiceStatus → 未啟動則 StartService
  5. 建立符號連結:

// 輸入: \Device\NPF_{A67CEC3B-...}
// 組裝: \\.\Packet_NPF_{A67CEC3B-...}
  1. 嘗試 CreateFile:直接用符號連結開啟
  2. 失敗 → DefineDosDevice:建立 DOS 裝置名稱映射
  3. 再次 CreateFile:GENERIC_READ | GENERIC_WRITE, OPEN_EXISTING
  4. 初始化讀取事件:PacketSetReadEvt 建立 ReadEvent
  5. 填充 ADAPTER 結構:hFile、SymbolicLink、ReadTimeOut=0、NumWrites=0

權限與部署提醒

  • 應用程式**必須以系統管理員身分執行**(SCM 存取需求)
  • 部署時需隨附 npf.sys、Oemsetup.inf 並正確簽章(Win10+ 驅動簽章強制)
  • 若目標機已安裝 WinPcap/Npcap,可略過安裝步驟,直接開啟介面卡

錯誤診斷检查清單

現象可能原因排查
返回 NULLSCM 連線失敗確認管理員權限、服務啟動類型
CreateFile 失敗符號連結錯誤/驅動未載入用 sc query npf 確認驅動狀態
權限被拒NPF 裝置 ACL 限制檢查 PacketInstallDriver 是否建立正確安全描述子
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved