[ros-diffs] [gedmurphy] 27423: - ensure SetLastError is called when EnumServicesStatusEx is returning required buffer sizes - servman.exe now lists all ReactOS services

gedmurphy at svn.reactos.org gedmurphy at svn.reactos.org
Fri Jul 6 15:53:29 CEST 2007


Author: gedmurphy
Date: Fri Jul  6 17:53:29 2007
New Revision: 27423

URL: http://svn.reactos.org/svn/reactos?rev=27423&view=rev
Log:
- ensure SetLastError is called when EnumServicesStatusEx is returning required buffer sizes
- servman.exe now lists all ReactOS services

Modified:
    trunk/reactos/dll/win32/advapi32/service/scm.c

Modified: trunk/reactos/dll/win32/advapi32/service/scm.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/service/scm.c?rev=27423&r1=27422&r2=27423&view=diff
==============================================================================
--- trunk/reactos/dll/win32/advapi32/service/scm.c (original)
+++ trunk/reactos/dll/win32/advapi32/service/scm.c Fri Jul  6 17:53:29 2007
@@ -962,21 +962,29 @@
                                         lpResumeHandle,
                                         (char *)pszGroupName);
 
-    lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSA)lpServices;
-    for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
-    {
-        if (lpStatusPtr->lpServiceName)
-            lpStatusPtr->lpServiceName =
-                (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
-
-        if (lpStatusPtr->lpDisplayName)
-            lpStatusPtr->lpDisplayName =
-                (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
-
-        lpStatusPtr++;
-    }
-
-    if (dwError != ERROR_SUCCESS)
+    if (dwError == ERROR_MORE_DATA)
+    {
+        DPRINT("Required buffer size %ul\n", *pcbBytesNeeded);
+        SetLastError(dwError);
+        return FALSE;
+    }
+    else if (dwError == ERROR_SUCCESS)
+    {
+        lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSA)lpServices;
+        for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
+        {
+            if (lpStatusPtr->lpServiceName)
+                lpStatusPtr->lpServiceName =
+                    (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
+
+            if (lpStatusPtr->lpDisplayName)
+                lpStatusPtr->lpDisplayName =
+                    (LPSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
+
+            lpStatusPtr++;
+        }
+    }
+    else
     {
         DPRINT1("ScmrEnumServicesStatusExA() failed (Error %lu)\n", dwError);
         SetLastError(dwError);
@@ -1026,22 +1034,29 @@
                                         lpResumeHandle,
                                         (wchar_t *)pszGroupName);
 
-    lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSW)lpServices;
-    for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
-    {
-        if (lpStatusPtr->lpServiceName)
-            lpStatusPtr->lpServiceName =
-                (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
-
-        if (lpStatusPtr->lpDisplayName)
-            lpStatusPtr->lpDisplayName =
-                (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
-
-        lpStatusPtr++;
-    }
-
-    if (dwError != ERROR_SUCCESS &&
-        dwError != ERROR_MORE_DATA)
+    if (dwError == ERROR_MORE_DATA)
+    {
+        DPRINT("Required buffer size %ul\n", *pcbBytesNeeded);
+        SetLastError(dwError);
+        return FALSE;
+    }
+    else if (dwError == ERROR_SUCCESS)
+    {
+        lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSW)lpServices;
+        for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
+        {
+            if (lpStatusPtr->lpServiceName)
+                lpStatusPtr->lpServiceName =
+                    (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpServiceName);
+
+            if (lpStatusPtr->lpDisplayName)
+                lpStatusPtr->lpDisplayName =
+                    (LPWSTR)((ULONG_PTR)lpServices + (ULONG_PTR)lpStatusPtr->lpDisplayName);
+
+            lpStatusPtr++;
+        }
+    }
+    else
     {
         DPRINT1("ScmrEnumServicesStatusExW() failed (Error %lu)\n", dwError);
         SetLastError(dwError);




More information about the Ros-diffs mailing list