📄 adinfo.c
字号:
//
// check if the adapter is already there, and remove it
//
for (TmpAdInfo = g_AdaptersInfoList; TmpAdInfo != NULL; TmpAdInfo = TmpAdInfo->Next)
{
if (TmpAdInfo->Flags == INFO_FLAG_AIRPCAP_CARD)
{
if (strcmp(TmpAdInfo->Name, name) == 0)
break;
}
}
if (TmpAdInfo != NULL)
{
//
// we already have it in the list. Just return
//
Result = TRUE;
break;
}
//
// Allocate a descriptor for this adapter
//
//here we do not acquire the mutex, since we are not touching the list, yet.
TmpAdInfo = GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(ADAPTER_INFO));
if (TmpAdInfo == NULL)
{
TRACE_PRINT("PacketAddAdapterDag: GlobalAlloc Failed");
Result = FALSE;
break;
}
// Copy the device name and description
StringCchCopyA(TmpAdInfo->Name,
sizeof(TmpAdInfo->Name),
name);
StringCchCopyA(TmpAdInfo->Description,
sizeof(TmpAdInfo->Description),
description);
TmpAdInfo->Flags = INFO_FLAG_AIRPCAP_CARD;
if(g_PAirpcapOpen)
{
AirpcapAdapter = g_PAirpcapOpen(name, ebuf);
}
else
{
AirpcapAdapter = NULL;
}
if(!AirpcapAdapter)
{
GlobalFreePtr(TmpAdInfo);
Result = FALSE;
break;
}
GllRes = g_PAirpcapGetLinkType(AirpcapAdapter, &AirpcapLinkLayer);
if(!GllRes)
{
g_PAirpcapClose(AirpcapAdapter);
GlobalFreePtr(TmpAdInfo);
Result = FALSE;
break;
}
switch(AirpcapLinkLayer)
{
case AIRPCAP_LT_802_11:
TmpAdInfo->LinkLayer.LinkType = (UINT)NdisMediumBare80211;
break;
case AIRPCAP_LT_802_11_PLUS_RADIO:
TmpAdInfo->LinkLayer.LinkType = (UINT)NdisMediumRadio80211;
break;
default:
TmpAdInfo->LinkLayer.LinkType = (UINT)NdisMediumNull; // Note: custom linktype, NDIS doesn't provide an equivalent
break;
}
//
// For the moment, we always set the speed to 54Mbps, since the speed is not channel-specific,
// but per packet
//
TmpAdInfo->LinkLayer.LinkSpeed = 54000000;
g_PAirpcapClose(AirpcapAdapter);
// Update the AdaptersInfo list
TmpAdInfo->Next = g_AdaptersInfoList;
g_AdaptersInfoList = TmpAdInfo;
}
while(FALSE);
ReleaseMutex(g_AdaptersInfoMutex);
TRACE_EXIT("PacketAddAdapterAirpcap");
return Result;
}
/*!
\brief Updates the list of the adapters using the airpcap dll.
\return If the function succeeds, the return value is nonzero.
This function populates the list of adapter descriptions, looking for DAG cards on the system.
*/
static BOOLEAN PacketGetAdaptersAirpcap()
{
CHAR Ebuf[AIRPCAP_ERRBUF_SIZE];
AirpcapDeviceDescription *Devs = NULL, *TmpDevs;
UINT i;
TRACE_ENTER("PacketGetAdaptersAirpcap");
if(!g_PAirpcapGetDeviceList(&Devs, Ebuf))
{
// No airpcap cards found on this system
TRACE_PRINT("No AirPcap adapters found");
TRACE_EXIT("PacketGetAdaptersAirpcap");
return FALSE;
}
else
{
for(TmpDevs = Devs, i = 0; TmpDevs != NULL; TmpDevs = TmpDevs->next)
{
PacketAddAdapterAirpcap(TmpDevs->Name, TmpDevs->Description);
}
}
g_PAirpcapFreeDeviceList(Devs);
TRACE_EXIT("PacketGetAdaptersAirpcap");
return TRUE;
}
#endif // HAVE_AIRPCAP_API
#ifdef HAVE_NPFIM_API
static BOOLEAN PacketAddAdapterNpfIm(PNPF_IM_DEVICE pDevice)
{
//this function should acquire the g_AdaptersInfoMutex, since it's NOT called with an ADAPTER_INFO as parameter
PADAPTER_INFO TmpAdInfo;
NPF_IM_DEV_HANDLE handle = NULL;
BYTE mac[6];
DWORD macSize = 0;
NDIS_MEDIUM medium = NdisMediumNull;
ULONGLONG linkSpeed = 0;
BOOL bResult = TRUE;
PNPF_IM_ADDRESS pAddresses = NULL;
DWORD addressesSize = 0;
DWORD returnedBytes = 0;
npf_if_addr *pnpf_if_addresses = NULL;
DWORD numAddresses;
DWORD i;
TRACE_ENTER("PacketAddAdapterNpfIm");
WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);
do
{
//
// check if the adapter is already there, and remove it
//
for (TmpAdInfo = g_AdaptersInfoList; TmpAdInfo != NULL; TmpAdInfo = TmpAdInfo->Next)
{
if (TmpAdInfo->Flags == INFO_FLAG_NPFIM_DEVICE)
{
if (strcmp(TmpAdInfo->Name, pDevice->Name) == 0)
break;
}
}
if (TmpAdInfo != NULL)
{
//
// we already have it in the list. Just return
//
//
// NOTE in this case we do not refresh the IP list
//
bResult = TRUE;
break;
}
do
{
//
// We suppose that the DLL has been loaded successfully
//
bResult = g_NpfImHandlers.NpfImOpenDevice(pDevice->Name, &handle);
if (bResult == FALSE) break;
bResult = g_NpfImHandlers.NpfImGetMedium(handle, &medium);
if (bResult == FALSE) break;
if (medium == NdisMedium802_3 || medium == NdisMediumWan)
{
DWORD bufferSize = sizeof(mac);
if (g_NpfImHandlers.NpfImIssueQueryOid(handle, OID_802_3_CURRENT_ADDRESS, mac, &bufferSize) == FALSE)
{
macSize = 0;
}
}
bResult = g_NpfImHandlers.NpfImGetLinkSpeed(handle, &linkSpeed);
if (bResult == FALSE)
{
break;
}
bResult = g_NpfImHandlers.NpfImGetIpAddresses(handle, NULL, 0, &returnedBytes);
if (bResult == TRUE)
{
//
// no ip addresses, return
//
break;
}
if (GetLastError() == ERROR_MORE_DATA)
{
pAddresses = (PNPF_IM_ADDRESS)LocalAlloc(LPTR, returnedBytes);
if (pAddresses == NULL)
{
bResult = FALSE;
break;
}
addressesSize = returnedBytes;
bResult = g_NpfImHandlers.NpfImGetIpAddresses(handle, pAddresses, addressesSize, &returnedBytes);
}
else
{
//
//unknown error listing the IP addresses
//
break;
}
}
while (FALSE);
if (handle != NULL)
g_NpfImHandlers.NpfImCloseDevice(handle);
if (bResult == FALSE)
{
break;
}
numAddresses = returnedBytes / sizeof(NPF_IM_ADDRESS);
//
// Allocate a descriptor for this adapter
//
//here we do not acquire the mutex, since we are not touching the list, yet.
TmpAdInfo = GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(ADAPTER_INFO));
if (TmpAdInfo == NULL)
{
TRACE_PRINT("PacketAddAdapterNpfIm: GlobalAlloc Failed");
bResult = FALSE;
break;
}
if (numAddresses > 0)
{
pnpf_if_addresses = (npf_if_addr*)GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(npf_if_addr) * numAddresses);
if (pnpf_if_addresses == NULL)
{
GlobalFreePtr(TmpAdInfo);
TRACE_PRINT("PacketAddAdapteNpfIm: GlobalAlloc failed");
bResult = FALSE;
break;
}
for (i = 0; i < numAddresses; i++)
{
DWORD ipAddr, netMask, broadCast;
CopyMemory(&(pnpf_if_addresses[i].IPAddress), &(pAddresses[i].IPAddress), sizeof(struct sockaddr_storage));
//
// generate the broadcast addr
switch(pAddresses[i].IPAddress.ss_family)
{
case AF_INET:
CopyMemory(&(pnpf_if_addresses[i].SubnetMask), &(pAddresses[i].SubnetMask), sizeof(struct sockaddr_storage));
CopyMemory(&(pnpf_if_addresses[i].Broadcast), &(pAddresses[i].SubnetMask), sizeof(struct sockaddr_storage));
ipAddr = ((struct sockaddr_in*)(&pnpf_if_addresses[i].IPAddress))->sin_addr.S_un.S_addr;
netMask = ((struct sockaddr_in*)(&pnpf_if_addresses[i].SubnetMask))->sin_addr.S_un.S_addr;
broadCast = ipAddr | (~netMask);
((struct sockaddr_in*)(&pnpf_if_addresses[i].Broadcast))->sin_addr.S_un.S_addr = broadCast;
break;
case AF_INET6:
default:
ZeroMemory(&(pnpf_if_addresses[i].SubnetMask), sizeof(struct sockaddr_storage));
ZeroMemory(&(pnpf_if_addresses[i].Broadcast), sizeof(struct sockaddr_storage));
break;
}
}
//
// put the ip addresses
//
TmpAdInfo->NetworkAddresses = pnpf_if_addresses;
TmpAdInfo->NNetworkAddresses = numAddresses;
}
// Copy the device name and description
StringCchCopyA(TmpAdInfo->Name,
sizeof(TmpAdInfo->Name),
pDevice->Name);
StringCchCopyA(TmpAdInfo->Description,
sizeof(TmpAdInfo->Description),
pDevice->Description);
CopyMemory(TmpAdInfo->MacAddress, mac, macSize);
TmpAdInfo->LinkLayer.LinkType = medium;
TmpAdInfo->Flags = INFO_FLAG_NPFIM_DEVICE;
TmpAdInfo->LinkLayer.LinkSpeed = linkSpeed;
// Update the AdaptersInfo list
TmpAdInfo->Next = g_AdaptersInfoList;
g_AdaptersInfoList = TmpAdInfo;
}
while(FALSE);
if (pAddresses != NULL) LocalFree(pAddresses);
ReleaseMutex(g_AdaptersInfoMutex);
TRACE_EXIT("PacketAddAdapterNpfIm");
return (BOOLEAN)bResult;
}
/*!
\brief Updates the list of the adapters using the NpfIm dll.
\return If the function succeeds, the return value is nonzero.
This function populates the list of adapter descriptions, looking for NpfIm adapters on the system.
*/
static BOOLEAN PacketGetAdaptersNpfIm()
{
PNPF_IM_DEVICE pDevices = NULL, pDevCursor;
TRACE_ENTER("PacketGetAdaptersNpfIm");
//
// We suppose that the DLL has been loaded successfully
//
if (g_NpfImHandlers.NpfImGetDeviceList(&pDevices) == FALSE)
{
TRACE_EXIT("PacketGetAdaptersNpfIm");
return FALSE;
}
for (pDevCursor = pDevices; pDevCursor != NULL; pDevCursor = pDevCursor->pNext)
{
PacketAddAdapterNpfIm(pDevCursor);
}
g_NpfImHandlers.NpfImFreeDeviceList(pDevices);
TRACE_EXIT("PacketGetAdaptersNpfIm");
return TRUE;
}
/*!
\brief Add an npfim adapter to the adapters info list, gathering information from the npfim dll
\param
\param description description of the adapter.
\return If the function succeeds, the return value is nonzero.
*/
#endif // HAVE_NPFIM_API
#ifdef HAVE_DAG_API
/*!
\brief Add a dag adapter to the adapters info list, gathering information from the dagc API
\param name Name of the adapter.
\param description description of the adapter.
\return If the function succeeds, the return value is nonzero.
*/
BOOLEAN PacketAddAdapterDag(PCHAR name, PCHAR description, BOOLEAN IsAFile)
{
//this function should acquire the g_AdaptersInfoMutex, since it's NOT called with an ADAPTER_INFO as parameter
CHAR ebuf[DAGC_ERRBUF_SIZE];
PADAPTER_INFO TmpAdInfo;
dagc_t *dagfd;
TRACE_ENTER("PacketAddAdapterDag");
//XXX what about checking if the adapter already exists???
//
// Allocate a descriptor for this adapter
//
//here we do not acquire the mutex, since we are not touching the list, yet.
TmpAdInfo = GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(ADAPTER_INFO));
if (TmpAdInfo == NULL)
{
TRACE_PRINT("PacketAddAdapterDag: GlobalAlloc Failed allocating memory for the AdInfo structure.");
TRACE_EXIT("PacketAddAdapterDag");
return FALSE;
}
// Copy the device name and description
StringCchCopyA(TmpAdInfo->Name,
sizeof(TmpAdInfo->Name),
name);
StringCchCopyA(TmpAdInfo->Description,
sizeof(TmpAdInfo->Description),
description);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -