790 lines
25 KiB
Plaintext
790 lines
25 KiB
Plaintext
/*
|
|
* svcctl interface definitions - exported by services.exe to access the
|
|
* services database
|
|
*
|
|
* Copyright 2007 Google (Mikolaj Zalewski)
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
import "wtypes.idl";
|
|
|
|
/*
|
|
* some defined for the C code
|
|
*/
|
|
cpp_quote("#include \"winsvc.h\"")
|
|
cpp_quote("#define SVCCTL_TRANSPORT {'n','c','a','c','n','_','n','p',0}")
|
|
cpp_quote("#define SVCCTL_TRANSPORTA \"ncacn_np\"")
|
|
cpp_quote("#define SVCCTL_ENDPOINT {'\\\\','p','i','p','e','\\\\','s','v','c','c','t','l',0}")
|
|
cpp_quote("#define SVCCTL_ENDPOINTA \"\\\\pipe\\\\svcctl\"")
|
|
|
|
/* Not the Windows event name - if needed the true one can be found in Inside Windows */
|
|
cpp_quote("#define SVCCTL_STARTED_EVENT {'_','_','w','i','n','e','_','S','v','c','c','t','l','S','t','a','r','t','e','d',0}")
|
|
|
|
/* Service startup protocol over control pipe - not compatible with Windows */
|
|
enum service_pipe_command
|
|
{
|
|
WINESERV_STARTINFO = 1,
|
|
WINESERV_SENDCONTROL = 2
|
|
};
|
|
|
|
typedef struct service_start_info_t
|
|
{
|
|
enum service_pipe_command cmd; /* request code */
|
|
DWORD total_size; /* total request size */
|
|
DWORD name_size; /* size of name in data buffer */
|
|
DWORD control; /* control code */
|
|
WCHAR data[1];
|
|
} service_start_info;
|
|
|
|
[
|
|
uuid(367abb81-9844-35f1-ad32-98f038001003),
|
|
version(2.0),
|
|
pointer_default(unique),
|
|
endpoint("ncacn_np:[\\pipe\\svcctl]")
|
|
]
|
|
interface svcctl
|
|
{
|
|
/* handle types */
|
|
typedef [handle] LPCWSTR MACHINE_HANDLEW;
|
|
typedef [handle] LPCSTR MACHINE_HANDLEA;
|
|
typedef [handle] LPCWSTR SVCCTL_HANDLEW;
|
|
typedef [context_handle] void *SC_RPC_HANDLE;
|
|
typedef [context_handle] void *SC_RPC_LOCK;
|
|
typedef [context_handle] void *SC_NOTIFY_RPC_HANDLE;
|
|
|
|
/* undocumented access rights */
|
|
cpp_quote("#define SERVICE_SET_STATUS 0x8000")
|
|
|
|
cpp_quote("#if 0 /* already defined in winsvc.h / winnt.h */")
|
|
|
|
typedef DWORD SECURITY_INFORMATION;
|
|
|
|
typedef struct _QUERY_SERVICE_CONFIGA {
|
|
DWORD dwServiceType;
|
|
DWORD dwStartType;
|
|
DWORD dwErrorControl;
|
|
LPSTR lpBinaryPathName;
|
|
LPSTR lpLoadOrderGroup;
|
|
DWORD dwTagId;
|
|
LPSTR lpDependencies;
|
|
LPSTR lpServiceStartName;
|
|
LPSTR lpDisplayName;
|
|
} QUERY_SERVICE_CONFIGA, *LPQUERY_SERVICE_CONFIGA;
|
|
|
|
typedef struct _QUERY_SERVICE_CONFIGW {
|
|
DWORD dwServiceType;
|
|
DWORD dwStartType;
|
|
DWORD dwErrorControl;
|
|
[unique] LPWSTR lpBinaryPathName;
|
|
[unique] LPWSTR lpLoadOrderGroup;
|
|
DWORD dwTagId;
|
|
[unique] LPWSTR lpDependencies;
|
|
[unique] LPWSTR lpServiceStartName;
|
|
[unique] LPWSTR lpDisplayName;
|
|
} QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW;
|
|
|
|
typedef struct _SERVICE_STATUS {
|
|
DWORD dwServiceType;
|
|
DWORD dwCurrentState;
|
|
DWORD dwControlsAccepted;
|
|
DWORD dwWin32ExitCode;
|
|
DWORD dwServiceSpecificExitCode;
|
|
DWORD dwCheckPoint;
|
|
DWORD dwWaitHint;
|
|
} SERVICE_STATUS, *LPSERVICE_STATUS;
|
|
|
|
typedef enum _SC_STATUS_TYPE {
|
|
SC_STATUS_PROCESS_INFO = 0
|
|
} SC_STATUS_TYPE;
|
|
|
|
typedef struct _SERVICE_DESCRIPTIONA {
|
|
LPSTR lpDescription;
|
|
} SERVICE_DESCRIPTIONA,*LPSERVICE_DESCRIPTIONA;
|
|
|
|
typedef struct _SERVICE_DESCRIPTIONW {
|
|
LPWSTR lpDescription;
|
|
} SERVICE_DESCRIPTIONW,*LPSERVICE_DESCRIPTIONW;
|
|
|
|
typedef enum _SC_ACTION_TYPE {
|
|
SC_ACTION_NONE = 0,
|
|
SC_ACTION_RESTART = 1,
|
|
SC_ACTION_REBOOT = 2,
|
|
SC_ACTION_RUN_COMMAND = 3
|
|
} SC_ACTION_TYPE;
|
|
|
|
typedef struct _SC_ACTION {
|
|
SC_ACTION_TYPE Type;
|
|
DWORD Delay;
|
|
} SC_ACTION,*LPSC_ACTION;
|
|
|
|
typedef struct _SERVICE_FAILURE_ACTIONSA {
|
|
DWORD dwResetPeriod;
|
|
[unique] LPSTR lpRebootMsg;
|
|
[unique] LPSTR lpCommand;
|
|
DWORD cActions;
|
|
[size_is(cActions)] SC_ACTION *lpsaActions;
|
|
} SERVICE_FAILURE_ACTIONSA,*LPSERVICE_FAILURE_ACTIONSA;
|
|
|
|
typedef struct _SERVICE_FAILURE_ACTIONSW {
|
|
DWORD dwResetPeriod;
|
|
[unique] LPWSTR lpRebootMsg;
|
|
[unique] LPWSTR lpCommand;
|
|
DWORD cActions;
|
|
[size_is(cActions)] SC_ACTION *lpsaActions;
|
|
} SERVICE_FAILURE_ACTIONSW,*LPSERVICE_FAILURE_ACTIONSW;
|
|
|
|
typedef struct _SERVICE_DELAYED_AUTO_START_INFO {
|
|
BOOL fDelayedAutostart;
|
|
} SERVICE_DELAYED_AUTO_START_INFO;
|
|
|
|
typedef struct _SERVICE_FAILURE_ACTIONS_FLAG {
|
|
BOOL fFailureActionsOnNonCrashFailures;
|
|
} SERVICE_FAILURE_ACTIONS_FLAG;
|
|
|
|
typedef struct _SERVICE_SID_INFO {
|
|
DWORD dwServiceSidType;
|
|
} SERVICE_SID_INFO;
|
|
|
|
typedef struct _SERVICE_PRESHUTDOWN_INFO {
|
|
DWORD dwPreshutdownTimeout;
|
|
} SERVICE_PRESHUTDOWN_INFO,*LPSERVICE_PRESHUTDOWN_INFO;
|
|
|
|
#define SERVICE_CONFIG_DESCRIPTION 1
|
|
#define SERVICE_CONFIG_FAILURE_ACTIONS 2
|
|
#define SERVICE_CONFIG_DELAYED_AUTO_START_INFO 3
|
|
#define SERVICE_CONFIG_FAILURE_ACTIONS_FLAG 4
|
|
#define SERVICE_CONFIG_SERVICE_SID_INFO 5
|
|
#define SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO 6
|
|
#define SERVICE_CONFIG_PRESHUTDOWN_INFO 7
|
|
|
|
#define SERVICE_NOTIFY_STATUS_CHANGE_1 1
|
|
#define SERVICE_NOTIFY_STATUS_CHANGE_2 2
|
|
|
|
typedef struct _ENUM_SERVICE_STATUSW {
|
|
LPWSTR lpServiceName;
|
|
LPWSTR lpDisplayName;
|
|
SERVICE_STATUS ServiceStatus;
|
|
} ENUM_SERVICE_STATUSW, *LPENUM_SERVICE_STATUSW;
|
|
|
|
typedef struct _QUERY_SERVICE_LOCK_STATUSA
|
|
{
|
|
DWORD fIsLocked;
|
|
LPSTR lpLockOwner;
|
|
DWORD dwLockDuration;
|
|
} QUERY_SERVICE_LOCK_STATUSA, *LPQUERY_SERVICE_LOCK_STATUSA;
|
|
|
|
typedef struct _QUERY_SERVICE_LOCK_STATUSW
|
|
{
|
|
DWORD fIsLocked;
|
|
LPWSTR lpLockOwner;
|
|
DWORD dwLockDuration;
|
|
} QUERY_SERVICE_LOCK_STATUSW, *LPQUERY_SERVICE_LOCK_STATUSW;
|
|
|
|
typedef struct _SERVICE_STATUS_PROCESS
|
|
{
|
|
DWORD dwServiceType;
|
|
DWORD dwCurrentState;
|
|
DWORD dwControlsAccepted;
|
|
DWORD dwWin32ExitCode;
|
|
DWORD dwServiceSpecificExitCode;
|
|
DWORD dwCheckPoint;
|
|
DWORD dwWaitHint;
|
|
DWORD dwProcessId;
|
|
DWORD dwServiceFlags;
|
|
} SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS;
|
|
|
|
typedef enum _SC_ENUM_TYPE {
|
|
SC_ENUM_PROCESS_INFO = 0
|
|
} SC_ENUM_TYPE;
|
|
|
|
cpp_quote("#endif")
|
|
|
|
typedef struct _SERVICE_RPC_REQUIRED_PRIVILEGES_INFO {
|
|
DWORD cbRequiredPrivileges;
|
|
[size_is(cbRequiredPrivileges)] BYTE *pRequiredPrivileges;
|
|
} SERVICE_RPC_REQUIRED_PRIVILEGES_INFO;
|
|
|
|
typedef struct _SC_RPC_CONFIG_INFOW {
|
|
DWORD dwInfoLevel;
|
|
[switch_is(dwInfoLevel)] union {
|
|
[case(SERVICE_CONFIG_DESCRIPTION)] SERVICE_DESCRIPTIONW *descr;
|
|
[case(SERVICE_CONFIG_FAILURE_ACTIONS)] SERVICE_FAILURE_ACTIONSW *actions;
|
|
[case(SERVICE_CONFIG_DELAYED_AUTO_START_INFO)] SERVICE_DELAYED_AUTO_START_INFO *delayedstart;
|
|
[case(SERVICE_CONFIG_FAILURE_ACTIONS_FLAG)] SERVICE_FAILURE_ACTIONS_FLAG *actionsflag;
|
|
[case(SERVICE_CONFIG_SERVICE_SID_INFO)] SERVICE_SID_INFO *sid;
|
|
[case(SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO)] SERVICE_RPC_REQUIRED_PRIVILEGES_INFO *privinfo;
|
|
[case(SERVICE_CONFIG_PRESHUTDOWN_INFO)] SERVICE_PRESHUTDOWN_INFO *preshutdown;
|
|
};
|
|
} SC_RPC_CONFIG_INFOW;
|
|
|
|
typedef struct _SC_RPC_CONFIG_INFOA {
|
|
DWORD dwInfoLevel;
|
|
[switch_is(dwInfoLevel)] union {
|
|
[case(SERVICE_CONFIG_DESCRIPTION)] SERVICE_DESCRIPTIONA *descr;
|
|
[case(SERVICE_CONFIG_FAILURE_ACTIONS)] SERVICE_FAILURE_ACTIONSA *actions;
|
|
[case(SERVICE_CONFIG_DELAYED_AUTO_START_INFO)] SERVICE_DELAYED_AUTO_START_INFO *delayedstart;
|
|
[case(SERVICE_CONFIG_FAILURE_ACTIONS_FLAG)] SERVICE_FAILURE_ACTIONS_FLAG *actionsflag;
|
|
[case(SERVICE_CONFIG_SERVICE_SID_INFO)] SERVICE_SID_INFO *sid;
|
|
[case(SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO)] SERVICE_RPC_REQUIRED_PRIVILEGES_INFO *privinfo;
|
|
[case(SERVICE_CONFIG_PRESHUTDOWN_INFO)] SERVICE_PRESHUTDOWN_INFO *preshutdown;
|
|
};
|
|
} SC_RPC_CONFIG_INFOA;
|
|
|
|
typedef struct _SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_1 {
|
|
ULONGLONG ullThreadId;
|
|
DWORD dwNotifyMask;
|
|
UCHAR CallbackAddressArray[16];
|
|
UCHAR CallbackParamAddressArray[16];
|
|
SERVICE_STATUS_PROCESS ServiceStatus;
|
|
DWORD dwNotificationStatus;
|
|
DWORD dwSequence;
|
|
} SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_1, *PSERVICE_NOTIFY_STATUS_CHANGE_PARAMS_1;
|
|
|
|
typedef struct _SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2 {
|
|
ULONGLONG ullThreadId;
|
|
DWORD dwNotifyMask;
|
|
UCHAR CallbackAddressArray[16];
|
|
UCHAR CallbackParamAddressArray[16];
|
|
SERVICE_STATUS_PROCESS ServiceStatus;
|
|
DWORD dwNotificationStatus;
|
|
DWORD dwSequence;
|
|
DWORD dwNotificationTriggered;
|
|
[string] LPWSTR pszServiceNames;
|
|
} SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2, *PSERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2;
|
|
|
|
typedef struct _SC_RPC_NOTIFY_PARAMS {
|
|
DWORD dwInfoLevel;
|
|
[switch_is(dwInfoLevel)] union {
|
|
[case(SERVICE_NOTIFY_STATUS_CHANGE_1)] SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_1 *params1;
|
|
[case(SERVICE_NOTIFY_STATUS_CHANGE_2)] SERVICE_NOTIFY_STATUS_CHANGE_PARAMS_2 *params;
|
|
};
|
|
} SC_RPC_NOTIFY_PARAMS;
|
|
|
|
typedef struct _SC_RPC_NOTIFY_PARAMS_LIST {
|
|
DWORD cElements;
|
|
[size_is(cElements)] SC_RPC_NOTIFY_PARAMS NotifyParamsArray[];
|
|
} SC_RPC_NOTIFY_PARAMS_LIST, *PSC_RPC_NOTIFY_PARAMS_LIST;
|
|
|
|
typedef struct _SERVICE_CONTROL_STATUS_REASON_IN_PARAMSA {
|
|
DWORD dwReason;
|
|
[string] LPSTR pszComment;
|
|
} SERVICE_CONTROL_STATUS_REASON_IN_PARAMSA, *PSERVICE_CONTROL_STATUS_REASON_IN_PARAMSA;
|
|
|
|
typedef struct _SERVICE_CONTROL_STATUS_REASON_IN_PARAMSW {
|
|
DWORD dwReason;
|
|
[string] LPWSTR pszComment;
|
|
} SERVICE_CONTROL_STATUS_REASON_IN_PARAMSW, *PSERVICE_CONTROL_STATUS_REASON_IN_PARAMSW;
|
|
|
|
typedef [switch_type(DWORD)] union _SC_RPC_SERVICE_CONTROL_IN_PARAMSA {
|
|
[case(1)] PSERVICE_CONTROL_STATUS_REASON_IN_PARAMSA psrInParams;
|
|
} SC_RPC_SERVICE_CONTROL_IN_PARAMSA, *PSC_RPC_SERVICE_CONTROL_IN_PARAMSA;
|
|
|
|
typedef [switch_type(DWORD)] union _SC_RPC_SERVICE_CONTROL_IN_PARAMSW {
|
|
[case(1)] PSERVICE_CONTROL_STATUS_REASON_IN_PARAMSW psrInParams;
|
|
} SC_RPC_SERVICE_CONTROL_IN_PARAMSW, *PSC_RPC_SERVICE_CONTROL_IN_PARAMSW;
|
|
|
|
typedef struct _SERVICE_CONTROL_STATUS_REASON_OUT_PARAMS {
|
|
SERVICE_STATUS_PROCESS ServiceStatus;
|
|
} SERVICE_CONTROL_STATUS_REASON_OUT_PARAMS, *PSERVICE_CONTROL_STATUS_REASON_OUT_PARAMS;
|
|
|
|
typedef [switch_type(DWORD)] union _SC_RPC_SERVICE_CONTROL_OUT_PARAMSA {
|
|
[case(1)] PSERVICE_CONTROL_STATUS_REASON_OUT_PARAMS psrOutParams;
|
|
} SC_RPC_SERVICE_CONTROL_OUT_PARAMSA, *PSC_RPC_SERVICE_CONTROL_OUT_PARAMSA;
|
|
|
|
typedef [switch_type(DWORD)] union _SC_RPC_SERVICE_CONTROL_OUT_PARAMSW {
|
|
[case(1)] PSERVICE_CONTROL_STATUS_REASON_OUT_PARAMS psrOutParams;
|
|
} SC_RPC_SERVICE_CONTROL_OUT_PARAMSW, *PSC_RPC_SERVICE_CONTROL_OUT_PARAMSW;
|
|
|
|
/* Function 0 */
|
|
DWORD svcctl_CloseServiceHandle(
|
|
[in,out] SC_RPC_HANDLE *handle
|
|
);
|
|
|
|
/* Function 1 */
|
|
DWORD svcctl_ControlService(
|
|
[in] SC_RPC_HANDLE hService,
|
|
[in] DWORD dwControl,
|
|
[out] SERVICE_STATUS *lpServiceStatus
|
|
);
|
|
|
|
/* Function 2 */
|
|
DWORD svcctl_DeleteService(
|
|
[in] SC_RPC_HANDLE hService
|
|
);
|
|
|
|
/* Function 3 */
|
|
DWORD svcctl_LockServiceDatabase(
|
|
[in] SC_RPC_HANDLE hSCManager,
|
|
[out] SC_RPC_LOCK *phLock
|
|
);
|
|
|
|
/* Function 4 */
|
|
DWORD svcctl_QueryServiceObjectSecurity(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] SECURITY_INFORMATION info,
|
|
[out, size_is(buf_size)] BYTE *descriptor,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size
|
|
);
|
|
|
|
/* Function 5 */
|
|
DWORD svcctl_SetServiceObjectSecurity(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] SECURITY_INFORMATION info,
|
|
[in, size_is(buf_size)] BYTE *descriptor,
|
|
[in] DWORD buf_size
|
|
);
|
|
|
|
/* Function 6 */
|
|
DWORD svcctl_QueryServiceStatus(
|
|
[in] SC_RPC_HANDLE service,
|
|
[out] SERVICE_STATUS *status
|
|
);
|
|
|
|
/* Function 7 */
|
|
DWORD svcctl_SetServiceStatus(
|
|
[in] SC_RPC_HANDLE hServiceStatus,
|
|
[in] LPSERVICE_STATUS lpServiceStatus
|
|
);
|
|
|
|
/* Function 8 */
|
|
DWORD svcctl_UnlockServiceDatabase(
|
|
[in,out] SC_RPC_LOCK *phLock
|
|
);
|
|
|
|
/* Function 9 */
|
|
DWORD svcctl_NotifyBootConfigStatus(
|
|
[in, string, unique] SVCCTL_HANDLEW machinename,
|
|
[in] DWORD boot_acceptable
|
|
);
|
|
|
|
/* Not compatible with Windows function 10 */
|
|
DWORD svcctl_SCSetServiceBitsW(/* FIXME */);
|
|
|
|
/* Function 11 */
|
|
DWORD svcctl_ChangeServiceConfigW(
|
|
[in] SC_RPC_HANDLE hService,
|
|
[in] DWORD dwServiceType,
|
|
[in] DWORD dwStartType,
|
|
[in] DWORD dwErrorControl,
|
|
[in,unique] LPCWSTR lpBinaryPathName,
|
|
[in,unique] LPCWSTR lpLoadOrderGroupKey,
|
|
[in,out,unique] DWORD *lpdwTagId,
|
|
[in,unique,size_is(dwDependenciesSize)] const BYTE *lpDependencies,
|
|
[in] DWORD dwDependenciesSize,
|
|
[in,unique] LPCWSTR lpServiceStartName,
|
|
[in,unique,size_is(dwPasswordSize)] const BYTE *lpPassword,
|
|
[in] DWORD dwPasswordSize,
|
|
[in,unique] LPCWSTR lpDisplayName
|
|
);
|
|
|
|
/* Function 12 */
|
|
DWORD svcctl_CreateServiceW(
|
|
[in] SC_RPC_HANDLE hSCManager,
|
|
[in] LPCWSTR lpServiceName,
|
|
[in,unique] LPCWSTR lpDisplayName,
|
|
[in] DWORD dwDesiredAccess,
|
|
[in] DWORD dwServiceType,
|
|
[in] DWORD dwStartType,
|
|
[in] DWORD dwErrorControl,
|
|
[in] LPCWSTR lpBinaryPathName,
|
|
[in,unique] LPCWSTR lpLoadOrderGroup,
|
|
[in,out,unique] DWORD *lpdwTagId,
|
|
[in,unique,size_is(dwDependenciesSize)] const BYTE *lpDependencies,
|
|
[in] DWORD dwDependenciesSize,
|
|
[in,unique] LPCWSTR lpServiceStartName,
|
|
[in,unique,size_is(dwPasswordSize)] const BYTE *lpPassword,
|
|
[in] DWORD dwPasswordSize,
|
|
[out] SC_RPC_HANDLE *phService
|
|
);
|
|
|
|
/* Function 13 */
|
|
DWORD svcctl_EnumDependentServicesW(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] DWORD state,
|
|
[out, size_is(buf_size)] BYTE *services,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size,
|
|
[out] DWORD *services_ret
|
|
);
|
|
|
|
/* Function 14 */
|
|
DWORD svcctl_EnumServicesStatusW(
|
|
[in] SC_RPC_HANDLE hmngr,
|
|
[in] DWORD type,
|
|
[in] DWORD state,
|
|
[out,size_is(size)] BYTE *buffer,
|
|
[in] DWORD size,
|
|
[out] LPDWORD needed,
|
|
[out] LPDWORD returned,
|
|
[in,out,unique] LPDWORD resume
|
|
);
|
|
|
|
/* Function 15 */
|
|
DWORD svcctl_OpenSCManagerW(
|
|
[in,unique] MACHINE_HANDLEW MachineName,
|
|
[in,unique] LPCWSTR DatabaseName,
|
|
[in] DWORD dwAccessMask,
|
|
[out] SC_RPC_HANDLE *handle
|
|
);
|
|
|
|
/* Function 16 */
|
|
DWORD svcctl_OpenServiceW(
|
|
[in] SC_RPC_HANDLE hSCManager,
|
|
[in] LPCWSTR lpServiceName,
|
|
[in] DWORD dwDesiredAccess,
|
|
[out] SC_RPC_HANDLE *phService
|
|
);
|
|
|
|
/* Function 17 */
|
|
DWORD svcctl_QueryServiceConfigW(
|
|
[in] SC_RPC_HANDLE hService,
|
|
[out] QUERY_SERVICE_CONFIGW *config,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size);
|
|
|
|
/* Function 18 */
|
|
DWORD svcctl_QueryServiceLockStatusW(
|
|
[in] SC_RPC_HANDLE scmanager,
|
|
[out] QUERY_SERVICE_LOCK_STATUSW *status,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size
|
|
);
|
|
|
|
/* Function 19 */
|
|
DWORD svcctl_StartServiceW(
|
|
[in] SC_RPC_HANDLE hService,
|
|
[in] DWORD dwNumServiceArgs,
|
|
[in,unique,size_is(dwNumServiceArgs)] LPCWSTR *lpServiceArgVectors
|
|
);
|
|
|
|
/* Function 20 */
|
|
DWORD svcctl_GetServiceDisplayNameW(
|
|
[in] SC_RPC_HANDLE hSCManager,
|
|
[in] LPCWSTR lpServiceName,
|
|
[out,string,size_is(*cchBufSize+1)] WCHAR lpBuffer[],
|
|
[in,out] DWORD *cchBufSize);
|
|
|
|
/* Function 21 */
|
|
DWORD svcctl_GetServiceKeyNameW(
|
|
[in] SC_RPC_HANDLE hSCManager,
|
|
[in] LPCWSTR lpServiceDisplayName,
|
|
[out,string,size_is(*cchBufSize+1)] WCHAR lpBuffer[],
|
|
[in,out] DWORD *cchBufSize);
|
|
|
|
/* Not compatible with Windows function 22 */
|
|
DWORD svcctl_SCSetServiceBitsA(/* FIXME */);
|
|
|
|
/* Function 23 */
|
|
DWORD svcctl_ChangeServiceConfigA(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] DWORD service_type,
|
|
[in] DWORD start_type,
|
|
[in] DWORD error_control,
|
|
[in, string, unique] LPSTR binarypath,
|
|
[in, string, unique] LPSTR loadordergroup,
|
|
[in, out, unique] DWORD *tagid,
|
|
[in, unique, size_is(depend_size)] BYTE *dependencies,
|
|
[in] DWORD depend_size,
|
|
[in, string, unique] LPSTR startname,
|
|
[in, unique, size_is(password_size)] BYTE *password,
|
|
[in] DWORD password_size,
|
|
[in, string, unique] LPSTR displayname
|
|
);
|
|
|
|
/* Function 24 */
|
|
DWORD svcctl_CreateServiceA(
|
|
[in] SC_RPC_HANDLE scmanager,
|
|
[in] LPCSTR servicename,
|
|
[in, unique] LPCSTR displayname,
|
|
[in] DWORD desiredaccess,
|
|
[in] DWORD service_type,
|
|
[in] DWORD start_type,
|
|
[in] DWORD error_control,
|
|
[in] LPCSTR binarypath,
|
|
[in, unique] LPCSTR loadordergroup,
|
|
[in, out, unique] DWORD *tagid,
|
|
[in, unique, size_is(depend_size)] const BYTE *dependencies,
|
|
[in] DWORD depend_size,
|
|
[in, unique] LPCSTR startname,
|
|
[in, unique, size_is(password_size)] const BYTE *password,
|
|
[in] DWORD password_size,
|
|
[out] SC_RPC_HANDLE *service
|
|
);
|
|
|
|
/* Function 25 */
|
|
DWORD svcctl_EnumDependentServicesA(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] DWORD state,
|
|
[out, size_is(buf_size)] BYTE *services,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size,
|
|
[out] DWORD *services_ret
|
|
);
|
|
|
|
/* Function 26 */
|
|
DWORD svcctl_EnumServicesStatusA(
|
|
[in] SC_RPC_HANDLE hmngr,
|
|
[in] DWORD type,
|
|
[in] DWORD state,
|
|
[out, size_is(size)] BYTE *buffer,
|
|
[in] DWORD size,
|
|
[out] DWORD *needed,
|
|
[out] DWORD *returned,
|
|
[in,out,unique] DWORD *resume
|
|
);
|
|
|
|
/* Function 27 */
|
|
DWORD svcctl_OpenSCManagerA(
|
|
[in,unique] MACHINE_HANDLEA MachineName,
|
|
[in,unique] LPCSTR DatabaseName,
|
|
[in] DWORD dwAccessMask,
|
|
[out] SC_RPC_HANDLE *handle
|
|
);
|
|
|
|
/* Function 28 */
|
|
DWORD svcctl_OpenServiceA(
|
|
[in] SC_RPC_HANDLE hSCManager,
|
|
[in] LPCSTR lpServiceName,
|
|
[in] DWORD dwDesiredAccess,
|
|
[out] SC_RPC_HANDLE *phService
|
|
);
|
|
|
|
/* Function 29 */
|
|
DWORD svcctl_QueryServiceConfigA(
|
|
[in] SC_RPC_HANDLE hService,
|
|
[out] QUERY_SERVICE_CONFIGA *config,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size);
|
|
|
|
/* Function 30 */
|
|
DWORD svcctl_QueryServiceLockStatusA(
|
|
[in] SC_RPC_HANDLE scmanager,
|
|
[out] QUERY_SERVICE_LOCK_STATUSA *status,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size
|
|
);
|
|
|
|
/* Function 31 */
|
|
DWORD svcctl_StartServiceA(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] DWORD argc,
|
|
[in, unique, size_is(argc)] LPCSTR *args
|
|
);
|
|
|
|
/* Function 32 */
|
|
DWORD svcctl_GetServiceDisplayNameA(
|
|
[in] SC_RPC_HANDLE hSCManager,
|
|
[in] LPCSTR servicename,
|
|
[out, string, size_is(*buf_size+1)] CHAR buffer[],
|
|
[in, out] DWORD *buf_size);
|
|
|
|
/* Function 33 */
|
|
DWORD svcctl_GetServiceKeyNameA(
|
|
[in] SC_RPC_HANDLE hSCManager,
|
|
[in] LPCSTR servicename,
|
|
[out, string, size_is(*buf_size+1)] CHAR buffer[],
|
|
[in, out] DWORD *buf_size);
|
|
|
|
/* Not compatible with Windows function 34 */
|
|
DWORD svcctl_GetCurrentGroupStateW(/* FIXME */);
|
|
|
|
/* Function 35 */
|
|
DWORD svcctl_EnumServiceGroupW(
|
|
[in] SC_RPC_HANDLE scmanager,
|
|
[in] DWORD service_type,
|
|
[in] DWORD service_state,
|
|
[out, size_is(buf_size)] BYTE *buffer,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size,
|
|
[out] DWORD *returned_size,
|
|
[in, out, unique] DWORD *resume_index,
|
|
[in, string, unique] LPCWSTR groupname
|
|
);
|
|
|
|
/* Function 36 */
|
|
DWORD svcctl_ChangeServiceConfig2A(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] SC_RPC_CONFIG_INFOA info
|
|
);
|
|
|
|
/* Function 37 */
|
|
DWORD svcctl_ChangeServiceConfig2W(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] SC_RPC_CONFIG_INFOW info
|
|
);
|
|
|
|
/* Function 38 */
|
|
DWORD svcctl_QueryServiceConfig2A(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] DWORD info_level,
|
|
[out, size_is(buf_size)] BYTE *buffer,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size
|
|
);
|
|
|
|
/* Function 39 */
|
|
DWORD svcctl_QueryServiceConfig2W(
|
|
[in] SC_RPC_HANDLE hService,
|
|
[in] DWORD InfoLevel,
|
|
[out,size_is(cbBufSize)] BYTE lpBuffer[],
|
|
[in] DWORD cbBufSize,
|
|
[out] LPDWORD pcbBytesNeeded
|
|
);
|
|
|
|
/* Function 40 */
|
|
DWORD svcctl_QueryServiceStatusEx(
|
|
[in] SC_RPC_HANDLE hService,
|
|
[in] SC_STATUS_TYPE InfoLevel,
|
|
[out,size_is(cbBufSize)] BYTE *lpBuffer,
|
|
[in] DWORD cbBufSize,
|
|
[out] LPDWORD pcbBytesNeeded
|
|
);
|
|
|
|
/* Function 41 */
|
|
DWORD svcctl_EnumServicesStatusExA(
|
|
[in] SC_RPC_HANDLE scmanager,
|
|
[in] SC_ENUM_TYPE info_level,
|
|
[in] DWORD service_type,
|
|
[in] DWORD service_state,
|
|
[out, size_is(buf_size)] BYTE *buffer,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size,
|
|
[out] DWORD *services_count,
|
|
[in, out, unique] DWORD *resume_index,
|
|
[in, string, unique] LPCSTR groupname
|
|
);
|
|
|
|
/* Function 42 */
|
|
DWORD svcctl_EnumServicesStatusExW(
|
|
[in] SC_RPC_HANDLE scmanager,
|
|
[in] SC_ENUM_TYPE info_level,
|
|
[in] DWORD service_type,
|
|
[in] DWORD service_state,
|
|
[out, size_is(buf_size)] BYTE *buffer,
|
|
[in] DWORD buf_size,
|
|
[out] DWORD *needed_size,
|
|
[out] DWORD *services_count,
|
|
[in, out, unique] DWORD *resume_index,
|
|
[in, string, unique] LPCWSTR groupname
|
|
);
|
|
|
|
/* Not compatible with Windows function 43 */
|
|
DWORD svcctl_unknown43(/*FIXME*/);
|
|
|
|
/* Function 44 */
|
|
DWORD svcctl_CreateServiceWOW64A(
|
|
[in] SC_RPC_HANDLE scmanager,
|
|
[in, string] LPCSTR servicename,
|
|
[in, string, unique] LPCSTR displayname,
|
|
[in] DWORD accessmask,
|
|
[in] DWORD service_type,
|
|
[in] DWORD start_type,
|
|
[in] DWORD error_control,
|
|
[in, string] LPCSTR imagepath,
|
|
[in, string, unique] LPCSTR loadordergroup,
|
|
[in, out, unique] DWORD *tagid,
|
|
[in, unique, size_is(depend_size)] const BYTE *dependencies,
|
|
[in] DWORD depend_size,
|
|
[in, string, unique] LPCSTR start_name,
|
|
[in, unique, size_is(password_size)] const BYTE *password,
|
|
[in] DWORD password_size,
|
|
[out] SC_RPC_HANDLE *service
|
|
);
|
|
|
|
/* Function 45 */
|
|
DWORD svcctl_CreateServiceWOW64W(
|
|
[in] SC_RPC_HANDLE scmanager,
|
|
[in, string] LPCWSTR servicename,
|
|
[in, string, unique] LPCWSTR displayname,
|
|
[in] DWORD accessmask,
|
|
[in] DWORD service_type,
|
|
[in] DWORD start_type,
|
|
[in] DWORD error_control,
|
|
[in, string] LPCWSTR imagepath,
|
|
[in, string, unique] LPCWSTR loadordergroup,
|
|
[in, out, unique] DWORD *tagid,
|
|
[in, unique, size_is(depend_size)] const BYTE *dependencies,
|
|
[in] DWORD depend_size,
|
|
[in, string, unique] LPCWSTR start_name,
|
|
[in, unique, size_is(password_size)] const BYTE *password,
|
|
[in] DWORD password_size,
|
|
[out] SC_RPC_HANDLE *service
|
|
);
|
|
|
|
/* Not compatible with Windows function 46 */
|
|
DWORD svcctl_unknown46(/*FIXME*/);
|
|
|
|
/* Function 47 */
|
|
DWORD svcctl_NotifyServiceStatusChange(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] SC_RPC_NOTIFY_PARAMS params,
|
|
[in] GUID *clientprocessguid,
|
|
[out] GUID *scmprocessguid,
|
|
[out] BOOL *createremotequeue,
|
|
[out] SC_NOTIFY_RPC_HANDLE *notify
|
|
);
|
|
|
|
/* Function 48 */
|
|
DWORD svcctl_GetNotifyResults(
|
|
[in] SC_NOTIFY_RPC_HANDLE notify,
|
|
[out] SC_RPC_NOTIFY_PARAMS_LIST **params
|
|
);
|
|
|
|
/* Function 49 */
|
|
DWORD svcctl_CloseNotifyHandle(
|
|
[in, out] SC_NOTIFY_RPC_HANDLE *notify,
|
|
[out] BOOL *apc_fired
|
|
);
|
|
|
|
/* Function 50 */
|
|
DWORD svcctl_ControlServiceExA(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] DWORD control,
|
|
[in] DWORD info_level,
|
|
[in, switch_is(info_level)] SC_RPC_SERVICE_CONTROL_IN_PARAMSA *in_params,
|
|
[out, switch_is(info_level)] SC_RPC_SERVICE_CONTROL_OUT_PARAMSA *out_params
|
|
);
|
|
|
|
/* Function 51 */
|
|
DWORD svcctl_ControlServiceExW(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] DWORD control,
|
|
[in] DWORD info_level,
|
|
[in, switch_is(info_level)] SC_RPC_SERVICE_CONTROL_IN_PARAMSW *in_params,
|
|
[out, switch_is(info_level)] SC_RPC_SERVICE_CONTROL_OUT_PARAMSW *out_params
|
|
);
|
|
|
|
/* Not compatible with Windows function 52 */
|
|
DWORD svcctl_unknown52();
|
|
|
|
/* Not compatible with Windows function 53 */
|
|
DWORD svcctl_unknown53();
|
|
|
|
/* Not compatible with Windows function 54 */
|
|
DWORD svcctl_unknown54();
|
|
|
|
/* Not compatible with Windows function 55 */
|
|
DWORD svcctl_unknown55();
|
|
|
|
/* Function 56 */
|
|
DWORD svcctl_QueryServiceConfigEx(
|
|
[in] SC_RPC_HANDLE service,
|
|
[in] DWORD info_level,
|
|
[out] SC_RPC_CONFIG_INFOW *info
|
|
);
|
|
}
|