3.1.4.30 RStartServiceA (Opnum 31)

The RStartServiceA method starts a specified service.

 DWORD RStartServiceA(
   [in] SC_RPC_HANDLE hService,
   [in, range(0, SC_MAX_ARGUMENTS)] 
     DWORD argc,
   [in, unique, size_is(argc)] LPSTRING_PTRSA argv
 );

hService: An SC_RPC_HANDLE (section 2.2.4) that defines the handle to the service record that MUST have been created previously, using one of the open methods specified in section 3.1.4. The SERVICE_START access right MUST have been granted to the caller when the RPC context handle was created.

argc: The number of argument strings in the argv array. If argv is NULL, this parameter MAY be zero.

argv: A pointer to a buffer that contains an array of pointers to null-terminated ANSI strings that are passed as arguments to the service.

Return Values: The method returns 0x00000000 (ERROR_SUCCESS) on success; otherwise, it returns one of the following error codes.<46>

Return value/code

Description

2

ERROR_FILE_NOT_FOUND

The system cannot find the file specified.

3

ERROR_PATH_NOT_FOUND

The system cannot find the path specified.

5

ERROR_ACCESS_DENIED

The SERVICE_START access right had not been granted to the caller when the RPC context handle to the service was created.

6

ERROR_INVALID_HANDLE

The handle is no longer valid.

87

ERROR_INVALID_PARAMETER

A parameter that was specified is invalid.

1053

ERROR_SERVICE_REQUEST_TIMEOUT

The process for the service was started, but it did not respond within an implementation-specific time-out.<47>

1054

ERROR_SERVICE_NO_THREAD

A thread could not be created for the service.

1055

ERROR_SERVICE_DATABASE_LOCKED

The service database is locked by the call to the RLockServiceDatabase (section 3.1.4.4) method.<48>

1056

ERROR_SERVICE_ALREADY_RUNNING

The ServiceStatus.dwCurrentState in the service record is not set to SERVICE_STOPPED.

1058

ERROR_SERVICE_DISABLED

The service cannot be started because the Start field in the service record is set to SERVICE_DISABLED.

1068

ERROR_SERVICE_DEPENDENCY_FAIL

The specified service depends on another service that has failed to start.

1069

ERROR_SERVICE_LOGON_FAILED

The service did not start due to a logon failure.

1072

ERROR_SERVICE_MARKED_FOR_DELETE

The RDeleteService method has been called for the service record identified by the hService parameter.

1075

ERROR_SERVICE_DEPENDENCY_DELETED

The specified service depends on a service that does not exist or has been marked for deletion.

1115

ERROR_SHUTDOWN_IN_PROGRESS

The system is shutting down.

In response to this request from the client, for a successful operation the server MUST start the service using the information from the service record identified by the hService parameter and pass the arguments specified in the argv parameter as part of the service launch command.

If argv is not NULL, the client SHOULD set the first element in argv to the name of the service.

The server MUST ignore argv for service records with Type equal to SERVICE_KERNEL_DRIVER or SERVICE_FILE_SYSTEM_DRIVER.

The server MUST set the ServiceStatus.dwCurrentState in the service record, as specified in SERVICE_STATUS (section 2.2.47), to SERVICE_START_PENDING.

The server MUST set the ServiceStatus.dwControlsAccepted in the service record, as specified in SERVICE_STATUS, to none (zero).

The server MUST set the ServiceStatus.dwCheckPoint in the service record, as specified in SERVICE_STATUS, to zero.

The server MUST set the ServiceStatus.dwWaitHint in the service record, as specified in SERVICE_STATUS, to 2 seconds.

The server MUST return ERROR_SERVICE_NO_THREAD if it is unable to create a new thread for the service process.

If argv does not contain as many non-NULL pointers as indicated by argc, the server MUST fail the call with ERROR_INVALID_PARAMETER (87).