Starting a Service
To start a service, the following example opens a handle to an installed database and then specifies the handle in a call to the function. It can be used to start either a service or a driver service, but this example assumes that a service is being started. After starting the service, the program uses the members of the structure returned by the function to track the progress of the service.
The function requires a handle to a service control manager database. For more information, see .
#include <windows.h> #include <stdio.h>
BOOL StartSampleService(SC_HANDLE schSCManager) { SC_HANDLE schService; SERVICE_STATUS_PROCESS ssStatus; DWORD dwOldCheckPoint; DWORD dwStartTickCount; DWORD dwWaitTime; DWORD dwBytesNeeded; schService = OpenService( schSCManager, // SCM database
"Sample_Srv", // service name
SERVICE_ALL_ACCESS); if (schService == NULL) { return 0; } if (!StartService( schService, // handle to service
0, // number of arguments
NULL) ) // no arguments
{ return 0; } else { printf("Service start pending.\n"); } // Check the status until the service is no longer start pending.
if (!QueryServiceStatusEx( schService, // handle to service
SC_STATUS_PROCESS_INFO, // info level
&ssStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // if buffer too small
{ return 0; } // Save the tick count and initial checkpoint.
dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint;
while (ssStatus.dwCurrentState == SERVICE_START_PENDING) { // Do not wait longer than the wait hint. A good interval is
// one tenth the wait hint, but no less than 1 second and no
// more than 10 seconds.
dwWaitTime = ssStatus.dwWaitHint / 10;
if( dwWaitTime < 1000 ) dwWaitTime = 1000; else if ( dwWaitTime > 10000 ) dwWaitTime = 10000;
Sleep( dwWaitTime );
// Check the status again.
if (!QueryServiceStatusEx( schService, // handle to service
SC_STATUS_PROCESS_INFO, // info level
&ssStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // if buffer too small
break; if ( ssStatus.dwCheckPoint > dwOldCheckPoint ) { // The service is making progress.
dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; } else { if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint) { // No progress made within the wait hint
break; } } }
CloseServiceHandle(schService);
if (ssStatus.dwCurrentState == SERVICE_RUNNING) { printf("StartService SUCCESS.\n"); return 1; } else { printf("\nService not started. \n"); printf(" Current State: %d\n", ssStatus.dwCurrentState); printf(" Exit Code: %d\n", ssStatus.dwWin32ExitCode); printf(" Service Specific Exit Code: %d\n", ssStatus.dwServiceSpecificExitCode); printf(" Check Point: %d\n", ssStatus.dwCheckPoint); printf(" Wait Hint: %d\n", ssStatus.dwWaitHint); return 0; } }
|
阅读(679) | 评论(0) | 转发(0) |