#include "svcctl.h"
+#include "wine/exception.h"
+
WINE_DEFAULT_DEBUG_CHANNEL(service);
static const WCHAR szLocalSystem[] = {'L','o','c','a','l','S','y','s','t','e','m',0};
RpcBindingFree(&h);
}
+static LONG WINAPI rpc_filter(EXCEPTION_POINTERS *eptr)
+{
+ return I_RpcExceptionFilter(eptr->ExceptionRecord->ExceptionCode);
+}
+
+static DWORD map_exception_code(DWORD exception_code)
+{
+ switch (exception_code)
+ {
+ case RPC_X_NULL_REF_POINTER:
+ case RPC_X_ENUM_VALUE_OUT_OF_RANGE:
+ case RPC_X_BYTE_COUNT_TOO_SMALL:
+ return ERROR_INVALID_PARAMETER;
+ default:
+ return exception_code;
+ }
+}
+
/******************************************************************************
* Service IPC functions
*/
return NULL;
}
- err = svcctl_LockServiceDatabase(hscm->hdr.server_handle, &hLock);
+ __TRY
+ {
+ err = svcctl_LockServiceDatabase(hscm->hdr.server_handle, &hLock);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != ERROR_SUCCESS)
{
SetLastError(err);
TRACE("%p\n",ScLock);
- err = svcctl_UnlockServiceDatabase(&hRpcLock);
+ __TRY
+ {
+ err = svcctl_UnlockServiceDatabase(&hRpcLock);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != ERROR_SUCCESS)
{
SetLastError(err);
return FALSE;
}
- err = svcctl_SetServiceStatus( hsvc->hdr.server_handle, lpStatus );
+ __TRY
+ {
+ err = svcctl_SetServiceStatus( hsvc->hdr.server_handle, lpStatus );
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != ERROR_SUCCESS)
{
SetLastError(err);
if (!manager)
return NULL;
- r = svcctl_OpenSCManagerW(lpMachineName, lpDatabaseName, dwDesiredAccess, &manager->hdr.server_handle);
+ __TRY
+ {
+ r = svcctl_OpenSCManagerW(lpMachineName, lpDatabaseName, dwDesiredAccess, &manager->hdr.server_handle);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ r = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (r!=ERROR_SUCCESS)
goto error;
return FALSE;
}
- err = svcctl_ControlService(hsvc->hdr.server_handle, dwControl, lpServiceStatus);
+ __TRY
+ {
+ err = svcctl_ControlService(hsvc->hdr.server_handle, dwControl, lpServiceStatus);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != ERROR_SUCCESS)
{
SetLastError(err);
}
obj = (struct sc_handle *)hSCObject;
- err = svcctl_CloseServiceHandle(&obj->server_handle);
+ __TRY
+ {
+ err = svcctl_CloseServiceHandle(&obj->server_handle);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
sc_handle_free( obj );
if (err != ERROR_SUCCESS)
hscm->hdr.ref_count++;
hsvc->scm = hscm;
- err = svcctl_OpenServiceW(hscm->hdr.server_handle, lpServiceName, dwDesiredAccess, &hsvc->hdr.server_handle);
+ __TRY
+ {
+ err = svcctl_OpenServiceW(hscm->hdr.server_handle, lpServiceName, dwDesiredAccess, &hsvc->hdr.server_handle);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != ERROR_SUCCESS)
{
hsvc->scm = hscm;
hscm->hdr.ref_count++;
- err = svcctl_CreateServiceW(hscm->hdr.server_handle, lpServiceName,
- lpDisplayName, dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl,
- lpBinaryPathName, lpLoadOrderGroup, lpdwTagId, (LPBYTE)lpDependencies,
- multisz_cb(lpDependencies), lpServiceStartName, (LPBYTE)lpPassword, passwdlen,
- &hsvc->hdr.server_handle);
+ __TRY
+ {
+ err = svcctl_CreateServiceW(hscm->hdr.server_handle, lpServiceName,
+ lpDisplayName, dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl,
+ lpBinaryPathName, lpLoadOrderGroup, lpdwTagId, (LPBYTE)lpDependencies,
+ multisz_cb(lpDependencies), lpServiceStartName, (LPBYTE)lpPassword, passwdlen,
+ &hsvc->hdr.server_handle);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != ERROR_SUCCESS)
{
return FALSE;
}
- err = svcctl_DeleteService(hsvc->hdr.server_handle);
+ __TRY
+ {
+ err = svcctl_DeleteService(hsvc->hdr.server_handle);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != 0)
{
SetLastError(err);
return FALSE;
}
- err = svcctl_StartServiceW(hsvc->hdr.server_handle, dwNumServiceArgs, lpServiceArgVectors);
+ __TRY
+ {
+ err = svcctl_StartServiceW(hsvc->hdr.server_handle, dwNumServiceArgs, lpServiceArgVectors);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != ERROR_SUCCESS)
{
SetLastError(err);
return FALSE;
}
- err = svcctl_QueryServiceStatusEx(hsvc->hdr.server_handle, InfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
+ __TRY
+ {
+ err = svcctl_QueryServiceStatusEx(hsvc->hdr.server_handle, InfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != ERROR_SUCCESS)
{
SetLastError(err);
memset(&config, 0, sizeof(config));
- if ((err = svcctl_QueryServiceConfigW(hsvc->hdr.server_handle, &config)) != 0)
+ __TRY
+ {
+ err = svcctl_QueryServiceConfigW(hsvc->hdr.server_handle, &config);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
+
+ if (err != ERROR_SUCCESS)
{
TRACE("services.exe: error %u\n", err);
SetLastError(err);
return FALSE;
}
- err = svcctl_GetServiceKeyNameW(hscm->hdr.server_handle,
- lpDisplayName, lpServiceName, lpServiceName ? *lpcchBuffer : 0, lpcchBuffer);
+ __TRY
+ {
+ err = svcctl_GetServiceKeyNameW(hscm->hdr.server_handle,
+ lpDisplayName, lpServiceName, lpServiceName ? *lpcchBuffer : 0, lpcchBuffer);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err)
SetLastError(err);
return FALSE;
}
- err = svcctl_GetServiceDisplayNameW(hscm->hdr.server_handle,
- lpServiceName, lpDisplayName, lpDisplayName ? *lpcchBuffer : 0, lpcchBuffer);
+ __TRY
+ {
+ err = svcctl_GetServiceDisplayNameW(hscm->hdr.server_handle,
+ lpServiceName, lpDisplayName, lpDisplayName ? *lpcchBuffer : 0, lpcchBuffer);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err)
SetLastError(err);
cb_pwd = lpPassword ? (strlenW(lpPassword) + 1)*sizeof(WCHAR) : 0;
- err = svcctl_ChangeServiceConfigW(hsvc->hdr.server_handle, dwServiceType,
- dwStartType, dwErrorControl, lpBinaryPathName, lpLoadOrderGroup, lpdwTagId,
- (const BYTE *)lpDependencies, multisz_cb(lpDependencies), lpServiceStartName,
- (const BYTE *)lpPassword, cb_pwd, lpDisplayName);
+ __TRY
+ {
+ err = svcctl_ChangeServiceConfigW(hsvc->hdr.server_handle, dwServiceType,
+ dwStartType, dwErrorControl, lpBinaryPathName, lpLoadOrderGroup, lpdwTagId,
+ (const BYTE *)lpDependencies, multisz_cb(lpDependencies), lpServiceStartName,
+ (const BYTE *)lpPassword, cb_pwd, lpDisplayName);
+ }
+ __EXCEPT(rpc_filter)
+ {
+ err = map_exception_code(GetExceptionCode());
+ }
+ __ENDTRY
if (err != ERROR_SUCCESS)
SetLastError(err);