as suggested by Loris: add wpcap_packet_get_version() and check the packet.dll version before using it (very restrictive for now, will check for exact DLL version strings). If version is unknown, ask user to continue or not.
svn path=/trunk/; revision=14411
This commit is contained in:
parent
b91e9cb311
commit
b5d1f77046
|
@ -79,6 +79,7 @@ gboolean has_wpacket = FALSE;
|
|||
/******************************************************************************************************************************/
|
||||
/* stuff to load WinPcap's packet.dll and the functions required from it */
|
||||
|
||||
static PCHAR (*p_PacketGetVersion) (void);
|
||||
static LPADAPTER (*p_PacketOpenAdapter) (char *adaptername);
|
||||
static void (*p_PacketCloseAdapter) (LPADAPTER);
|
||||
static int (*p_PacketRequest) (LPADAPTER, int, void *);
|
||||
|
@ -97,9 +98,10 @@ wpcap_packet_load(void)
|
|||
|
||||
/* These are the symbols I need or want from packet.dll */
|
||||
static const symbol_table_t symbols[] = {
|
||||
SYM(PacketGetVersion, FALSE),
|
||||
SYM(PacketOpenAdapter, FALSE),
|
||||
SYM(PacketCloseAdapter, FALSE),
|
||||
SYM(PacketRequest, TRUE),
|
||||
SYM(PacketRequest, FALSE),
|
||||
{ NULL, NULL, FALSE }
|
||||
};
|
||||
|
||||
|
@ -131,7 +133,6 @@ wpcap_packet_load(void)
|
|||
sym++;
|
||||
}
|
||||
|
||||
|
||||
has_wpacket = TRUE;
|
||||
}
|
||||
|
||||
|
@ -141,12 +142,22 @@ wpcap_packet_load(void)
|
|||
/* functions to access the NDIS driver values */
|
||||
|
||||
|
||||
/* get dll version */
|
||||
char *
|
||||
wpcap_packet_get_version(void)
|
||||
{
|
||||
g_assert(has_wpacket);
|
||||
return p_PacketGetVersion();
|
||||
}
|
||||
|
||||
|
||||
/* open the interface */
|
||||
void *
|
||||
wpcap_packet_open(char *if_name)
|
||||
{
|
||||
LPADAPTER adapter;
|
||||
LPADAPTER adapter;
|
||||
|
||||
g_assert(has_wpacket);
|
||||
adapter = p_PacketOpenAdapter(if_name);
|
||||
|
||||
return adapter;
|
||||
|
@ -158,6 +169,7 @@ void
|
|||
wpcap_packet_close(void *adapter)
|
||||
{
|
||||
|
||||
g_assert(has_wpacket);
|
||||
p_PacketCloseAdapter(adapter);
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,9 @@
|
|||
|
||||
extern void wpcap_packet_load(void);
|
||||
|
||||
/* get the packet.dll version info */
|
||||
extern char *wpcap_packet_get_version(void);
|
||||
|
||||
/* open the interface */
|
||||
extern void * wpcap_packet_open(char *if_name);
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
#include "capture_wpcap_packet.h"
|
||||
#include "capture_if_details_dlg.h"
|
||||
|
||||
#include "simple_dialog.h"
|
||||
|
||||
#define DETAILS_STR_MAX 1024
|
||||
|
||||
|
@ -1141,8 +1142,8 @@ capture_if_details_page_new(GtkWidget **table)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
capture_if_details_open(char *iface)
|
||||
static void
|
||||
capture_if_details_open_win(char *iface)
|
||||
{
|
||||
GtkWidget *details_open_w,
|
||||
*main_vb, *bbox, *close_bt, *help_bt;
|
||||
|
@ -1154,6 +1155,10 @@ capture_if_details_open(char *iface)
|
|||
int entries;
|
||||
|
||||
|
||||
/* open the network adapter */
|
||||
adapter = wpcap_packet_open(iface);
|
||||
|
||||
/* open a new window */
|
||||
details_open_w = window_new(GTK_WINDOW_TOPLEVEL, "Ethereal: Interface Details");
|
||||
|
||||
/* Container for the window contents */
|
||||
|
@ -1165,9 +1170,6 @@ capture_if_details_open(char *iface)
|
|||
notebook = gtk_notebook_new();
|
||||
gtk_container_add(GTK_CONTAINER(main_vb), notebook);
|
||||
|
||||
/* open the network adapter */
|
||||
adapter = wpcap_packet_open(iface);
|
||||
|
||||
/* General page */
|
||||
page_general = capture_if_details_page_new(&table);
|
||||
page_lb = gtk_label_new("General");
|
||||
|
@ -1224,4 +1226,53 @@ capture_if_details_open(char *iface)
|
|||
window_present(details_open_w);
|
||||
}
|
||||
|
||||
|
||||
static void capture_if_details_open_answered_cb(gpointer dialog _U_, gint btn, gpointer data)
|
||||
{
|
||||
switch(btn) {
|
||||
case(ESD_BTN_OK):
|
||||
capture_if_details_open_win(data);
|
||||
break;
|
||||
case(ESD_BTN_CANCEL):
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
capture_if_details_open(char *iface)
|
||||
{
|
||||
char *version;
|
||||
gboolean version_ok = FALSE;
|
||||
gpointer dialog;
|
||||
|
||||
|
||||
/* check packet.dll version */
|
||||
version = wpcap_packet_get_version();
|
||||
|
||||
/* XXX - we have to add more known DLL versions here */
|
||||
if( strcmp(version, "3, 1, 0, 24") == 0 || /* 3.1 beta 4 */
|
||||
strcmp(version, "3.0 alpha3" ) == 0 /* 3.0 release */
|
||||
) {
|
||||
version_ok = TRUE;
|
||||
}
|
||||
|
||||
if(!version_ok) {
|
||||
/* dll version unknown, warn user */
|
||||
dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK | ESD_BTN_CANCEL,
|
||||
PRIMARY_TEXT_START "Unknown WinPcap version might crash or fail!" PRIMARY_TEXT_END
|
||||
"\n\nThe WinPcap packet.dll version \"%s\" is unknown if it supports required functions!"
|
||||
"\n\nOnly WinPcap versions 3.0 and 3.1 are known to work with this feature."
|
||||
"\n\nCrashes or unexpected behaviour might occur, you have been warned!"
|
||||
"\n\nContinue anyway?",
|
||||
version);
|
||||
simple_dialog_set_cb(dialog, capture_if_details_open_answered_cb, iface);
|
||||
} else {
|
||||
capture_if_details_open_win(iface);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif /* HAVE_LIBPCAP && _WIN32 */
|
||||
|
|
Loading…
Reference in New Issue