{*****************************************************************************
 Portions created by Microsoft are Copyright (c) 1995-1998  Microsoft Corporation
 New stuff WinSvc.h 
 Pascal translation by Arno Garrels <arno.garrels@gmx.de>
 Oct 17, 08 some Unicode changes.
*****************************************************************************}

unit DDWinSvc;

{$ALIGN ON}
{$WEAKPACKAGEUNIT}
{$MINENUMSIZE 4}
{$I DDCompilers.inc}

interface

{$IFNDEF COMPILER16_UP}
uses Windows, WinSvc;
{$ELSE}
uses Winapi.Windows, Winapi.WinSvc;
{$ENDIF}

const
{$IFDEF UNICODE}
  ApiSuffix = 'W';
{$ELSE}
  ApiSuffix = 'A';
{$ENDIF}  

type
  {$EXTERNALSYM USHORT}
  USHORT = Word;

{$IFNDEF COMPILER16_UP}
  {$EXTERNALSYM SERVICE_STATUS_HANDLE}
  SERVICE_STATUS_HANDLE = THandle;
{$ENDIF}

const
//
// Controls W2K, XP, Vista
//
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONTROL_PARAMCHANGE} {$ENDIF}
  SERVICE_CONTROL_PARAMCHANGE           = $00000006;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONTROL_NETBINDADD} {$ENDIF}
  SERVICE_CONTROL_NETBINDADD            = $00000007;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONTROL_NETBINDREMOVE} {$ENDIF}
  SERVICE_CONTROL_NETBINDREMOVE         = $00000008;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONTROL_NETBINDENABLE} {$ENDIF}
  SERVICE_CONTROL_NETBINDENABLE         = $00000009;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONTROL_NETBINDDISABLE} {$ENDIF}
  SERVICE_CONTROL_NETBINDDISABLE        = $0000000A;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONTROL_DEVICEEVENT} {$ENDIF}
  SERVICE_CONTROL_DEVICEEVENT           = $0000000B;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONTROL_HARDWAREPROFILECHANGE} {$ENDIF}
  SERVICE_CONTROL_HARDWAREPROFILECHANGE = $0000000C;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONTROL_POWEREVENT} {$ENDIF}
  SERVICE_CONTROL_POWEREVENT            = $0000000D;

  {$IFDEF SDK_HEADER_WINXP} {$EXTERNALSYM SERVICE_CONTROL_SESSIONCHANGE} {$ENDIF}
  SERVICE_CONTROL_SESSIONCHANGE         = $0000000E;

  // Vista
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONTROL_PRESHUTDOWN} {$ENDIF}
  SERVICE_CONTROL_PRESHUTDOWN           = $0000000F;

// ==> Begin Windows 7 and Server 2008 R2

  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_CONTROL_TIMECHANGE} {$ENDIF}
  SERVICE_CONTROL_TIMECHANGE            = $00000010;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_CONTROL_TRIGGEREVENT} {$ENDIF}
  SERVICE_CONTROL_TRIGGEREVENT          = $00000020;
// <== End Windows 7 and Server 2008 R2

//
// Controls Accepted  (Bit Mask) W2K, XP, Vista
//
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_ACCEPT_PARAMCHANGE} {$ENDIF}
  SERVICE_ACCEPT_PARAMCHANGE            = $00000008;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_ACCEPT_NETBINDCHANGE}  {$ENDIF}
  SERVICE_ACCEPT_NETBINDCHANGE          = $00000010;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_ACCEPT_HARDWAREPROFILECHANGE} {$ENDIF}
  SERVICE_ACCEPT_HARDWAREPROFILECHANGE  = $00000020;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_ACCEPT_POWEREVENT} {$ENDIF}
  SERVICE_ACCEPT_POWEREVENT             = $00000040;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_ACCEPT_SESSIONCHANGE} {$ENDIF}
  SERVICE_ACCEPT_SESSIONCHANGE          = $00000080;

  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_ACCEPT_PRESHUTDOWN} {$ENDIF}
  SERVICE_ACCEPT_PRESHUTDOWN            = $00000100;

// ==> Begin Windows 7 and Server 2008 R2
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_ACCEPT_TIMECHANGE} {$ENDIF}
  SERVICE_ACCEPT_TIMECHANGE             = $00000200;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_ACCEPT_TRIGGEREVENT} {$ENDIF}
  SERVICE_ACCEPT_TRIGGEREVENT           = $00000400;
// <== End Windows 7 and Server 2008 R2

//
// Info levels for ChangeServiceConfig2 and QueryServiceConfig2
//
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONFIG_DESCRIPTION} {$ENDIF}
  SERVICE_CONFIG_DESCRIPTION                = 1;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_CONFIG_FAILURE_ACTIONS} {$ENDIF}
  SERVICE_CONFIG_FAILURE_ACTIONS            = 2;

  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONFIG_DELAYED_AUTO_START_INFO} {$ENDIF}
  SERVICE_CONFIG_DELAYED_AUTO_START_INFO    = 3;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONFIG_FAILURE_ACTIONS_FLAG} {$ENDIF}
  SERVICE_CONFIG_FAILURE_ACTIONS_FLAG       = 4;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONFIG_SERVICE_SID_INFO} {$ENDIF}
  SERVICE_CONFIG_SERVICE_SID_INFO           = 5;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO} {$ENDIF}
  SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO   = 6;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONFIG_PRESHUTDOWN_INFO} {$ENDIF}
  SERVICE_CONFIG_PRESHUTDOWN_INFO           = 7;

// ==> Begin Windows 7 and Server 2008 R2
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_CONFIG_TRIGGER_INFO} {$ENDIF}
  SERVICE_CONFIG_TRIGGER_INFO               = 8;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_CONFIG_PREFERRED_NODE} {$ENDIF}
  SERVICE_CONFIG_PREFERRED_NODE             = 9;
// <== End Windows 7 and Server 2008 R2

//
// Info levels for NotifyServiceStatusChange
//
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_STATUS_CHANGE_1} {$ENDIF}
  SERVICE_NOTIFY_STATUS_CHANGE_1          = 1;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_STATUS_CHANGE_2} {$ENDIF}
  SERVICE_NOTIFY_STATUS_CHANGE_2          = 2;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_STATUS_CHANGE} {$ENDIF}
  SERVICE_NOTIFY_STATUS_CHANGE            = SERVICE_NOTIFY_STATUS_CHANGE_2;

//
// Service notification masks
//
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_STOPPED} {$ENDIF}
  SERVICE_NOTIFY_STOPPED                  = $00000001;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_START_PENDING} {$ENDIF}
  SERVICE_NOTIFY_START_PENDING            = $00000002;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_STOP_PENDING} {$ENDIF}
  SERVICE_NOTIFY_STOP_PENDING             = $00000004;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_RUNNING} {$ENDIF}
  SERVICE_NOTIFY_RUNNING                  = $00000008;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_CONTINUE_PENDING} {$ENDIF}
  SERVICE_NOTIFY_CONTINUE_PENDING         = $00000010;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_PAUSE_PENDING} {$ENDIF}
  SERVICE_NOTIFY_PAUSE_PENDING            = $00000020;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_PAUSED} {$ENDIF}
  SERVICE_NOTIFY_PAUSED                   = $00000040;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_CREATED} {$ENDIF}
  SERVICE_NOTIFY_CREATED                  = $00000080;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_DELETED} {$ENDIF}
  SERVICE_NOTIFY_DELETED                  = $00000100;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_DELETE_PENDING} {$ENDIF}
  SERVICE_NOTIFY_DELETE_PENDING           = $00000200;

//
// The following defines are for service stop reason codes
//
//
// Stop reason flags. Update SERVICE_STOP_REASON_FLAG_MAX when
// new flags are added.
//
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_FLAG_MIN} {$ENDIF}
  SERVICE_STOP_REASON_FLAG_MIN            = $00000000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_FLAG_UNPLANNED} {$ENDIF}
  SERVICE_STOP_REASON_FLAG_UNPLANNED      = $10000000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_FLAG_CUSTOM} {$ENDIF}
  SERVICE_STOP_REASON_FLAG_CUSTOM         = $20000000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_FLAG_PLANNED} {$ENDIF}
  SERVICE_STOP_REASON_FLAG_PLANNED        = $40000000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_FLAG_MAX} {$ENDIF}
  SERVICE_STOP_REASON_FLAG_MAX            = $80000000;

//
// Microsoft major reasons. Update SERVICE_STOP_REASON_MAJOR_MAX when
// new codes are added.
//
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_MIN} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_MIN              = $00000000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_OTHER} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_OTHER            = $00010000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_HARDWARE} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_HARDWARE         = $00020000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_OPERATINGSYSTEM} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_OPERATINGSYSTEM  = $00030000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_SOFTWARE} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_SOFTWARE         = $00040000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_APPLICATION} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_APPLICATION      = $00050000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_NONE} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_NONE             = $00060000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_MAX} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_MAX              = $00070000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_MIN_CUSTOM} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_MIN_CUSTOM       = $00400000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MAJOR_MAX_CUSTOM} {$ENDIF}
  SERVICE_STOP_REASON_MAJOR_MAX_CUSTOM       = $00ff0000;

//
// Microsoft minor reasons. Update SERVICE_STOP_REASON_MINOR_MAX when
// new codes are added.
//
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_MIN} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_MIN                           = $00000000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_OTHER} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_OTHER                         = $00000001;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_MAINTENANCE} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_MAINTENANCE                   = $00000002;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_INSTALLATION} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_INSTALLATION                  = $00000003;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_UPGRADE} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_UPGRADE                       = $00000004;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_RECONFIG} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_RECONFIG                      = $00000005;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_HUNG} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_HUNG                          = $00000006;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_UNSTABLE} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_UNSTABLE                      = $00000007;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_DISK} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_DISK                          = $00000008;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_NETWORKCARD} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_NETWORKCARD                   = $00000009;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_ENVIRONMENT} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_ENVIRONMENT                   = $0000000a;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_HARDWARE_DRIVER} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_HARDWARE_DRIVER               = $0000000b;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_OTHERDRIVER} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_OTHERDRIVER                   = $0000000c;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_SERVICEPACK} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_SERVICEPACK                   = $0000000d;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE               = $0000000e;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_SECURITYFIX} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_SECURITYFIX                   = $0000000f;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_SECURITY} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_SECURITY                      = $00000010;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_NETWORK_CONNECTIVITY} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_NETWORK_CONNECTIVITY          = $00000011;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_WMI} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_WMI                           = $00000012;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_SERVICEPACK_UNINSTALL} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_SERVICEPACK_UNINSTALL         = $00000013;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE_UNINSTALL} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_SOFTWARE_UPDATE_UNINSTALL     = $00000014;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_SECURITYFIX_UNINSTALL} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_SECURITYFIX_UNINSTALL         = $00000015;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_MMC} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_MMC                           = $00000016;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_NONE} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_NONE                          = $00000017;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_MAX} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_MAX                           = $00000018;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_MIN_CUSTOM} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_MIN_CUSTOM                    = $00000100;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_STOP_REASON_MINOR_MAX_CUSTOM} {$ENDIF}
  SERVICE_STOP_REASON_MINOR_MAX_CUSTOM                    = $0000FFFF;

//
// Info levels for ControlServiceEx
//
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONTROL_STATUS_REASON_INFO} {$ENDIF}
  SERVICE_CONTROL_STATUS_REASON_INFO      = 1;

//
// Service SID types supported Vista
//
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_SID_TYPE_NONE} {$ENDIF}
  SERVICE_SID_TYPE_NONE                   = $00000000;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_SID_TYPE_UNRESTRICTED} {$ENDIF}
  SERVICE_SID_TYPE_UNRESTRICTED           = $00000001;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_SID_TYPE_RESTRICTED} {$ENDIF}
  SERVICE_SID_TYPE_RESTRICTED             = $00000002 or
                                            SERVICE_SID_TYPE_UNRESTRICTED;

// ==> Begin Windows 7 and Server 2008 R2
//
// Service trigger types
//
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL}{$ENDIF}
  SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL   = 1;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_TYPE_IP_ADDRESS_AVAILABILITY}{$ENDIF}
  SERVICE_TRIGGER_TYPE_IP_ADDRESS_AVAILABILITY    = 2;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_TYPE_DOMAIN_JOIN}{$ENDIF}
  SERVICE_TRIGGER_TYPE_DOMAIN_JOIN                = 3;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT}{$ENDIF}
  SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT        = 4;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_TYPE_GROUP_POLICY}{$ENDIF}
  SERVICE_TRIGGER_TYPE_GROUP_POLICY               = 5;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_TYPE_CUSTOM}{$ENDIF}
  SERVICE_TRIGGER_TYPE_CUSTOM                     = 20;

//
// Service trigger data types
//
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_DATA_TYPE_BINARY}{$ENDIF}
  SERVICE_TRIGGER_DATA_TYPE_BINARY    = 1; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_DATA_TYPE_STRING}{$ENDIF}
  SERVICE_TRIGGER_DATA_TYPE_STRING    = 2; 

//
//  NETWORK_MANAGER_FIRST_IP_ADDRESS_ARRIVAL_GUID & NETWORK_MANAGER_LAST_IP_ADDRESS_REMOVAL_GUID are used with
//  SERVICE_TRIGGER_TYPE_IP_ADDRESS_AVAILABILITY trigger.
//
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM NETWORK_MANAGER_FIRST_IP_ADDRESS_ARRIVAL_GUID} {$ENDIF}
  NETWORK_MANAGER_FIRST_IP_ADDRESS_ARRIVAL_GUID : TGUID = '{4f27f2de-14e2-430b-a549-7cd48cbc8245}';
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM NETWORK_MANAGER_LAST_IP_ADDRESS_REMOVAL_GUID} {$ENDIF}
  NETWORK_MANAGER_LAST_IP_ADDRESS_REMOVAL_GUID  : TGUID = '{cc4ba62a-162e-4648-847a-b6bdf993e335}';

//
//  DOMAIN_JOIN_GUID & DOMAIN_LEAVE_GUID are used with SERVICE_TRIGGER_TYPE_DOMAIN_JOIN trigger.
//
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM DOMAIN_JOIN_GUID} {$ENDIF}
  DOMAIN_JOIN_GUID  : TGUID = '{1ce20aba-9851-4421-9430-1ddeb766e809}';
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM DOMAIN_LEAVE_GUID} {$ENDIF}
  DOMAIN_LEAVE_GUID : TGUID = '{ddaf516e-58c2-4866-9574-c3b615d42ea1}';

//
//  FIREWALL_PORT_OPEN_GUID & FIREWALL_PORT_CLOSE_GUID are used with
//  SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT trigger.
//
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM FIREWALL_PORT_OPEN_GUID} {$ENDIF}
  FIREWALL_PORT_OPEN_GUID  : TGUID = '{b7569e07-8421-4ee0-ad10-86915afdad09}';
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM FIREWALL_PORT_CLOSE_GUID} {$ENDIF}
  FIREWALL_PORT_CLOSE_GUID : TGUID = '{a144ed38-8e12-4de4-9d96-e64740b1a524}';

//
//  MACHINE_POLICY_PRESENT_GUID & USER_POLICY_PRESENT_GUID are used with
//  SERVICE_TRIGGER_TYPE_GROUP_POLICY trigger.
//
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM MACHINE_POLICY_PRESENT_GUID} {$ENDIF}
  MACHINE_POLICY_PRESENT_GUID : TGUID = '{659FCAE6-5BDB-4DA9-B1FF-CA2A178D46E0}';
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM USER_POLICY_PRESENT_GUID} {$ENDIF}
  USER_POLICY_PRESENT_GUID    : TGUID = '{54FB46C8-F089-464C-B1FD-59D1B62C3B50}';

