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(a)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/datab…
 ==============================================================================
 --- 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/rpcse…
 ==============================================================================
 --- 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/servi…
 ==============================================================================
 --- 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);