From 608835bf56bc39e4f21b72d59aced70a3740c84b Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Tue, 14 Jul 2020 00:11:05 -0700 Subject: [PATCH] Don't call any routines from WinPcap/Npcap packet32.dll. We aren't using them now; stick to libpcap APIs (including Windows-only libpcap APIs). Change-Id: I812eaa31ba1e6e611418853105d3e00c9130a420 Reviewed-on: https://code.wireshark.org/review/37852 Petri-Dish: Guy Harris Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris --- caputils/CMakeLists.txt | 1 - caputils/capture_wpcap_packet.c | 273 -------------------------------- caputils/capture_wpcap_packet.h | 39 ----- doc/README.capture | 2 - dumpcap.c | 4 - ui/qt/main.cpp | 4 - 6 files changed, 323 deletions(-) delete mode 100644 caputils/capture_wpcap_packet.c delete mode 100644 caputils/capture_wpcap_packet.h diff --git a/caputils/CMakeLists.txt b/caputils/CMakeLists.txt index 74c9496834..e65759f79e 100644 --- a/caputils/CMakeLists.txt +++ b/caputils/CMakeLists.txt @@ -18,7 +18,6 @@ if(WIN32) set(PLATFORM_CAPUTILS_SRC capture_win_ifnames.c capture-wpcap.c - capture_wpcap_packet.c ) endif() diff --git a/caputils/capture_wpcap_packet.c b/caputils/capture_wpcap_packet.c deleted file mode 100644 index 15aa8cd326..0000000000 --- a/caputils/capture_wpcap_packet.c +++ /dev/null @@ -1,273 +0,0 @@ -/* capture_wpcap_packet.c - * WinPcap/Npcap-specific interfaces for low-level information (packet.dll). - * We load WinPcap/Npcap at run time, so that we only need one Wireshark - * binary and one TShark binary for Windows, regardless of whether - * WinPcap/Npcap is installed or not. - * - * Wireshark - Network traffic analyzer - * By Gerald Combs - * Copyright 2001 Gerald Combs - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -#include "config.h" - -#if defined HAVE_LIBPCAP && defined _WIN32 - -#include -#include - -#include "wspcap.h" - -/* XXX - yes, I know, I should move cppmagic.h to a generic location. */ -#include "tools/lemon/cppmagic.h" - -#include - -#include -#include - -#include "caputils/capture_wpcap_packet.h" -#include - -#include - -gboolean has_wpacket = FALSE; - -/* This module will use the PacketRequest function in packet.dll (coming - * with WinPcap and Npcap) to "directly" access the Win32 NDIS network - * driver(s) and ask for various values (status, statistics, ...). - * - * Unfortunately, the definitions required for this are not available through the usual windows header files, - * but require the Windows "Device Driver Kit" which is not available for free :-( - * - * - * - * Fortunately, the definitions needed to access the various NDIS values are available from various OSS projects: - * - WinPcap in Ntddndis.h - * - Ndiswrapper in driver/ndis.h and driver/iw_ndis.h - * - cygwin (MingW?) in usr/include/w32api/ddk/ndis.h and ntddndis.h - * - FreeBSD (netperf) - */ - -/* The description of the NDIS driver API is available at: - * https://docs.microsoft.com/en-us/windows-hardware/drivers/network/ndis-core-functionality2 - */ - -/* Some more interesting links: - * https://sourceforge.net/projects/ndiswrapper/ - * http://www.osronline.com/lists_archive/windbg/thread521.html - * http://cvs.sourceforge.net/viewcvs.py/mingw/w32api/include/ddk/ndis.h?view=markup - * http://cvs.sourceforge.net/viewcvs.py/mingw/w32api/include/ddk/ntddndis.h?view=markup - */ - - - -/******************************************************************************************************************************/ -/* stuff to load WinPcap/Npcap'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 *); - -typedef struct { - const char *name; - gpointer *ptr; - gboolean optional; -} symbol_table_t; - -#define SYM(x, y) { G_STRINGIFY(x) , (gpointer) &CONCAT(p_,x), y } - -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; -} - - - -/******************************************************************************************************************************/ -/* functions to access the NDIS driver values */ - - -/* get dll version */ -char * -wpcap_packet_get_version(void) -{ - if(!has_wpacket) { - return NULL; - } - return p_PacketGetVersion(); -} - - -/* open the interface */ -void * -wpcap_packet_open(char *if_name) -{ - LPADAPTER adapter; - - g_assert(has_wpacket); - adapter = p_PacketOpenAdapter(if_name); - - return adapter; -} - - -/* close the interface */ -void -wpcap_packet_close(void *adapter) -{ - - g_assert(has_wpacket); - p_PacketCloseAdapter(adapter); -} - - -/* do a packet request call */ -int -wpcap_packet_request(void *adapter, ULONG Oid, int set, char *value, unsigned int *length) -{ - BOOLEAN Status; - ULONG IoCtlBufferLength=(sizeof(PACKET_OID_DATA) + (*length) - 1); - PPACKET_OID_DATA OidData; - - - g_assert(has_wpacket); - - if(p_PacketRequest == NULL) { - g_warning("packet_request not available\n"); - return 0; - } - - /* get a buffer suitable for PacketRequest() */ - OidData=GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,IoCtlBufferLength); - if (OidData == NULL) { - g_warning("GlobalAllocPtr failed for %u\n", IoCtlBufferLength); - return 0; - } - - OidData->Oid = Oid; - OidData->Length = *length; - memcpy(OidData->Data, value, *length); - - Status = p_PacketRequest(adapter, set, OidData); - - if(Status) { - if(OidData->Length <= *length) { - /* copy value from driver */ - memcpy(value, OidData->Data, OidData->Length); - *length = OidData->Length; - } else { - /* the driver returned a value that is longer than expected (and longer than the given buffer) */ - g_warning("returned oid too long, Oid: 0x%x OidLen:%u MaxLen:%u", Oid, OidData->Length, *length); - Status = FALSE; - } - } - - GlobalFreePtr (OidData); - - if(Status) { - return 1; - } else { - return 0; - } -} - - -/* get an UINT value using the packet request call */ -int -wpcap_packet_request_uint(void *adapter, ULONG Oid, UINT *value) -{ - BOOLEAN Status; - int length = sizeof(UINT); - - - Status = wpcap_packet_request(adapter, Oid, FALSE /* !set */, (char *) value, &length); - if(Status && length == sizeof(UINT)) { - return 1; - } else { - return 0; - } -} - - -/* get an ULONG value using the NDIS packet request call */ -int -wpcap_packet_request_ulong(void *adapter, ULONG Oid, ULONG *value) -{ - BOOLEAN Status; - int length = sizeof(ULONG); - - - Status = wpcap_packet_request(adapter, Oid, FALSE /* !set */, (char *) value, &length); - if(Status && length == sizeof(ULONG)) { - return 1; - } else { - return 0; - } -} - - -#else /* HAVE_LIBPCAP && _WIN32 */ - -void -wpcap_packet_load(void) -{ - return; -} - -#endif /* HAVE_LIBPCAP */ - -/* - * Editor modelines - https://www.wireshark.org/tools/modelines.html - * - * Local variables: - * c-basic-offset: 4 - * tab-width: 8 - * indent-tabs-mode: nil - * End: - * - * ex: set shiftwidth=4 tabstop=8 expandtab: - * :indentSize=4:tabSize=8:noTabs=true: - */ diff --git a/caputils/capture_wpcap_packet.h b/caputils/capture_wpcap_packet.h deleted file mode 100644 index 5590a427be..0000000000 --- a/caputils/capture_wpcap_packet.h +++ /dev/null @@ -1,39 +0,0 @@ -/* capture_wpcap_packet.h - * - * Wireshark - Network traffic analyzer - * By Gerald Combs - * Copyright 2001 Gerald Combs - * - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -#ifndef CAPTURE_WPCAP_PACKET_H -#define CAPTURE_WPCAP_PACKET_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -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); - -/* close the interface */ -extern void wpcap_packet_close(void * adapter); - -extern int wpcap_packet_request(void *a, ULONG Oid, int set, char *value, unsigned int *length); - -extern int wpcap_packet_request_uint(void *a, ULONG Oid, UINT *value); - -extern int wpcap_packet_request_ulong(void *a, ULONG Oid, ULONG *value); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* CAPTURE_WPCAP_PACKET_H */ diff --git a/doc/README.capture b/doc/README.capture index 3451c09fc9..d6ef3f68f0 100644 --- a/doc/README.capture +++ b/doc/README.capture @@ -15,8 +15,6 @@ capture-pcap-util-int.h capture-pcap-util-unix.c capture-wpcap.c capture-wpcap.h -capture_wpcap_packet.c -capture_wpcap_packet.h Capture related source files: ----------------------------- diff --git a/dumpcap.c b/dumpcap.c index dd38b4dc8a..2d4e0195d3 100644 --- a/dumpcap.c +++ b/dumpcap.c @@ -4578,10 +4578,6 @@ main(int argc, char *argv[]) /* Load wpcap if possible. Do this before collecting the run-time version information */ load_wpcap(); - - /* ... and also load the packet.dll from wpcap */ - /* XXX - currently not required, may change later. */ - /*wpcap_packet_load();*/ #endif /* Initialize the version information. */ diff --git a/ui/qt/main.cpp b/ui/qt/main.cpp index a834dcaf51..6a275dcf61 100644 --- a/ui/qt/main.cpp +++ b/ui/qt/main.cpp @@ -101,7 +101,6 @@ #ifdef _WIN32 # include "caputils/capture-wpcap.h" -# include "caputils/capture_wpcap_packet.h" # include #endif /* _WIN32 */ @@ -471,9 +470,6 @@ int main(int argc, char *qt_argv[]) /* Load wpcap if possible. Do this before collecting the run-time version information */ load_wpcap(); - /* ... and also load the packet.dll from wpcap */ - wpcap_packet_load(); - #ifdef HAVE_AIRPCAP /* Load the airpcap.dll. This must also be done before collecting * run-time version information. */