This commit breaks 2nd stage setup. It fails just before device enumeration with the message: "CMP_WaitNoPendingInstallEvents() failed". The official buildbot also exhibits this bug.

Thanks,
Cameron Gutman

On Oct 30, 2010, at 3:25 PM, ekohl@svn.reactos.org wrote:

Author: ekohl
Date: Sat Oct 30 19:25:23 2010
New Revision: 49366

URL: http://svn.reactos.org/svn/reactos?rev=49366&view=rev
Log:
Merge ScmControlService() and ScmSendStartCommand() into ScmSendServiceCommand().

Modified:
   trunk/reactos/base/system/services/database.c
   trunk/reactos/base/system/services/rpcserver.c
   trunk/reactos/base/system/services/services.h

Modified: trunk/reactos/base/system/services/database.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/database.c?rev=49366&r1=49365&r2=49366&view=diff
==============================================================================
--- trunk/reactos/base/system/services/database.c [iso-8859-1] (original)
+++ trunk/reactos/base/system/services/database.c [iso-8859-1] Sat Oct 30 19:25:23 2010
@@ -678,66 +678,10 @@


DWORD
-ScmControlService(PSERVICE Service,
-                  DWORD dwControl)
-{
-    PSCM_CONTROL_PACKET ControlPacket;
-    SCM_REPLY_PACKET ReplyPacket;
-
-    DWORD dwWriteCount = 0;
-    DWORD dwReadCount = 0;
-    DWORD TotalLength;
-    DWORD dwError = ERROR_SUCCESS;
-
-    DPRINT("ScmControlService() called\n");
-
-    TotalLength = wcslen(Service->lpServiceName) + 1;
-
-    ControlPacket = (SCM_CONTROL_PACKET*)HeapAlloc(GetProcessHeap(),
-                                                   HEAP_ZERO_MEMORY,
-                                                   sizeof(SCM_CONTROL_PACKET) + (TotalLength * sizeof(WCHAR)));
-    if (ControlPacket == NULL)
-        return ERROR_NOT_ENOUGH_MEMORY;
-
-    ControlPacket->dwControl = dwControl;
-    ControlPacket->dwSize = TotalLength;
-    ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
-    wcscpy(&ControlPacket->szArguments[0], Service->lpServiceName);
-
-    /* Send the control packet */
-    WriteFile(Service->ControlPipeHandle,
-              ControlPacket,
-              sizeof(SCM_CONTROL_PACKET) + (TotalLength * sizeof(WCHAR)),
-              &dwWriteCount,
-              NULL);
-
-    /* Read the reply */
-    ReadFile(Service->ControlPipeHandle,
-             &ReplyPacket,
-             sizeof(SCM_REPLY_PACKET),
-             &dwReadCount,
-             NULL);
-
-    /* Release the contol packet */
-    HeapFree(GetProcessHeap(),
-             0,
-             ControlPacket);
-
-    if (dwReadCount == sizeof(SCM_REPLY_PACKET))
-    {
-        dwError = ReplyPacket.dwError;
-    }
-
-    DPRINT("ScmControlService() done\n");
-
-    return dwError;
-}
-
-
-static DWORD
-ScmSendStartCommand(PSERVICE Service,
-                    DWORD argc,
-                    LPWSTR *argv)
+ScmSendServiceCommand(PSERVICE Service,
+                      DWORD dwControl,
+                      DWORD argc,
+                      LPWSTR *argv)
{
    PSCM_CONTROL_PACKET ControlPacket;
    SCM_REPLY_PACKET ReplyPacket;
@@ -750,7 +694,7 @@
    DWORD dwError = ERROR_SUCCESS;
    DWORD i;

-    DPRINT("ScmSendStartCommand() called\n");
+    DPRINT("ScmSendServiceCommand() called\n");

    /* Calculate the total length of the start command line */
    TotalLength = wcslen(Service->lpServiceName) + 1;
@@ -774,7 +718,7 @@
    if (ControlPacket == NULL)
        return ERROR_NOT_ENOUGH_MEMORY;

-    ControlPacket->dwControl = SERVICE_CONTROL_START;
+    ControlPacket->dwControl = dwControl;
    ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
    ControlPacket->dwSize = TotalLength;
    Ptr = &ControlPacket->szArguments[0];
@@ -819,7 +763,7 @@
        dwError = ReplyPacket.dwError;
    }

