📄 packet32.c
字号:
HKEY dagkey;
DWORD lptype;
DWORD fpc;
DWORD lpcbdata = sizeof(fpc);
WCHAR keyname[512];
PWCHAR tsn;
lpAdapter = (LPADAPTER) GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,
sizeof(ADAPTER));
if (lpAdapter == NULL)
{
return NULL;
}
if(IsAFile)
{
// We must add an entry to the adapter description list, otherwise many function will not
// be able to work
if(!PacketAddAdapterDag(AdapterName, "DAG file", IsAFile))
{
GlobalFreePtr(lpAdapter);
return NULL;
}
// Flag that this is a DAG file
lpAdapter->Flags = INFO_FLAG_DAG_FILE;
}
else
{
// Flag that this is a DAG card
lpAdapter->Flags = INFO_FLAG_DAG_CARD;
}
//
// See if the user is asking for fast capture with this device
//
lpAdapter->DagFastProcess = FALSE;
tsn = (strstr(strlwr((char*)AdapterName), "dag") != NULL)?
SChar2WChar(strstr(strlwr((char*)AdapterName), "dag")):
L"";
_snwprintf(keyname, sizeof(keyname), L"%s\\CardParams\\%ws",
L"SYSTEM\\CurrentControlSet\\Services\\DAG",
tsn);
GlobalFreePtr(tsn);
do
{
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyname, 0 , KEY_READ, &dagkey);
if(status != ERROR_SUCCESS)
break;
status = RegQueryValueEx(dagkey,
L"FastCap",
NULL,
&lptype,
(char*)&fpc,
&lpcbdata);
if(status == ERROR_SUCCESS)
lpAdapter->DagFastProcess = fpc;
RegCloseKey(dagkey);
}
while(FALSE);
//
// Open the card
//
lpAdapter->pDagCard = p_dagc_open(AdapterName,
0,
DagEbuf);
if(lpAdapter->pDagCard == NULL)
{
GlobalFreePtr(lpAdapter);
return NULL;
}
lpAdapter->DagFcsLen = p_dagc_getfcslen(lpAdapter->pDagCard);
_snprintf(lpAdapter->Name, ADAPTER_NAME_LENGTH, "%s", AdapterName);
// XXX we could create the read event here
return lpAdapter;
}
#endif // HAVE_DAG_API
//---------------------------------------------------------------------------
// PUBLIC API
//---------------------------------------------------------------------------
/** @ingroup packetapi
* @{
*/
/** @defgroup packet32 Packet.dll exported functions and variables
* @{
*/
/*!
\brief Return a string with the dll version.
\return A char pointer to the version of the library.
*/
PCHAR PacketGetVersion()
{
return PacketLibraryVersion;
}
/*!
\brief Return a string with the version of the NPF.sys device driver.
\return A char pointer to the version of the driver.
*/
PCHAR PacketGetDriverVersion()
{
return PacketDriverVersion;
}
/*!
\brief Stops and unloads the WinPcap device driver.
\return If the function succeeds, the return value is nonzero, otherwise it is zero.
This function can be used to unload the driver from memory when the application no more needs it.
Note that the driver is physically stopped and unloaded only when all the files on its devices
are closed, i.e. when all the applications that use WinPcap close all their adapters.
*/
BOOL PacketStopDriver()
{
SC_HANDLE scmHandle;
SC_HANDLE schService;
BOOL ret;
SERVICE_STATUS serviceStatus;
scmHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(scmHandle != NULL){
schService = OpenService (scmHandle,
NPFServiceName,
SERVICE_ALL_ACCESS
);
if (schService != NULL)
{
ret = ControlService (schService,
SERVICE_CONTROL_STOP,
&serviceStatus
);
if (!ret)
{
}
CloseServiceHandle (schService);
CloseServiceHandle(scmHandle);
return ret;
}
}
return FALSE;
}
/*!
\brief Opens an adapter.
\param AdapterName A string containing the name of the device to open.
Use the PacketGetAdapterNames() function to retrieve the list of available devices.
\return If the function succeeds, the return value is the pointer to a properly initialized ADAPTER object,
otherwise the return value is NULL.
*/
LPADAPTER PacketOpenAdapter(PCHAR AdapterName)
{
LPADAPTER lpAdapter;
WCHAR *AdapterNameU;
SC_HANDLE svcHandle = NULL;
PCHAR AdapterNameA = NULL;
#ifndef _WINNT4
PADAPTER_INFO TAdInfo;
#endif // _WINNT4
ODSEx("PacketOpenAdapter: trying to open the adapter=%s\n",AdapterName)
if(AdapterName[1]!=0){ //ASCII
AdapterNameU = SChar2WChar(AdapterName);
AdapterNameA = AdapterName;
AdapterName = (PCHAR)AdapterNameU;
} else { //Unicode
AdapterNameU = NULL;
AdapterNameA = WChar2SChar((PWCHAR)AdapterName);
}
#ifndef _WINNT4
WaitForSingleObject(AdaptersInfoMutex, INFINITE);
// Find the PADAPTER_INFO structure associated with this adapter
TAdInfo = PacketFindAdInfo(AdapterNameA);
if(TAdInfo == NULL)
{
PacketUpdateAdInfo(AdapterNameA);
TAdInfo = PacketFindAdInfo(AdapterNameA);
if(TAdInfo == NULL)
{
//can be an ERF file?
lpAdapter = PacketOpenAdapterDAG(AdapterNameA, TRUE);
if (AdapterNameU != NULL)
GlobalFreePtr(AdapterNameU);
else
GlobalFreePtr(AdapterNameA);
ReleaseMutex(AdaptersInfoMutex);
if (lpAdapter == NULL)
SetLastError(ERROR_BAD_UNIT); //this is the best we can do....
return lpAdapter;
}
}
if(TAdInfo->Flags != INFO_FLAG_NDIS_ADAPTER)
{
//
// Not a standard NDIS adapter, we must have specific handling
//
if(TAdInfo->Flags & INFO_FLAG_NDISWAN_ADAPTER)
{
//
// This is a wan adapter. Open it using the netmon API
//
lpAdapter = (LPADAPTER) GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,
sizeof(ADAPTER));
if (lpAdapter == NULL)
{
if (AdapterNameU != NULL) GlobalFreePtr(AdapterNameU);
else GlobalFreePtr(AdapterNameA);
ReleaseMutex(AdaptersInfoMutex);
SetLastError(ERROR_BAD_UNIT);
return NULL;
}
// Backup flags for future usage
lpAdapter->Flags = TAdInfo->Flags;
// Open the adapter
lpAdapter->pWanAdapter = WanPacketOpenAdapter();
if (lpAdapter->pWanAdapter == NULL)
{
if (AdapterNameU != NULL) GlobalFreePtr(AdapterNameU);
else GlobalFreePtr(AdapterNameA);
GlobalFreePtr(lpAdapter);
ReleaseMutex(AdaptersInfoMutex);
SetLastError(ERROR_BAD_UNIT);
return NULL;
}
_snprintf(lpAdapter->Name, ADAPTER_NAME_LENGTH, "%s", AdapterNameA);
lpAdapter->ReadEvent = WanPacketGetReadEvent(lpAdapter->pWanAdapter);
if (AdapterNameU != NULL)
GlobalFreePtr(AdapterNameU);
else
GlobalFreePtr(AdapterNameA);
ReleaseMutex(AdaptersInfoMutex);
return lpAdapter;
}
else
if(TAdInfo->Flags & INFO_FLAG_DAG_CARD)
{
//
// This is a Dag card. Open it using the dagc API
//
lpAdapter = PacketOpenAdapterDAG(AdapterNameA, FALSE);
if (AdapterNameU != NULL)
GlobalFreePtr(AdapterNameU);
else
GlobalFreePtr(AdapterNameA);
ReleaseMutex(AdaptersInfoMutex);
if (lpAdapter == NULL)
SetLastError(ERROR_BAD_UNIT);
return lpAdapter;
}
}
ReleaseMutex(AdaptersInfoMutex);
#endif // _WINNT4
lpAdapter = PacketOpenAdapterNPF(AdapterName);
if (AdapterNameU != NULL)
GlobalFreePtr(AdapterNameU);
else
GlobalFreePtr(AdapterNameA);
return lpAdapter;
}
/*!
\brief Closes an adapter.
\param lpAdapter the pointer to the adapter to close.
PacketCloseAdapter closes the given adapter and frees the associated ADAPTER structure
*/
VOID PacketCloseAdapter(LPADAPTER lpAdapter)
{
#ifndef _WINNT4
if (lpAdapter->pWanAdapter != NULL)
{
WanPacketCloseAdapter(lpAdapter->pWanAdapter);
GlobalFreePtr(lpAdapter);
return;
}
#ifdef HAVE_DAG_API
else
if(lpAdapter->pDagCard != NULL)
{
if(lpAdapter->Flags & INFO_FLAG_DAG_FILE & ~INFO_FLAG_DAG_CARD)
{
// This is a file. We must remove the entry in the adapter description list
PacketUpdateAdInfo(lpAdapter->Name);
}
p_dagc_close(lpAdapter->pDagCard);
}
#endif // HAVE_DAG_API
#endif // _WINNT4
CloseHandle(lpAdapter->hFile);
SetEvent(lpAdapter->ReadEvent);
CloseHandle(lpAdapter->ReadEvent);
GlobalFreePtr(lpAdapter);
}
/*!
\brief Allocates a _PACKET structure.
\return On succeess, the return value is the pointer to a _PACKET structure otherwise the
return value is NULL.
The structure returned will be passed to the PacketReceivePacket() function to receive the
packets from the driver.
\warning The Buffer field of the _PACKET structure is not set by this function.
The buffer \b must be allocated by the application, and associated to the PACKET structure
with a call to PacketInitPacket.
*/
LPPACKET PacketAllocatePacket(void)
{
LPPACKET lpPacket;
lpPacket=(LPPACKET)GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,sizeof(PACKET));
if (lpPacket==NULL)
{
ODS("PacketAllocatePacket: GlobalAlloc Failed\n");
return NULL;
}
return lpPacket;
}
/*!
\brief Frees a _PACKET structure.
\param lpPacket The structure to free.
\warning the user-allocated buffer associated with the _PACKET structure is not deallocated
by this function and \b must be explicitly deallocated by the programmer.
*/
VOID PacketFreePacket(LPPACKET lpPacket)
{
GlobalFreePtr(lpPacket);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -