Sebastian Lackner : services: Fix handling of user defined service controls.

Alexandre Julliard julliard at winehq.org
Wed Aug 10 11:05:58 CDT 2016


Module: wine
Branch: master
Commit: cbc5de1c5fb6504c3d52635043268b5306aa9d59
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cbc5de1c5fb6504c3d52635043268b5306aa9d59

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Wed Aug 10 10:42:35 2016 +0200

services: Fix handling of user defined service controls.

Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/services/rpc.c           | 3 +++
 programs/services/tests/service.c | 7 +++++++
 2 files changed, 10 insertions(+)

diff --git a/programs/services/rpc.c b/programs/services/rpc.c
index 17900cc..4036f7d 100644
--- a/programs/services/rpc.c
+++ b/programs/services/rpc.c
@@ -941,6 +941,9 @@ static BOOL service_accepts_control(const struct service_entry *service, DWORD d
 {
     DWORD a = service->status.dwControlsAccepted;
 
+    if (dwControl >= 128 && dwControl <= 255)
+        return TRUE;
+
     switch (dwControl)
     {
     case SERVICE_CONTROL_INTERROGATE:
diff --git a/programs/services/tests/service.c b/programs/services/tests/service.c
index 85b8e86..fea6363 100644
--- a/programs/services/tests/service.c
+++ b/programs/services/tests/service.c
@@ -83,6 +83,9 @@ static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, void *event_da
         SetServiceStatus(service_handle, &status);
         SetEvent(service_stop_event);
         return NO_ERROR;
+    case 128:
+        service_event("CUSTOM");
+        return 0xdeadbeef;
     default:
         status.dwCurrentState = SERVICE_RUNNING;
         SetServiceStatus( service_handle, &status );
@@ -346,6 +349,10 @@ static void test_service(void)
     ok(status.dwCheckPoint == 0, "status.dwCheckPoint = %d\n", status.dwCheckPoint);
     todo_wine ok(status.dwWaitHint == 0, "status.dwWaitHint = %d\n", status.dwWaitHint);
 
+    res = ControlService(service_handle, 128, &status);
+    ok(res, "ControlService failed: %u\n", GetLastError());
+    expect_event("CUSTOM");
+
     res = ControlService(service_handle, SERVICE_CONTROL_STOP, &status);
     ok(res, "ControlService failed: %u\n", GetLastError());
     expect_event("STOP");




More information about the wine-cvs mailing list