|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/4] Add code to monitor 'Request' key
The xenbus_monitor service key has a sub-key called 'Request'. This
patch adss code to register for a notification event on the key.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
src/monitor/monitor.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 109 insertions(+), 6 deletions(-)
diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index 7aeb5d2..6c66518 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -46,12 +46,22 @@ typedef struct _MONITOR_CONTEXT {
SERVICE_STATUS_HANDLE Service;
HANDLE EventLog;
HANDLE StopEvent;
+ HANDLE RequestEvent;
+ HKEY RequestKey;
} MONITOR_CONTEXT, *PMONITOR_CONTEXT;
MONITOR_CONTEXT MonitorContext;
#define MAXIMUM_BUFFER_SIZE 1024
+#define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services"
+
+#define SERVICE_KEY(_Service) \
+ SERVICES_KEY ## "\\" ## #_Service
+
+#define REQUEST_KEY \
+ SERVICE_KEY(XENBUS_MONITOR) ## "\\Request"
+
static VOID
#pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds
/analyze:stacksize'1024'
__Log(
@@ -180,7 +190,8 @@ ReportStatus(
Context->Status.dwControlsAccepted = 0;
else
Context->Status.dwControlsAccepted = SERVICE_ACCEPT_STOP |
- SERVICE_ACCEPT_SHUTDOWN;
+ SERVICE_ACCEPT_SHUTDOWN |
+ SERVICE_ACCEPT_SESSIONCHANGE;
if (CurrentState == SERVICE_RUNNING ||
CurrentState == SERVICE_STOPPED )
@@ -229,6 +240,10 @@ MonitorCtrlHandlerEx(
SetEvent(Context->StopEvent);
return NO_ERROR;
+ case SERVICE_CONTROL_SESSIONCHANGE:
+ SetEvent(Context->RequestEvent);
+ return NO_ERROR;
+
case SERVICE_CONTROL_INTERROGATE:
ReportStatus(SERVICE_RUNNING, NO_ERROR, 0);
return NO_ERROR;
@@ -241,6 +256,40 @@ MonitorCtrlHandlerEx(
return ERROR_CALL_NOT_IMPLEMENTED;
}
+static VOID
+CheckRequestKey(
+ VOID
+ )
+{
+ PMONITOR_CONTEXT Context = &MonitorContext;
+ HRESULT Error;
+
+ Log("====>");
+
+ Error = RegNotifyChangeKeyValue(Context->RequestKey,
+ TRUE,
+ REG_NOTIFY_CHANGE_LAST_SET,
+ Context->RequestEvent,
+ TRUE);
+
+ if (Error != ERROR_SUCCESS)
+ goto fail1;
+
+ Log("<====");
+
+ return;
+
+fail1:
+ Error = GetLastError();
+
+ {
+ PTCHAR Message;
+ Message = GetErrorMessage(Error);
+ Log("fail1 (%s)", Message);
+ LocalFree(Message);
+ }
+}
+
VOID WINAPI
MonitorMain(
_In_ DWORD argc,
@@ -248,6 +297,7 @@ MonitorMain(
)
{
PMONITOR_CONTEXT Context = &MonitorContext;
+ BOOL Success;
HRESULT Error;
UNREFERENCED_PARAMETER(argc);
@@ -279,16 +329,59 @@ MonitorMain(
if (Context->StopEvent == NULL)
goto fail3;
+ Context->RequestEvent = CreateEvent(NULL,
+ TRUE,
+ FALSE,
+ NULL);
+
+ if (Context->RequestEvent == NULL)
+ goto fail4;
+
+ Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ REQUEST_KEY,
+ 0,
+ KEY_ALL_ACCESS,
+ &Context->RequestKey);
+
+ if (Error != ERROR_SUCCESS)
+ goto fail5;
+
+ SetEvent(Context->RequestEvent);
+
ReportStatus(SERVICE_RUNNING, NO_ERROR, 0);
for (;;) {
- Log("waiting...");
- WaitForSingleObject(Context->StopEvent, INFINITE);
+ HANDLE Events[2];
+ DWORD Object;
+
+ Events[0] = Context->StopEvent;
+ Events[1] = Context->RequestEvent;
+
+ Log("waiting (%u)...", ARRAYSIZE(Events));
+ Object = WaitForMultipleObjects(ARRAYSIZE(Events),
+ Events,
+ FALSE,
+ INFINITE);
Log("awake");
- break;
+ switch (Object) {
+ case WAIT_OBJECT_0:
+ ResetEvent(Events[0]);
+ goto done;
+
+ case WAIT_OBJECT_0 + 1:
+ ResetEvent(Events[1]);
+ CheckRequestKey();
+ break;
+
+ default:
+ break;
+ }
}
+done:
+ CloseHandle(Context->RequestKey);
+ CloseHandle(Context->RequestEvent);
CloseHandle(Context->StopEvent);
ReportStatus(SERVICE_STOPPED, NO_ERROR, 0);
@@ -299,11 +392,21 @@ MonitorMain(
return;
-fail3:
- Log("fail3");
+fail5:
+ Log("fail5");
ReportStatus(SERVICE_STOPPED, GetLastError(), 0);
+ CloseHandle(Context->RequestEvent);
+
+fail4:
+ Log("fail4");
+
+ CloseHandle(Context->StopEvent);
+
+fail3:
+ Log("fail3");
+
(VOID) DeregisterEventSource(Context->EventLog);
fail2:
--
2.1.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |