Unit WinSvc20

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.

Classes

Functions

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 -

Types

SC_HANDLE
SC_LOCK
SERVICE_STATUS_HANDLE
TEnumServiceStatus
TEnumServiceStatusA
TEnumServiceStatusW
THandlerFunction
TQueryServiceConfig
TQueryServiceConfigA
TQueryServiceConfigW
TQueryServiceLockStatus
TQueryServiceLockStatusA
TQueryServiceLockStatusW
TServiceMainFunction
TServiceMainFunctionA
TServiceMainFunctionW
TServiceStatus
TServiceTableEntry
TServiceTableEntryA
TServiceTableEntryW

Constants

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

Variables


Functions


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;


Types


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;

Constants

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


Variables