Alexandre Julliard : advapi32: Reimplement RegisterServiceCtrlHandler on top of RegisterServiceCtrlHandlerEx .
Alexandre Julliard
julliard at winehq.org
Thu Dec 20 06:21:34 CST 2007
Module: wine
Branch: master
Commit: 865bb0a67a06720c94e1360c5ae4c669b364d60d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=865bb0a67a06720c94e1360c5ae4c669b364d60d
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Dec 19 15:05:04 2007 +0100
advapi32: Reimplement RegisterServiceCtrlHandler on top of RegisterServiceCtrlHandlerEx.
---
dlls/advapi32/service.c | 111 ++++++++++++++++++-----------------------------
1 files changed, 43 insertions(+), 68 deletions(-)
diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c
index 302d649..60c99be 100644
--- a/dlls/advapi32/service.c
+++ b/dlls/advapi32/service.c
@@ -74,15 +74,11 @@ typedef struct service_start_info_t
typedef struct service_data_t
{
struct list entry;
- union {
- LPHANDLER_FUNCTION handler;
- LPHANDLER_FUNCTION_EX handler_ex;
- } handler;
+ LPHANDLER_FUNCTION_EX handler;
LPVOID context;
SERVICE_STATUS_PROCESS status;
HANDLE thread;
BOOL unicode : 1;
- BOOL extended : 1; /* uses handler_ex instead of handler? */
union {
LPSERVICE_MAIN_FUNCTIONA a;
LPSERVICE_MAIN_FUNCTIONW w;
@@ -606,11 +602,6 @@ static BOOL service_accepts_control(const service_data *service, DWORD dwControl
case SERVICE_CONTROL_NETBINDDISABLE:
if (a&SERVICE_ACCEPT_NETBINDCHANGE)
return TRUE;
- }
- if (!service->extended)
- return FALSE;
- switch (dwControl)
- {
case SERVICE_CONTROL_HARDWAREPROFILECHANGE:
if (a&SERVICE_ACCEPT_HARDWAREPROFILECHANGE)
return TRUE;
@@ -639,16 +630,8 @@ static BOOL service_handle_control(HANDLE pipe, service_data *service,
if (service_accepts_control(service, dwControl))
{
- if (service->extended && service->handler.handler_ex)
- {
- service->handler.handler_ex(dwControl, 0, NULL, service->context);
- ret = ERROR_SUCCESS;
- }
- else if (service->handler.handler)
- {
- service->handler.handler(dwControl);
- ret = ERROR_SUCCESS;
- }
+ if (service->handler)
+ ret = service->handler(dwControl, 0, NULL, service->context);
}
return WriteFile(pipe, &ret, sizeof ret, &count, NULL);
}
@@ -909,48 +892,6 @@ BOOL WINAPI UnlockServiceDatabase (SC_LOCK ScLock)
}
/******************************************************************************
- * RegisterServiceCtrlHandlerA [ADVAPI32.@]
- */
-SERVICE_STATUS_HANDLE WINAPI
-RegisterServiceCtrlHandlerA( LPCSTR lpServiceName, LPHANDLER_FUNCTION lpfHandler )
-{
- LPWSTR lpServiceNameW;
- SERVICE_STATUS_HANDLE ret;
-
- lpServiceNameW = SERV_dup(lpServiceName);
- ret = RegisterServiceCtrlHandlerW( lpServiceNameW, lpfHandler );
- HeapFree(GetProcessHeap(), 0, lpServiceNameW);
- return ret;
-}
-
-/******************************************************************************
- * RegisterServiceCtrlHandlerW [ADVAPI32.@]
- *
- * PARAMS
- * lpServiceName []
- * lpfHandler []
- */
-SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerW( LPCWSTR lpServiceName,
- LPHANDLER_FUNCTION lpfHandler )
-{
- service_data *service;
- SERVICE_STATUS_HANDLE handle = 0;
-
- EnterCriticalSection( &service_cs );
- LIST_FOR_EACH_ENTRY( service, &service_list, service_data, entry )
- {
- if(!strcmpW(lpServiceName, service->name))
- {
- service->handler.handler = lpfHandler;
- handle = (SERVICE_STATUS_HANDLE)service;
- break;
- }
- }
- LeaveCriticalSection( &service_cs );
- return handle;
-}
-
-/******************************************************************************
* SetServiceStatus [ADVAPI32.@]
*
* PARAMS
@@ -2577,13 +2518,48 @@ BOOL WINAPI SetServiceBits( SERVICE_STATUS_HANDLE hServiceStatus,
return TRUE;
}
-SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExA( LPCSTR lpServiceName,
- LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext )
+/* thunk for calling the RegisterServiceCtrlHandler handler function */
+static DWORD WINAPI ctrl_handler_thunk( DWORD control, DWORD type, void *data, void *context )
{
- FIXME("%s %p %p\n", debugstr_a(lpServiceName), lpHandlerProc, lpContext);
- return 0;
+ LPHANDLER_FUNCTION func = context;
+
+ func( control );
+ return ERROR_SUCCESS;
+}
+
+/******************************************************************************
+ * RegisterServiceCtrlHandlerA [ADVAPI32.@]
+ */
+SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerA( LPCSTR name, LPHANDLER_FUNCTION handler )
+{
+ return RegisterServiceCtrlHandlerExA( name, ctrl_handler_thunk, handler );
}
+/******************************************************************************
+ * RegisterServiceCtrlHandlerW [ADVAPI32.@]
+ */
+SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerW( LPCWSTR name, LPHANDLER_FUNCTION handler )
+{
+ return RegisterServiceCtrlHandlerExW( name, ctrl_handler_thunk, handler );
+}
+
+/******************************************************************************
+ * RegisterServiceCtrlHandlerExA [ADVAPI32.@]
+ */
+SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExA( LPCSTR name, LPHANDLER_FUNCTION_EX handler, LPVOID context )
+{
+ LPWSTR nameW;
+ SERVICE_STATUS_HANDLE ret;
+
+ nameW = SERV_dup(name);
+ ret = RegisterServiceCtrlHandlerExW( nameW, handler, context );
+ HeapFree( GetProcessHeap(), 0, nameW );
+ return ret;
+}
+
+/******************************************************************************
+ * RegisterServiceCtrlHandlerExW [ADVAPI32.@]
+ */
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW( LPCWSTR lpServiceName,
LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext )
{
@@ -2597,9 +2573,8 @@ SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW( LPCWSTR lpServiceNam
{
if(!strcmpW(lpServiceName, service->name))
{
- service->handler.handler_ex = lpHandlerProc;
+ service->handler = lpHandlerProc;
service->context = lpContext;
- service->extended = TRUE;
handle = (SERVICE_STATUS_HANDLE)service;
break;
}
More information about the wine-cvs
mailing list