Lazily load PCAP DLL on Windows, keeping it cached afterwards
parent
af4f4894f5
commit
dec85a4c55
|
|
@ -4,12 +4,17 @@
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <pcap.h>
|
#include <pcap.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
namespace icsneo {
|
namespace icsneo {
|
||||||
|
|
||||||
// Helper loader for the PCAP DLL
|
// Helper loader for the PCAP DLL
|
||||||
class PCAPDLL {
|
class PCAPDLL {
|
||||||
public:
|
public:
|
||||||
|
// The first time we use the DLL we keep it in here and it won't get freed until the user unloads us (for speed reasons)
|
||||||
|
static std::shared_ptr<PCAPDLL> lazyLoadHolder;
|
||||||
|
static bool lazyLoaded;
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
typedef int(__cdecl* PCAPFINDDEVICE)(char* source, struct pcap_rmtauth* auth, pcap_if_t** alldevs, char* errbuf);
|
typedef int(__cdecl* PCAPFINDDEVICE)(char* source, struct pcap_rmtauth* auth, pcap_if_t** alldevs, char* errbuf);
|
||||||
typedef pcap_t*(__cdecl* PCAPOPEN)(const char* source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth* auth, char* errbuf);
|
typedef pcap_t*(__cdecl* PCAPOPEN)(const char* source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth* auth, char* errbuf);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,15 @@
|
||||||
|
|
||||||
using namespace icsneo;
|
using namespace icsneo;
|
||||||
|
|
||||||
|
std::shared_ptr<PCAPDLL> PCAPDLL::lazyLoadHolder;
|
||||||
|
bool PCAPDLL::lazyLoaded = false;
|
||||||
|
|
||||||
PCAPDLL::PCAPDLL() {
|
PCAPDLL::PCAPDLL() {
|
||||||
|
if(!lazyLoaded) {
|
||||||
|
lazyLoaded = true;
|
||||||
|
lazyLoadHolder = std::make_shared<PCAPDLL>();
|
||||||
|
}
|
||||||
|
|
||||||
dll = LoadLibrary("wpcap.dll");
|
dll = LoadLibrary("wpcap.dll");
|
||||||
|
|
||||||
if(dll == NULL) {
|
if(dll == NULL) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue