您的位置:首页 > 理论基础 > 计算机网络

深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(9)

2010-06-22 23:36 381 查看
本文转自http://eslxf.blog.51cto.com/918801/198595



1.4.3.1 PacketUpdateAdInfo函数

函数PacketUpdateAdInfo()在一个全局链表g_AdaptersInfoList中更新一个适配器的信息。其原型如下:

BOOLEAN PacketUpdateAdInfo(PCHAR AdapterName);

参数AdapterName是所需更新信息的适配器名称。
如果函数成功返回TRUE,一个false值意味着适配器不可用或没有被连接。
函数PacketUpdateAdInfo()首先检查适配器AdapterNam节点在g_AdaptersInfoList链表中是否存在,如果存在则销毁该节点。然后获得适配器AdapterName的信息,并把该节点信息更新到g_AdaptersInfoList适配器链表中。
函数的主要代码实现如下:

BOOLEAN PacketUpdateAdInfo(PCHAR AdapterName)

{
PADAPTER_INFO TAdInfo, PrevAdInfo;

/*获得g_AdaptersInfoMutex互斥信号*/
WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);

PrevAdInfo = TAdInfo = g_AdaptersInfoList;

/*
*如果适配器AdapterNam节点在g_AdaptersInfoList链表中存在,
*则销毁该节点。
*/
while(TAdInfo != NULL)
{
if(strcmp(TAdInfo->Name, AdapterName) == 0)
{
if(TAdInfo == g_AdaptersInfoList)
{
g_AdaptersInfoList = TAdInfo->Next;
}
else
{
PrevAdInfo->Next = TAdInfo->Next;
}

if (TAdInfo->pNetworkAddresses != NULL)
{
PNPF_IF_ADDRESS_ITEM pItem, pNext;

pItem = TAdInfo->pNetworkAddresses;
//释放网络地址链表
while(pItem != NULL)
{
pNext = pItem->Next;

GlobalFreePtr(pItem);
pItem = pNext;
}
}

GlobalFreePtr(TAdInfo);//释放该适配器信息节点

break;
}

PrevAdInfo = TAdInfo;

TAdInfo = TAdInfo->Next;
}

/*释放g_AdaptersInfoMutex互斥信号*/
ReleaseMutex(g_AdaptersInfoMutex);

/*
*获得适配器AdapterName的信息,
*并把该节点信息添加到g_AdaptersInfoList适配器链表中。
*/
if(PacketAddAdapterNPF(AdapterName, 0) == TRUE)
{
//信息更新成功
return TRUE;
}

return TRUE;

}


1.4.3.2 PacketFindAdInfo函数

函数PacketFindAdInfo ()查找g_AdaptersInfoList全局链表,查找一个适配器的信息。其原型如下:

PADAPTER_INFO PacketFindAdInfo(PCHAR AdapterName)

参数AdapterName是所需获取信息的适配器名称
如果函数成功,返回一个指向适配器信息的PADAPTER_INFO结构体指针,如果失败,返回NULL值。
函数的主要代码实现如下:

PADAPTER_INFO PacketFindAdInfo(PCHAR AdapterName)

{
PADAPTER_INFO TAdInfo;



TAdInfo = g_AdaptersInfoList;

/*查找适配器AdapterName*/
while(TAdInfo != NULL)
{
if(strcmp(TAdInfo->Name, AdapterName) == 0)
{
//成功找到适配器AdapterName
break;
}
TAdInfo = TAdInfo->Next;
}

return TAdInfo;

}

该函数需要返回一个PADAPTER_INF类型指针, 所以不需要获取g_AdaptersInfoMutex互斥信号,而是在PacketGetNetInfoEx()函数中调用该函数时提供互斥操作的保护。

1.5 NPF中对应的函数接口

在NPF中由NPF_IoControl函数中的如下代码处理该操作。

NTSTATUS NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)

{

switch (FunctionCode){

case BIOCSETOID:
case BIOCQUERYOID:

}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