| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- Type
- TSERVICE_STATUS = Record
- dwServiceType: Cardinal;
- dwCurrentState: Cardinal;
- dwControlsAccepted: Cardinal;
- dwWin32ExitCode: Cardinal;
- dwServiceSpecificExitCode: Cardinal;
- dwCheckPoint: Cardinal;
- dwWaitHint: Cardinal;
- End;
- // THANDLE = Cardinal;
- Const
- SERVICE_QUERY_CONFIG = $1;
- SERVICE_CHANGE_CONFIG = $2;
- SERVICE_QUERY_STATUS = $4;
- SERVICE_START = $10;
- SERVICE_STOP = $20;
- SERVICE_ALL_ACCESS = $F01FF;
- SC_MANAGER_ALL_ACCESS = $F003F;
- SERVICE_WIN32_OWN_PROCESS = $10;
- SERVICE_WIN32_SHARE_PROCESS = $20;
- SERVICE_WIN32 = $30;
- SERVICE_INTERACTIVE_PROCESS = $100;
- SERVICE_BOOT_START = $0;
- SERVICE_SYSTEM_START = $1;
- SERVICE_AUTO_START = $2;
- SERVICE_DEMAND_START = $3;
- SERVICE_DISABLED = $4;
- SERVICE_DELETE = $10000;
- SERVICE_CONTROL_STOP = $1;
- SERVICE_CONTROL_PAUSE = $2;
- SERVICE_CONTROL_CONTINUE = $3;
- SERVICE_CONTROL_INTERROGATE = $4;
- SERVICE_STOPPED = $1;
- SERVICE_START_PENDING = $2;
- SERVICE_STOP_PENDING = $3;
- SERVICE_RUNNING = $4;
- SERVICE_CONTINUE_PENDING = $5;
- SERVICE_PAUSE_PENDING = $6;
- SERVICE_PAUSED = $7;
- // #######################################################################################
- // nt based service utilities
- // #######################################################################################
- Function OpenSCManager(lpMachineName, lpDatabaseName: AnsiString; dwDesiredAccess: Cardinal): THANDLE;
- External 'OpenSCManagerA@advapi32.dll stdcall';
- Function OpenService(hSCManager: THANDLE; lpServiceName: AnsiString; dwDesiredAccess: Cardinal): THANDLE;
- External 'OpenServiceA@advapi32.dll stdcall';
- Function CloseServiceHandle(hSCObject: THANDLE): boolean;
- External 'CloseServiceHandle@advapi32.dll stdcall';
- Function CreateService(hSCManager: THANDLE; lpServiceName, lpDisplayName: AnsiString; dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl: Cardinal; lpBinaryPathName, lpLoadOrderGroup: String; lpdwTagId: Cardinal; lpDependencies, lpServiceStartName, lpPassword: String): Cardinal;
- External 'CreateServiceA@advapi32.dll stdcall';
- Function DeleteService(hService: THANDLE): boolean;
- External 'DeleteService@advapi32.dll stdcall';
- Function StartNTService(hService: THANDLE; dwNumServiceArgs: Cardinal; lpServiceArgVectors: Cardinal): boolean;
- External 'StartServiceA@advapi32.dll stdcall';
- Function ControlService(hService: THANDLE; dwControl: Cardinal; Var ServiceStatus: TSERVICE_STATUS): boolean;
- External 'ControlService@advapi32.dll stdcall';
- Function QueryServiceStatus(hService: THANDLE; Var ServiceStatus: TSERVICE_STATUS): boolean;
- External 'QueryServiceStatus@advapi32.dll stdcall';
- Function QueryServiceStatusEx(hService: THANDLE; ServiceStatus: TSERVICE_STATUS): boolean;
- External 'QueryServiceStatus@advapi32.dll stdcall';
- Function OpenServiceManager(): THANDLE;
- Begin
- Result := 0;
- If UsingWinNT() Then
- Begin
- Result := OpenSCManager('', 'ServicesActive', SC_MANAGER_ALL_ACCESS);
- If Result = 0 Then
- MsgBox('the servicemanager is not available', mbError, MB_OK);
- End
- Else
- MsgBox('only nt based systems support services', mbError, MB_OK);
- End;
- Function IsServiceInstalled(ServiceName: String): boolean;
- Var
- hSCM: THANDLE;
- hService: THANDLE;
- Begin
- hSCM := OpenServiceManager();
- Result := false;
- If hSCM <> 0 Then
- Begin
- hService := OpenService(hSCM, ServiceName, SERVICE_QUERY_CONFIG);
- If hService <> 0 Then
- Begin
- Result := true;
- CloseServiceHandle(hService)
- End;
- CloseServiceHandle(hSCM)
- End
- End;
- Function InstallService(FileName, ServiceName, DisplayName, Description: String; ServiceType, StartType: Cardinal): boolean;
- Var
- hSCM: THANDLE;
- hService: THANDLE;
- Begin
- hSCM := OpenServiceManager();
- Result := false;
- If hSCM <> 0 Then
- Begin
- hService := CreateService(hSCM, ServiceName, DisplayName, SERVICE_ALL_ACCESS, ServiceType, StartType, 0, FileName, '', 0, '', '', '');
- If hService <> 0 Then
- Begin
- Result := true;
- // Win2K & WinXP supports aditional description text for services
- If Description <> '' Then
- RegWriteStringValue(HKLM, 'System\CurrentControlSet\Services\' + ServiceName, 'Description', Description);
- CloseServiceHandle(hService)
- End;
- CloseServiceHandle(hSCM)
- End
- End;
- Function RemoveService(ServiceName: String): boolean;
- Var
- hSCM: THANDLE;
- hService: THANDLE;
- Begin
- hSCM := OpenServiceManager();
- Result := false;
- If hSCM <> 0 Then
- Begin
- hService := OpenService(hSCM, ServiceName, SERVICE_ALL_ACCESS);
- If hService <> 0 Then
- Begin
- Result := DeleteService(hService);
- CloseServiceHandle(hService)
- End;
- CloseServiceHandle(hSCM)
- End
- End;
- Function StartService(ServiceName: String): boolean;
- Var
- hSCM: THANDLE;
- hService: THANDLE;
- Begin
- hSCM := OpenServiceManager();
- Result := false;
- If hSCM <> 0 Then
- Begin
- hService := OpenService(hSCM, ServiceName, SERVICE_START);
- If hService <> 0 Then
- Begin
- Result := StartNTService(hService, 0, 0);
- CloseServiceHandle(hService)
- End;
- CloseServiceHandle(hSCM)
- End;
- End;
- Function StopService(ServiceName: String): boolean;
- Var
- hSCM: THANDLE;
- hService: THANDLE;
- Status: TSERVICE_STATUS;
- Begin
- hSCM := OpenServiceManager();
- Result := false;
- If hSCM <> 0 Then
- Begin
- hService := OpenService(hSCM, ServiceName, SERVICE_STOP);
- If hService <> 0 Then
- Begin
- Result := ControlService(hService, SERVICE_CONTROL_STOP, Status);
- CloseServiceHandle(hService)
- End;
- CloseServiceHandle(hSCM)
- End;
- End;
- Function IsServiceRunning(ServiceName: String): boolean;
- Var
- hSCM: THANDLE;
- hService: THANDLE;
- Status: TSERVICE_STATUS;
- Begin
- hSCM := OpenServiceManager();
- Result := false;
- If hSCM <> 0 Then
- Begin
- hService := OpenService(hSCM, ServiceName, SERVICE_QUERY_STATUS);
- If hService <> 0 Then
- Begin
- If QueryServiceStatus(hService, Status) Then
- Result := (Status.dwCurrentState = SERVICE_RUNNING)
- CloseServiceHandle(hService)
- End;
- CloseServiceHandle(hSCM)
- End
- End;
|