summaryrefslogtreecommitdiff
path: root/src/usvfsconnector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/usvfsconnector.cpp')
-rw-r--r--src/usvfsconnector.cpp98
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;
+}