ISSCM.iss 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. Type
  2. TSERVICE_STATUS = Record
  3. dwServiceType: Cardinal;
  4. dwCurrentState: Cardinal;
  5. dwControlsAccepted: Cardinal;
  6. dwWin32ExitCode: Cardinal;
  7. dwServiceSpecificExitCode: Cardinal;
  8. dwCheckPoint: Cardinal;
  9. dwWaitHint: Cardinal;
  10. End;
  11. // THANDLE = Cardinal;
  12. Const
  13. SERVICE_QUERY_CONFIG = $1;
  14. SERVICE_CHANGE_CONFIG = $2;
  15. SERVICE_QUERY_STATUS = $4;
  16. SERVICE_START = $10;
  17. SERVICE_STOP = $20;
  18. SERVICE_ALL_ACCESS = $F01FF;
  19. SC_MANAGER_ALL_ACCESS = $F003F;
  20. SERVICE_WIN32_OWN_PROCESS = $10;
  21. SERVICE_WIN32_SHARE_PROCESS = $20;
  22. SERVICE_WIN32 = $30;
  23. SERVICE_INTERACTIVE_PROCESS = $100;
  24. SERVICE_BOOT_START = $0;
  25. SERVICE_SYSTEM_START = $1;
  26. SERVICE_AUTO_START = $2;
  27. SERVICE_DEMAND_START = $3;
  28. SERVICE_DISABLED = $4;
  29. SERVICE_DELETE = $10000;
  30. SERVICE_CONTROL_STOP = $1;
  31. SERVICE_CONTROL_PAUSE = $2;
  32. SERVICE_CONTROL_CONTINUE = $3;
  33. SERVICE_CONTROL_INTERROGATE = $4;
  34. SERVICE_STOPPED = $1;
  35. SERVICE_START_PENDING = $2;
  36. SERVICE_STOP_PENDING = $3;
  37. SERVICE_RUNNING = $4;
  38. SERVICE_CONTINUE_PENDING = $5;
  39. SERVICE_PAUSE_PENDING = $6;
  40. SERVICE_PAUSED = $7;
  41. // #######################################################################################
  42. // nt based service utilities
  43. // #######################################################################################
  44. Function OpenSCManager(lpMachineName, lpDatabaseName: AnsiString; dwDesiredAccess: Cardinal): THANDLE;
  45. External 'OpenSCManagerA@advapi32.dll stdcall';
  46. Function OpenService(hSCManager: THANDLE; lpServiceName: AnsiString; dwDesiredAccess: Cardinal): THANDLE;
  47. External 'OpenServiceA@advapi32.dll stdcall';
  48. Function CloseServiceHandle(hSCObject: THANDLE): boolean;
  49. External 'CloseServiceHandle@advapi32.dll stdcall';
  50. Function CreateService(hSCManager: THANDLE; lpServiceName, lpDisplayName: AnsiString; dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl: Cardinal; lpBinaryPathName, lpLoadOrderGroup: String; lpdwTagId: Cardinal; lpDependencies, lpServiceStartName, lpPassword: String): Cardinal;
  51. External 'CreateServiceA@advapi32.dll stdcall';
  52. Function DeleteService(hService: THANDLE): boolean;
  53. External 'DeleteService@advapi32.dll stdcall';
  54. Function StartNTService(hService: THANDLE; dwNumServiceArgs: Cardinal; lpServiceArgVectors: Cardinal): boolean;
  55. External 'StartServiceA@advapi32.dll stdcall';
  56. Function ControlService(hService: THANDLE; dwControl: Cardinal; Var ServiceStatus: TSERVICE_STATUS): boolean;
  57. External 'ControlService@advapi32.dll stdcall';
  58. Function QueryServiceStatus(hService: THANDLE; Var ServiceStatus: TSERVICE_STATUS): boolean;
  59. External 'QueryServiceStatus@advapi32.dll stdcall';
  60. Function QueryServiceStatusEx(hService: THANDLE; ServiceStatus: TSERVICE_STATUS): boolean;
  61. External 'QueryServiceStatus@advapi32.dll stdcall';
  62. Function OpenServiceManager(): THANDLE;
  63. Begin
  64. Result := 0;
  65. If UsingWinNT() Then
  66. Begin
  67. Result := OpenSCManager('', 'ServicesActive', SC_MANAGER_ALL_ACCESS);
  68. If Result = 0 Then
  69. MsgBox('the servicemanager is not available', mbError, MB_OK);
  70. End
  71. Else
  72. MsgBox('only nt based systems support services', mbError, MB_OK);
  73. End;
  74. Function IsServiceInstalled(ServiceName: String): boolean;
  75. Var
  76. hSCM: THANDLE;
  77. hService: THANDLE;
  78. Begin
  79. hSCM := OpenServiceManager();
  80. Result := false;
  81. If hSCM <> 0 Then
  82. Begin
  83. hService := OpenService(hSCM, ServiceName, SERVICE_QUERY_CONFIG);
  84. If hService <> 0 Then
  85. Begin
  86. Result := true;
  87. CloseServiceHandle(hService)
  88. End;
  89. CloseServiceHandle(hSCM)
  90. End
  91. End;
  92. Function InstallService(FileName, ServiceName, DisplayName, Description: String; ServiceType, StartType: Cardinal): boolean;
  93. Var
  94. hSCM: THANDLE;
  95. hService: THANDLE;
  96. Begin
  97. hSCM := OpenServiceManager();
  98. Result := false;
  99. If hSCM <> 0 Then
  100. Begin
  101. hService := CreateService(hSCM, ServiceName, DisplayName, SERVICE_ALL_ACCESS, ServiceType, StartType, 0, FileName, '', 0, '', '', '');
  102. If hService <> 0 Then
  103. Begin
  104. Result := true;
  105. // Win2K & WinXP supports aditional description text for services
  106. If Description <> '' Then
  107. RegWriteStringValue(HKLM, 'System\CurrentControlSet\Services\' + ServiceName, 'Description', Description);
  108. CloseServiceHandle(hService)
  109. End;
  110. CloseServiceHandle(hSCM)
  111. End
  112. End;
  113. Function RemoveService(ServiceName: String): boolean;
  114. Var
  115. hSCM: THANDLE;
  116. hService: THANDLE;
  117. Begin
  118. hSCM := OpenServiceManager();
  119. Result := false;
  120. If hSCM <> 0 Then
  121. Begin
  122. hService := OpenService(hSCM, ServiceName, SERVICE_ALL_ACCESS);
  123. If hService <> 0 Then
  124. Begin
  125. Result := DeleteService(hService);
  126. CloseServiceHandle(hService)
  127. End;
  128. CloseServiceHandle(hSCM)
  129. End
  130. End;
  131. Function StartService(ServiceName: String): boolean;
  132. Var
  133. hSCM: THANDLE;
  134. hService: THANDLE;
  135. Begin
  136. hSCM := OpenServiceManager();
  137. Result := false;
  138. If hSCM <> 0 Then
  139. Begin
  140. hService := OpenService(hSCM, ServiceName, SERVICE_START);
  141. If hService <> 0 Then
  142. Begin
  143. Result := StartNTService(hService, 0, 0);
  144. CloseServiceHandle(hService)
  145. End;
  146. CloseServiceHandle(hSCM)
  147. End;
  148. End;
  149. Function StopService(ServiceName: String): boolean;
  150. Var
  151. hSCM: THANDLE;
  152. hService: THANDLE;
  153. Status: TSERVICE_STATUS;
  154. Begin
  155. hSCM := OpenServiceManager();
  156. Result := false;
  157. If hSCM <> 0 Then
  158. Begin
  159. hService := OpenService(hSCM, ServiceName, SERVICE_STOP);
  160. If hService <> 0 Then
  161. Begin
  162. Result := ControlService(hService, SERVICE_CONTROL_STOP, Status);
  163. CloseServiceHandle(hService)
  164. End;
  165. CloseServiceHandle(hSCM)
  166. End;
  167. End;
  168. Function IsServiceRunning(ServiceName: String): boolean;
  169. Var
  170. hSCM: THANDLE;
  171. hService: THANDLE;
  172. Status: TSERVICE_STATUS;
  173. Begin
  174. hSCM := OpenServiceManager();
  175. Result := false;
  176. If hSCM <> 0 Then
  177. Begin
  178. hService := OpenService(hSCM, ServiceName, SERVICE_QUERY_STATUS);
  179. If hService <> 0 Then
  180. Begin
  181. If QueryServiceStatus(hService, Status) Then
  182. Result := (Status.dwCurrentState = SERVICE_RUNNING)
  183. CloseServiceHandle(hService)
  184. End;
  185. CloseServiceHandle(hSCM)
  186. End
  187. End;