aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/platform')
-rw-r--r--src/lib/platform/MSWindowsHook.cpp3
-rw-r--r--src/lib/platform/MSWindowsUtil.cpp20
-rw-r--r--src/lib/platform/MSWindowsUtil.h7
-rw-r--r--src/lib/platform/MSWindowsWatchdog.cpp102
-rw-r--r--src/lib/platform/MSWindowsWatchdog.h7
5 files changed, 46 insertions, 93 deletions
diff --git a/src/lib/platform/MSWindowsHook.cpp b/src/lib/platform/MSWindowsHook.cpp
index 929888e..2d7845a 100644
--- a/src/lib/platform/MSWindowsHook.cpp
+++ b/src/lib/platform/MSWindowsHook.cpp
@@ -22,6 +22,7 @@
#include "platform/ImmuneKeysReader.h"
#include "barrier/protocol_types.h"
#include "barrier/XScreen.h"
+#include "common/DataDirectories.h"
#include "base/Log.h"
//
@@ -52,7 +53,7 @@ static BYTE g_keyState[256] = { 0 };
static bool g_fakeServerInput = false;
static std::vector<DWORD> g_immuneKeys;
-static const std::string ImmuneKeysPath = ArchFileWindows().getProfileDirectory() + "\\ImmuneKeys.txt";
+static const std::string ImmuneKeysPath = DataDirectories::profile() + "\\ImmuneKeys.txt";
static std::vector<DWORD> immune_keys_list()
{
diff --git a/src/lib/platform/MSWindowsUtil.cpp b/src/lib/platform/MSWindowsUtil.cpp
index 4b51781..b657906 100644
--- a/src/lib/platform/MSWindowsUtil.cpp
+++ b/src/lib/platform/MSWindowsUtil.cpp
@@ -62,3 +62,23 @@ MSWindowsUtil::getErrorString(HINSTANCE hinstance, DWORD error, DWORD id)
return result;
}
}
+
+/*
+
+This is a quick and dirty iterative CreateDirectory() wrapper that does zero
+error checking. A much better cross-platform option exists in C++17 via
+std::filesystem. If/when the project is updated to use 17 this function should
+absolutley be replaced!
+
+*/
+
+void
+MSWindowsUtil::createDirectory(const std::string& path, bool stripLast)
+{
+ // create parent directories
+ for (auto pos = path.find_first_of('\\'); pos != std::string::npos; pos = path.find_first_of('\\', pos + 1))
+ CreateDirectory(path.substr(0, pos).c_str(), NULL);
+ if (!stripLast)
+ // create innermost directory
+ CreateDirectory(path.c_str(), NULL);
+}
diff --git a/src/lib/platform/MSWindowsUtil.h b/src/lib/platform/MSWindowsUtil.h
index 95ec2cf..29eef2e 100644
--- a/src/lib/platform/MSWindowsUtil.h
+++ b/src/lib/platform/MSWindowsUtil.h
@@ -37,4 +37,11 @@ public:
found return the string for \p id, replacing ${1} with \p error.
*/
static String getErrorString(HINSTANCE, DWORD error, DWORD id);
+
+ //! Create directory
+ /*!
+ Create directory \p recursively optionally stripping the last component
+ (presumably the filename) if \p is set.
+ */
+ static void createDirectory(const std::string& path, bool stripLast = false);
};
diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp
index ba1890e..9856b5d 100644
--- a/src/lib/platform/MSWindowsWatchdog.cpp
+++ b/src/lib/platform/MSWindowsWatchdog.cpp
@@ -44,7 +44,20 @@ enum {
typedef VOID (WINAPI *SendSas)(BOOL asUser);
-const char g_activeDesktop[] = {"activeDesktop:"};
+std::string activeDesktopName()
+{
+ const std::size_t BufferLength = 1024;
+ std::string name;
+ HDESK desk = OpenInputDesktop(0, FALSE, GENERIC_READ);
+ if (desk != NULL) {
+ TCHAR buffer[BufferLength];
+ if (GetUserObjectInformation(desk, UOI_NAME, buffer, BufferLength - 1, NULL) == TRUE)
+ name = buffer;
+ CloseDesktop(desk);
+ }
+ LOG((CLOG_DEBUG "found desktop name: %.64s", name.c_str()));
+ return name;
+}
MSWindowsWatchdog::MSWindowsWatchdog(
bool daemonized,
@@ -64,22 +77,8 @@ MSWindowsWatchdog::MSWindowsWatchdog(
m_processRunning(false),
m_fileLogOutputter(NULL),
m_autoElevated(false),
- m_ready(false),
m_daemonized(daemonized)
{
- m_mutex = ARCH->newMutex();
- m_condVar = ARCH->newCondVar();
-}
-
-MSWindowsWatchdog::~MSWindowsWatchdog()
-{
- if (m_condVar != NULL) {
- ARCH->closeCondVar(m_condVar);
- }
-
- if (m_mutex != NULL) {
- ARCH->closeMutex(m_mutex);
- }
}
void
@@ -288,12 +287,9 @@ MSWindowsWatchdog::startProcess()
if (!m_daemonized) {
createRet = doStartProcessAsSelf(m_command);
} else {
- SECURITY_ATTRIBUTES sa;
- ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
-
- getActiveDesktop(&sa);
+ m_autoElevated = activeDesktopName() != "Default";
- ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
+ SECURITY_ATTRIBUTES sa{ 0 };
HANDLE userToken = getUserToken(&sa);
m_elevateProcess = m_autoElevated ? m_autoElevated : m_elevateProcess;
m_autoElevated = false;
@@ -408,7 +404,7 @@ MSWindowsWatchdog::getCommand() const
}
// seems like a fairly convoluted way to get the process name
- const char* launchName = App::instance().argsBase().m_pname;
+ const char* launchName = App::instance().argsBase().m_exename.c_str();
std::string args = ARCH->commandLine();
// build up a full command line
@@ -444,11 +440,7 @@ MSWindowsWatchdog::outputLoop(void*)
}
else {
buffer[bytesRead] = '\0';
-
- testOutput(buffer);
-
m_ipcLogOutputter.write(kINFO, buffer);
-
if (m_fileLogOutputter != NULL) {
m_fileLogOutputter->write(kINFO, buffer);
}
@@ -549,63 +541,3 @@ MSWindowsWatchdog::shutdownExistingProcesses()
CloseHandle(snapshot);
m_processRunning = false;
}
-
-void
-MSWindowsWatchdog::getActiveDesktop(LPSECURITY_ATTRIBUTES security)
-{
- String installedDir = ARCH->getInstalledDirectory();
- if (!installedDir.empty()) {
- String syntoolCommand;
- syntoolCommand.append("\"").append(installedDir).append("\\").append("syntool").append("\"");
- syntoolCommand.append(" --get-active-desktop");
-
- m_session.updateActiveSession();
- bool elevateProcess = m_elevateProcess;
- m_elevateProcess = true;
- HANDLE userToken = getUserToken(security);
- m_elevateProcess = elevateProcess;
-
- BOOL createRet = doStartProcessAsUser(syntoolCommand, userToken, security);
-
- if (!createRet) {
- DWORD rc = GetLastError();
- RevertToSelf();
- }
- else {
- LOG((CLOG_DEBUG "launched syntool to check active desktop"));
- }
-
- ARCH->lockMutex(m_mutex);
- int waitTime = 0;
- while (!m_ready) {
- if (waitTime >= MAXIMUM_WAIT_TIME) {
- break;
- }
-
- ARCH->waitCondVar(m_condVar, m_mutex, 1.0);
- waitTime++;
- }
- m_ready = false;
- ARCH->unlockMutex(m_mutex);
- }
-}
-
-void
-MSWindowsWatchdog::testOutput(String buffer)
-{
- // HACK: check standard output seems hacky.
- size_t i = buffer.find(g_activeDesktop);
- if (i != String::npos) {
- size_t s = sizeof(g_activeDesktop);
- String defaultDesktop("Default");
- String sub = buffer.substr(i + s - 1, defaultDesktop.size());
- if (sub != defaultDesktop) {
- m_autoElevated = true;
- }
-
- ARCH->lockMutex(m_mutex);
- m_ready = true;
- ARCH->broadcastCondVar(m_condVar);
- ARCH->unlockMutex(m_mutex);
- }
-}
diff --git a/src/lib/platform/MSWindowsWatchdog.h b/src/lib/platform/MSWindowsWatchdog.h
index 64ffab3..7a1f661 100644
--- a/src/lib/platform/MSWindowsWatchdog.h
+++ b/src/lib/platform/MSWindowsWatchdog.h
@@ -39,7 +39,6 @@ public:
bool autoDetectCommand,
IpcServer& ipcServer,
IpcLogOutputter& ipcLogOutputter);
- virtual ~MSWindowsWatchdog();
void startAsync();
std::string getCommand() const;
@@ -58,9 +57,6 @@ private:
void startProcess();
BOOL doStartProcessAsUser(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa);
BOOL doStartProcessAsSelf(String& command);
- void sendSas();
- void getActiveDesktop(LPSECURITY_ATTRIBUTES security);
- void testOutput(String buffer);
private:
Thread* m_thread;
@@ -80,9 +76,6 @@ private:
bool m_processRunning;
FileLogOutputter* m_fileLogOutputter;
bool m_autoElevated;
- ArchMutex m_mutex;
- ArchCond m_condVar;
- bool m_ready;
bool m_daemonized;
};