Unit: WinSvc20
translated from winsvc.h
Translator: Peter Sawatzki (ps)
Buchenhof 3, 58091 Hagen, Germany
CompuServe: 100031,3002
E-Mail: Peter@Sawatzki.de
web: http://www.sawatzki.de
Date: Author:
01/03/96 ps first version for Delphi 2.0
03/01/97 ps corrections for compatabilty with Delphi 3.0
Copyright (c) 1996, 1997 Peter Sawatzki. All Rights Reserved.
! Notice: this unit is for Delphi2 only. Delphi3 comes with WinSvc.Pas so
! I've renamed my original WinSvc.Pas file to WinSvc20.Pas
! to avoid confusion. Also I've made modifications to match
! my version with the Borland version.
ChangeServiceConfig -
ChangeServiceConfigA -
ChangeServiceConfigW -
CloseServiceHandle -
ControlService -
CreateService -
CreateServiceA -
CreateServiceW -
DeleteService -
EnumDependentServices -
EnumDependentServicesA -
EnumDependentServicesW -
EnumServicesStatus -
EnumServicesStatusA -
EnumServicesStatusW -
GetServiceDisplayName -
GetServiceDisplayNameA -
GetServiceDisplayNameW -
GetServiceKeyName -
GetServiceKeyNameA -
GetServiceKeyNameW -
LockServiceDatabase -
NotifyBootConfigStatus -
OpenSCManager -
OpenSCManagerA -
OpenSCManagerW -
OpenService -
OpenServiceA -
OpenServiceW -
QueryServiceConfig -
QueryServiceConfigA -
QueryServiceConfigW -
QueryServiceLockStatus -
QueryServiceLockStatusA -
QueryServiceLockStatusW -
QueryServiceObjectSecurity -
QueryServiceStatus -
RegisterServiceCtrlHandler -
RegisterServiceCtrlHandlerA -
RegisterServiceCtrlHandlerW -
SetServiceObjectSecurity -
SetServiceStatus -
StartService -
StartServiceA -
StartServiceCtrlDispatcher -
StartServiceCtrlDispatcherA -
StartServiceCtrlDispatcherW -
StartServiceW -
UnlockServiceDatabase -
SC_HANDLE
SC_LOCK
SERVICE_STATUS_HANDLE
TEnumServiceStatus
TEnumServiceStatusA
TEnumServiceStatusW
THandlerFunction
TQueryServiceConfig
TQueryServiceConfigA
TQueryServiceConfigW
TQueryServiceLockStatus
TQueryServiceLockStatusA
TQueryServiceLockStatusW
TServiceMainFunction
TServiceMainFunctionA
TServiceMainFunctionW
TServiceStatus
TServiceTableEntry
TServiceTableEntryA
TServiceTableEntryW
SC_GROUP_IDENTIFIER
SC_MANAGER_ALL_ACCESS
SC_MANAGER_CONNECT
SC_MANAGER_CREATE_SERVICE
SC_MANAGER_ENUMERATE_SERVICE
SC_MANAGER_LOCK
SC_MANAGER_MODIFY_BOOT_CONFIG
SC_MANAGER_QUERY_LOCK_STATUS
SERVICES_ACTIVE_DATABASE
SERVICES_FAILED_DATABASE
SERVICE_ACCEPT_PAUSE_CONTINUE
SERVICE_ACCEPT_SHUTDOWN
SERVICE_ACCEPT_STOP
SERVICE_ACTIVE
SERVICE_ALL_ACCESS
SERVICE_CHANGE_CONFIG
SERVICE_CONTINUE_PENDING
SERVICE_CONTROL_CONTINUE
SERVICE_CONTROL_INTERROGATE
SERVICE_CONTROL_PAUSE
SERVICE_CONTROL_SHUTDOWN
SERVICE_CONTROL_STOP
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_INACTIVE
SERVICE_INTERROGATE
SERVICE_NO_CHANGE
SERVICE_PAUSED
SERVICE_PAUSE_CONTINUE
SERVICE_PAUSE_PENDING
SERVICE_QUERY_CONFIG
SERVICE_QUERY_STATUS
SERVICE_RUNNING
SERVICE_START
SERVICE_START_PENDING
SERVICE_STATE_ALL
SERVICE_STOP
SERVICE_STOPPED
SERVICE_STOP_PENDING
SERVICE_USER_DEFINED_CONTROL
function ChangeServiceConfig(hService: SC_HANDLE; dwServiceType, dwStartType,
dwErrorControl: DWORD; lpBinaryPathName, lpLoadOrderGroup: PChar;
lpdwTagId: LPDWORD; lpDependencies, lpServiceStartName, lpPassword,
lpDisplayName: PChar): BOOL;
function ChangeServiceConfigA(hService: SC_HANDLE; dwServiceType, dwStartType,
dwErrorControl: DWORD; lpBinaryPathName, lpLoadOrderGroup: PAnsiChar;
lpdwTagId: LPDWORD; lpDependencies, lpServiceStartName, lpPassword,
lpDisplayName: PAnsiChar): BOOL;
function ChangeServiceConfigW(hService: SC_HANDLE; dwServiceType, dwStartType,
dwErrorControl: DWORD; lpBinaryPathName, lpLoadOrderGroup: PWideChar;
lpdwTagId: LPDWORD; lpDependencies, lpServiceStartName, lpPassword,
lpDisplayName: PWideChar): BOOL;
function CloseServiceHandle(hSCObject: SC_HANDLE): BOOL;
function ControlService(hService: SC_HANDLE; dwControl: DWORD;
var lpServiceStatus: TServiceStatus): BOOL;
function CreateService(hSCManager: SC_HANDLE; lpServiceName, lpDisplayName: PChar;
dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl: DWORD;
lpBinaryPathName, lpLoadOrderGroup: PChar; lpdwTagId: LPDWORD; lpDependencies,
lpServiceStartName, lpPassword: PChar): SC_HANDLE;
function CreateServiceA(hSCManager: SC_HANDLE; lpServiceName, lpDisplayName: PAnsiChar;
dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl: DWORD;
lpBinaryPathName, lpLoadOrderGroup: PAnsiChar; lpdwTagId: LPDWORD; lpDependencies,
lpServiceStartName, lpPassword: PAnsiChar): SC_HANDLE;
function CreateServiceW(hSCManager: SC_HANDLE; lpServiceName, lpDisplayName: PWideChar;
dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl: DWORD;
lpBinaryPathName, lpLoadOrderGroup: PWideChar; lpdwTagId: LPDWORD; lpDependencies,
lpServiceStartName, lpPassword: PWideChar): SC_HANDLE;
function DeleteService(hService: SC_HANDLE): BOOL;
function EnumDependentServices(hService: SC_HANDLE; dwServiceState: DWORD;
var lpServices: TEnumServiceStatus; cbBufSize: DWORD; var pcbBytesNeeded,
lpServicesReturned : DWORD): BOOL;
function EnumDependentServicesA(hService: SC_HANDLE; dwServiceState: DWORD;
var lpServices: TEnumServiceStatusA; cbBufSize: DWORD; var pcbBytesNeeded,
lpServicesReturned : DWORD): BOOL;
function EnumDependentServicesW(hService: SC_HANDLE; dwServiceState: DWORD;
var lpServices: TEnumServiceStatusW; cbBufSize: DWORD; var pcbBytesNeeded,
lpServicesReturned : DWORD): BOOL;
function EnumServicesStatus(hSCManager: SC_HANDLE; dwServiceType,
dwServiceState: DWORD; var lpServices: TEnumServiceStatus; cbBufSize: DWORD;
var pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD): BOOL;
function EnumServicesStatusA(hSCManager: SC_HANDLE; dwServiceType,
dwServiceState: DWORD; var lpServices: TEnumServiceStatusA; cbBufSize: DWORD;
var pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD): BOOL;
function EnumServicesStatusW(hSCManager: SC_HANDLE; dwServiceType,
dwServiceState: DWORD; var lpServices: TEnumServiceStatusW; cbBufSize: DWORD;
var pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD): BOOL;
function GetServiceDisplayName(hSCManager: SC_HANDLE; lpServiceName,
lpDisplayName: PChar; var lpcchBuffer: DWORD): BOOL;
function GetServiceDisplayNameA(hSCManager: SC_HANDLE; lpServiceName,
lpDisplayName: PAnsiChar; var lpcchBuffer: DWORD): BOOL;
function GetServiceDisplayNameW(hSCManager: SC_HANDLE; lpServiceName,
lpDisplayName: PWideChar; var lpcchBuffer: DWORD): BOOL;
function GetServiceKeyName(hSCManager: SC_HANDLE; lpDisplayName,
lpServiceName: PChar; var lpcchBuffer: DWORD): BOOL;
function GetServiceKeyNameA(hSCManager: SC_HANDLE; lpDisplayName,
lpServiceName: PAnsiChar; var lpcchBuffer: DWORD): BOOL;
function GetServiceKeyNameW(hSCManager: SC_HANDLE; lpDisplayName,
lpServiceName: PWideChar; var lpcchBuffer: DWORD): BOOL;
function LockServiceDatabase(hSCManager: SC_HANDLE): SC_LOCK;
function NotifyBootConfigStatus(BootAcceptable: BOOL): BOOL;
function OpenSCManager(lpMachineName, lpDatabaseName: PChar;
dwDesiredAccess: DWORD): SC_HANDLE;
function OpenSCManagerA(lpMachineName, lpDatabaseName: PAnsiChar;
dwDesiredAccess: DWORD): SC_HANDLE;
function OpenSCManagerW(lpMachineName, lpDatabaseName: PWideChar;
dwDesiredAccess: DWORD): SC_HANDLE;
function OpenService(hSCManager: SC_HANDLE; lpServiceName: PChar;
dwDesiredAccess: DWORD): SC_HANDLE;
function OpenServiceA(hSCManager: SC_HANDLE; lpServiceName: PAnsiChar;
dwDesiredAccess: DWORD): SC_HANDLE;
function OpenServiceW(hSCManager: SC_HANDLE; lpServiceName: PWideChar;
dwDesiredAccess: DWORD): SC_HANDLE;
function QueryServiceConfig(hService: SC_HANDLE;
var lpServiceConfig: TQueryServiceConfig; cbBufSize: DWORD;
var pcbBytesNeeded: DWORD): BOOL;
function QueryServiceConfigA(hService: SC_HANDLE;
var lpServiceConfig: TQueryServiceConfigA; cbBufSize: DWORD;
var pcbBytesNeeded: DWORD): BOOL;
function QueryServiceConfigW(hService: SC_HANDLE;
var lpServiceConfig: TQueryServiceConfigW; cbBufSize: DWORD;
var pcbBytesNeeded: DWORD): BOOL;
function QueryServiceLockStatus(hSCManager: SC_HANDLE;
var lpLockStatus: TQueryServiceLockStatus; cbBufSize: DWORD;
var pcbBytesNeeded: DWORD): BOOL;
function QueryServiceLockStatusA(hSCManager: SC_HANDLE;
var lpLockStatus: TQueryServiceLockStatusA; cbBufSize: DWORD;
var pcbBytesNeeded: DWORD): BOOL;
function QueryServiceLockStatusW(hSCManager: SC_HANDLE;
var lpLockStatus: TQueryServiceLockStatusW; cbBufSize: DWORD;
var pcbBytesNeeded: DWORD): BOOL;
function QueryServiceObjectSecurity(hService: SC_HANDLE;
dwSecurityInformation: SECURITY_INFORMATION;
lpSecurityDescriptor: PSECURITY_DESCRIPTOR; cbBufSize: DWORD;
var pcbBytesNeeded: DWORD): BOOL;
function QueryServiceStatus(hService: SC_HANDLE; var
lpServiceStatus: TServiceStatus): BOOL;
function RegisterServiceCtrlHandler(lpServiceName: PChar;
lpHandlerProc: ThandlerFunction): SERVICE_STATUS_HANDLE;
function RegisterServiceCtrlHandlerA(lpServiceName: PAnsiChar;
lpHandlerProc: ThandlerFunction): SERVICE_STATUS_HANDLE;
function RegisterServiceCtrlHandlerW(lpServiceName: PWideChar;
lpHandlerProc: ThandlerFunction): SERVICE_STATUS_HANDLE;
function SetServiceObjectSecurity(hService: SC_HANDLE;
dwSecurityInformation: SECURITY_INFORMATION;
lpSecurityDescriptor: PSECURITY_DESCRIPTOR): BOOL;
function SetServiceStatus(hServiceStatus: SERVICE_STATUS_HANDLE;
var lpServiceStatus: TServiceStatus): BOOL;
function StartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD;
var lpServiceArgVectors: PChar): BOOL;
function StartServiceA(hService: SC_HANDLE; dwNumServiceArgs: DWORD;
var lpServiceArgVectors: PAnsiChar): BOOL;
function StartServiceCtrlDispatcher(
var lpServiceStartTable: TServiceTableEntry): BOOL;
function StartServiceCtrlDispatcherA(
var lpServiceStartTable: TServiceTableEntryA): BOOL;
function StartServiceCtrlDispatcherW(
var lpServiceStartTable: TServiceTableEntryW): BOOL;
function StartServiceW(hService: SC_HANDLE; dwNumServiceArgs: DWORD;
var lpServiceArgVectors: PWideChar): BOOL;
function UnlockServiceDatabase(ScLock: SC_LOCK): BOOL;
SC_HANDLE = THandle
Handle Types
SC_LOCK = Pointer
Structures for the Lock API functions
SERVICE_STATUS_HANDLE = DWord
TEnumServiceStatus = TEnumServiceStatusA
TEnumServiceStatusA = record
lpServiceName : PAnsiChar;
lpDisplayName : PAnsiChar;
ServiceStatus : TServiceStatus
end;
Service Status Enumeration Structure
TEnumServiceStatusW = record
lpServiceName : PWideChar;
lpDisplayName : PWideChar;
ServiceStatus : TServiceStatus
end;
THandlerFunction = Procedure (dwControl: DWord) StdCall
Prototype for the Service Control Handler Function
TQueryServiceConfig = TQueryServiceConfigA
TQueryServiceConfigA = record
dwServiceType : DWord;
dwStartType : DWord;
dwErrorControl : DWord;
lpBinaryPathName : PAnsiChar;
lpLoadOrderGroup : PAnsiChar;
dwTagId : DWord;
lpDependencies : PAnsiChar;
lpServiceStartName : PAnsiChar;
lpDisplayName : PAnsiChar;
end;
Query Service Configuration Structure
TQueryServiceConfigW = record
dwServiceType : DWord;
dwStartType : DWord;
dwErrorControl : DWord;
lpBinaryPathName : PWideChar;
lpLoadOrderGroup : PWideChar;
dwTagId : DWord;
lpDependencies : PWideChar;
lpServiceStartName : PWideChar;
lpDisplayName : PWideChar;
end;
TQueryServiceLockStatus = TQueryServiceLockStatusA
TQueryServiceLockStatusA = record
fIsLocked : DWord;
lpLockOwner : PAnsiChar;
dwLockDuration : DWord
end;
TQueryServiceLockStatusW = record
fIsLocked : DWord;
lpLockOwner : PWideChar;
dwLockDuration : DWord
end;
TServiceMainFunction = Procedure (dwNumServicesArgs: DWord; Var ArgVectors: PChar) StdCall
TServiceMainFunctionA = Procedure (dwNumServicesArgs: DWord; Var ArgVectors: PAnsiChar) StdCall
TServiceMainFunctionW = Procedure (dwNumServicesArgs: DWord; Var ArgVectors: PWideChar) StdCall
Function Prototype for the Service Main Function
TServiceStatus = record
dwServiceType : DWord
dwCurrentState : DWord
dwControlsAccepted : DWord
dwWin32ExitCode : DWord
dwServiceSpecificExitCode : DWord
dwCheckPoint : DWord
dwWaitHint : DWord
end;
Service Status Structure
TServiceTableEntry = TServiceTableEntryA
TServiceTableEntryA = record
lpServiceName : PAnsiChar;
lpServiceProc : TServiceMainFunctionA
end;
Service Start Table
TServiceTableEntryW = record
lpServiceName : PWideChar;
lpServiceProc : TServiceMainFunctionW
end;
SC_GROUP_IDENTIFIER = '+'
SC_MANAGER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED
Or SC_MANAGER_CONNECT
Or SC_MANAGER_CREATE_SERVICE
Or SC_MANAGER_ENUMERATE_SERVICE
Or SC_MANAGER_LOCK
Or SC_MANAGER_QUERY_LOCK_STATUS
Or SC_MANAGER_MODIFY_BOOT_CONFIG
SC_MANAGER_CONNECT = $0001
Service Control Manager object specific access types
SC_MANAGER_CREATE_SERVICE = $0002
SC_MANAGER_ENUMERATE_SERVICE = $0004
SC_MANAGER_LOCK = $0008
SC_MANAGER_MODIFY_BOOT_CONFIG = $0020
SC_MANAGER_QUERY_LOCK_STATUS = $0010
SERVICES_ACTIVE_DATABASE = 'ServicesActive'
SERVICES_FAILED_DATABASE = 'ServicesFailed'
SERVICE_ACCEPT_PAUSE_CONTINUE = $00000002
SERVICE_ACCEPT_SHUTDOWN = $00000004
SERVICE_ACCEPT_STOP = $00000001
Controls Accepted (Bit Mask)
SERVICE_ACTIVE = $00000001
- Service State -- for Enum Requests (Bit Mask
SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED
Or SERVICE_QUERY_CONFIG
Or SERVICE_CHANGE_CONFIG
Or SERVICE_QUERY_STATUS
Or SERVICE_ENUMERATE_DEPENDENTS
Or SERVICE_START
Or SERVICE_STOP
Or SERVICE_PAUSE_CONTINUE
Or SERVICE_INTERROGATE
Or SERVICE_USER_DEFINED_CONTROL
SERVICE_CHANGE_CONFIG = $0002
SERVICE_CONTINUE_PENDING = $00000005
SERVICE_CONTROL_CONTINUE = $00000003
SERVICE_CONTROL_INTERROGATE = $00000004
SERVICE_CONTROL_PAUSE = $00000002
SERVICE_CONTROL_SHUTDOWN = $00000005
SERVICE_CONTROL_STOP = $00000001
- Controls
SERVICE_ENUMERATE_DEPENDENTS = $0008
SERVICE_INACTIVE = $00000002
SERVICE_INTERROGATE = $0080
SERVICE_NO_CHANGE = $ffffffff
- Value to indicate no change to an optional parameter
SERVICE_PAUSED = $00000007
SERVICE_PAUSE_CONTINUE = $0040
SERVICE_PAUSE_PENDING = $00000006
SERVICE_QUERY_CONFIG = $0001
Service object specific access type
SERVICE_QUERY_STATUS = $0004
SERVICE_RUNNING = $00000004
SERVICE_START = $0010
SERVICE_START_PENDING = $00000002
SERVICE_STATE_ALL = SERVICE_ACTIVE Or SERVICE_INACTIVE
SERVICE_STOP = $0020
SERVICE_STOPPED = $00000001
Service State -- for CurrentState
SERVICE_STOP_PENDING = $00000003
SERVICE_USER_DEFINED_CONTROL = $0100