[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 10/20] Add ServiceInstall
Adds events for shutdown and suspend handlers Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/liteagent/LiteAgent.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++--- src/liteagent/LiteAgent.h | 3 +++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/liteagent/LiteAgent.cpp b/src/liteagent/LiteAgent.cpp index ba48fc0..a887925 100644 --- a/src/liteagent/LiteAgent.cpp +++ b/src/liteagent/LiteAgent.cpp @@ -63,7 +63,31 @@ static CLiteAgent s_service; /*static*/ int CLiteAgent::ServiceInstall() { - return -1; + SC_HANDLE svc, mgr; + char path[MAX_PATH+1]; + + mgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if (mgr == NULL) + return -1; + + if (GetModuleFileNameA(NULL, path, MAX_PATH) == 0) { + CloseServiceHandle(mgr); + return GetLastError(); + } + path[MAX_PATH] = 0; + + svc = CreateServiceA(mgr, SVC_NAME, SVC_DISPLAYNAME, SERVICE_ALL_ACCESS, + SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, + SERVICE_ERROR_NORMAL, path, + NULL, NULL, NULL, NULL, NULL); + if (svc == NULL) { + CloseServiceHandle(mgr); + return -2; + } + + CloseServiceHandle(svc); + CloseServiceHandle(mgr); + return 0; } /*static*/ int CLiteAgent::ServiceUninstall() @@ -192,8 +216,38 @@ void CLiteAgent::OnDeviceEvent(DWORD evt, LPVOID data) bool CLiteAgent::ServiceMainLoop() { - WaitForSingleObject(m_svc_stop, INFINITE); - return false; + HANDLE evts[3] = { m_svc_stop, m_shutdown, m_suspend }; + DWORD wait = WaitForMultipleObjects(3, evts, FALSE, INFINITE); + switch (wait) { + case WAIT_OBJECT_0: + return false; // service stop event + + case WAIT_OBJECT_0+1: + OnShutdown(); + break; + + case WAIT_OBJECT_0+2: + OnSuspend(); + break; + + default: + break; + } + return true; // keep looping +} + +void CLiteAgent::OnShutdown() +{ + if (m_dev == NULL) + return; + CLiteAgent::Log("OnShutdown(%ws)\n", m_dev->Path()); +} + +void CLiteAgent::OnSuspend() +{ + if (m_dev == NULL) + return; + CLiteAgent::Log("OnSuspend(%ws)\n", m_dev->Path()); } void CLiteAgent::SetServiceStatus(DWORD state, DWORD exit /*= 0*/, DWORD hint /*= 0*/) diff --git a/src/liteagent/LiteAgent.h b/src/liteagent/LiteAgent.h index 2ec1f55..b19d8e2 100644 --- a/src/liteagent/LiteAgent.h +++ b/src/liteagent/LiteAgent.h @@ -68,6 +68,9 @@ private: // service events void OnDeviceEvent(DWORD, LPVOID); bool ServiceMainLoop(); + void OnShutdown(); + void OnSuspend(); + private: // service support void SetServiceStatus(DWORD state, DWORD exit = 0, DWORD hint = 0); void WINAPI __ServiceMain(int argc, char** argv); -- 1.9.4.msysgit.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |