檢測當前網卡是否處於混雜模式 – Flier????s Sky – 部落格園

來源:互聯網
上載者:User

導讀:

檢測當前網卡是否處於混雜模式

http://www.blogcn.com/user8/flier_lu/index.html?id=1245590&run=.0C9B086

    今天比較巧,剛剛把重起網卡的文章貼上來,就有同事要我寫個檢測網卡混雜模式的小工具。本以為WinPCap會提供此功能,但翻了一遍Packet32.c和其驅動代碼後,發現居然沒有提供介面。只好下班、跑步、吃飯,然後老老實實google找解決方案,呵呵
     實際上方法很簡單,開啟一個網卡裝置,查詢其全域統計資訊(IOCTL_NDIS_QUERY_GLOBAL_STATS),然後判斷相應的標誌位(NDIS_PACKET_TYPE_PROMISCUOUS)是否設定,即可判斷此網卡是否進入混雜模式。
     首先還是枚舉網卡ID,我這兒偷懶直接用WinPCap提供的PacketGetAdapterNames函數,擷取網卡列表。WinPCap 3.x返回的適配器裝置名稱是類似DeviceNPF_{4BA2EE23-C4FE-488E-98CD-FE129206458A}這種格式的,因此要字串操作去掉DeviceNPF_首碼,組裝成/.{4BA2EE23-C4FE-488E-98CD-FE129206458A}這種形式的裝置名稱,用CreateFile開啟。
 


以下為引用:

 string::size_type idx = name.find_last_of('{');

 if(idx == string::npos)
   return;

 string strDev = "//./" + name.substr(idx);

 HANDLE hNic = CreateFile(strDev.c_str(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, INVALID_HANDLE_VALUE);
 

     如果開啟裝置成功,則可以使用DeviceIoControl函數向其發送擷取全域統計資訊的請求,其實這兒叫網卡裝置配置資訊更合適 :)
 


以下為引用:

 DWORD dwInBuf = OID_GEN_CURRENT_PACKET_FILTER, dwOutBuf = 0, dwByteReturn = 0;

 if(DeviceIoControl(hNic, IOCTL_NDIS_QUERY_GLOBAL_STATS, 
   &dwInBuf, sizeof(dwInBuf), &dwOutBuf, sizeof(dwOutBuf), &dwByteReturn, NULL))
 {
   cout    
   static const char *NdisFilterTypes[] = 
   {
     "Directed", "Multicast", "All Multicast", "Broadcast", 
       "Source Routing", "Promiscuous", "SMT", "All Local",
       "Group", "All Functional", "Functional", "MAC Frame"
   };
   
   for(int i=0; i   {
     if((dwOutBuf & (1      {
       cout      }
   }        
 }
 

     網卡當前模式有多個標誌位,由DDK的ntddndis.h檔案指定標誌位意義
 


以下為引用:

 //
 // Ndis Packet Filter Bits (OID_GEN_CURRENT_PACKET_FILTER).
 //
 #define NDIS_PACKET_TYPE_DIRECTED      0x0001
 #define NDIS_PACKET_TYPE_MULTICAST    0x0002
 #define NDIS_PACKET_TYPE_ALL_MULTICAST  0x0004
 #define NDIS_PACKET_TYPE_BROADCAST    0x0008
 #define NDIS_PACKET_TYPE_SOURCE_ROUTING  0x0010
 #define NDIS_PACKET_TYPE_PROMISCUOUS   0x0020
 #define NDIS_PACKET_TYPE_SMT         0x0040
 #define NDIS_PACKET_TYPE_ALL_LOCAL    0x0080
 #define NDIS_PACKET_TYPE_MAC_FRAME    0x8000
 #define NDIS_PACKET_TYPE_FUNCTIONAL    0x4000
 #define NDIS_PACKET_TYPE_ALL_FUNCTIONAL  0x2000
 #define NDIS_PACKET_TYPE_GROUP       0x1000
 

     
     有興趣仔細看看的朋友可以參考這個討論Detecting if Adapter is in Promiscuous mode。有一個小工具也完成了類似的功能PromiscDetect,可惜不開源,不然我也不用折騰了,呵呵
     此外PCAUSA提供的兩個小工具和例子也很不錯,對瞭解NDIS很有協助

     PCAUSA NDIS Developer Tools
     MACADDR II IOCTL_NDIS_QUERY_GLOBAL_STATS Sample Application

本文轉自
http://www.cnblogs.com/flier/archive/2004/07/08/22301.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.