Write Sunshine log output to disk and hide the window
This commit is contained in:
parent
d15c1af152
commit
b4255e22aa
2 changed files with 37 additions and 6 deletions
|
|
@ -185,6 +185,10 @@ int main(int argc, char *argv[]) {
|
||||||
os << _date << log_type << view.attribute_values()[message].extract<std::string>();
|
os << _date << log_type << view.attribute_values()[message].extract<std::string>();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Flush after each log record to ensure log file contents on disk isn't stale.
|
||||||
|
// This is particularly important when running from a Windows service.
|
||||||
|
sink->locked_backend()->auto_flush(true);
|
||||||
|
|
||||||
bl::core::get()->add_sink(sink);
|
bl::core::get()->add_sink(sink);
|
||||||
auto fg = util::fail_guard(log_flush);
|
auto fg = util::fail_guard(log_flush);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <wtsapi32.h>
|
#include <wtsapi32.h>
|
||||||
#include <psapi.h>
|
|
||||||
|
|
||||||
SERVICE_STATUS_HANDLE service_status_handle;
|
SERVICE_STATUS_HANDLE service_status_handle;
|
||||||
SERVICE_STATUS service_status;
|
SERVICE_STATUS service_status;
|
||||||
|
|
@ -60,6 +59,26 @@ HANDLE DuplicateTokenForConsoleSession() {
|
||||||
return new_token;
|
return new_token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HANDLE OpenLogFileHandle() {
|
||||||
|
WCHAR log_file_name[MAX_PATH];
|
||||||
|
|
||||||
|
// Create sunshine.log in the Temp folder (usually %SYSTEMROOT%\Temp)
|
||||||
|
GetTempPathW(_countof(log_file_name), log_file_name);
|
||||||
|
wcscat_s(log_file_name, L"sunshine.log");
|
||||||
|
|
||||||
|
// The file handle must be inheritable for our child process to use it
|
||||||
|
SECURITY_ATTRIBUTES security_attributes = { sizeof(security_attributes), NULL, TRUE };
|
||||||
|
|
||||||
|
// Overwrite the old sunshine.log
|
||||||
|
return CreateFileW(log_file_name,
|
||||||
|
GENERIC_WRITE,
|
||||||
|
FILE_SHARE_READ,
|
||||||
|
&security_attributes,
|
||||||
|
CREATE_ALWAYS,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) {
|
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) {
|
||||||
stop_event = CreateEventA(NULL, TRUE, FALSE, NULL);
|
stop_event = CreateEventA(NULL, TRUE, FALSE, NULL);
|
||||||
if(stop_event == NULL) {
|
if(stop_event == NULL) {
|
||||||
|
|
@ -71,6 +90,11 @@ VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto log_file_handle = OpenLogFileHandle();
|
||||||
|
if (log_file_handle == INVALID_HANDLE_VALUE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Tell SCM we're running
|
// Tell SCM we're running
|
||||||
service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
|
service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
|
||||||
service_status.dwServiceSpecificExitCode = 0;
|
service_status.dwServiceSpecificExitCode = 0;
|
||||||
|
|
@ -89,18 +113,21 @@ VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
STARTUPINFOW startup_info = {};
|
STARTUPINFOW startup_info = {};
|
||||||
startup_info.cb = sizeof(startup_info);
|
startup_info.cb = sizeof(startup_info);
|
||||||
startup_info.lpDesktop = (LPWSTR)L"winsta0\\default";
|
startup_info.lpDesktop = (LPWSTR)L"winsta0\\default";
|
||||||
|
startup_info.dwFlags = STARTF_USESTDHANDLES;
|
||||||
|
startup_info.hStdInput = INVALID_HANDLE_VALUE;
|
||||||
|
startup_info.hStdOutput = log_file_handle;
|
||||||
|
startup_info.hStdError = log_file_handle;
|
||||||
|
|
||||||
// TODO: Redirect stdout to file and set CREATE_NO_WINDOW
|
|
||||||
PROCESS_INFORMATION process_info;
|
PROCESS_INFORMATION process_info;
|
||||||
if(!CreateProcessAsUserW(console_token,
|
if(!CreateProcessAsUserW(console_token,
|
||||||
L"Sunshine.exe",
|
L"Sunshine.exe",
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
FALSE,
|
TRUE,
|
||||||
ABOVE_NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT /*| CREATE_NO_WINDOW */,
|
ABOVE_NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT | CREATE_NO_WINDOW,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
&startup_info,
|
&startup_info,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue