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