diff options
-rw-r--r-- | caputils/capture-pcap-util-unix.c | 92 | ||||
-rw-r--r-- | caputils/capture-pcap-util.c | 91 | ||||
-rw-r--r-- | caputils/capture-wpcap.c | 123 | ||||
-rw-r--r-- | cmake/modules/FindPCAP.cmake | 72 | ||||
-rw-r--r-- | tools/win-setup.ps1 | 8 |
5 files changed, 228 insertions, 158 deletions
diff --git a/caputils/capture-pcap-util-unix.c b/caputils/capture-pcap-util-unix.c index e963f3de60..936de1ce50 100644 --- a/caputils/capture-pcap-util-unix.c +++ b/caputils/capture-pcap-util-unix.c @@ -18,10 +18,6 @@ #include "wspcap.h" -#ifdef __APPLE__ -#include <dlfcn.h> -#endif - #ifdef HAVE_LIBCAP # include <sys/capability.h> #endif @@ -57,94 +53,6 @@ cant_get_if_list_error_message(const char *err_str) return g_strdup_printf("Can't get list of interfaces: %s", err_str); } -#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION -/* - * Request high-resolution time stamps. - * - * We don't check for errors - if this fails, we just live with boring old - * microsecond-resolution time stamps. The only errors pcap_set_tstamp_precision() - * is documenting as returning are PCAP_ERROR_TSTAMP_PRECISION_NOTSUP, which just - * means we can't do nanosecond precision on this adapter, in which case we - * just live with whatever resolution we get by default, and - * PCAP_ERROR_ACTIVATED, which shouldn't happen as we shouldn't call this - * after we've activated the pcap_t. - */ -void -request_high_resolution_timestamp(pcap_t *pcap_h) -{ -#ifdef __APPLE__ - /* - * On macOS, if you build with a newer SDK, pcap_set_tstamp_precision() - * is available, so the code will be built with it. - * - * However, if you then try to run on an older release that - * doesn't have pcap_set_tstamp_precision(), the dynamic linker - * will fail, as it won't find pcap_set_tstamp_precision(). - * - * libpcap doesn't use macOS "weak linking" for new routines, - * so we can't just check whether a pointer to - * pcap_set_tstamp_precision() is null and, if it is, not - * call it. We have to, instead, use dlopen() to load - * libpcap, and dlsym() to find a pointer to pcap_set_tstamp_precision(), - * and if we find the pointer, call it. - */ - static gboolean initialized = FALSE; - static int (*p_pcap_set_tstamp_precision)(pcap_t *, int); - - if (!initialized) { - p_pcap_set_tstamp_precision = - (int (*)(pcap_t *, int)) - dlsym(RTLD_NEXT, "pcap_set_tstamp_precision"); - initialized = TRUE; - } - if (p_pcap_set_tstamp_precision != NULL) - (*p_pcap_set_tstamp_precision)(pcap_h, PCAP_TSTAMP_PRECISION_NANO); -#else /* __APPLE__ */ - /* - * On other UN*Xes we require that we be run on an OS version - * with a libpcap equal to or later than the version with which - * we were built. - */ - pcap_set_tstamp_precision(pcap_h, PCAP_TSTAMP_PRECISION_NANO); -#endif /* __APPLE__ */ -} - -/* - * Return TRUE if the pcap_t in question is set up for high-precision - * time stamps, FALSE otherwise. - */ -gboolean -have_high_resolution_timestamp(pcap_t *pcap_h) -{ -#ifdef __APPLE__ - /* - * See above. - */ - static gboolean initialized = FALSE; - static int (*p_pcap_get_tstamp_precision)(pcap_t *); - - if (!initialized) { - p_pcap_get_tstamp_precision = - (int (*)(pcap_t *)) - dlsym(RTLD_NEXT, "pcap_get_tstamp_precision"); - initialized = TRUE; - } - if (p_pcap_get_tstamp_precision != NULL) - return (*p_pcap_get_tstamp_precision)(pcap_h) == PCAP_TSTAMP_PRECISION_NANO; - else - return FALSE; /* Can't get implies couldn't set */ -#else /* __APPLE__ */ - /* - * On other UN*Xes we require that we be run on an OS version - * with a libpcap equal to or later than the version with which - * we were built. - */ - return pcap_get_tstamp_precision(pcap_h) == PCAP_TSTAMP_PRECISION_NANO; -#endif /* __APPLE__ */ -} - -#endif /* HAVE_PCAP_SET_TSTAMP_PRECISION */ - if_capabilities_t * get_if_capabilities_local(interface_options *interface_opts, cap_device_open_err *err, char **err_str) diff --git a/caputils/capture-pcap-util.c b/caputils/capture-pcap-util.c index 6b16ddceca..7abe416557 100644 --- a/caputils/capture-pcap-util.c +++ b/caputils/capture-pcap-util.c @@ -25,6 +25,10 @@ #include <sys/socket.h> #endif +#ifdef __APPLE__ +#include <dlfcn.h> +#endif + #include "ws_attributes.h" /* @@ -1032,6 +1036,93 @@ get_pcap_timestamp_types(pcap_t *pch _U_, char **err_str _U_) return list; } +#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION +/* + * Request high-resolution time stamps. + * + * We don't check for errors - if this fails, we just live with boring old + * microsecond-resolution time stamps. The only errors pcap_set_tstamp_precision() + * is documenting as returning are PCAP_ERROR_TSTAMP_PRECISION_NOTSUP, which just + * means we can't do nanosecond precision on this adapter, in which case we + * just live with whatever resolution we get by default, and + * PCAP_ERROR_ACTIVATED, which shouldn't happen as we shouldn't call this + * after we've activated the pcap_t. + */ +void +request_high_resolution_timestamp(pcap_t *pcap_h) +{ +#ifdef __APPLE__ + /* + * On macOS, if you build with a newer SDK, pcap_set_tstamp_precision() + * is available, so the code will be built with it. + * + * However, if you then try to run on an older release that + * doesn't have pcap_set_tstamp_precision(), the dynamic linker + * will fail, as it won't find pcap_set_tstamp_precision(). + * + * libpcap doesn't use macOS "weak linking" for new routines, + * so we can't just check whether a pointer to + * pcap_set_tstamp_precision() is null and, if it is, not + * call it. We have to, instead, use dlopen() to load + * libpcap, and dlsym() to find a pointer to pcap_set_tstamp_precision(), + * and if we find the pointer, call it. + */ + static gboolean initialized = FALSE; + static int (*p_pcap_set_tstamp_precision)(pcap_t *, int); + + if (!initialized) { + p_pcap_set_tstamp_precision = + (int (*)(pcap_t *, int)) + dlsym(RTLD_NEXT, "pcap_set_tstamp_precision"); + initialized = TRUE; + } + if (p_pcap_set_tstamp_precision != NULL) + (*p_pcap_set_tstamp_precision)(pcap_h, PCAP_TSTAMP_PRECISION_NANO); +#else /* __APPLE__ */ + /* + * On other UN*Xes we require that we be run on an OS version + * with a libpcap equal to or later than the version with which + * we were built. + */ + pcap_set_tstamp_precision(pcap_h, PCAP_TSTAMP_PRECISION_NANO); +#endif /* __APPLE__ */ +} + +/* + * Return TRUE if the pcap_t in question is set up for high-precision + * time stamps, FALSE otherwise. + */ +gboolean +have_high_resolution_timestamp(pcap_t *pcap_h) +{ +#ifdef __APPLE__ + /* + * See above. + */ + static gboolean initialized = FALSE; + static int (*p_pcap_get_tstamp_precision)(pcap_t *); + + if (!initialized) { + p_pcap_get_tstamp_precision = + (int (*)(pcap_t *)) + dlsym(RTLD_NEXT, "pcap_get_tstamp_precision"); + initialized = TRUE; + } + if (p_pcap_get_tstamp_precision != NULL) + return (*p_pcap_get_tstamp_precision)(pcap_h) == PCAP_TSTAMP_PRECISION_NANO; + else + return FALSE; /* Can't get implies couldn't set */ +#else /* __APPLE__ */ + /* + * On other UN*Xes we require that we be run on an OS version + * with a libpcap equal to or later than the version with which + * we were built. + */ + return pcap_get_tstamp_precision(pcap_h) == PCAP_TSTAMP_PRECISION_NANO; +#endif /* __APPLE__ */ +} + +#endif /* HAVE_PCAP_SET_TSTAMP_PRECISION */ #ifdef HAVE_PCAP_CREATE #ifdef HAVE_BONDING diff --git a/caputils/capture-wpcap.c b/caputils/capture-wpcap.c index f34ea537e0..064b939ba3 100644 --- a/caputils/capture-wpcap.c +++ b/caputils/capture-wpcap.c @@ -46,7 +46,6 @@ gboolean has_wpcap = FALSE; * for using Wireshark? */ -static char* (*p_pcap_lookupdev) (char *); static void (*p_pcap_close) (pcap_t *); static int (*p_pcap_stats) (pcap_t *, struct pcap_stat *); static int (*p_pcap_dispatch) (pcap_t *, int, pcap_handler, guchar *); @@ -76,7 +75,7 @@ static int (*p_pcap_next_ex) (pcap_t *, struct pcap_pkthdr **pkt_header, con #ifdef HAVE_PCAP_REMOTE static pcap_t* (*p_pcap_open) (const char *, int, int, int, struct pcap_rmtauth *, char *); -static int (*p_pcap_findalldevs_ex) (char *, struct pcap_rmtauth *, +static int (*p_pcap_findalldevs_ex) (const char *, struct pcap_rmtauth *, pcap_if_t **, char *); static int (*p_pcap_createsrcstr) (char *, int, const char *, const char *, const char *, char *); @@ -106,6 +105,17 @@ static int (*p_pcap_activate)(pcap_t *); static const char *(*p_pcap_statustostr)(int); #endif +#ifdef HAVE_PCAP_SET_TSTAMP_TYPE +static int (*p_pcap_set_tstamp_type)(pcap_t *, int); +static int (*p_pcap_set_tstamp_precision)(pcap_t *, int); +static int (*p_pcap_get_tstamp_precision)(pcap_t *); +static int (*p_pcap_list_tstamp_types)(pcap_t *, int **); +static void (*p_pcap_free_tstamp_types)(int *); +static int (*p_pcap_tstamp_type_name_to_val)(const char *); +static const char * (*p_pcap_tstamp_type_val_to_name)(int); +static const char * (*p_pcap_tstamp_type_val_to_description)(int); +#endif + typedef struct { const char *name; gpointer *ptr; @@ -120,7 +130,6 @@ 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), @@ -169,6 +178,16 @@ load_wpcap(void) SYM(pcap_activate, TRUE), SYM(pcap_statustostr, TRUE), #endif +#ifdef HAVE_PCAP_SET_TSTAMP_TYPE + SYM(pcap_set_tstamp_type, TRUE), + SYM(pcap_set_tstamp_precision, TRUE), + SYM(pcap_get_tstamp_precision, TRUE), + SYM(pcap_list_tstamp_types, TRUE), + SYM(pcap_free_tstamp_types, TRUE), + SYM(pcap_tstamp_type_name_to_val, TRUE), + SYM(pcap_tstamp_type_val_to_name, TRUE), + SYM(pcap_tstamp_type_val_to_description, TRUE), +#endif { NULL, NULL, FALSE } }; @@ -261,19 +280,6 @@ cant_load_winpcap_err(const char *app_name) app_name); } -char* -pcap_lookupdev(char *errbuf) -{ - char *ret; - if (!has_wpcap) { - return NULL; - } - ret = p_pcap_lookupdev(errbuf); - if (ret == NULL) - convert_errbuf_to_utf8(errbuf); - return ret; -} - void pcap_close(pcap_t *a) { @@ -412,7 +418,7 @@ pcap_open(const char *a, int b, int c, int d, struct pcap_rmtauth *e, char *errb } int -pcap_findalldevs_ex(char *a, struct pcap_rmtauth *b, pcap_if_t **c, char *errbuf) +pcap_findalldevs_ex(const char *a, struct pcap_rmtauth *b, pcap_if_t **c, char *errbuf) { int ret; g_assert(has_wpcap); @@ -560,6 +566,81 @@ pcap_statustostr(int a) } #endif +#ifdef HAVE_PCAP_SET_TSTAMP_TYPE +int +pcap_set_tstamp_type(pcap_t *a, int b) { + g_assert(has_wpcap); + if (p_pcap_set_tstamp_type != NULL) { + return p_pcap_set_tstamp_type(a, b); + } + return PCAP_ERROR_CANTSET_TSTAMP_TYPE; +} + +int +pcap_set_tstamp_precision(pcap_t *a, int b) { + g_assert(has_wpcap); + if (p_pcap_set_tstamp_precision != NULL) { + return p_pcap_set_tstamp_precision(a, b); + } + // No error code defined so return NOTSUP. + return PCAP_ERROR_TSTAMP_PRECISION_NOTSUP; +} + +int +pcap_get_tstamp_precision(pcap_t *a) { + g_assert(has_wpcap); + if (p_pcap_get_tstamp_precision != NULL) { + return p_pcap_get_tstamp_precision(a); + } + // No error code defined so return MICRO. + return PCAP_TSTAMP_PRECISION_MICRO; +} + +int +pcap_list_tstamp_types(pcap_t *a, int **b) { + g_assert(has_wpcap); + if (p_pcap_list_tstamp_types != NULL) { + return p_pcap_list_tstamp_types(a, b); + } + return PCAP_ERROR; +} + +void +pcap_free_tstamp_types(int *a) { + g_assert(has_wpcap); + if (p_pcap_free_tstamp_types != NULL) { + p_pcap_free_tstamp_types(a); + } +} + +int +pcap_tstamp_type_name_to_val(const char *a) { + g_assert(has_wpcap); + if (p_pcap_tstamp_type_name_to_val != NULL) { + return p_pcap_tstamp_type_name_to_val(a); + } + return PCAP_ERROR; +} + +const char * +pcap_tstamp_type_val_to_name(int a) { + g_assert(has_wpcap); + if (p_pcap_tstamp_type_val_to_name != NULL) { + return p_pcap_tstamp_type_val_to_name(a); + } + return NULL; +} + +const char * +pcap_tstamp_type_val_to_description(int a) { + g_assert(has_wpcap); + if (p_pcap_tstamp_type_val_to_description != NULL) { + return p_pcap_tstamp_type_val_to_description(a); + } + return NULL; +} +#endif + int pcap_datalink_name_to_val(const char *name) { @@ -732,18 +813,12 @@ open_capture_device_local(capture_options *capture_opts, } /* - * Neither WpdPack nor the Npcap SDK as of version 1.01 defines a version - * string anywhere. Hard-code one for now. - */ -#define WINPCAP_SDK_VERSION "4.1.2" - -/* * Append the WinPcap or Npcap SDK version with which we were compiled to a GString. */ void get_compiled_caplibs_version(GString *str) { - g_string_append(str, "with WinPcap SDK (WpdPack) " WINPCAP_SDK_VERSION); + g_string_append(str, "with libpcap"); } /* diff --git a/cmake/modules/FindPCAP.cmake b/cmake/modules/FindPCAP.cmake index 0a3d4de404..75e49449e7 100644 --- a/cmake/modules/FindPCAP.cmake +++ b/cmake/modules/FindPCAP.cmake @@ -1,5 +1,5 @@ # -# - Find pcap and winpcap +# - Find libpcap # Find the native PCAP includes and library # # PCAP_INCLUDE_DIRS - where to find pcap.h, etc. @@ -7,13 +7,7 @@ # PCAP_FOUND - True if pcap found. include(FindWSWinLibs) -FindWSWinLibs("WpdPack" "PCAP_HINTS") - -# The 64-bit wpcap.lib is under /x64 -set(_PLATFORM_SUBDIR "") -if(WIN32 AND WIRESHARK_TARGET_PLATFORM STREQUAL "win64") - set(_PLATFORM_SUBDIR "/x64") -endif() +FindWSWinLibs("libpcap-*" "PCAP_HINTS") # # First, try pkg-config on platforms other than Windows. @@ -117,15 +111,22 @@ find_path(PCAP_INCLUDE_DIR "${PCAP_HINTS}/Include" ) -find_library(PCAP_LIBRARY - NAMES - pcap - wpcap - HINTS - ${PC_PCAP_LIBRARY_DIRS} - ${PCAP_CONFIG_LIBRARY_DIRS} - "${PCAP_HINTS}/Lib${_PLATFORM_SUBDIR}" -) +# On Windows we load wpcap.dll explicitly and probe its functions in +# caputils\capture-wpcap.c. We don't want to link with pcap.lib since +# that would bring in the non-capturing (null) pcap.dll from the vcpkg +# library. +if(WIN32) + set(_pkg_required_vars PCAP_INCLUDE_DIR) +else() + find_library(PCAP_LIBRARY + NAMES + pcap + HINTS + ${PC_PCAP_LIBRARY_DIRS} + ${PCAP_CONFIG_LIBRARY_DIRS} + ) + set(_pkg_required_vars PCAP_LIBRARY PCAP_INCLUDE_DIR) +endif() if(UNIX AND CMAKE_FIND_LIBRARY_SUFFIXES STREQUAL ".a") # Try to find the static library (XXX - what about AIX?) @@ -161,8 +162,8 @@ if(UNIX AND CMAKE_FIND_LIBRARY_SUFFIXES STREQUAL ".a") endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(PCAP DEFAULT_MSG PCAP_LIBRARY PCAP_INCLUDE_DIR) -mark_as_advanced(PCAP_LIBRARY PCAP_INCLUDE_DIR) +find_package_handle_standard_args(PCAP DEFAULT_MSG ${_pkg_required_vars}) +mark_as_advanced(${_pkg_required_vars}) if(PCAP_FOUND) set(PCAP_INCLUDE_DIRS ${PCAP_INCLUDE_DIR}) @@ -186,20 +187,6 @@ if(PCAP_FOUND) if(WIN32) # - # Make sure we have at least the WinPcap 3.1 SDK, because we - # we require at least libpcap 0.8's APIs. 3.1 is based on - # libpcap 0.9.2, but 3.0 is based on a pre-0.8 snapshot of - # libpcap. - # - # We check whether pcap_lib_version is defined in the pcap header, - # using it as a proxy for all the 0.8 API's. if not, we fail. - # - check_symbol_exists( pcap_lib_version ${PCAP_INCLUDE_DIR}/pcap.h HAVE_PCAP_LIB_VERSION ) - if( NOT HAVE_PCAP_LIB_VERSION ) - message(FATAL_ERROR "You need WinPcap 3.1 or later, or Npcap") - endif( NOT HAVE_PCAP_LIB_VERSION ) - - # # Prepopulate some values. WinPcap 3.1 and later, and Npcap, have these # in their SDK, and compilation checks on Windows can be slow. We check # whether they're present at run time, when we load wpcap.dll, and work @@ -210,6 +197,8 @@ if(PCAP_FOUND) set(HAVE_PCAP_FREE_DATALINKS TRUE) set(HAVE_PCAP_OPEN TRUE) set(HAVE_PCAP_SETSAMPLING TRUE) + set(HAVE_PCAP_SET_TSTAMP_PRECISION TRUE) + set(HAVE_PCAP_SET_TSTAMP_TYPE TRUE) else(WIN32) # # Make sure we have at least libpcap 0.8, because we we require at @@ -272,9 +261,16 @@ if(PCAP_FOUND) endif() if(PCAP_FOUND AND NOT TARGET pcap::pcap) - add_library(pcap::pcap UNKNOWN IMPORTED) - set_target_properties(pcap::pcap PROPERTIES - IMPORTED_LOCATION "${PCAP_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${PCAP_INCLUDE_DIRS}" - ) + if(WIN32) + add_library(pcap::pcap INTERFACE IMPORTED) + set_target_properties(pcap::pcap PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${PCAP_INCLUDE_DIRS}" + ) + else() + add_library(pcap::pcap UNKNOWN IMPORTED) + set_target_properties(pcap::pcap PROPERTIES + IMPORTED_LOCATION "${PCAP_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${PCAP_INCLUDE_DIRS}" + ) + endif() endif() diff --git a/tools/win-setup.ps1 b/tools/win-setup.ps1 index f8234a20ba..77bbc150ce 100644 --- a/tools/win-setup.ps1 +++ b/tools/win-setup.ps1 @@ -69,8 +69,8 @@ Param( # trouble instead of trying to catch exceptions everywhere. $ErrorActionPreference = "Stop" -$Win64CurrentTag = "2020-07-14" -$Win32CurrentTag = "2020-07-14" +$Win64CurrentTag = "2020-07-19" +$Win32CurrentTag = "2020-07-19" # Archive file / SHA256 $Win64Archives = @{ @@ -82,6 +82,7 @@ $Win64Archives = @{ "krb5-1.17-1-win64ws.zip" = "1f4a7ab86ae331ea9e58c9776a60def81ae9fe622882b2e8da2ad6ce6f6fb1d8"; "libgcrypt-1.8.3-win64ws.zip" = "53b1c636cb89de308ca4ea01b4990cf1deca7f6c2446189c7ff6e971137ffd76"; "libilbc-2.0.2-3-win64ws.zip" = "d7baeb98627c405bd7c3e41d6b07c4ea4f0f5db88436e566148320afd10cbb66"; + "libpcap-1.9.1-1-win64ws.zip" = "5713acad1b095b0351c3b05d7c8e51351af91ae19c306bb1aa985b69c5af7f16"; "libsmi-svn-40773-win64ws.zip" = "571fcee71d741bf847c3247d4c2e1c42388ca6a9feebe08fc0d4ce053571d15d"; "libssh-0.7.3-1-win64ws.zip" = "3a81b9f4a914a46f15243bbb13b6919ef1c20d4bf502c47646caeccff2cbd75c"; "lua-5.2.4-unicode-win64-vc14.zip" = "e8968d2c7871ce1ea82cbd29ac1b3a2c59d3dec25e483c5e12de85df66f5d928"; @@ -94,7 +95,6 @@ $Win64Archives = @{ "spandsp-0.0.6-1-win64ws.zip" = "0e46c61a5a8dca562c36e88a8962a50c1ec1a9fcf89dd05996dac5a79e454527"; "vcpkg-export-20190318-win64ws.zip" = "72c2c43594b0581de2bc86517870a561cc40df294662502536b2a6c06cace87e"; "WinSparkle-0.5.7.zip" = "56d396ef0c4e8b0589ea74134e484376ca6459d972cd1ab1da6b9624d82e6d04"; - "WpdPack_4_1_2.zip" = "ea799cf2f26e4afb1892938070fd2b1ca37ce5cf75fec4349247df12b784edbd"; "zstd-1.4.0-win64ws.zip" = "154199227bdfdfa608972bcdcea38e20768937085e5a59a8fa06c72d07b00d6b"; } @@ -107,6 +107,7 @@ $Win32Archives = @{ "krb5-1.17-1-win32ws.zip" = "f90cac08355ccfe624652d3e05f8e2e077b8830382315d4ea0a6fa52af08260b"; "libgcrypt-1.8.3-win32ws.zip" = "409b72f2809019050cca91b9e670047c50a0752ff52999089178da54ef926393"; "libilbc-2.0.2-3-win32ws.zip" = "b87967b5e46cd96d178bc3b3dbba5a75c069ef28ab8a86838c9d004690703997"; + "libpcap-1.9.1-1-win32ws.zip" = "431d8a6bac7a5e80ff8c7f1fc99388fb17c9555589b368577dc8c9d2f4499275"; "libsmi-svn-40773-win32ws.zip" = "44bc81edfeb8948322ca365fc632e419383907c305cc922e6b74fdbb13827958"; "libssh-0.7.3-1-win32ws.zip" = "b02f0d318175194ac538a24c9c9fc280a0ecad69fb3afd4945c106b4b7c4fa6f"; "lua-5.2.4-unicode-win32-vc14.zip" = "ca2368a83f623674178e9441f71fb791e3c0b46f208e3dac28c6ac735f034bff"; @@ -119,7 +120,6 @@ $Win32Archives = @{ "spandsp-0.0.6-1-win32ws.zip" = "3c25f2f4d641d4257ec9922f6db77346a8eed2e360e7d0e27b828ade19c4705b"; "vcpkg-export-20190318-win32ws.zip" = "5f9eb78b1ea9e6762c2a4104e0126f1f5453919dc9df66fef2b1e0be8d8c5829"; "WinSparkle-0.5.7.zip" = "56d396ef0c4e8b0589ea74134e484376ca6459d972cd1ab1da6b9624d82e6d04"; - "WpdPack_4_1_2.zip" = "ea799cf2f26e4afb1892938070fd2b1ca37ce5cf75fec4349247df12b784edbd"; "zstd-1.4.0-win32ws.zip" = "9141716d4d749e67dad40d4aab6bbb3206085bf68e5acb03baf1e5667aa0b6f5"; } |