您的位置:首页 > 其它

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

2010-06-23 10:19 274 查看
本文转自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为单位)。
参数type的LinkType成员可能为下列值:
- 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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: