diff options
Diffstat (limited to 'src/usvfsconnector.cpp')
| -rw-r--r-- | src/usvfsconnector.cpp | 98 |
1 files changed, 53 insertions, 45 deletions
diff --git a/src/usvfsconnector.cpp b/src/usvfsconnector.cpp index 9a4fa742..3dba3efc 100644 --- a/src/usvfsconnector.cpp +++ b/src/usvfsconnector.cpp @@ -20,6 +20,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "usvfsconnector.h" #include "settings.h" #include "organizercore.h" +#include "envmodule.h" #include "shared/util.h" #include <memory> #include <sstream> @@ -118,48 +119,6 @@ CrashDumpsType crashDumpsType(int type) } } -QString toString(LogLevel lv) -{ - switch (lv) - { - case LogLevel::Debug: - return "debug"; - - case LogLevel::Info: - return "info"; - - case LogLevel::Warning: - return "warning"; - - case LogLevel::Error: - return "error"; - - default: - return QString("%1").arg(static_cast<int>(lv)); - } -} - -QString toString(CrashDumpsType t) -{ - switch (t) - { - case CrashDumpsType::None: - return "none"; - - case CrashDumpsType::Mini: - return "mini"; - - case CrashDumpsType::Data: - return "data"; - - case CrashDumpsType::Full: - return "full"; - - default: - return QString("%1").arg(static_cast<int>(t)); - } -} - UsvfsConnector::UsvfsConnector() { using namespace std::chrono; @@ -188,9 +147,9 @@ UsvfsConnector::UsvfsConnector() " . log: {}\n" " . dump: {} ({})", SHMID, - toString(logLevel), + usvfsLogLevelToString(logLevel), dumpPath.c_str(), - toString(dumpType)); + usvfsCrashDumpTypeToString(dumpType)); usvfsCreateVFS(params); usvfsFreeParameters(params); @@ -263,14 +222,17 @@ void UsvfsConnector::updateMapping(const MappingType &mapping) void UsvfsConnector::updateParams( MOBase::log::Levels logLevel, CrashDumpsType crashDumpsType, - std::chrono::seconds spawnDelay, QString executableBlacklist) + const QString& crashDumpsPath, std::chrono::seconds spawnDelay, + QString executableBlacklist) { using namespace std::chrono; usvfsParameters* p = usvfsCreateParameters(); + usvfsSetDebugMode(p, FALSE); usvfsSetLogLevel(p, toUsvfsLogLevel(logLevel)); usvfsSetCrashDumpType(p, crashDumpsType); + usvfsSetCrashDumpPath(p, crashDumpsPath.toStdString().c_str()); usvfsSetProcessDelay(p, duration_cast<milliseconds>(spawnDelay).count()); usvfsUpdateParameters(p); @@ -295,3 +257,49 @@ void UsvfsConnector::updateForcedLibraries(const QList<MOBase::ExecutableForcedL } } } + + +std::vector<HANDLE> getRunningUSVFSProcesses() +{ + std::vector<DWORD> pids; + + { + size_t count = 0; + DWORD* buffer = nullptr; + if (!::GetVFSProcessList2(&count, &buffer)) { + log::error("failed to get usvfs process list"); + return {}; + } + + if (buffer) { + pids.assign(buffer, buffer + count); + std::free(buffer); + } + } + + const auto thisPid = GetCurrentProcessId(); + std::vector<HANDLE> v; + + for (auto&& pid : pids) { + if (pid == thisPid) { + continue; // obviously don't wait for MO process + } + + HANDLE handle = ::OpenProcess( + PROCESS_QUERY_LIMITED_INFORMATION | SYNCHRONIZE, FALSE, pid); + + if (handle == INVALID_HANDLE_VALUE) { + const auto e = GetLastError(); + + log::warn( + "failed to open usvfs process {}: {}", + pid, formatSystemMessage(e)); + + continue; + } + + v.push_back(handle); + } + + return v; +} |