-    DPRINT("ScmSendStartCommand() done\n");
+    DPRINT("ScmSendServiceCommand() done\n");

    return dwError;
}
@@ -998,7 +942,10 @@
            DPRINT("Received service process ID %lu\n", dwProcessId);

            /* Send start command */
-            dwError = ScmSendStartCommand(Service, argc, argv);
+            dwError = ScmSendServiceCommand(Service,
+                                            SERVICE_CONTROL_START,
+                                            argc,
+                                            argv);
        }
    }
    else
@@ -1227,7 +1174,10 @@
            CurrentService->Status.dwCurrentState == SERVICE_START_PENDING)
        {
            /* shutdown service */
-            ScmControlService(CurrentService, SERVICE_CONTROL_STOP);
+            ScmSendServiceCommand(CurrentService,
+                                  SERVICE_CONTROL_STOP,
+                                  0,
+                                  NULL);
        }

        ServiceEntry = ServiceEntry->Flink;

Modified: trunk/reactos/base/system/services/rpcserver.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/rpcserver.c?rev=49366&r1=49365&r2=49366&view=diff
==============================================================================
--- trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] (original)
+++ trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] Sat Oct 30 19:25:23 2010
@@ -699,8 +699,10 @@
        }

        /* Send control code to the service */
-        dwError = ScmControlService(lpService,
-                                    dwControl);
+        dwError = ScmSendServiceCommand(lpService,
+                                        dwControl,
+                                        0,
+                                        NULL);

        /* Return service status information */
        RtlCopyMemory(lpServiceStatus,
@@ -2864,7 +2866,10 @@
    }

    /* Start the service */
-    dwError = ScmStartService(lpService, argc, (LPWSTR *)argv);
+    dwError = ScmSendServiceCommand(lpService,
+                                    SERVICE_CONTROL_START,
+                                    argc,
+                                    (LPWSTR *)argv);

    return dwError;
}
@@ -4072,7 +4077,10 @@
    /* FIXME: Convert argument vector to Unicode */

    /* Start the service */
-    dwError = ScmStartService(lpService, 0, NULL);
+    dwError = ScmSendServiceCommand(lpService,
+                                    SERVICE_CONTROL_START,
+                                    0,
+                                    NULL);

    /* FIXME: Free argument vector */


Modified: trunk/reactos/base/system/services/services.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/services.h?rev=49366&r1=49365&r2=49366&view=diff
==============================================================================
--- trunk/reactos/base/system/services/services.h [iso-8859-1] (original)
+++ trunk/reactos/base/system/services/services.h [iso-8859-1] Sat Oct 30 19:25:23 2010
@@ -104,9 +104,10 @@
VOID ScmGetBootAndSystemDriverState(VOID);
VOID ScmAutoStartServices(VOID);
VOID ScmAutoShutdownServices(VOID);
-DWORD ScmStartService(PSERVICE Service,
-                      DWORD argc,
-                      LPWSTR *argv);
+DWORD ScmSendServiceCommand(PSERVICE Service,
+                            DWORD dwControl,
+                            DWORD argc,
+                            LPWSTR *argv);

PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName);
PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName);
@@ -115,9 +116,6 @@
                                PSERVICE *lpServiceRecord);
VOID ScmDeleteServiceRecord(PSERVICE lpService);
DWORD ScmMarkServiceForDelete(PSERVICE pService);
-
-DWORD ScmControlService(PSERVICE Service,
-                        DWORD dwControl);

BOOL ScmLockDatabaseExclusive(VOID);
BOOL ScmLockDatabaseShared(VOID);