//
// Service trigger actions
//
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_ACTION_SERVICE_START}{$ENDIF}
  SERVICE_TRIGGER_ACTION_SERVICE_START    = 1;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_ACTION_SERVICE_STOP}{$ENDIF}
  SERVICE_TRIGGER_ACTION_SERVICE_STOP     = 2;

//
// argv[1] passed into ServiceMain of trigger started services
//
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_STARTED_ARGUMENT}{$ENDIF}
  SERVICE_TRIGGER_STARTED_ARGUMENT        = 'TriggerStarted'; 

type
//
//  Service trigger data item
//
  PServiceTriggerSpecificDataItem = ^TServiceTriggerSpecificDataItem;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM _SERVICE_TRIGGER_SPECIFIC_DATA_ITEM}{$ENDIF}
  _SERVICE_TRIGGER_SPECIFIC_DATA_ITEM = record 
    dwDataType: DWORD; 
    // Data type -- one of SERVICE_TRIGGER_DATA_TYPE_* constants 
    cbData: DWORD; 
    // Size of trigger specific data 
    pData: PBYTE; 
    // Trigger specific data 
  end; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_SPECIFIC_DATA_ITEM}{$ENDIF}
  SERVICE_TRIGGER_SPECIFIC_DATA_ITEM = _SERVICE_TRIGGER_SPECIFIC_DATA_ITEM; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM PSERVICE_TRIGGER_SPECIFIC_DATA_ITEM} {$ENDIF}
  PSERVICE_TRIGGER_SPECIFIC_DATA_ITEM = ^_SERVICE_TRIGGER_SPECIFIC_DATA_ITEM; 
  TServiceTriggerSpecificDataItem = _SERVICE_TRIGGER_SPECIFIC_DATA_ITEM; 

//
//  Trigger-specific information
//
  PServiceTrigger = ^TServiceTrigger;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM _SERVICE_TRIGGER}{$ENDIF}
  _SERVICE_TRIGGER = record 
    dwTriggerType: DWORD; 
    // One of SERVICE_TRIGGER_TYPE_* constants 
    dwAction: DWORD; 
    // One of SERVICE_TRIGGER_ACTION_* constants 
    pTriggerSubtype: PGUID;
    // Provider GUID if the trigger type is SERVICE_TRIGGER_TYPE_CUSTOM 
    // Device class interface GUID if the trigger type is 
    // SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL 
    cDataItems: DWORD; 
    // Number of data items in pDataItems array 
    pDataItems: PSERVICE_TRIGGER_SPECIFIC_DATA_ITEM; 
    // Trigger specific data 
  end; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER}{$ENDIF}
  SERVICE_TRIGGER = _SERVICE_TRIGGER; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM PSERVICE_TRIGGER}{$ENDIF}
  PSERVICE_TRIGGER = ^_SERVICE_TRIGGER; 
  TServiceTrigger = _SERVICE_TRIGGER; 

//
// Service trigger information
//
  PServiceTriggerInfo = ^TServiceTriggerInfo;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM _SERVICE_TRIGGER_INFO}{$ENDIF}
  _SERVICE_TRIGGER_INFO = record 
    cTriggers: DWORD; 
    // Number of triggers in the pTriggers array 
    pTriggers: PSERVICE_TRIGGER; 
    // Array of triggers 
    pReserved: PBYTE; 
    // Reserved, must be NULL 
  end; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TRIGGER_INFO}{$ENDIF}
  SERVICE_TRIGGER_INFO = _SERVICE_TRIGGER_INFO; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM PSERVICE_TRIGGER_INFO}{$ENDIF}
  PSERVICE_TRIGGER_INFO = ^_SERVICE_TRIGGER_INFO; 
  TServiceTriggerInfo = _SERVICE_TRIGGER_INFO; 

//
// Preferred node information
//
  PServicePreferredNodeInfo = ^TServicePreferredNodeInfo;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM _SERVICE_PREFERRED_NODE_INFO}{$ENDIF}
  _SERVICE_PREFERRED_NODE_INFO = record 
    usPreferredNode: USHORT;
    // Preferred node 
    fDelete: BOOLEAN; 
    // Delete the preferred node setting 
  end; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_PREFERRED_NODE_INFO}{$ENDIF}
  SERVICE_PREFERRED_NODE_INFO = _SERVICE_PREFERRED_NODE_INFO; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM LPSERVICE_PREFERRED_NODE_INFO}{$ENDIF}
  LPSERVICE_PREFERRED_NODE_INFO = ^_SERVICE_PREFERRED_NODE_INFO; 
  TServicePreferredNodeInfo = _SERVICE_PREFERRED_NODE_INFO; 

//
// Time change information
//
  PServiceTimechangeInfo = ^TServiceTimechangeInfo;
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM _SERVICE_TIMECHANGE_INFO} {$ENDIF}
  _SERVICE_TIMECHANGE_INFO = record 
    liNewTime: LARGE_INTEGER; 
    // New time 
    liOldTime: LARGE_INTEGER; 
    // Old time 
  end; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM SERVICE_TIMECHANGE_INFO}{$ENDIF}
  SERVICE_TIMECHANGE_INFO = _SERVICE_TIMECHANGE_INFO; 
  {$IFDEF SDK_HEADER_WIN7} {$EXTERNALSYM PSERVICE_TIMECHANGE_INFO} {$ENDIF}
  PSERVICE_TIMECHANGE_INFO = ^_SERVICE_TIMECHANGE_INFO; 
  TServiceTimechangeInfo = _SERVICE_TIMECHANGE_INFO; 

// <== End Windows 7 and Server 2008 R2

//
// Service description string
//
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SERVICE_DESCRIPTIONA} {$ENDIF}
  _SERVICE_DESCRIPTIONA = record
    lpDescription   : PAnsiChar;
  end;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_DESCRIPTIONA} {$ENDIF}
  SERVICE_DESCRIPTIONA = _SERVICE_DESCRIPTIONA;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SERVICE_DESCRIPTIONW} {$ENDIF}

  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SERVICE_DESCRIPTIONW} {$ENDIF}
  _SERVICE_DESCRIPTIONW = record
    lpDescription   : PWideChar;
  end;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_DESCRIPTIONW} {$ENDIF}
  SERVICE_DESCRIPTIONW = _SERVICE_DESCRIPTIONW;

  TServiceDescriptionA = _SERVICE_DESCRIPTIONA;
  TServiceDescriptionW = _SERVICE_DESCRIPTIONW;
  PServiceDescriptionA = ^TServiceDescriptionA;
  PServiceDescriptionW = ^TServiceDescriptionW;

{$IFDEF UNICODE}
  PServiceDescription = PServiceDescriptionW;
  TServiceDescription = TServiceDescriptionW;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_DESCRIPTION} {$ENDIF}
  SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONW;
{$ELSE}
  PServiceDescription = PServiceDescriptionA;
  TServiceDescription  = TServiceDescriptionA;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_DESCRIPTION} {$ENDIF}
  SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;
{$ENDIF}

