From 8bdd530d7dd64cf7d141341472e109c2e1abbb4d Mon Sep 17 00:00:00 2001 From: walker0643 <> Date: Tue, 30 Jan 2018 14:18:14 -0500 Subject: [PATCH] fix running daemon in foreground for debugging --- src/lib/barrier/DaemonApp.cpp | 37 ++++++++-------- src/lib/barrier/DaemonApp.h | 2 +- src/lib/platform/MSWindowsWatchdog.cpp | 61 +++++++++++++++++++------- src/lib/platform/MSWindowsWatchdog.h | 5 ++- 4 files changed, 68 insertions(+), 37 deletions(-) diff --git a/src/lib/barrier/DaemonApp.cpp b/src/lib/barrier/DaemonApp.cpp index 28f883de..8a431f95 100644 --- a/src/lib/barrier/DaemonApp.cpp +++ b/src/lib/barrier/DaemonApp.cpp @@ -192,13 +192,13 @@ DaemonApp::run(int argc, char** argv) } void -DaemonApp::mainLoop(bool logToFile) +DaemonApp::mainLoop(bool daemonized) { try { DAEMON_RUNNING(true); - if (logToFile) { + if (daemonized) { m_fileLogOutputter = new FileLogOutputter(logFilename().c_str()); CLOG->insert(m_fileLogOutputter); } @@ -215,7 +215,7 @@ DaemonApp::mainLoop(bool logToFile) CLOG->insert(m_ipcLogOutputter); #if SYSAPI_WIN32 - m_watchdog = new MSWindowsWatchdog(false, *m_ipcServer, *m_ipcLogOutputter); + m_watchdog = new MSWindowsWatchdog(daemonized, false, *m_ipcServer, *m_ipcLogOutputter); m_watchdog->setFileLogOutputter(m_fileLogOutputter); #endif @@ -339,20 +339,21 @@ DaemonApp::handleIpcMessage(const Event& e, void*) } #if SYSAPI_WIN32 - String logFilename; - if (argBase->m_logFile != NULL) { - logFilename = String(argBase->m_logFile); - ARCH->setting("LogFilename", logFilename); - m_watchdog->setFileLogOutputter(m_fileLogOutputter); - command = ArgParser::assembleCommand(argsArray, "--log", 1); - LOG((CLOG_DEBUG "removed log file argument and filename %s from command ", logFilename.c_str())); - LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); + // eg. no log-to-file while running in foreground + if (m_fileLogOutputter != nullptr) { + String logFilename; + if (argBase->m_logFile != NULL) { + logFilename = String(argBase->m_logFile); + ARCH->setting("LogFilename", logFilename); + m_watchdog->setFileLogOutputter(m_fileLogOutputter); + command = ArgParser::assembleCommand(argsArray, "--log", 1); + LOG((CLOG_DEBUG "removed log file argument and filename %s from command ", logFilename.c_str())); + LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); + } else { + m_watchdog->setFileLogOutputter(NULL); + } + m_fileLogOutputter->setLogFilename(logFilename.c_str()); } - else { - m_watchdog->setFileLogOutputter(NULL); - } - - m_fileLogOutputter->setLogFilename(logFilename.c_str()); #endif } else { @@ -392,8 +393,8 @@ DaemonApp::handleIpcMessage(const Event& e, void*) LOG((CLOG_DEBUG "ipc hello, type=%s", type.c_str())); #if SYSAPI_WIN32 - String watchdogStatus = m_watchdog->isProcessActive() ? "ok" : "error"; - LOG((CLOG_INFO "watchdog status: %s", watchdogStatus.c_str())); + const char * serverstatus = m_watchdog->isProcessActive() ? "active" : "not active"; + LOG((CLOG_INFO "server status: %s", serverstatus)); #endif m_ipcLogOutputter->notifyBuffer(); diff --git a/src/lib/barrier/DaemonApp.h b/src/lib/barrier/DaemonApp.h index e6118ef1..e2e7bdf1 100644 --- a/src/lib/barrier/DaemonApp.h +++ b/src/lib/barrier/DaemonApp.h @@ -37,7 +37,7 @@ public: DaemonApp(); virtual ~DaemonApp(); int run(int argc, char** argv); - void mainLoop(bool logToFile); + void mainLoop(bool daemonized); private: void daemonize(); diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp index 34454f7e..677e1da7 100644 --- a/src/lib/platform/MSWindowsWatchdog.cpp +++ b/src/lib/platform/MSWindowsWatchdog.cpp @@ -47,6 +47,7 @@ typedef VOID (WINAPI *SendSas)(BOOL asUser); const char g_activeDesktop[] = {"activeDesktop:"}; MSWindowsWatchdog::MSWindowsWatchdog( + bool daemonized, bool autoDetectCommand, IpcServer& ipcServer, IpcLogOutputter& ipcLogOutputter) : @@ -63,7 +64,8 @@ MSWindowsWatchdog::MSWindowsWatchdog( m_processRunning(false), m_fileLogOutputter(NULL), m_autoElevated(false), - m_ready(false) + m_ready(false), + m_daemonized(daemonized) { m_mutex = ARCH->newMutex(); m_condVar = ARCH->newCondVar(); @@ -286,23 +288,28 @@ MSWindowsWatchdog::startProcess() m_session.updateActiveSession(); - SECURITY_ATTRIBUTES sa; - ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); + BOOL createRet; + if (!m_daemonized) { + createRet = doStartProcessAsSelf(m_command); + } else { + SECURITY_ATTRIBUTES sa; + ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); - getActiveDesktop(&sa); + getActiveDesktop(&sa); - ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); - HANDLE userToken = getUserToken(&sa); - m_elevateProcess = m_autoElevated ? m_autoElevated : m_elevateProcess; - m_autoElevated = false; + ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); + HANDLE userToken = getUserToken(&sa); + m_elevateProcess = m_autoElevated ? m_autoElevated : m_elevateProcess; + m_autoElevated = false; - // patch by Jack Zhou and Henry Tung - // set UIAccess to fix Windows 8 GUI interaction - // http://symless.com/spit/issues/details/3338/#c70 - DWORD uiAccess = 1; - SetTokenInformation(userToken, TokenUIAccess, &uiAccess, sizeof(DWORD)); + // patch by Jack Zhou and Henry Tung + // set UIAccess to fix Windows 8 GUI interaction + // http://symless.com/spit/issues/details/3338/#c70 + DWORD uiAccess = 1; + SetTokenInformation(userToken, TokenUIAccess, &uiAccess, sizeof(DWORD)); - BOOL createRet = doStartProcess(m_command, userToken, &sa); + createRet = doStartProcessAsUser(m_command, userToken, &sa); + } if (!createRet) { LOG((CLOG_ERR "could not launch")); @@ -329,7 +336,27 @@ MSWindowsWatchdog::startProcess() } BOOL -MSWindowsWatchdog::doStartProcess(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa) +MSWindowsWatchdog::doStartProcessAsSelf(String& command) +{ + DWORD creationFlags = + NORMAL_PRIORITY_CLASS | + CREATE_NO_WINDOW | + CREATE_UNICODE_ENVIRONMENT; + + STARTUPINFO si; + ZeroMemory(&si, sizeof(STARTUPINFO)); + si.cb = sizeof(STARTUPINFO); + si.lpDesktop = "winsta0\\Default"; // TODO: maybe this should be \winlogon if we have logonui.exe? + si.hStdError = m_stdOutWrite; + si.hStdOutput = m_stdOutWrite; + si.dwFlags |= STARTF_USESTDHANDLES; + + LOG((CLOG_INFO "starting new process as self")); + return CreateProcess(NULL, LPSTR(command.c_str()), NULL, NULL, FALSE, creationFlags, NULL, NULL, &si, &m_processInfo); +} + +BOOL +MSWindowsWatchdog::doStartProcessAsUser(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa) { // clear, as we're reusing process info struct ZeroMemory(&m_processInfo, sizeof(PROCESS_INFORMATION)); @@ -355,7 +382,7 @@ MSWindowsWatchdog::doStartProcess(String& command, HANDLE userToken, LPSECURITY_ CREATE_UNICODE_ENVIRONMENT; // re-launch in current active user session - LOG((CLOG_INFO "starting new process")); + LOG((CLOG_INFO "starting new process as privileged user")); BOOL createRet = CreateProcessAsUser( userToken, NULL, LPSTR(command.c_str()), sa, NULL, TRUE, creationFlags, @@ -542,7 +569,7 @@ MSWindowsWatchdog::getActiveDesktop(LPSECURITY_ATTRIBUTES security) HANDLE userToken = getUserToken(security); m_elevateProcess = elevateProcess; - BOOL createRet = doStartProcess(syntoolCommand, userToken, security); + BOOL createRet = doStartProcessAsUser(syntoolCommand, userToken, security); if (!createRet) { DWORD rc = GetLastError(); diff --git a/src/lib/platform/MSWindowsWatchdog.h b/src/lib/platform/MSWindowsWatchdog.h index b741977a..64ffab30 100644 --- a/src/lib/platform/MSWindowsWatchdog.h +++ b/src/lib/platform/MSWindowsWatchdog.h @@ -35,6 +35,7 @@ class FileLogOutputter; class MSWindowsWatchdog { public: MSWindowsWatchdog( + bool daemonized, bool autoDetectCommand, IpcServer& ipcServer, IpcLogOutputter& ipcLogOutputter); @@ -55,7 +56,8 @@ private: HANDLE duplicateProcessToken(HANDLE process, LPSECURITY_ATTRIBUTES security); HANDLE getUserToken(LPSECURITY_ATTRIBUTES security); void startProcess(); - BOOL doStartProcess(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa); + BOOL doStartProcessAsUser(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa); + BOOL doStartProcessAsSelf(String& command); void sendSas(); void getActiveDesktop(LPSECURITY_ATTRIBUTES security); void testOutput(String buffer); @@ -81,6 +83,7 @@ private: ArchMutex m_mutex; ArchCond m_condVar; bool m_ready; + bool m_daemonized; }; //! Relauncher error