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

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

你可能感兴趣的:(职场,休闲,winpcap)