//
// Actions to take on service failure
//
  _SC_ACTION_TYPE       = (SC_ACTION_NONE, SC_ACTION_RESTART,
                           SC_ACTION_REBOOT, SC_ACTION_RUN_COMMAND);
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SC_ACTION_TYPE} {$ENDIF}
  SC_ACTION_TYPE        = _SC_ACTION_TYPE;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SC_ACTION_TYPE} {$ENDIF}
  TScActionType         = _SC_ACTION_TYPE;

  PScAction = ^TScAction;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SC_ACTION} {$ENDIF}
  _SC_ACTION = record
    Type_   : SC_ACTION_TYPE;
    Delay   : DWORD;
  end;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SC_ACTION} {$ENDIF}
  SC_ACTION = _SC_ACTION;
  TScAction = _SC_ACTION;

  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SERVICE_FAILURE_ACTIONSA} {$ENDIF}
  _SERVICE_FAILURE_ACTIONSA = record
    dwResetPeriod   : DWORD;
    lpRebootMsg     : PAnsiChar;
    lpCommand       : PAnsiChar;
    cActions        : DWORD;
    lpsaActions     : PScAction;
  end;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_FAILURE_ACTIONSA} {$ENDIF}
  SERVICE_FAILURE_ACTIONSA = _SERVICE_FAILURE_ACTIONSA;

  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SERVICE_FAILURE_ACTIONSW} {$ENDIF}
  _SERVICE_FAILURE_ACTIONSW = record
    dwResetPeriod   : DWORD;
    lpRebootMsg     : PWideChar;
    lpCommand       : PWideChar;
    cActions        : DWORD;
    lpsaActions     : PScAction;
  end;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_FAILURE_ACTIONSW} {$ENDIF}
  SERVICE_FAILURE_ACTIONSW = _SERVICE_FAILURE_ACTIONSW;

  TServiceFailureActionsA = _SERVICE_FAILURE_ACTIONSA;
  TServiceFailureActionsW = _SERVICE_FAILURE_ACTIONSW;
  PServiceFailureActionsA = ^TServiceFailureActionsA;
  PServiceFailureActionsW = ^TServiceFailureActionsW;
  
{$IFDEF UNICODE}
  PServiceFailureActions = PServiceFailureActionsW;
  TServiceFailureActions = TServiceFailureActionsW;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_FAILURE_ACTIONS} {$ENDIF}
  SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSW;
{$ELSE}
  PServiceFailureActions = PServiceFailureActionsA;
  TServiceFailureActions = TServiceFailureActionsA;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_FAILURE_ACTIONS} {$ENDIF}
  SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;
{$ENDIF}

//
// Service delayed autostart info setting Vista
//
  PServiceDelayedAutoStartInfo = ^TServiceDelayedAutoStartInfo;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_DELAYED_AUTO_START_INFO} {$ENDIF}
  _SERVICE_DELAYED_AUTO_START_INFO = record
    fDelayedAutostart   : Bool;
  end;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_DELAYED_AUTO_START_INFO} {$ENDIF}
  SERVICE_DELAYED_AUTO_START_INFO = _SERVICE_DELAYED_AUTO_START_INFO;
  TServiceDelayedAutoStartInfo = _SERVICE_DELAYED_AUTO_START_INFO;

//
// Service failure actions flag setting Vista
//
  PServiceFailureActionsFlag = ^TServiceFailureActionsFlag;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_FAILURE_ACTIONS_FLAG} {$ENDIF}
  _SERVICE_FAILURE_ACTIONS_FLAG = record
    fFailureActionsOnNonCrashFailures   : BOOL;
  end;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_FAILURE_ACTIONS_FLAG} {$ENDIF}
  SERVICE_FAILURE_ACTIONS_FLAG = _SERVICE_FAILURE_ACTIONS_FLAG;
  TServiceFailureActionsFlag = _SERVICE_FAILURE_ACTIONS_FLAG;

//
// Service SID info setting
//
  PServiceSidInfo = ^TServiceSidInfo;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_SID_INFO} {$ENDIF}
  _SERVICE_SID_INFO = record
    dwServiceSidType    : DWORD;     // Service SID type
  end;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_SID_INFO} {$ENDIF}
  SERVICE_SID_INFO = _SERVICE_SID_INFO;
  TServiceSidInfo = _SERVICE_SID_INFO;

//
// Service required privileges information Ansi
//
  PServiceRequiredPrivilegesInfoA = ^TServiceRequiredPrivilegesInfoA;
  PServiceRequiredPrivilegesInfoW = ^TServiceRequiredPrivilegesInfoW;
{$IFDEF UNICODE}  
  PServiceRequiredPrivilegesInfo = PServiceRequiredPrivilegesInfoW;
{$ELSE}
  PServiceRequiredPrivilegesInfo = PServiceRequiredPrivilegesInfoA;
{$ENDIF}
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_REQUIRED_PRIVILEGES_INFOA} {$ENDIF}
  _SERVICE_REQUIRED_PRIVILEGES_INFOA = record
    pmszRequiredPrivileges  : PAnsiChar;    // Required privileges multi-sz
  end;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_REQUIRED_PRIVILEGES_INFOA} {$ENDIF}
  SERVICE_REQUIRED_PRIVILEGES_INFOA =  _SERVICE_REQUIRED_PRIVILEGES_INFOA;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_REQUIRED_PRIVILEGES_INFOW} {$ENDIF}
  _SERVICE_REQUIRED_PRIVILEGES_INFOW = record
    pmszRequiredPrivileges  : PWideChar;   // Required privileges multi-sz
  end;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_REQUIRED_PRIVILEGES_INFOW} {$ENDIF}
  SERVICE_REQUIRED_PRIVILEGES_INFOW =  _SERVICE_REQUIRED_PRIVILEGES_INFOW;

  TServiceRequiredPrivilegesInfoW = _SERVICE_REQUIRED_PRIVILEGES_INFOW;
  TServiceRequiredPrivilegesInfoA = _SERVICE_REQUIRED_PRIVILEGES_INFOA;

{$IFDEF UNICODE}
  TServiceRequiredPrivilegesInfo = TServiceRequiredPrivilegesInfoW;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_REQUIRED_PRIVILEGES_INFO} {$ENDIF}
  SERVICE_REQUIRED_PRIVILEGES_INFO = SERVICE_REQUIRED_PRIVILEGES_INFOW;
{$ELSE}
  TServiceRequiredPrivilegesInfo = TServiceRequiredPrivilegesInfoA;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_REQUIRED_PRIVILEGES_INFO} {$ENDIF}
  SERVICE_REQUIRED_PRIVILEGES_INFO = SERVICE_REQUIRED_PRIVILEGES_INFOA;
{$ENDIF}

//
// Service preshutdown timeout setting
//
  PServicePreShutDownInfo = ^TServicePreShutDownInfo;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_PRESHUTDOWN_INFO} {$ENDIF}
  _SERVICE_PRESHUTDOWN_INFO = record
    dwPreshutdownTimeout    : DWORD;
  end;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_PRESHUTDOWN_INFO} {$ENDIF}
  SERVICE_PRESHUTDOWN_INFO = _SERVICE_PRESHUTDOWN_INFO;
  TServicePreShutDownInfo = _SERVICE_PRESHUTDOWN_INFO;

//
// Info levels for QueryServiceStatusEx
//
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SC_STATUS_TYPE}{$ENDIF}
  _SC_STATUS_TYPE = (SC_STATUS_PROCESS_INFO);
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SC_STATUS_TYPE}{$ENDIF}
  SC_STATUS_TYPE = _SC_STATUS_TYPE;

//
// Info levels for EnumServicesStatusEx
//
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SC_ENUM_TYPE}{$ENDIF}
  _SC_ENUM_TYPE = (SC_ENUM_PROCESS_INFO);
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SC_ENUM_TYPE}{$ENDIF}
  SC_ENUM_TYPE = _SC_ENUM_TYPE;

//
// Prototypes for the Service Control Handler Functions
//
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM LPHANDLER_FUNCTION_EX}{$ENDIF}
  LPHANDLER_FUNCTION_EX = TFarProc;
  THandlerFunctionEx = LPHANDLER_FUNCTION_EX;

//
// Service notification parameters
//
  //TNotifyCallBack = procedure(pParameter: Pointer); stdcall;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM PFN_SC_NOTIFY_CALLBACK}{$ENDIF}
  PFN_SC_NOTIFY_CALLBACK = TFarProc;
  TNotifyCallBack = PFN_SC_NOTIFY_CALLBACK;

