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 << endl << " mode="; 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<(sizeof(NdisFilterTypes) / sizeof(NdisFilterTypes[0])); i++) { if((dwOutBuf & (1 << i)) != 0) { cout << NdisFilterTypes[i] << " "; } } }
网卡当前模式有多个标志位,由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