X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;f=capture_wpcap_packet.c;h=58e30ff42b3853860b39cd426d48bfa0ee221f42;hb=c0864d4a0d445495fb6a15fddb6df03a4f802951;hp=62623ca06b456e412b5317d502baded7a3e28015;hpb=05bc7d37bc1c5abf044960335c45ec785065d89f;p=obnox%2Fwireshark%2Fwip.git diff --git a/capture_wpcap_packet.c b/capture_wpcap_packet.c index 62623ca06b..58e30ff42b 100644 --- a/capture_wpcap_packet.c +++ b/capture_wpcap_packet.c @@ -1,5 +1,5 @@ /* capture_wpcap_packet.c - * WinPcap-specific interfaces for low-level information (packet.dll). + * WinPcap-specific interfaces for low-level information (packet.dll). * We load WinPcap at run * time, so that we only need one Wireshark binary and one TShark binary * for Windows, regardless of whether WinPcap is installed or not. @@ -34,7 +34,6 @@ #include #include -#include #include /* XXX - yes, I know, I should move cppmagic.h to a generic location. */ @@ -42,12 +41,27 @@ #include +#include /* Needed here to force a definition of WINVER */ + /* for some (all ?) Microsoft compilers newer than vc6. */ + /* (If windows.h were used instead, there might be */ + /* issues re winsock.h included before winsock2.h ) */ +#include +#include +#include "capture_wpcap_packet.h" +#include -#ifndef HAVE_SOCKADDR_STORAGE -/* packet32.h requires sockaddr_storage (usually defined in Platform SDK) +/* packet32.h requires sockaddr_storage + * whether sockaddr_storage is defined or not depends on the Platform SDK + * version installed. The only one not defining it is the SDK that comes + * with MSVC 6.0 (WINVER 0x0400). + * * copied from RFC2553 (and slightly modified because of datatypes) ... * XXX - defined more than once, move this to a header file */ +#ifndef WINVER +#error WINVER not defined .... +#endif +#if (WINVER <= 0x0400) && defined(_MSC_VER) typedef unsigned short eth_sa_family_t; /* @@ -78,24 +92,18 @@ struct sockaddr_storage { /* __ss_pad1, __ss_align fields is 112 */ }; /* ... copied from RFC2553 */ -#endif - +#endif /* WINVER */ #include -#include -#include -#include - -#include "capture_wpcap_packet.h" gboolean has_wpacket = FALSE; -/* This module will use the PacketRequest function in packet.dll (coming with WinPcap) to "directly" access +/* This module will use the PacketRequest function in packet.dll (coming with WinPcap) 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 :-( + * 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 @@ -127,55 +135,55 @@ static void (*p_PacketCloseAdapter) (LPADAPTER); static int (*p_PacketRequest) (LPADAPTER, int, void *); typedef struct { - const char *name; - gpointer *ptr; - gboolean optional; + const char *name; + gpointer *ptr; + gboolean optional; } symbol_table_t; -#define SYM(x, y) { STRINGIFY(x) , (gpointer) &CONCAT(p_,x), y } +#define SYM(x, y) { 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 = g_module_open("packet", 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; + /* 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; } @@ -201,7 +209,7 @@ wpcap_packet_open(char *if_name) { LPADAPTER adapter; - g_assert(has_wpacket); + g_assert(has_wpacket); adapter = p_PacketOpenAdapter(if_name); return adapter; @@ -213,13 +221,13 @@ void wpcap_packet_close(void *adapter) { - g_assert(has_wpacket); + g_assert(has_wpacket); p_PacketCloseAdapter(adapter); } /* do a packet request call */ -int +int wpcap_packet_request(void *adapter, ULONG Oid, int set, char *value, unsigned int *length) { BOOLEAN Status; @@ -227,16 +235,17 @@ wpcap_packet_request(void *adapter, ULONG Oid, int set, char *value, unsigned in PPACKET_OID_DATA OidData; - g_assert(has_wpacket); + 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("packet_link_status failed\n"); + g_warning("GlobalAllocPtr failed for %u\n", IoCtlBufferLength); return 0; } @@ -247,9 +256,15 @@ wpcap_packet_request(void *adapter, ULONG Oid, int set, char *value, unsigned in Status = p_PacketRequest(adapter, set, OidData); if(Status) { - g_assert(OidData->Length <= *length); - memcpy(value, OidData->Data, OidData->Length); - *length = OidData->Length; + 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); @@ -301,7 +316,20 @@ wpcap_packet_request_ulong(void *adapter, ULONG Oid, ULONG *value) void wpcap_packet_load(void) { - return; + return; } #endif /* HAVE_LIBPCAP */ + +/* + * Editor modelines - http://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: + */