From 481ddd1308bf84544c91b62c7a41ec7f9c9f7178 Mon Sep 17 00:00:00 2001 From: Sepalani Date: Sat, 24 Sep 2022 20:25:23 +0400 Subject: [PATCH] NetworkCaptureLogger: Allow PCAP shared read access on Windows --- Source/Core/Common/IOFile.cpp | 18 ++++++++++++++---- Source/Core/Common/IOFile.h | 12 ++++++++++-- Source/Core/Core/NetworkCaptureLogger.cpp | 4 ++-- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Source/Core/Common/IOFile.cpp b/Source/Core/Common/IOFile.cpp index 374c56ac6f..cf7762ea68 100644 --- a/Source/Core/Common/IOFile.cpp +++ b/Source/Core/Common/IOFile.cpp @@ -35,9 +35,10 @@ IOFile::IOFile(std::FILE* file) : m_file(file), m_good(true) { } -IOFile::IOFile(const std::string& filename, const char openmode[]) : m_file(nullptr), m_good(true) +IOFile::IOFile(const std::string& filename, const char openmode[], SharedAccess sh) + : m_file(nullptr), m_good(true) { - Open(filename, openmode); + Open(filename, openmode, sh); } IOFile::~IOFile() @@ -62,12 +63,21 @@ void IOFile::Swap(IOFile& other) noexcept std::swap(m_good, other.m_good); } -bool IOFile::Open(const std::string& filename, const char openmode[]) +bool IOFile::Open(const std::string& filename, const char openmode[], + [[maybe_unused]] SharedAccess sh) { Close(); #ifdef _WIN32 - m_good = _tfopen_s(&m_file, UTF8ToTStr(filename).c_str(), UTF8ToTStr(openmode).c_str()) == 0; + if (sh == SharedAccess::Default) + { + m_good = _tfopen_s(&m_file, UTF8ToTStr(filename).c_str(), UTF8ToTStr(openmode).c_str()) == 0; + } + else if (sh == SharedAccess::Read) + { + m_file = _tfsopen(UTF8ToTStr(filename).c_str(), UTF8ToTStr(openmode).c_str(), SH_DENYWR); + m_good = m_file != nullptr; + } #else #ifdef ANDROID if (IsPathAndroidContent(filename)) diff --git a/Source/Core/Common/IOFile.h b/Source/Core/Common/IOFile.h index 0c14fad838..62fdd7186e 100644 --- a/Source/Core/Common/IOFile.h +++ b/Source/Core/Common/IOFile.h @@ -20,6 +20,12 @@ enum class SeekOrigin End, }; +enum class SharedAccess +{ + Default, + Read, +}; + // simple wrapper for cstdlib file functions to // hopefully will make error checking easier // and make forgetting an fclose() harder @@ -28,7 +34,8 @@ class IOFile public: IOFile(); IOFile(std::FILE* file); - IOFile(const std::string& filename, const char openmode[]); + IOFile(const std::string& filename, const char openmode[], + SharedAccess sh = SharedAccess::Default); ~IOFile(); @@ -40,7 +47,8 @@ public: void Swap(IOFile& other) noexcept; - bool Open(const std::string& filename, const char openmode[]); + bool Open(const std::string& filename, const char openmode[], + SharedAccess sh = SharedAccess::Default); bool Close(); template diff --git a/Source/Core/Core/NetworkCaptureLogger.cpp b/Source/Core/Core/NetworkCaptureLogger.cpp index 2fd921686a..0b8e2bf5d8 100644 --- a/Source/Core/Core/NetworkCaptureLogger.cpp +++ b/Source/Core/Core/NetworkCaptureLogger.cpp @@ -83,8 +83,8 @@ PCAPSSLCaptureLogger::PCAPSSLCaptureLogger() const std::string filepath = fmt::format("{}{} {:%Y-%m-%d %Hh%Mm%Ss}.pcap", File::GetUserPath(D_DUMPSSL_IDX), SConfig::GetInstance().GetGameID(), fmt::localtime(std::time(nullptr))); - m_file = std::make_unique(new File::IOFile(filepath, "wb"), - Common::PCAP::LinkType::Ethernet); + m_file = std::make_unique( + new File::IOFile(filepath, "wb", File::SharedAccess::Read), Common::PCAP::LinkType::Ethernet); } PCAPSSLCaptureLogger::~PCAPSSLCaptureLogger() = default;