//
// Service Status Structure
//
  PServiceStatusProcess = ^TServiceStatusProcess;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM _SERVICE_STATUS_PROCESS}{$ENDIF}
  _SERVICE_STATUS_PROCESS = record
    dwServiceType               : DWORD;
    dwCurrentState              : DWORD;
    dwControlsAccepted          : DWORD;
    dwWin32ExitCode             : DWORD;
    dwServiceSpecificExitCode   : DWORD;
    dwCheckPoint                : DWORD;
    dwWaitHint                  : DWORD;
    dwProcessId                 : DWORD;
    dwServiceFlags              : DWORD;
  end;
  {$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM SERVICE_STATUS_PROCESS} {$ENDIF}
  SERVICE_STATUS_PROCESS = _SERVICE_STATUS_PROCESS;
  TServiceStatusProcess  = _SERVICE_STATUS_PROCESS;

 //
//  Each new notify structure is a superset of the older version
//
  PServiceNotify1 = ^TServiceNotify1;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_NOTIFY_1} {$ENDIF}
  _SERVICE_NOTIFY_1 = record
    dwVersion            : DWORD;
    pfnNotifyCallback    : TNotifyCallBack;
    pContext             : Pointer;
    dwNotificationStatus : DWORD;
    ServiceStatus        : TServiceStatusProcess;
  end;
   {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_1} {$ENDIF}
   SERVICE_NOTIFY_1 = _SERVICE_NOTIFY_1;
   TServiceNotify1 = _SERVICE_NOTIFY_1;

  PServiceNotify2A = ^TServiceNotify2A;
  PServiceNotify2W = ^TServiceNotify2W;
{$IFDEF UNICODE}
  PServiceNotify2 = PServiceNotify2W;
{$ELSE}
  PServiceNotify2 = PServiceNotify2A;
{$ENDIF}
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_NOTIFY_2A} {$ENDIF}
  _SERVICE_NOTIFY_2A = record
    dwVersion               : DWORD;
    pfnNotifyCallback       : TNotifyCallBack;
    pContext                : Pointer;
    dwNotificationStatus    : DWORD;
    ServiceStatus           : TServiceStatusProcess;
    dwNotificationTriggered : DWORD;
    pszServiceNames         : PAnsiChar;
  end;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_2A} {$ENDIF}
  SERVICE_NOTIFY_2A = _SERVICE_NOTIFY_2A;

  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_NOTIFY_2W} {$ENDIF}
  _SERVICE_NOTIFY_2W = record
    dwVersion               : DWORD;
    pfnNotifyCallback       : TNotifyCallBack;
    pContext                : Pointer;
    dwNotificationStatus    : DWORD;
    ServiceStatus           : TServiceStatusProcess;
    dwNotificationTriggered : DWORD;
    pszServiceNames         : PWideChar;
  end;
  {$EXTERNALSYM SERVICE_NOTIFY_2W}
  SERVICE_NOTIFY_2W = _SERVICE_NOTIFY_2W;

  TServiceNotify2W = _SERVICE_NOTIFY_2W;
  TServiceNotify2A = _SERVICE_NOTIFY_2A;

{$IFDEF UNICODE}
  TServiceNotify2 = TServiceNotify2W;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_2} {$ENDIF}
  SERVICE_NOTIFY_2 = SERVICE_NOTIFY_2W ;
{$ELSE}
  TServiceNotify2 = TServiceNotify2A;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY_2} {$ENDIF}
  SERVICE_NOTIFY_2 = SERVICE_NOTIFY_2A ;
{$ENDIF}

  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFYA} {$ENDIF}
  SERVICE_NOTIFYA = SERVICE_NOTIFY_2A;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFYW} {$ENDIF}
  SERVICE_NOTIFYW = SERVICE_NOTIFY_2W;

  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM PSERVICE_NOTIFYA} {$ENDIF}
  PSERVICE_NOTIFYA = ^SERVICE_NOTIFYA;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM PSERVICE_NOTIFYW} {$ENDIF}
  PSERVICE_NOTIFYW = ^SERVICE_NOTIFYW;

  TServiceNotifyA = TServiceNotify2A;
  TServiceNotifyW = TServiceNotify2W;
  PServiceNotifyA = PServiceNotify2A;
  PServiceNotifyW = PServiceNotify2W;

{$IFDEF UNICODE}
  TServiceNotify = TServiceNotifyW;
  PServiceNotify = PServiceNotifyW;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY} {$ENDIF}
  SERVICE_NOTIFY  = SERVICE_NOTIFYW;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM PSERVICE_NOTIFY} {$ENDIF}
  PSERVICE_NOTIFY = PSERVICE_NOTIFYW;
{$ELSE}
  TServiceNotify = TServiceNotifyA;
  PServiceNotify = PServiceNotifyA;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_NOTIFY} {$ENDIF}
  SERVICE_NOTIFY  = SERVICE_NOTIFYA;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM PSERVICE_NOTIFY} {$ENDIF}
  PSERVICE_NOTIFY = PSERVICE_NOTIFYA;
{$ENDIF}  
  
//
// Service control status reason parameters
//
  PServiceControlStatusReasonParamsA = ^TServiceControlStatusReasonParamsA;
  PServiceControlStatusReasonParamsW = ^TServiceControlStatusReasonParamsW;
{$IFDEF UNICODE}
  PServiceControlStatusReasonParams = ^TServiceControlStatusReasonParamsW;
{$ELSE}
  PServiceControlStatusReasonParams = ^TServiceControlStatusReasonParamsA;
{$ENDIF}  
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_CONTROL_STATUS_REASON_PARAMSA} {$ENDIF}
  _SERVICE_CONTROL_STATUS_REASON_PARAMSA = record
    dwReason        : DWORD;
    pszComment      : PAnsiChar;
    ServiceStatus   : TServiceStatusProcess;
  end;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONTROL_STATUS_REASON_PARAMSA} {$ENDIF}
  SERVICE_CONTROL_STATUS_REASON_PARAMSA = _SERVICE_CONTROL_STATUS_REASON_PARAMSA;
  TServiceControlStatusReasonParamsA = _SERVICE_CONTROL_STATUS_REASON_PARAMSA;

  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM _SERVICE_CONTROL_STATUS_REASON_PARAMSW} {$ENDIF}
  _SERVICE_CONTROL_STATUS_REASON_PARAMSW = record
    dwReason        : DWORD;
    pszComment      : PWideChar;
    ServiceStatus   : TServiceStatusProcess;
  end;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONTROL_STATUS_REASON_PARAMSW} {$ENDIF}
  SERVICE_CONTROL_STATUS_REASON_PARAMSW = _SERVICE_CONTROL_STATUS_REASON_PARAMSW;
  TServiceControlStatusReasonParamsW = _SERVICE_CONTROL_STATUS_REASON_PARAMSW;

{$IFDEF UNICODE}
  TServiceControlStatusReasonParams = TServiceControlStatusReasonParamsW;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONTROL_STATUS_REASON_PARAMS} {$ENDIF}
  SERVICE_CONTROL_STATUS_REASON_PARAMS = SERVICE_CONTROL_STATUS_REASON_PARAMSW;
{$ELSE}
  TServiceControlStatusReasonParams = TServiceControlStatusReasonParamsA;
  {$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM SERVICE_CONTROL_STATUS_REASON_PARAMS} {$ENDIF}
  SERVICE_CONTROL_STATUS_REASON_PARAMS = SERVICE_CONTROL_STATUS_REASON_PARAMSA;
{$ENDIF}

///////////////////////////////////////////////////////////////////////////
// API Function Prototypes
///////////////////////////////////////////////////////////////////////////

{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM ChangeServiceConfig2} {$ENDIF}
function ChangeServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpInfo: Pointer): BOOL;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM ChangeServiceConfig2A} {$ENDIF}
function ChangeServiceConfig2A(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpInfo: Pointer): BOOL;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM ChangeServiceConfig2W} {$ENDIF}
function ChangeServiceConfig2W(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpInfo: Pointer): BOOL;

