/* * Append the version of WinPcap with which we we're running to a GString. */ void get_runtime_pcap_version(GString *str) { /* * On Windows, we might have been compiled with WinPcap but * might not have it loaded; indicate whether we have it or * not and, if we have it and we have "pcap_lib_version()", * what version we have. */ GModule *handle; /* handle returned by ws_module_open */ static gchar *packetVer; gchar *blankp; if (has_wpcap) { g_string_append_printf(str, "with "); if (p_pcap_lib_version != NULL) g_string_append_printf(str, p_pcap_lib_version()); else { /* * An alternative method of obtaining the version * number, by using the PacketLibraryVersion * string from packet.dll. * * Unfortunately, in WinPcap 3.0, it returns * "3.0 alpha3", even in the final version of * WinPcap 3.0, so if there's a blank in the * string, we strip it and everything after * it from the string, so we don't misleadingly * report that 3.0 alpha3 is being used when * the final version is being used. */ if (packetVer == NULL) { packetVer = "version unknown"; handle = ws_module_open("packet.dll", 0); if (handle != NULL) { if (g_module_symbol(handle, "PacketLibraryVersion", (gpointer*)&packetVer)) { packetVer = g_strdup(packetVer); blankp = strchr(packetVer, ' '); if (blankp != NULL) *blankp = '\0'; } else { packetVer = "version unknown"; } g_module_close(handle); } } g_string_append_printf(str, "WinPcap (%s)", packetVer); } } else g_string_append(str, "without WinPcap"); }
void 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, FALSE), { NULL, NULL, FALSE } }; GModule *wh; /* wpcap handle */ const symbol_table_t *sym; wh = ws_module_open("packet.dll", 0); if (!wh) { return; } sym = symbols; while (sym->name) { if (!g_module_symbol(wh, sym->name, sym->ptr)) { if (sym->optional) { /* * We don't care if it's missing; we just * don't use it. */ *sym->ptr = NULL; } else { /* * We require this symbol. */ return; } } sym++; } has_wpacket = TRUE; }
void load_wpcap(void) { /* These are the symbols I need or want from Wpcap */ static const symbol_table_t symbols[] = { SYM(pcap_lookupdev, FALSE), SYM(pcap_close, FALSE), SYM(pcap_stats, FALSE), SYM(pcap_dispatch, FALSE), SYM(pcap_snapshot, FALSE), SYM(pcap_datalink, FALSE), SYM(pcap_setfilter, FALSE), SYM(pcap_geterr, FALSE), SYM(pcap_compile, FALSE), SYM(pcap_compile_nopcap, FALSE), SYM(pcap_lookupnet, FALSE), #ifdef HAVE_PCAP_REMOTE SYM(pcap_open, FALSE), SYM(pcap_findalldevs_ex, FALSE), SYM(pcap_createsrcstr, FALSE), #endif SYM(pcap_open_live, FALSE), #ifdef HAVE_PCAP_OPEN_DEAD SYM(pcap_open_dead, FALSE), #endif #ifdef HAVE_PCAP_SETSAMPLING SYM(pcap_setsampling, TRUE), #endif SYM(pcap_loop, FALSE), SYM(pcap_freecode, TRUE), #ifdef HAVE_PCAP_FINDALLDEVS SYM(pcap_findalldevs, TRUE), SYM(pcap_freealldevs, TRUE), #endif #ifdef HAVE_PCAP_DATALINK_NAME_TO_VAL SYM(pcap_datalink_name_to_val, TRUE), #endif #ifdef HAVE_PCAP_DATALINK_VAL_TO_NAME SYM(pcap_datalink_val_to_name, TRUE), #endif #ifdef HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION SYM(pcap_datalink_val_to_description, TRUE), #endif #ifdef HAVE_PCAP_BREAKLOOP /* * We don't try to work around the lack of this at * run time; it's present in WinPcap 3.1, which is * the version we build with and ship with. */ SYM(pcap_breakloop, FALSE), #endif SYM(pcap_lib_version, TRUE), SYM(pcap_setbuff, TRUE), SYM(pcap_next_ex, TRUE), #ifdef HAVE_PCAP_LIST_DATALINKS SYM(pcap_list_datalinks, FALSE), #endif #ifdef HAVE_PCAP_SET_DATALINK SYM(pcap_set_datalink, FALSE), #endif #ifdef HAVE_PCAP_FREE_DATALINKS SYM(pcap_free_datalinks, TRUE), #endif #ifdef HAVE_BPF_IMAGE SYM(bpf_image, FALSE), #endif { NULL, NULL, FALSE } }; GModule *wh; /* wpcap handle */ const symbol_table_t *sym; wh = ws_module_open("wpcap.dll", 0); if (!wh) { return; } sym = symbols; while (sym->name) { if (!g_module_symbol(wh, sym->name, sym->ptr)) { if (sym->optional) { /* * We don't care if it's missing; we just * don't use it. */ *sym->ptr = NULL; } else { /* * We require this symbol. */ return; } } sym++; } has_wpcap = TRUE; }