/******************************************************************************************************************************/
/* 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 *);
/* 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 }
};
sym++;
}
-
has_wpacket = TRUE;
}
/* 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;
wpcap_packet_close(void *adapter)
{
+ g_assert(has_wpacket);
p_PacketCloseAdapter(adapter);
}
#include "capture_wpcap_packet.h"
#include "capture_if_details_dlg.h"
+#include "simple_dialog.h"
#define DETAILS_STR_MAX 1024
}
-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;
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 */
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");
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 */