{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM ControlServiceEx} {$ENDIF}
function ControlServiceEx(hService: SC_HANDLE; dwControl: DWORD;
  dwInfoLevel: DWORD; pControlParams: Pointer): BOOL;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM ControlServiceExA} {$ENDIF}
function ControlServiceExA(hService: SC_HANDLE; dwControl: DWORD;
  dwInfoLevel: DWORD; pControlParams: Pointer): BOOL;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM ControlServiceExW} {$ENDIF}
function ControlServiceExW(hService: SC_HANDLE; dwControl: DWORD;
  dwInfoLevel: DWORD; pControlParams: Pointer): BOOL;

{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM EnumServicesStatusEx} {$ENDIF}
function EnumServicesStatusEx(hSCManager: SC_HANDLE; InfoLevel: SC_ENUM_TYPE;
  dwServiceType: DWORD; dwServiceState: DWORD; lpServices: TEnumServiceStatus;
  cbBufSize: DWORD; var pcbBytesNeeded, lpServicesReturned,
  lpResumeHandle: DWORD;
  pszGroupName: {$IFNDEF UNICODE} PAnsiChar {$ELSE} PWideChar {$ENDIF}): BOOL;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM EnumServicesStatusExA} {$ENDIF}
function EnumServicesStatusExA(hSCManager: SC_HANDLE; InfoLevel: SC_ENUM_TYPE;
  dwServiceType: DWORD; dwServiceState: DWORD; lpServices: TEnumServiceStatusA;
  cbBufSize: DWORD; var pcbBytesNeeded, lpServicesReturned,
  lpResumeHandle: DWORD; pszGroupName: PAnsiChar): BOOL;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM EnumServicesStatusExW} {$ENDIF}
function EnumServicesStatusExW(hSCManager: SC_HANDLE; InfoLevel: SC_ENUM_TYPE;
  dwServiceType: DWORD; dwServiceState: DWORD; lpServices: TEnumServiceStatusW;
  cbBufSize: DWORD; var pcbBytesNeeded, lpServicesReturned,
  lpResumeHandle: DWORD;  pszGroupName: PWideChar): BOOL;

{$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM NotifyServiceStatusChange} {$ENDIF}
function NotifyServiceStatusChange(hService: SC_HANDLE; dwNotifyMask: DWORD;
  pNotifyBuffer: PServiceNotify): DWORD;
{$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM NotifyServiceStatusChangeA} {$ENDIF}
function NotifyServiceStatusChangeA(hService: SC_HANDLE; dwNotifyMask: DWORD;
  pNotifyBuffer: PServiceNotifyA): DWORD;
{$IFDEF SDK_HEADER_VISTA} {$EXTERNALSYM NotifyServiceStatusChangeW} {$ENDIF}
function NotifyServiceStatusChangeW(hService: SC_HANDLE; dwNotifyMask: DWORD;
  pNotifyBuffer: PServiceNotifyW): DWORD;

{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM QueryServiceObjectSecurity} {$ENDIF}
function QueryServiceObjectSecurity(hService: SC_HANDLE;
  dwSecurityInformation: SECURITY_INFORMATION;
  lpSecurityDescriptor: PSECURITY_DESCRIPTOR; cbBufSize: DWORD;
  var pcbBytesNeeded: DWORD): BOOL;

{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM QueryServiceStatusEx} {$ENDIF}
function QueryServiceStatusEx(hService: SC_HANDLE; InfoLevel: SC_STATUS_TYPE;
  var lpBuffer: TServiceStatusProcess; cbBufSize: DWORD;
  var pcbBytesNeeded: DWORD): BOOL;

{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM QueryServiceConfig2} {$ENDIF}
function QueryServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpBuffer: PBYTE; cbBufSize: DWORD; var pcbBytesNeeded: DWORD): BOOL;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM QueryServiceConfig2A} {$ENDIF}
function QueryServiceConfig2A(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpBuffer: PBYTE; cbBufSize: DWORD; var pcbBytesNeeded: DWORD): BOOL;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM QueryServiceConfig2W} {$ENDIF}
function QueryServiceConfig2W(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpBuffer: PBYTE; cbBufSize: DWORD; var pcbBytesNeeded: DWORD): BOOL;

{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM RegisterServiceCtrlHandlerEx} {$ENDIF}
function RegisterServiceCtrlHandlerEx(
  lpServiceName: {$IFNDEF UNICODE} PAnsiChar {$ELSE} PWideChar {$ENDIF};
  lpHandlerProc: THandlerFunctionEx;
  lpContext: Pointer): SERVICE_STATUS_HANDLE;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM RegisterServiceCtrlHandlerExA} {$ENDIF}
function RegisterServiceCtrlHandlerExA(lpServiceName: PAnsiChar;
  lpHandlerProc: THandlerFunctionEx;
  lpContext: Pointer): SERVICE_STATUS_HANDLE;
{$IFDEF SDK_HEADER_WIN2K} {$EXTERNALSYM RegisterServiceCtrlHandlerExW} {$ENDIF}
function RegisterServiceCtrlHandlerExW(lpServiceName: PWideChar;
  lpHandlerProc: THandlerFunctionEx;
  lpContext: Pointer): SERVICE_STATUS_HANDLE;

implementation

