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
。