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:
…
}
…