type

  TChangeServiceConfig2A        = function (hService: SC_HANDLE;
                                            dwInfoLevel: DWORD;
                                            lpInfo: Pointer): BOOL; stdcall;
  TChangeServiceConfig2W        = function (hService: SC_HANDLE;
                                            dwInfoLevel: DWORD;
                                            lpInfo: Pointer): BOOL; stdcall;
{$IFDEF UNICODE}
  TChangeServiceConfig2         = TChangeServiceConfig2W;
{$ELSE}
  TChangeServiceConfig2         = TChangeServiceConfig2A;
{$ENDIF}

  TControlServiceExA            = function (hService: SC_HANDLE;
                                            dwControl: DWORD;
                                            dwInfoLevel: DWORD;
                                            pControlParams: Pointer): BOOL; stdcall;
  TControlServiceExW            = function (hService: SC_HANDLE;
                                            dwControl: DWORD;
                                            dwInfoLevel: DWORD;
                                            pControlParams: Pointer): BOOL; stdcall;
{$IFDEF UNICODE}
  TControlServiceEx             = TControlServiceExW;
{$ELSE}
  TControlServiceEx             = TControlServiceExA;
{$ENDIF}

  TEnumServicesStatusExA        = function (hSCManager: SC_HANDLE;
                                            InfoLevel: SC_ENUM_TYPE;
                                            dwServiceType: DWORD;
                                            dwServiceState: DWORD;
                                            lpServices: TEnumServiceStatusA;
                                            cbBufSize: DWORD;
                                            var pcbBytesNeeded,
                                            lpServicesReturned,
                                            lpResumeHandle: DWORD;
                                            pszGroupName: PAnsiChar): BOOL; stdcall;
  TEnumServicesStatusExW        = function (hSCManager: SC_HANDLE;
                                            InfoLevel: SC_ENUM_TYPE;
                                            dwServiceType: DWORD;
                                            dwServiceState: DWORD;
                                            lpServices: TEnumServiceStatusW;
                                            cbBufSize: DWORD;
                                            var pcbBytesNeeded,
                                            lpServicesReturned,
                                            lpResumeHandle: DWORD;
                                            pszGroupName: PWideChar): BOOL; stdcall;
{$IFDEF UNICODE}
  TEnumServicesStatusEx         = TEnumServicesStatusExW;
{$ELSE}
  TEnumServicesStatusEx         = TEnumServicesStatusExA;
{$ENDIF}

  TNotifyServiceStatusChangeA   = function (hService: SC_HANDLE;
                                            dwNotifyMask: DWORD;
                                            pNotifyBuffer: PServiceNotifyA): DWORD; stdcall;
  TNotifyServiceStatusChangeW   = function (hService: SC_HANDLE;
                                            dwNotifyMask: DWORD;
                                            pNotifyBuffer: PServiceNotifyW): DWORD; stdcall;
{$IFDEF UNICODE}
  TNotifyServiceStatusChange    = TNotifyServiceStatusChangeW;
{$ELSE}
  TNotifyServiceStatusChange    = TNotifyServiceStatusChangeA;
{$ENDIF}

  TQueryServiceObjectSecurity   = function (hService: SC_HANDLE;
                                            dwSecurityInformation: SECURITY_INFORMATION;
                                            lpSecurityDescriptor: PSECURITY_DESCRIPTOR;
                                            cbBufSize: DWORD;
                                            var pcbBytesNeeded: DWORD): BOOL; stdcall;

  TQueryServiceStatusEx         = function (hService: SC_HANDLE;
                                            InfoLevel: SC_STATUS_TYPE;
                                            var lpBuffer: TServiceStatusProcess;
                                            cbBufSize: DWORD;
                                            var pcbBytesNeeded: DWORD): BOOL; stdcall;
  TQueryServiceConfig2A         = function (hService: SC_HANDLE;
                                            dwInfoLevel: DWORD;
                                            lpBuffer: PBYTE; cbBufSize: DWORD;
                                            var pcbBytesNeeded: DWORD): BOOL; stdcall;
  TQueryServiceConfig2W         = function (hService: SC_HANDLE;
                                            dwInfoLevel: DWORD;
                                            lpBuffer: PBYTE; cbBufSize: DWORD;
                                            var pcbBytesNeeded: DWORD): BOOL; stdcall;
{$IFDEF UNICODE}
  TQueryServiceConfig2          = TQueryServiceConfig2W;
{$ELSE}
  TQueryServiceConfig2          = TQueryServiceConfig2A;
{$ENDIF}

  TRegisterServiceCtrlHandlerExA = function (lpServiceName: PAnsiChar;
                                             lpHandlerProc: THandlerFunctionEx;
                                             lpContext: Pointer): SERVICE_STATUS_HANDLE; stdcall;
  TRegisterServiceCtrlHandlerExW = function (lpServiceName: PWideChar;
                                             lpHandlerProc: THandlerFunctionEx;
                                             lpContext: Pointer): SERVICE_STATUS_HANDLE; stdcall;
{$IFDEF UNICODE}
  TRegisterServiceCtrlHandlerEx  = TRegisterServiceCtrlHandlerExW;
{$ELSE}
  TRegisterServiceCtrlHandlerEx  = TRegisterServiceCtrlHandlerExA;
{$ENDIF}

var
  hAdvApi32 : THandle = 0;

  _ChangeServiceConfig2           : TChangeServiceConfig2          = nil;
  _ChangeServiceConfig2A          : TChangeServiceConfig2A         = nil;
  _ChangeServiceConfig2W          : TChangeServiceConfig2W         = nil;
  _ControlServiceEx               : TControlServiceEx              = nil;
  _ControlServiceExA              : TControlServiceExA             = nil;
  _ControlServiceExW              : TControlServiceExW             = nil;
  _EnumServicesStatusEx           : TEnumServicesStatusEx          = nil;
  _EnumServicesStatusExA          : TEnumServicesStatusExA         = nil;
  _EnumServicesStatusExW          : TEnumServicesStatusExW         = nil;
  _NotifyServiceStatusChange      : TNotifyServiceStatusChange     = nil;
  _NotifyServiceStatusChangeA     : TNotifyServiceStatusChangeA    = nil;
  _NotifyServiceStatusChangeW     : TNotifyServiceStatusChangeW    = nil;
  _QueryServiceObjectSecurity     : TQueryServiceObjectSecurity    = nil;
  _QueryServiceStatusEx           : TQueryServiceStatusEx          = nil;
  _QueryServiceConfig2            : TQueryServiceConfig2           = nil;
  _QueryServiceConfig2A           : TQueryServiceConfig2A          = nil;
  _QueryServiceConfig2W           : TQueryServiceConfig2W          = nil;
  _RegisterServiceCtrlHandlerEx   : TRegisterServiceCtrlHandlerEx  = nil;
  _RegisterServiceCtrlHandlerExA  : TRegisterServiceCtrlHandlerExA = nil;
  _RegisterServiceCtrlHandlerExW  : TRegisterServiceCtrlHandlerExW = nil;


function ChangeServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpInfo: Pointer): BOOL;
begin
  if not Assigned(@_ChangeServiceConfig2) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_ChangeServiceConfig2 := GetProcAddress(hAdvApi32,
                                            'ChangeServiceConfig2' + ApiSuffix);
  end;
  Result := _ChangeServiceConfig2(hService, dwInfoLevel, lpInfo);
end;

function ChangeServiceConfig2A(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpInfo: Pointer): BOOL;
begin
  if not Assigned(@_ChangeServiceConfig2A) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_ChangeServiceConfig2A := GetProcAddress(hAdvApi32,
                                              'ChangeServiceConfig2A');
  end;
  Result := _ChangeServiceConfig2A(hService, dwInfoLevel, lpInfo);
end;

function ChangeServiceConfig2W(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpInfo: Pointer): BOOL;
begin
  if not Assigned(@_ChangeServiceConfig2W) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_ChangeServiceConfig2W := GetProcAddress(hAdvApi32,
                                              'ChangeServiceConfig2W');
  end;
  Result := _ChangeServiceConfig2W(hService, dwInfoLevel, lpInfo);
end;

function ControlServiceEx(hService: SC_HANDLE; dwControl: DWORD;
  dwInfoLevel: DWORD; pControlParams: Pointer): BOOL;
begin
  if not Assigned(@_ControlServiceEx) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_ControlServiceEx := GetProcAddress(hAdvApi32,
                                         'ControlServiceEx' + ApiSuffix);
  end;
  Result := _ControlServiceEx(hService, dwControl, dwInfoLevel, pControlParams);
end;

function ControlServiceExA(hService: SC_HANDLE; dwControl: DWORD;
  dwInfoLevel: DWORD; pControlParams: Pointer): BOOL;
begin
  if not Assigned(@_ControlServiceExA) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_ControlServiceExA := GetProcAddress(hAdvApi32, 'ControlServiceExA');
  end;
  Result := _ControlServiceExA(hService, dwControl, dwInfoLevel, pControlParams);
end;

function ControlServiceExW(hService: SC_HANDLE; dwControl: DWORD;
  dwInfoLevel: DWORD; pControlParams: Pointer): BOOL;
begin
  if not Assigned(@_ControlServiceExW) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_ControlServiceExW := GetProcAddress(hAdvApi32, 'ControlServiceExW');
  end;
  Result := _ControlServiceExW(hService, dwControl, dwInfoLevel, pControlParams);
end;

function EnumServicesStatusEx(hSCManager: SC_HANDLE; InfoLevel: SC_ENUM_TYPE;
  dwServiceType: DWORD; dwServiceState: DWORD; lpServices: TEnumServiceStatus;
  cbBufSize: DWORD; var pcbBytesNeeded, lpServicesReturned,
  lpResumeHandle: DWORD;
  pszGroupName:
  {$IFNDEF UNICODE} PAnsiChar {$ELSE} PWideChar {$ENDIF}): BOOL;
begin
  if not Assigned(@_EnumServicesStatusEx) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_EnumServicesStatusEx := GetProcAddress(hAdvApi32,
                                            'EnumServicesStatusEx' + ApiSuffix);
  end;
  Result := _EnumServicesStatusEx(hSCManager, InfoLevel, dwServiceType,
            dwServiceState, lpServices, cbBufSize, pcbBytesNeeded,
            lpServicesReturned, lpResumeHandle, pszGroupName);
end;

