深度剖析WinPcap之(八)——打开与关闭适配器(12)

本文转自http://eslxf.blog.51cto.com/918801/208598

 

1.5.2.1.2     PacketGetNetType函数
函数PacketGetNetType返回一个适配器的MAC类型的信息。函数原型如下
BOOLEAN PacketGetNetType(LPADAPTER AdapterObject, NetType *type)
参数AdapterObject为需要获取信息的适配器。参数type指向一个NetType结构体,将被函数填充。
如果函数成功,返回非0值,否则返回0值。  
函数的主要代码如下:
BOOLEAN PacketGetNetType(LPADAPTER AdapterObject, NetType *type)
{
    PADAPTER_INFO TAdInfo;
    BOOLEAN ret;   
 
    WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);
 
    //查找该适配器的PADAPTER_INFO结构体
    TAdInfo = PacketFindAdInfo(AdapterObject->Name);
 
    if(TAdInfo != NULL)
    {//找到该适配器,获得type
        memcpy(type, &(TAdInfo->LinkLayer),
sizeof(struct NetType));
        ret = TRUE;
    }
    else
    {//没找到适配器
        ret =  FALSE;
    }
 
    ReleaseMutex(g_AdaptersInfoMutex);
 
    return ret;
}
函数返回一个已打开适配器数据链路层的类型与速度(以bps为单位)。
参数typeLinkType成员可能为下列值:
  - NdisMedium802_3: Ethernet (802.3)
  - NdisMediumWan: WAN
  - NdisMedium802_5: Token Ring (802.5)
  - NdisMediumFddi: FDDI
  - NdisMediumAtm: ATM
  - NdisMediumArcnet878_2: ARCNET (878.2)
1.5.2.1.3      PacketSetHwFilter函数
函数PacketSetHwFilter对到来的数据包设置一个硬件过滤器。函数原型如下
BOOLEAN PacketSetHwFilter(LPADAPTER  AdapterObject,ULONG Filter)
参数AdapterObject指向一个_ADAPTER结构体,参数Filter是过滤器的类型。函数如果成功,返回非0值。
函数的主要代码如下:
BOOLEAN PacketSetHwFilter(LPADAPTER  AdapterObject,ULONG Filter)
{
    BOOLEAN    Status;
    ULONG      IoCtlBufferLength
=(sizeof(PACKET_OID_DATA)+sizeof(ULONG)-1);
    PPACKET_OID_DATA  OidData;
    …
    if (AdapterObject->Flags == INFO_FLAG_NDIS_ADAPTER)
    {
        OidData=GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,
IoCtlBufferLength);
        if (OidData == NULL) {
           //分配失败,函数返回
        }
        OidData->Oid=OID_GEN_CURRENT_PACKET_FILTER;
        OidData->Length=sizeof(ULONG);
        *((PULONG)OidData->Data)=Filter;
        Status=PacketRequest(AdapterObject,TRUE,OidData);
        GlobalFreePtr(OidData);
    }
    else
    {   //该类型的适配器不支持所设置的硬件过滤器类型
        Status = FALSE;
    }
 
    return Status;
}
函数主要依靠PacketRequest函数实行设置,实际上该过滤器的过滤由NPF设备驱动下面一层的网卡执行计算。
下列是一些常用的硬件过滤器类型,完整的列表参见ntddndis.h文件。
Ø NDIS_PACKET_TYPE_PROMISCUOUS:设置为混杂模式,网卡接收到来的每个数据包。
Ø NDIS_PACKET_TYPE_DIRECTED:网卡只接收到本机的数据包。
Ø NDIS_PACKET_TYPE_BROADCAST:网卡只接收广播数据包。
Ø NDIS_PACKET_TYPE_MULTICAST:网卡只接收所属多播组的多播数据包。
Ø NDIS_PACKET_TYPE_ALL_MULTICAST:网卡接收所有的多播数据包。NDIS_PACKET_TYPE_ALL_LOCAL:接收所有发送给本机的数据包,也就是,NDIS_PACKET_TYPE_DIRECTED + NDIS_PACKET_TYPE_BROADCAST + NDIS_PACKET_TYPE_MULTICAST

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值