Module: wine Branch: refs/heads/master Commit: 19d4378a5487f5b2eeb465bf70ef359c354c0740 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=19d4378a5487f5b2eeb465bf...
Author: Robert Shearman rob@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; }