[Spice-devel] [vdagent-win PATCH 4/4] Store agent process handle instead of using PROCESS_INFORMATION
Frediano Ziglio
fziglio at redhat.com
Fri Jul 7 05:31:12 UTC 2017
We just need the handle of the process.
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
vdservice/vdservice.cpp | 29 +++++++++++++++--------------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/vdservice/vdservice.cpp b/vdservice/vdservice.cpp
index 5caed39..0d358c2 100644
--- a/vdservice/vdservice.cpp
+++ b/vdservice/vdservice.cpp
@@ -78,18 +78,18 @@ private:
bool kill_agent();
unsigned fill_agent_event() {
ASSERT(_events);
- if (_agent_proc_info.hProcess) {
- _events[_events_count - 1] = _agent_proc_info.hProcess;
+ if (_agent_process) {
+ _events[_events_count - 1] = _agent_process;
return _events_count;
} else {
return _events_count - 1;
}
}
- bool agent_alive() const { return _agent_proc_info.hProcess != NULL; }
+ bool agent_alive() const { return _agent_process != NULL; }
private:
SERVICE_STATUS _status;
SERVICE_STATUS_HANDLE _status_handle;
- PROCESS_INFORMATION _agent_proc_info;
+ HANDLE _agent_process;
HANDLE _control_event;
HANDLE _agent_stop_event;
HANDLE* _events;
@@ -109,6 +109,7 @@ private:
VDService::VDService()
: _status_handle (0)
+ , _agent_process(NULL)
, _events (NULL)
, _connection_id (0)
, _session_id (0)
@@ -118,7 +119,6 @@ VDService::VDService()
, _log (NULL)
, _events_count(0)
{
- ZeroMemory(&_agent_proc_info, sizeof(_agent_proc_info));
_system_version = supported_system_version();
_control_event = CreateEvent(NULL, FALSE, FALSE, NULL);
_agent_stop_event = CreateEvent(NULL, FALSE, FALSE, VD_AGENT_STOP_EVENT);
@@ -695,20 +695,22 @@ bool VDService::launch_agent()
{
STARTUPINFO startup_info;
BOOL ret = FALSE;
+ PROCESS_INFORMATION agent_proc_info;
ZeroMemory(&startup_info, sizeof(startup_info));
startup_info.cb = sizeof(startup_info);
startup_info.lpDesktop = const_cast<LPTSTR>(TEXT("Winsta0\\winlogon"));
- ZeroMemory(&_agent_proc_info, sizeof(_agent_proc_info));
+ _agent_process = NULL;
+ ZeroMemory(&agent_proc_info, sizeof(agent_proc_info));
if (_system_version == SYS_VER_WIN_XP_CLASS) {
if (_session_id == 0) {
ret = CreateProcess(_agent_path, _agent_path, NULL, NULL, FALSE, 0, NULL, NULL,
- &startup_info, &_agent_proc_info);
+ &startup_info, &agent_proc_info);
} else {
for (int i = 0; i < CREATE_PROC_MAX_RETRIES; i++) {
ret = create_session_process_as_user(_session_id, TRUE, NULL, NULL, _agent_path,
NULL, NULL, FALSE, 0, NULL, NULL,
- &startup_info, &_agent_proc_info);
+ &startup_info, &agent_proc_info);
if (ret) {
vd_printf("create_session_process_as_user #%d", i);
break;
@@ -719,7 +721,7 @@ bool VDService::launch_agent()
} else if (_system_version == SYS_VER_WIN_7_CLASS) {
startup_info.lpDesktop = const_cast<LPTSTR>(TEXT("Winsta0\\default"));
ret = create_process_as_user(_session_id, _agent_path, _agent_path, NULL, NULL, FALSE, 0,
- NULL, NULL, &startup_info, &_agent_proc_info);
+ NULL, NULL, &startup_info, &agent_proc_info);
} else {
vd_printf("Not supported in this system version");
return false;
@@ -728,8 +730,8 @@ bool VDService::launch_agent()
vd_printf("CreateProcess() failed: %lu", GetLastError());
return false;
}
- CloseHandle(_agent_proc_info.hThread);
- _agent_proc_info.hThread = NULL;
+ CloseHandle(agent_proc_info.hThread);
+ _agent_process = agent_proc_info.hProcess;
return true;
}
@@ -743,8 +745,8 @@ bool VDService::kill_agent()
if (!agent_alive()) {
return true;
}
- proc_handle = _agent_proc_info.hProcess;
- _agent_proc_info.hProcess = 0;
+ proc_handle = _agent_process;
+ _agent_process = NULL;
SetEvent(_agent_stop_event);
if (GetProcessId(proc_handle)) {
wait_ret = WaitForSingleObject(proc_handle, VD_AGENT_TIMEOUT);
@@ -768,7 +770,6 @@ bool VDService::kill_agent()
}
ResetEvent(_agent_stop_event);
CloseHandle(proc_handle);
- ZeroMemory(&_agent_proc_info, sizeof(_agent_proc_info));
return ret;
}
--
2.9.4
More information about the Spice-devel
mailing list