diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c index 43b953096bc..0d75aae927f 100644 --- a/base/system/services/rpcserver.c +++ b/base/system/services/rpcserver.c @@ -1860,8 +1860,41 @@ RI_ScSetServiceBitsW( int bUpdateImmediately, wchar_t *lpString) { - UNIMPLEMENTED; - return ERROR_CALL_NOT_IMPLEMENTED; + PSERVICE pService; + + DPRINT("RI_ScSetServiceBitsW(%p %lx %d %d %S)\n", + hServiceStatus, dwServiceBits, bSetBitsOn, + bUpdateImmediately, lpString); + + if (ScmShutdown) + return ERROR_SHUTDOWN_IN_PROGRESS; + + if (lpString != NULL) + return ERROR_INVALID_PARAMETER; + + if (hServiceStatus == 0) + { + DPRINT("hServiceStatus == NULL!\n"); + return ERROR_INVALID_HANDLE; + } + + // FIXME: Validate the status handle + pService = (PSERVICE)hServiceStatus; + + if (bSetBitsOn) + { + DPRINT("Old service bits: %08lx\n", pService->dwServiceBits); + pService->dwServiceBits |= dwServiceBits; + DPRINT("New service bits: %08lx\n", pService->dwServiceBits); + } + else + { + DPRINT("Old service bits: %08lx\n", pService->dwServiceBits); + pService->dwServiceBits &= ~dwServiceBits; + DPRINT("New service bits: %08lx\n", pService->dwServiceBits); + } + + return ERROR_SUCCESS; } @@ -3335,8 +3368,17 @@ RI_ScSetServiceBitsA( int bUpdateImmediately, char *lpString) { - UNIMPLEMENTED; - return ERROR_CALL_NOT_IMPLEMENTED; + if (ScmShutdown) + return ERROR_SHUTDOWN_IN_PROGRESS; + + if (lpString != NULL) + return ERROR_INVALID_PARAMETER; + + return RI_ScSetServiceBitsW(hServiceStatus, + dwServiceBits, + bSetBitsOn, + bUpdateImmediately, + NULL); } diff --git a/base/system/services/services.h b/base/system/services/services.h index 3592ba2560b..b455bead0f6 100644 --- a/base/system/services/services.h +++ b/base/system/services/services.h @@ -71,6 +71,8 @@ typedef struct _SERVICE DWORD dwErrorControl; DWORD dwTag; + DWORD dwServiceBits; + ULONG Flags; PSECURITY_DESCRIPTOR pSecurityDescriptor;