[SERVICES] Implement RI_ScSetServiceBitsA/W
authorEric Kohl <eric.kohl@reactos.org>
Tue, 1 May 2018 19:33:37 +0000 (21:33 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Tue, 1 May 2018 19:33:37 +0000 (21:33 +0200)
- RI_ScSetServiceBitsA: Just call RI_ScSetServiceBitsW.
- RI_ScSetServiceBitsW: Store the service bits in the service list entry.
TODO: Merge all service bits in a global variable and pass it to the server service. Maybe use netapi.I_NetServerSetServiceBits(Ex)?

base/system/services/rpcserver.c
base/system/services/services.h

index 43b9530..0d75aae 100644 (file)
@@ -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);
 }
 
 
index 3592ba2..b455bea 100644 (file)
@@ -71,6 +71,8 @@ typedef struct _SERVICE
     DWORD dwErrorControl;
     DWORD dwTag;
 
+    DWORD dwServiceBits;
+
     ULONG Flags;
 
     PSECURITY_DESCRIPTOR pSecurityDescriptor;