📄 adinfo.c
字号:
// Conver to ASCII
WideCharToMultiByte(
CP_ACP,
0,
TName, // wide-character string
-1, // number of chars in string
TAName + sizeof("\\Device\\NPF_") - sizeof("\\Device\\"), // buffer for new string
sizeof(TAName) - sizeof("\\Device\\NPF_") + sizeof("\\Device\\"), // size of buffer
NULL,
NULL);
// Put the \Device\NPF_ string at the beginning of the name
memcpy(TAName, "\\Device\\NPF_", sizeof("\\Device\\NPF_") - 1);
// If the adapter is valid, add it to the list.
AddAdapter(TAName);
RegCloseKey(OneAdapKey);
RegCloseKey(LinkageKey);
} // while enum reg keys
RegCloseKey(AdapKey);
nt4:
//
// no adapters were found under {4D36E972-E325-11CE-BFC1-08002BE10318}. This means with great probability
// that we are under Windows NT 4, so we try to look under the tcpip bindings.
//
ODS("Adapters not found under SYSTEM\\CurrentControlSet\\Control\\Class. Using the TCP/IP bindings.\n");
Status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage"),
0,
KEY_READ,
&LinkageKey);
if (Status == ERROR_SUCCESS)
{
// Retrieve the length of th binde key
Status=RegQueryValueEx(LinkageKey,
TEXT("bind"),
NULL,
&RegType,
NULL,
&RegKeySize);
// Allocate the buffer
BpStr = GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT, RegKeySize+2);
if (BpStr == NULL)
{
return FALSE;
}
// Query the key again to get its content
Status = RegQueryValueEx(LinkageKey,
TEXT("bind"),
NULL,
&RegType,
(LPBYTE)BpStr,
&RegKeySize);
RegCloseKey(LinkageKey);
// Scan the buffer with the device names
for(i = 0;;)
{
if((k = _snprintf(TAName + sizeof("\\Device\\NPF_") - sizeof("\\Device\\"), sizeof(TAName), "%S", BpStr + i)) == 0)
break;
// Put the \Device\NPF_ string at the beginning of the name
memcpy(TAName, "\\Device\\NPF_", sizeof("\\Device\\NPF_") - 1);
// If the adapter is valid, add it to the list.
AddAdapter(TAName);
i += k + 1;
}
GlobalFreePtr(BpStr);
}
else{
#ifdef _WINNT4
MessageBox(NULL,TEXT("Can not find TCP/IP bindings.\nIn order to run the packet capture driver you must install TCP/IP."),szWindowTitle,MB_OK);
ODS("Cannot find the TCP/IP bindings");
return FALSE;
#endif
}
return TRUE;
}
#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 AdaptersInfoMutex, since it's NOT called with an ADAPTER_INFO as parameter
CHAR ebuf[DAGC_ERRBUF_SIZE];
PADAPTER_INFO TmpAdInfo;
dagc_t *dagfd;
//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)
{
ODS("PacketAddAdapterDag: GlobalAlloc Failed\n");
return FALSE;
}
// Copy the device name and description
_snprintf(TmpAdInfo->Name,
sizeof(TmpAdInfo->Name),
"%s",
name);
_snprintf(TmpAdInfo->Description,
sizeof(TmpAdInfo->Description),
"%s",
description);
if(IsAFile)
TmpAdInfo->Flags = INFO_FLAG_DAG_FILE;
else
TmpAdInfo->Flags = INFO_FLAG_DAG_CARD;
if(p_dagc_open)
dagfd = p_dagc_open(name, 0, ebuf);
else
dagfd = NULL;
if(!dagfd)
{
GlobalFreePtr(TmpAdInfo);
return FALSE;
}
TmpAdInfo->LinkLayer.LinkType = p_dagc_getlinktype(dagfd);
switch(p_dagc_getlinktype(dagfd))
{
case TYPE_HDLC_POS:
TmpAdInfo->LinkLayer.LinkType = NdisMediumCHDLC; // Note: custom linktype, NDIS doesn't provide an equivalent
break;
case -TYPE_HDLC_POS:
TmpAdInfo->LinkLayer.LinkType = NdisMediumPPPSerial; // Note: custom linktype, NDIS doesn't provide an equivalent
break;
case TYPE_ETH:
TmpAdInfo->LinkLayer.LinkType = NdisMedium802_3;
break;
case TYPE_ATM:
TmpAdInfo->LinkLayer.LinkType = NdisMediumAtm;
break;
default:
TmpAdInfo->LinkLayer.LinkType = NdisMediumNull; // Note: custom linktype, NDIS doesn't provide an equivalent
break;
}
TmpAdInfo->LinkLayer.LinkSpeed = (p_dagc_getlinkspeed(dagfd) == -1)?
100000000: // Unknown speed, default to 100Mbit
p_dagc_getlinkspeed(dagfd) * 1000000;
p_dagc_close(dagfd);
WaitForSingleObject(AdaptersInfoMutex, INFINITE);
// Update the AdaptersInfo list
TmpAdInfo->Next = AdaptersInfoList;
AdaptersInfoList = TmpAdInfo;
ReleaseMutex(AdaptersInfoMutex);
return TRUE;
}
/*!
\brief Updates the list of the adapters using the DAGC API.
\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.
*/
BOOLEAN PacketGetAdaptersDag()
{
CHAR ebuf[DAGC_ERRBUF_SIZE];
dagc_if_t *devs = NULL, *tmpdevs;
UINT i;
if(p_dagc_finddevs(&devs, ebuf))
// No dag cards found on this system
return FALSE;
else
{
for(tmpdevs = devs, i=0; tmpdevs != NULL; tmpdevs = tmpdevs->next)
{
PacketAddAdapterDag(tmpdevs->name, tmpdevs->description, FALSE);
}
}
p_dagc_freedevs(devs);
return TRUE;
}
#endif // HAVE_DAG_API
/*!
\brief Find the information about an adapter scanning the global ADAPTER_INFO list.
\param AdapterName Name of the adapter whose information has to be retrieved.
\return If the function succeeds, the return value is non-null.
*/
PADAPTER_INFO PacketFindAdInfo(PCHAR AdapterName)
{
//this function should NOT acquire the AdaptersInfoMutex, since it does return an ADAPTER_INFO structure
PADAPTER_INFO TAdInfo;
if (AdaptersInfoList == NULL)
PacketPopulateAdaptersInfoList();
TAdInfo = AdaptersInfoList;
while(TAdInfo != NULL)
{
if(strcmp(TAdInfo->Name, AdapterName) == 0) break;
TAdInfo = TAdInfo->Next;
}
return TAdInfo;
}
/*!
\brief Updates information about an adapter in the global ADAPTER_INFO list.
\param AdapterName Name of the adapter whose information has to be retrieved.
\return If the function succeeds, the return value is TRUE. A false value means that the adapter is no
more valid or that it is disconnected.
*/
BOOLEAN PacketUpdateAdInfo(PCHAR AdapterName)
{
//this function should acquire the AdaptersInfoMutex, since it's NOT called with an ADAPTER_INFO as parameter
PADAPTER_INFO TAdInfo, PrevAdInfo;
WaitForSingleObject(AdaptersInfoMutex, INFINITE);
PrevAdInfo = TAdInfo = AdaptersInfoList;
//
// If an entry for this adapter is present in the list, we destroy it
//
while(TAdInfo != NULL)
{
if(strcmp(TAdInfo->Name, AdapterName) == 0)
{
if (strcmp(AdapterName, FAKE_NDISWAN_ADAPTER_NAME) == 0)
{
ReleaseMutex(AdaptersInfoMutex);
return TRUE;
}
if(TAdInfo == AdaptersInfoList)
{
AdaptersInfoList = TAdInfo->Next;
}
else
{
PrevAdInfo->Next = TAdInfo->Next;
}
if (TAdInfo->NetworkAddresses != NULL)
GlobalFreePtr(TAdInfo->NetworkAddresses);
GlobalFreePtr(TAdInfo);
break;
}
PrevAdInfo = TAdInfo;
TAdInfo = TAdInfo->Next;
}
ReleaseMutex(AdaptersInfoMutex);
//
// Now obtain the information about this adapter
//
if(AddAdapter(AdapterName) == TRUE)
return TRUE;
#ifndef _WINNT4
//
// Not a tradiditonal adapter, but possibly a Wan or DAG interface
// Gather all the available adapters from IPH API and dagc API
//
PacketGetAdaptersIPH();
PacketAddFakeNdisWanAdapter();
#ifdef HAVE_DAG_API
if(p_dagc_open == NULL)
return TRUE; // dagc.dll not present on this system.
else
PacketGetAdaptersDag();
#endif // HAVE_DAG_API
#endif // _WINNT4
// Adapter not found
return TRUE;
}
/*!
\brief Populates the list of the adapters.
This function populates the list of adapter descriptions, invoking first PacketGetAdapters() and then
PacketGetAdaptersIPH().
*/
void PacketPopulateAdaptersInfoList()
{
//this function should acquire the AdaptersInfoMutex, since it's NOT called with an ADAPTER_INFO as parameter
PADAPTER_INFO TAdInfo;
PVOID Mem1, Mem2;
WaitForSingleObject(AdaptersInfoMutex, INFINITE);
if(AdaptersInfoList)
{
// Free the old list
TAdInfo = AdaptersInfoList;
while(TAdInfo != NULL)
{
Mem1 = TAdInfo->NetworkAddresses;
Mem2 = TAdInfo;
TAdInfo = TAdInfo->Next;
if (Mem1 != NULL)
GlobalFreePtr(Mem1);
GlobalFreePtr(Mem2);
}
AdaptersInfoList = NULL;
}
//
// Fill the new list
//
if(!PacketGetAdapters())
{
// No info about adapters in the registry.
ODS("PacketPopulateAdaptersInfoList: registry scan for adapters failed!\n");
}
#ifndef _WINNT4
if(!PacketGetAdaptersIPH()){
// IP Helper API not present. We are under WinNT 4 or TCP/IP is not installed
ODS("PacketPopulateAdaptersInfoList: failed to get adapters from the IP Helper API!\n");
}
if (!PacketAddFakeNdisWanAdapter())
{
ODS("PacketPopulateAdaptersInfoList: adding fake NdisWan adapter failed.\n");
}
#ifdef HAVE_DAG_API
if(p_dagc_open == NULL)
{} // dagc.dll not present on this system.
else
{
if(!PacketGetAdaptersDag())
{
// No info about adapters in the registry.
ODS("PacketPopulateAdaptersInfoList: lookup of dag cards failed!\n");
}
}
#endif // HAVE_DAG_API
#endif // _WINNT4
ReleaseMutex(AdaptersInfoMutex);
}
#ifndef _WINNT4
BOOL PacketAddFakeNdisWanAdapter()
{
//this function should acquire the AdaptersInfoMutex, since it's NOT called with an ADAPTER_INFO as parameter
PADAPTER_INFO TmpAdInfo, SAdInfo;
// Scan the adapters list to see if this one is already present
if (!WanPacketTestAdapter())
{
ODS("Cannot add the adapter, since it cannot be opened.");
//the adapter cannot be opened, we do not list it, but we return t
return FALSE;
}
WaitForSingleObject(AdaptersInfoMutex, INFINITE);
for(SAdInfo = AdaptersInfoList; SAdInfo != NULL; SAdInfo = SAdInfo->Next)
{
if(strcmp(FAKE_NDISWAN_ADAPTER_NAME, SAdInfo->Name) == 0)
{
ODS("PacketAddFakeNdisWanAdapter: Adapter already present in the list\n");
ReleaseMutex(AdaptersInfoMutex);
return TRUE;
}
}
TmpAdInfo = GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(ADAPTER_INFO));
if (TmpAdInfo == NULL)
{
ODS("PacketAddFakeNdisWanAdapter: GlobalAlloc Failed\n");
ReleaseMutex(AdaptersInfoMutex);
return FALSE;
}
strcpy(TmpAdInfo->Name, FAKE_NDISWAN_ADAPTER_NAME);
strcpy(TmpAdInfo->Description, FAKE_NDISWAN_ADAPTER_DESCRIPTION);
TmpAdInfo->LinkLayer.LinkType = NdisMedium802_3;
TmpAdInfo->LinkLayer.LinkSpeed = 10 * 1000 * 1000; //we emulate a fake 10MBit Ethernet
TmpAdInfo->Flags = INFO_FLAG_NDISWAN_ADAPTER;
memset(TmpAdInfo->MacAddress,'0',6);
TmpAdInfo->MacAddressLen = 6;
TmpAdInfo->NetworkAddresses = NULL;
TmpAdInfo->NNetworkAddresses = 0;
TmpAdInfo->Next = AdaptersInfoList;
AdaptersInfoList = TmpAdInfo;
ReleaseMutex(AdaptersInfoMutex);
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -