From af2c30885b3b979e7df608f79362be9b0c32fa8e Mon Sep 17 00:00:00 2001 From: Tomasz Ziobrowski Date: Tue, 15 Jun 2021 20:15:08 +0200 Subject: [PATCH] Added support for MinGW32 - to be working with qticsneo --- include/icsneo/platform/windows/pcap.h | 4 +- platform/windows/pcap.cpp | 69 ++++++++++++----------- platform/windows/registry.cpp | 3 +- third-party/winpcap/include/pcap-stdinc.h | 2 + 4 files changed, 41 insertions(+), 37 deletions(-) diff --git a/include/icsneo/platform/windows/pcap.h b/include/icsneo/platform/windows/pcap.h index 5fc0452..21c216f 100644 --- a/include/icsneo/platform/windows/pcap.h +++ b/include/icsneo/platform/windows/pcap.h @@ -9,7 +9,7 @@ #include "icsneo/api/eventmanager.h" #include "icsneo/communication/ethernetpacketizer.h" #include - +#include namespace icsneo { class PCAP : public Driver { @@ -59,7 +59,7 @@ private: pcap_stat stats; }; static std::vector knownInterfaces; - NetworkInterface interface; + NetworkInterface interfacevar; }; } diff --git a/platform/windows/pcap.cpp b/platform/windows/pcap.cpp index 31c149c..8cd8c4f 100644 --- a/platform/windows/pcap.cpp +++ b/platform/windows/pcap.cpp @@ -9,6 +9,7 @@ #include #include #include +#include using namespace icsneo; @@ -32,7 +33,7 @@ std::vector PCAP::FindAll() { bool success = false; // Calling pcap.findalldevs_ex too quickly can cause various errors. Retry a few times in this case. for(auto retry = 0; retry < 10; retry++) { - auto ret = pcap.findalldevs_ex(PCAP_SRC_IF_STRING, nullptr, &alldevs, errbuf); + auto ret = pcap.findalldevs_ex((char*)PCAP_SRC_IF_STRING, nullptr, &alldevs, errbuf); if(ret == 0) { success = true; break; @@ -68,48 +69,48 @@ std::vector PCAP::FindAll() { } // aa->AdapterName constains a unique name of the interface like "{3B1D2791-435A-456F-8A7B-9CB0EEE5DAB3}" - // interface.nameFromWinPCAP has "rpcap://\Device\NPF_{3B1D2791-435A-456F-8A7B-9CB0EEE5DAB3}" + // interfacevar.nameFromWinPCAP has "rpcap://\Device\NPF_{3B1D2791-435A-456F-8A7B-9CB0EEE5DAB3}" // We're comparing strings to match the Win32 info with the WinPCAP info for(IP_ADAPTER_ADDRESSES* aa = (IP_ADAPTER_ADDRESSES*)adapterAddressBuffer.data(); aa != nullptr; aa = aa->Next) { - for(auto& interface : interfaces) { - if(interface.nameFromWinPCAP.find(aa->AdapterName) == std::string::npos) + for(auto& interfacevar : interfaces) { + if(interfacevar.nameFromWinPCAP.find(aa->AdapterName) == std::string::npos) continue; // This is not the interface that corresponds - memcpy(interface.macAddress, aa->PhysicalAddress, sizeof(interface.macAddress)); - interface.nameFromWin32API = aa->AdapterName; - interface.descriptionFromWin32API = converter.to_bytes(aa->Description); - interface.friendlyNameFromWin32API = converter.to_bytes(aa->FriendlyName); - if(interface.descriptionFromWin32API.find("LAN9512/LAN9514") != std::string::npos) { + memcpy(interfacevar.macAddress, aa->PhysicalAddress, sizeof(interfacevar.macAddress)); + interfacevar.nameFromWin32API = aa->AdapterName; + interfacevar.descriptionFromWin32API = converter.to_bytes(aa->Description); + interfacevar.friendlyNameFromWin32API = converter.to_bytes(aa->FriendlyName); + if(interfacevar.descriptionFromWin32API.find("LAN9512/LAN9514") != std::string::npos) { // This is an Ethernet EVB device - interface.fullName = "Intrepid Ethernet EVB ( " + interface.friendlyNameFromWin32API + " : " + interface.descriptionFromWin32API + " )"; + interfacevar.fullName = "Intrepid Ethernet EVB ( " + interfacevar.friendlyNameFromWin32API + " : " + interfacevar.descriptionFromWin32API + " )"; } else { - interface.fullName = interface.friendlyNameFromWin32API + " : " + interface.descriptionFromWin32API; + interfacevar.fullName = interfacevar.friendlyNameFromWin32API + " : " + interfacevar.descriptionFromWin32API; } } } - for(auto& interface : interfaces) { + for(auto& interfacevar : interfaces) { bool exists = false; for(auto& known : knownInterfaces) - if(memcmp(interface.macAddress, known.macAddress, sizeof(interface.macAddress)) == 0) + if(memcmp(interfacevar.macAddress, known.macAddress, sizeof(interfacevar.macAddress)) == 0) exists = true; if(!exists) - knownInterfaces.emplace_back(interface); + knownInterfaces.emplace_back(interfacevar); } constexpr auto openflags = (PCAP_OPENFLAG_MAX_RESPONSIVENESS | PCAP_OPENFLAG_NOCAPTURE_LOCAL); for(size_t i = 0; i < knownInterfaces.size(); i++) { - auto& interface = knownInterfaces[i]; - if(interface.fullName.length() == 0) + auto& interfacevar = knownInterfaces[i]; + if(interfacevar.fullName.length() == 0) continue; // Win32 did not find this interface in the previous step - interface.fp = pcap.open(interface.nameFromWinPCAP.c_str(), 1518, openflags, 1, nullptr, errbuf); + interfacevar.fp = pcap.open(interfacevar.nameFromWinPCAP.c_str(), 1518, openflags, 1, nullptr, errbuf); - if(interface.fp == nullptr) + if(interfacevar.fp == nullptr) continue; // Could not open the interface EthernetPacketizer::EthernetPacket requestPacket; - memcpy(requestPacket.srcMAC, interface.macAddress, sizeof(requestPacket.srcMAC)); + memcpy(requestPacket.srcMAC, interfacevar.macAddress, sizeof(requestPacket.srcMAC)); requestPacket.payload.reserve(4); requestPacket.payload = { ((1 << 4) | (uint8_t)Network::NetID::Main51), // Packet size of 1 on NETID_MAIN51 @@ -119,13 +120,13 @@ std::vector PCAP::FindAll() { requestPacket.payload.insert(requestPacket.payload.begin(), 0xAA); auto bs = requestPacket.getBytestream(); - pcap.sendpacket(interface.fp, bs.data(), (int)bs.size()); + pcap.sendpacket(interfacevar.fp, bs.data(), (int)bs.size()); auto timeout = std::chrono::high_resolution_clock::now() + std::chrono::milliseconds(5); while(std::chrono::high_resolution_clock::now() <= timeout) { // Wait up to 5ms for the response struct pcap_pkthdr* header; const uint8_t* data; - auto res = pcap.next_ex(interface.fp, &header, &data); + auto res = pcap.next_ex(interfacevar.fp, &header, &data); if(res < 0) { //std::cout << "pcapnextex failed with " << res << std::endl; break; @@ -136,7 +137,7 @@ std::vector PCAP::FindAll() { EthernetPacketizer::EthernetPacket packet(data, header->caplen); // Is this an ICS response packet (0xCAB2) from an ICS MAC, either to broadcast or directly to us? if(packet.etherType == 0xCAB2 && packet.srcMAC[0] == 0x00 && packet.srcMAC[1] == 0xFC && packet.srcMAC[2] == 0x70 && ( - memcmp(packet.destMAC, interface.macAddress, sizeof(packet.destMAC)) == 0 || + memcmp(packet.destMAC, interfacevar.macAddress, sizeof(packet.destMAC)) == 0 || memcmp(packet.destMAC, BROADCAST_MAC, sizeof(packet.destMAC)) == 0 )) { /* We have received a packet from a device. We don't know if this is the device we're @@ -168,8 +169,8 @@ std::vector PCAP::FindAll() { } } - pcap.close(interface.fp); - interface.fp = nullptr; + pcap.close(interfacevar.fp); + interfacevar.fp = nullptr; } return foundDevices; @@ -182,8 +183,8 @@ bool PCAP::IsHandleValid(neodevice_handle_t handle) { PCAP::PCAP(const device_eventhandler_t& err, neodevice_t& forDevice) : Driver(err), device(forDevice), pcap(PCAPDLL::getInstance()), ethPacketizer(err) { if(IsHandleValid(device.handle)) { - interface = knownInterfaces[(device.handle >> 24) & 0xFF]; - interface.fp = nullptr; // We're going to open our own connection to the interface. This should already be nullptr but just in case. + interfacevar = knownInterfaces[(device.handle >> 24) & 0xFF]; + interfacevar.fp = nullptr; // We're going to open our own connection to the interfacevar. This should already be nullptr but just in case. deviceMAC[0] = 0x00; deviceMAC[1] = 0xFC; @@ -192,7 +193,7 @@ PCAP::PCAP(const device_eventhandler_t& err, neodevice_t& forDevice) : Driver(er deviceMAC[4] = (device.handle >> 8) & 0xFF; deviceMAC[5] = device.handle & 0xFF; memcpy(ethPacketizer.deviceMAC, deviceMAC, 6); - memcpy(ethPacketizer.hostMAC, interface.macAddress, 6); + memcpy(ethPacketizer.hostMAC, interfacevar.macAddress, 6); } else { openable = false; } @@ -215,8 +216,8 @@ bool PCAP::open() { } // Open the interface - interface.fp = pcap.open(interface.nameFromWinPCAP.c_str(), 65536, PCAP_OPENFLAG_MAX_RESPONSIVENESS | PCAP_OPENFLAG_NOCAPTURE_LOCAL, 50, nullptr, errbuf); - if(interface.fp == nullptr) { + interfacevar.fp = pcap.open(interfacevar.nameFromWinPCAP.c_str(), 65536, PCAP_OPENFLAG_MAX_RESPONSIVENESS | PCAP_OPENFLAG_NOCAPTURE_LOCAL, 50, nullptr, errbuf); + if(interfacevar.fp == nullptr) { report(APIEvent::Type::DriverFailedToOpen, APIEvent::Severity::Error); return false; } @@ -230,7 +231,7 @@ bool PCAP::open() { } bool PCAP::isOpen() { - return interface.fp != nullptr; + return interfacevar.fp != nullptr; } bool PCAP::close() { @@ -245,8 +246,8 @@ bool PCAP::close() { transmitThread.join(); closing = false; - pcap.close(interface.fp); - interface.fp = nullptr; + pcap.close(interfacevar.fp); + interfacevar.fp = nullptr; uint8_t flush; WriteOperation flushop; @@ -262,7 +263,7 @@ void PCAP::readTask() { const uint8_t* data; EventManager::GetInstance().downgradeErrorsOnCurrentThread(); while(!closing) { - auto readBytes = pcap.next_ex(interface.fp, &header, &data); + auto readBytes = pcap.next_ex(interfacevar.fp, &header, &data); if(readBytes < 0) { report(APIEvent::Type::FailedToRead, APIEvent::Severity::Error); break; @@ -333,7 +334,7 @@ void PCAP::transmitTask() { if(transmitQueueCV.wait_for(lk, std::chrono::milliseconds(100), [this] { return !!transmitQueue; }) && !closing && transmitQueue) { pcap_send_queue* current = transmitQueue; lk.unlock(); - pcap.sendqueue_transmit(interface.fp, current, 0); + pcap.sendqueue_transmit(interfacevar.fp, current, 0); { std::lock_guard lk2(transmitQueueMutex); transmitQueue = nullptr; diff --git a/platform/windows/registry.cpp b/platform/windows/registry.cpp index ec4dbe8..2d87b2d 100644 --- a/platform/windows/registry.cpp +++ b/platform/windows/registry.cpp @@ -1,6 +1,7 @@ #include "icsneo/platform/windows/registry.h" #include #include +#include using namespace icsneo; @@ -105,4 +106,4 @@ bool Registry::Get(std::wstring path, std::wstring key, uint32_t& value) { bool Registry::Get(std::string path, std::string key, uint32_t& value) { return Get(converter.from_bytes(path), converter.from_bytes(key), value); -} \ No newline at end of file +} diff --git a/third-party/winpcap/include/pcap-stdinc.h b/third-party/winpcap/include/pcap-stdinc.h index 77a4824..1171865 100644 --- a/third-party/winpcap/include/pcap-stdinc.h +++ b/third-party/winpcap/include/pcap-stdinc.h @@ -60,11 +60,13 @@ #define caddr_t char* +#ifdef __MSC_VER #if _MSC_VER < 1500 #define snprintf _snprintf #define vsnprintf _vsnprintf #define strdup _strdup #endif +#endif // __MSC_VER //#define inline __inline