function EnumServicesStatusExA(hSCManager: SC_HANDLE; InfoLevel: SC_ENUM_TYPE;
  dwServiceType: DWORD; dwServiceState: DWORD; lpServices: TEnumServiceStatusA;
  cbBufSize: DWORD; var pcbBytesNeeded, lpServicesReturned,
  lpResumeHandle: DWORD; pszGroupName: PAnsiChar): BOOL;
begin
  if not Assigned(@_EnumServicesStatusExA) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_EnumServicesStatusExA := GetProcAddress(hAdvApi32,
                                              'EnumServicesStatusExA');
  end;
  Result := _EnumServicesStatusExA(hSCManager, InfoLevel, dwServiceType,
            dwServiceState, lpServices, cbBufSize, pcbBytesNeeded,
            lpServicesReturned, lpResumeHandle, pszGroupName);
end;

function EnumServicesStatusExW(hSCManager: SC_HANDLE; InfoLevel: SC_ENUM_TYPE;
  dwServiceType: DWORD; dwServiceState: DWORD; lpServices: TEnumServiceStatusW;
  cbBufSize: DWORD; var pcbBytesNeeded, lpServicesReturned,
  lpResumeHandle: DWORD;  pszGroupName: PWideChar): BOOL;
begin
  if not Assigned(@_EnumServicesStatusExW) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_EnumServicesStatusExW := GetProcAddress(hAdvApi32,
                                              'EnumServicesStatusExW');
  end;
  Result := _EnumServicesStatusExW(hSCManager, InfoLevel, dwServiceType,
            dwServiceState, lpServices, cbBufSize, pcbBytesNeeded,
            lpServicesReturned, lpResumeHandle, pszGroupName);
end;

function NotifyServiceStatusChange(hService: SC_HANDLE; dwNotifyMask: DWORD;
  pNotifyBuffer: PServiceNotify): DWORD;
begin
  if not Assigned(@_NotifyServiceStatusChange) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_NotifyServiceStatusChange := GetProcAddress(hAdvApi32,
                                       'NotifyServiceStatusChange' + ApiSuffix);
  end;
  Result := _NotifyServiceStatusChange(hService, dwNotifyMask, pNotifyBuffer);
end;

function NotifyServiceStatusChangeA(hService: SC_HANDLE; dwNotifyMask: DWORD;
  pNotifyBuffer: PServiceNotifyA): DWORD;
begin
  if not Assigned(@_NotifyServiceStatusChangeA) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_NotifyServiceStatusChangeA := GetProcAddress(hAdvApi32,
                                                  'NotifyServiceStatusChangeA');
  end;
  Result := _NotifyServiceStatusChangeA(hService, dwNotifyMask, pNotifyBuffer);
end;

function NotifyServiceStatusChangeW(hService: SC_HANDLE; dwNotifyMask: DWORD;
  pNotifyBuffer: PServiceNotifyW): DWORD;
begin
  if not Assigned(@_NotifyServiceStatusChangeW) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_NotifyServiceStatusChangeW := GetProcAddress(hAdvApi32,
                                                  'NotifyServiceStatusChangeW');
  end;
  Result := _NotifyServiceStatusChangeW(hService, dwNotifyMask, pNotifyBuffer);
end;

function QueryServiceObjectSecurity(hService: SC_HANDLE;
  dwSecurityInformation: SECURITY_INFORMATION;
  lpSecurityDescriptor: PSECURITY_DESCRIPTOR; cbBufSize: DWORD;
  var pcbBytesNeeded: DWORD): BOOL;
begin
  if not Assigned(@_QueryServiceObjectSecurity) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_QueryServiceObjectSecurity := GetProcAddress(hAdvApi32,
                                                  'QueryServiceObjectSecurity');
  end;
  Result := _QueryServiceObjectSecurity(hService, dwSecurityInformation,
            lpSecurityDescriptor, cbBufSize, pcbBytesNeeded);
end;

function QueryServiceStatusEx(hService: SC_HANDLE; InfoLevel: SC_STATUS_TYPE;
  var lpBuffer: TServiceStatusProcess; cbBufSize: DWORD;
  var pcbBytesNeeded: DWORD): BOOL;
begin
  if not Assigned(@_QueryServiceStatusEx) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_QueryServiceStatusEx := GetProcAddress(hAdvApi32, 'QueryServiceStatusEx');
  end;
  Result := _QueryServiceStatusEx(hService, InfoLevel, lpBuffer, cbBufSize,
            pcbBytesNeeded);
end;

function QueryServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpBuffer: PBYTE; cbBufSize: DWORD; var pcbBytesNeeded: DWORD): BOOL;
begin
  if not Assigned(@_QueryServiceConfig2) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_QueryServiceConfig2 := GetProcAddress(hAdvApi32,
                                            'QueryServiceConfig2' + ApiSuffix);
  end;
  Result := _QueryServiceConfig2(hService, dwInfoLevel, lpBuffer, cbBufSize,
            pcbBytesNeeded);
end;

function QueryServiceConfig2A(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpBuffer: PBYTE; cbBufSize: DWORD; var pcbBytesNeeded: DWORD): BOOL;
begin
  if not Assigned(@_QueryServiceConfig2A) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_QueryServiceConfig2A := GetProcAddress(hAdvApi32, 'QueryServiceConfig2A');
  end;
  Result := _QueryServiceConfig2A(hService, dwInfoLevel, lpBuffer, cbBufSize,
            pcbBytesNeeded);
end;

function QueryServiceConfig2W(hService: SC_HANDLE; dwInfoLevel: DWORD;
  lpBuffer: PBYTE; cbBufSize: DWORD; var pcbBytesNeeded: DWORD): BOOL;
begin
  if not Assigned(@_QueryServiceConfig2W) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_QueryServiceConfig2W := GetProcAddress(hAdvApi32, 'QueryServiceConfig2W');
  end;
  Result := _QueryServiceConfig2W(hService, dwInfoLevel, lpBuffer, cbBufSize,
            pcbBytesNeeded);
end;

function RegisterServiceCtrlHandlerEx(
  lpServiceName: {$IFNDEF UNICODE} PAnsiChar {$ELSE} PWideChar {$ENDIF};
  lpHandlerProc: THandlerFunctionEx;
  lpContext: Pointer): SERVICE_STATUS_HANDLE;
begin
  if not Assigned(@_RegisterServiceCtrlHandlerEx) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_RegisterServiceCtrlHandlerEx := GetProcAddress(hAdvApi32,
                                    'RegisterServiceCtrlHandlerEx' + ApiSuffix);
  end;
  Result := _RegisterServiceCtrlHandlerEx(lpServiceName, lpHandlerProc,
            lpContext);
end;

function RegisterServiceCtrlHandlerExA(lpServiceName: PAnsiChar;
  lpHandlerProc: THandlerFunctionEx;
  lpContext: Pointer): SERVICE_STATUS_HANDLE;
begin
  if not Assigned(@_RegisterServiceCtrlHandlerExA) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_RegisterServiceCtrlHandlerExA := GetProcAddress(hAdvApi32,
                                               'RegisterServiceCtrlHandlerExA');
  end;
  Result := _RegisterServiceCtrlHandlerExA(lpServiceName, lpHandlerProc,
                                           lpContext);
end;

function RegisterServiceCtrlHandlerExW(lpServiceName: PWideChar;
  lpHandlerProc: THandlerFunctionEx;
  lpContext: Pointer): SERVICE_STATUS_HANDLE;
begin
  if not Assigned(@_RegisterServiceCtrlHandlerExW) then
  begin
    if hAdvApi32 = 0 then
        hAdvApi32 := GetModuleHandle(advapi32);
    @_RegisterServiceCtrlHandlerExW := GetProcAddress(hAdvApi32,
                                               'RegisterServiceCtrlHandlerExW');
  end;
  Result := _RegisterServiceCtrlHandlerExW(lpServiceName, lpHandlerProc,
                                           lpContext);
end;

end.
