Robert Shearman : advapi32: Implement RegisterServiceCtrlHandleExW.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 3 05:22:46 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 19d4378a5487f5b2eeb465bf70ef359c354c0740
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=19d4378a5487f5b2eeb465bf70ef359c354c0740

Author: Robert Shearman <rob at codeweavers.com>
Date:   Fri Jun 30 11:06:59 2006 +0100

advapi32: Implement RegisterServiceCtrlHandleExW.

---

 dlls/advapi32/service.c |   46 +++++++++++++++++++++++++++++++++++++---------
 1 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c
index 08adf89..2ceb8a2 100644
--- a/dlls/advapi32/service.c
+++ b/dlls/advapi32/service.c
@@ -57,10 +57,15 @@ #define WINESERV_SENDCONTROL 3
 typedef struct service_data_t
 {
     struct service_data_t *next;
-    LPHANDLER_FUNCTION handler;
+    union {
+        LPHANDLER_FUNCTION handler;
+        LPHANDLER_FUNCTION_EX handler_ex;
+    } handler;
+    LPVOID context;
     SERVICE_STATUS status;
     HANDLE thread;
-    BOOL unicode;
+    BOOL unicode : 1;
+    BOOL extended : 1; /* uses handler_ex instead of handler? */
     union {
         LPSERVICE_MAIN_FUNCTIONA a;
         LPSERVICE_MAIN_FUNCTIONW w;
@@ -573,7 +578,7 @@ static BOOL service_accepts_control(serv
         if (a&SERVICE_ACCEPT_NETBINDCHANGE)
             return TRUE;
     }
-    if (1) /* (!service->handlerex) */
+    if (!service->extended)
         return FALSE;
     switch (dwControl)
     {
@@ -603,10 +608,18 @@ static BOOL service_handle_control(HANDL
 
     TRACE("received control %ld\n", dwControl);
     
-    if (service_accepts_control(service, dwControl) && service->handler)
+    if (service_accepts_control(service, dwControl))
     {
-        service->handler(dwControl);
-        ret = ERROR_SUCCESS;
+        if (service->extended && service->handler.handler)
+        {
+            service->handler.handler(dwControl);
+            ret = ERROR_SUCCESS;
+        }
+        else if (service->handler.handler_ex)
+        {
+            service->handler.handler_ex(dwControl, 0, NULL, service->context);
+            ret = ERROR_SUCCESS;
+        }
     }
     return WriteFile(pipe, &ret, sizeof ret, &count, NULL);
 }
@@ -886,7 +899,7 @@ SERVICE_STATUS_HANDLE WINAPI RegisterSer
         if(!strcmpW(lpServiceName, service->name))
             break;
     if (service)
-        service->handler = lpfHandler;
+        service->handler.handler = lpfHandler;
     LeaveCriticalSection( &service_cs );
 
     return (SERVICE_STATUS_HANDLE)service;
@@ -2251,6 +2264,21 @@ SERVICE_STATUS_HANDLE WINAPI RegisterSer
 SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW( LPCWSTR lpServiceName,
         LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext )
 {
-    FIXME("%s %p %p\n", debugstr_w(lpServiceName), lpHandlerProc, lpContext);
-    return 0;
+    service_data *service;
+
+    TRACE("%s %p %p\n", debugstr_w(lpServiceName), lpHandlerProc, lpContext);
+
+    EnterCriticalSection( &service_cs );
+    for(service = service_list; service; service = service->next)
+        if(!strcmpW(lpServiceName, service->name))
+            break;
+    if (service)
+    {
+        service->handler.handler_ex = lpHandlerProc;
+        service->context = lpContext;
+        service->extended = TRUE;
+    }
+    LeaveCriticalSection( &service_cs );
+
+    return (SERVICE_STATUS_HANDLE)service;
 }




More information about the wine-cvs mailing list