int CheckAdapterType(char *adaptername)
{
   try
   {
        LPADAPTER hAdapter;
char openadaptername[512]; memset(openadaptername,'\0',sizeof(openadaptername));
strcpy(openadaptername,"\\Device\\NPF_");
strcat(openadaptername,adaptername);        hAdapter = PacketOpenAdapter(openadaptername);
        if (!hAdapter || (hAdapter->hFile == INVALID_HANDLE_VALUE))
            return 2;        PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)malloc(512);
        if (OidData == NULL)
        {
            free(OidData);
            PacketCloseAdapter(hAdapter);
            return 2;
        }        OidData->Oid = OID_802_3_CURRENT_ADDRESS;
        OidData->Length = 256;
        ZeroMemory(OidData->Data, 256);
        if (!PacketRequest(hAdapter, FALSE, OidData))
        {
            free(OidData);
            PacketCloseAdapter(hAdapter);
                return 2;
        }
        CString str;
        str = OidData->Data;
        int adalen;
        adalen = str.GetLength();
        PacketCloseAdapter(hAdapter);
        free(OidData);
        if (adalen==0) return 0 ; else return 1;
    }
    catch(CException e)
    {
       return 2;
    }
}
上面是我自己瞎琢磨出的一个区分虚拟网卡和物理网卡的方法;
adalen==0是物理网卡,adalen>=1是虚拟网卡;实际使用中,该方法不太可靠啊;经常会错误的分辨物理网卡和虚拟网卡;Ntddndis.h中,申明了非常多的OID,不知道哪个能分辨虚拟网卡和物理网卡?或者大家有其他的好建议能分辨此2者!

解决方案 »

  1.   

    用的是winpcap吧?
    ggz
    我也想知道
      

  2.   

    GetAdaptersInfo,根据IP_ADAPTER_INFO的Type字段判断?
      

  3.   

    GetAdaptersInfo,根据IP_ADAPTER_INFO的Type字段判断?管用?MIB_IF_TYPE_OTHER 
    MIB_IF_TYPE_ETHERNET 
    MIB_IF_TYPE_TOKENRING 
    MIB_IF_TYPE_FDDI 
    MIB_IF_TYPE_PPP 
    MIB_IF_TYPE_LOOPBACK 
    MIB_IF_TYPE_SLIP ??
      

  4.   

    虚拟网卡好像没有MAC地址吧?如果得不到MAC地址,则为虚拟网卡
    呵呵,不太会,不知道对不对
      

  5.   

    虚拟网卡一样有MAC的,感觉应该从驱动入手,但是偶驱动还没有学到家,没办法
      

  6.   

    一般虚拟拨号适配器的尾数是00,而物理网卡的一般不是00,但不敢断定。
    用GetAdapterInfo得到的就是一个网卡啊
      

  7.   

    GetAdapterInfo得到的是一个IP_ADAPTER_INFO的链表
    可能包含多个网卡的信息
      

  8.   

    用  GETADAPTERINFO 的得到的信息是无法区分虚拟网卡的比如PPPOE的虚拟网卡就不能区分PPPOE的虚拟网卡的TYPE也是MIB_IF_TYPE_OTHER 除非是微软的虚拟网卡TYPE才有可能是MIB_IF_TYPE_LOOPBACK