diff --git a/reactos/include/idl/svcctl.idl b/reactos/include/idl/svcctl.idl index ed6e758e3a8..d2702744007 100644 --- a/reactos/include/idl/svcctl.idl +++ b/reactos/include/idl/svcctl.idl @@ -324,7 +324,11 @@ cpp_quote("#endif") /* ScmrChangeServiceConfig2A */ /* Function 37 */ - /* ScmrChangeServiceConfig2W */ + DWORD ScmrChangeServiceConfig2W([in] handle_t BindingHandle, + [in] SC_HANDLE hService, + [in] DWORD dwInfoLevel, + [in, size_is(dwInfoSize)] unsigned char *lpInfo, + [in] DWORD dwInfoSize); /* Function 38 */ /* ScmrQueryServiceConfig2A */ diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index 4abe55b7389..bcd9f6f0387 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -59,7 +59,7 @@ BuildTrusteeWithSidA@8 BuildTrusteeWithSidW@8 ;CancelOverlappedAccess@4 ;ChangeServiceConfig2A@12 -;ChangeServiceConfig2W@12 +ChangeServiceConfig2W@12 ChangeServiceConfigA@44 ChangeServiceConfigW@44 CheckTokenMembership@12 diff --git a/reactos/lib/advapi32/service/scm.c b/reactos/lib/advapi32/service/scm.c index f883f82bc25..0f7997cab35 100644 --- a/reactos/lib/advapi32/service/scm.c +++ b/reactos/lib/advapi32/service/scm.c @@ -77,6 +77,53 @@ HandleUnbind(VOID) #endif +/********************************************************************** + * ChangeServiceConfig2W + * + * @implemented + */ +BOOL WINAPI +ChangeServiceConfig2W(SC_HANDLE hService, + DWORD dwInfoLevel, + LPVOID lpInfo) +{ + DWORD lpInfoSize; + DWORD dwError; + + DPRINT("ChangeServiceConfig2W() called\n"); + + /* Determine the length of the lpInfo parameter */ + switch (dwInfoLevel) + { + case SERVICE_CONFIG_DESCRIPTION: + lpInfoSize = sizeof(SERVICE_DESCRIPTION); + case SERVICE_CONFIG_FAILURE_ACTIONS: + lpInfoSize = sizeof(SERVICE_FAILURE_ACTIONS); + default: + DPRINT1("Unknown info level 0x%lx\n", dwInfoLevel); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if (lpInfo == NULL) + return TRUE; + + HandleBind(); + + dwError = ScmrChangeServiceConfig2W(BindingHandle, + (unsigned int)hService, + dwInfoLevel, + lpInfo, + lpInfoSize); + if (dwError != ERROR_SUCCESS) + { + DPRINT1("ScmrChangeServiceConfig2W() failed (Error %lu)\n", dwError); + SetLastError(dwError); + return FALSE; + } +} + + /********************************************************************** * ChangeServiceConfigA * @@ -1553,7 +1600,7 @@ StartServiceW( #if 0 DWORD dwError; - DPRINT("StartServiceW()\n", ScLock); + DPRINT("StartServiceW()\n"); HandleBind(); diff --git a/reactos/subsys/system/services/rpcserver.c b/reactos/subsys/system/services/rpcserver.c index 58164ad8869..f982ab37e63 100644 --- a/reactos/subsys/system/services/rpcserver.c +++ b/reactos/subsys/system/services/rpcserver.c @@ -2061,7 +2061,16 @@ ScmrGetServiceKeyNameA(handle_t BindingHandle, /* Function 37 */ -/* ScmrChangeServiceConfig2W */ +unsigned long +ScmrChangeServiceConfig2W(handle_t BindingHandle, + unsigned int hService, + unsigned long dwInfoLevel, + unsigned char *lpInfo, + unsigned long dwInfoSize) +{ + DPRINT1("ScmrChangeServiceConfig2W() is unimplemented\n"); + return ERROR_CALL_NOT_IMPLEMENTED; +} /* Function 38 */