#ifndef _RPC_SVCCTL_H /* _RPC_SVCCTL_H */
#define _RPC_SVCCTL_H
-
/* svcctl pipe */
#define SVCCTL_CLOSE_SERVICE 0x00
#define SVCCTL_CONTROL_SERVICE 0x01
+#define SVCCTL_LOCK_SERVICE_DB 0x03
+#define SVCCTL_QUERY_SERVICE_SEC 0x04
+#define SVCCTL_SET_SERVICE_SEC 0x05
#define SVCCTL_QUERY_STATUS 0x06
+#define SVCCTL_UNLOCK_SERVICE_DB 0x08
#define SVCCTL_ENUM_DEPENDENT_SERVICES_W 0x0d
#define SVCCTL_ENUM_SERVICES_STATUS_W 0x0e
#define SVCCTL_OPEN_SCMANAGER_W 0x0f
#define SVCCTL_START_SERVICE_W 0x13
#define SVCCTL_GET_DISPLAY_NAME 0x14
#define SVCCTL_QUERY_SERVICE_CONFIG2_W 0x27
+#define SVCCTL_QUERY_SERVICE_STATUSEX_W 0x28
/* ANSI versions not implemented currently
#define SVCCTL_ENUM_SERVICES_STATUS_A 0x0e
/* SERVER_STATUS - state */
#define SVCCTL_STATE_ACTIVE 0x00000001
#define SVCCTL_STATE_INACTIVE 0x00000002
-#define SVCCTL_STATE_ALL ( SVC_STATE_ACTIVE | SVC_STATE_INACTIVE )
+#define SVCCTL_STATE_ALL ( SVCCTL_STATE_ACTIVE | SVCCTL_STATE_INACTIVE )
/* SERVER_STATUS - CurrentState */
+#define SVCCTL_STATE_UNKNOWN 0x00000000 /* only used internally to smbd */
#define SVCCTL_STOPPED 0x00000001
#define SVCCTL_START_PENDING 0x00000002
#define SVCCTL_STOP_PENDING 0x00000003
/* SERVER_STATUS - ControlAccepted */
+#define SVCCTL_ACCEPT_NONE 0x00000000
#define SVCCTL_ACCEPT_STOP 0x00000001
#define SVCCTL_ACCEPT_PAUSE_CONTINUE 0x00000002
#define SVCCTL_ACCEPT_SHUTDOWN 0x00000004
#define SVCCTL_ACCEPT_HARDWAREPROFILECHANGE 0x00000020
#define SVCCTL_ACCEPT_POWEREVENT 0x00000040
+/* SERVER_STATUS - ControlAccepted */
+#define SVCCTL_SVC_ERROR_IGNORE 0x00000000
+#define SVCCTL_SVC_ERROR_NORMAL 0x00000001
+#define SVCCTL_SVC_ERROR_CRITICAL 0x00000002
+#define SVCCTL_SVC_ERROR_SEVERE 0x00000003
+
+/* QueryServiceConfig2 options */
+#define SERVICE_CONFIG_DESCRIPTION 0x00000001
+#define SERVICE_CONFIG_FAILURE_ACTIONS 0x00000002
+
+
+/* Service Config - values for ServiceType field*/
+
+#define SVCCTL_KERNEL_DRVR 0x00000001 /* doubtful we'll have these */
+#define SVCCTL_FILE_SYSTEM_DRVR 0x00000002
+#define SVCCTL_WIN32_OWN_PROC 0x00000010
+#define SVCCTL_WIN32_SHARED_PROC 0x00000020
+#define SVCCTL_WIN32_INTERACTIVE 0x00000100
+
+/* Service Config - values for StartType field */
+#define SVCCTL_BOOT_START 0x00000000
+#define SVCCTL_SYSTEM_START 0x00000001
+#define SVCCTL_AUTO_START 0x00000002
+#define SVCCTL_DEMAND_START 0x00000003
+#define SVCCTL_DISABLED 0x00000004
+
+/* Service Controls */
+
+#define SVCCTL_CONTROL_STOP 0x00000001
+#define SVCCTL_CONTROL_PAUSE 0x00000002
+#define SVCCTL_CONTROL_CONTINUE 0x00000003
+#define SVCCTL_CONTROL_INTERROGATE 0x00000004
+#define SVCCTL_CONTROL_SHUTDOWN 0x00000005
+
+#define SVC_HANDLE_IS_SCM 0x0000001
+#define SVC_HANDLE_IS_SERVICE 0x0000002
+#define SVC_HANDLE_IS_DBLOCK 0x0000003
+
+#define SVC_STATUS_PROCESS_INFO 0x00000000
+
+/* where we assume the location of the service control scripts */
+#define SVCCTL_SCRIPT_DIR "svcctl"
/* utility structures for RPCs */
uint32 type;
uint32 state;
uint32 controls_accepted;
- uint32 win32_exit_code;
+ WERROR win32_exit_code;
uint32 service_exit_code;
uint32 check_point;
uint32 wait_hint;
} SERVICE_STATUS;
+typedef struct {
+ SERVICE_STATUS status;
+ uint32 process_id;
+ uint32 service_flags;
+} SERVICE_STATUS_PROCESS;
+
+
typedef struct {
UNISTR servicename;
UNISTR displayname;
UNISTR2 *displayname;
} SERVICE_CONFIG;
+typedef struct {
+ uint32 unknown;
+ UNISTR description;
+} SERVICE_DESCRIPTION;
-/* rpc structures */
-
-/**************************/
+typedef struct {
+ uint32 type;
+ uint32 delay;
+} SC_ACTION;
typedef struct {
- POLICY_HND handle;
-} SVCCTL_Q_CLOSE_SERVICE;
+ uint32 reset_period;
+ UNISTR2 *rebootmsg; /* i have no idea if these are UNISTR2's. I can't get a good trace */
+ UNISTR2 *command;
+ uint32 num_actions;
+ SC_ACTION *actions;
+} SERVICE_FAILURE_ACTIONS;
+/*
+ * dispatch table of functions to handle the =ServiceControl API
+ */
+
typedef struct {
- WERROR status;
-} SVCCTL_R_CLOSE_SERVICE;
+ /* functions for enumerating subkeys and values */
+ WERROR (*stop_service)( const char *service, SERVICE_STATUS *status );
+ WERROR (*start_service) ( const char *service );
+ WERROR (*service_status)( const char *service, SERVICE_STATUS *status );
+} SERVICE_CONTROL_OPS;
+
+/* structure to store the service handle information */
+
+typedef struct _ServiceInfo {
+ uint8 type;
+ char *name;
+ uint32 access_granted;
+ SERVICE_CONTROL_OPS *ops;
+} SERVICE_INFO;
+
+
+/* rpc structures */
/**************************/
typedef struct {
- uint32 ptr_srv;
- UNISTR2 servername;
- uint32 ptr_db;
- UNISTR2 database;
- uint32 access_mask;
+ UNISTR2 *servername;
+ UNISTR2 *database;
+ uint32 access;
} SVCCTL_Q_OPEN_SCMANAGER;
typedef struct {
typedef struct {
POLICY_HND handle;
UNISTR2 servicename;
- uint32 access_mask;
+ uint32 access;
} SVCCTL_Q_OPEN_SERVICE;
typedef struct {
typedef struct {
POLICY_HND handle;
uint32 parmcount;
- UNISTR2_ARRAY parameters;
+ UNISTR4_ARRAY *parameters;
} SVCCTL_Q_START_SERVICE;
typedef struct {
WERROR status;
} SVCCTL_R_ENUM_DEPENDENT_SERVICES;
+
/**************************/
typedef struct {
WERROR status;
} SVCCTL_R_QUERY_SERVICE_CONFIG;
+
+/**************************/
+
+typedef struct {
+ POLICY_HND handle;
+ uint32 level;
+ uint32 buffer_size;
+} SVCCTL_Q_QUERY_SERVICE_CONFIG2;
+
+typedef struct {
+ RPC_BUFFER buffer;
+ uint32 needed;
+ WERROR status;
+} SVCCTL_R_QUERY_SERVICE_CONFIG2;
+
+
+/**************************/
+
+typedef struct {
+ POLICY_HND handle;
+ uint32 level;
+ uint32 buffer_size;
+} SVCCTL_Q_QUERY_SERVICE_STATUSEX;
+
+typedef struct {
+ RPC_BUFFER buffer;
+ uint32 needed;
+ WERROR status;
+} SVCCTL_R_QUERY_SERVICE_STATUSEX;
+
+
+/**************************/
+
+typedef struct {
+ POLICY_HND handle;
+} SVCCTL_Q_LOCK_SERVICE_DB;
+
+typedef struct {
+ POLICY_HND h_lock;
+ WERROR status;
+} SVCCTL_R_LOCK_SERVICE_DB;
+
+
+/**************************/
+
+typedef struct {
+ POLICY_HND h_lock;
+} SVCCTL_Q_UNLOCK_SERVICE_DB;
+
+typedef struct {
+ WERROR status;
+} SVCCTL_R_UNLOCK_SERVICE_DB;
+
+
+/**************************/
+
+typedef struct {
+ POLICY_HND handle;
+ uint32 security_flags;
+ uint32 buffer_size;
+} SVCCTL_Q_QUERY_SERVICE_SEC;
+
+typedef struct {
+ RPC_BUFFER buffer;
+ uint32 needed;
+ WERROR status;
+} SVCCTL_R_QUERY_SERVICE_SEC;
+
+/**************************/
+
+typedef struct {
+ POLICY_HND handle;
+ uint32 security_flags;
+ RPC_BUFFER buffer;
+ uint32 buffer_size;
+} SVCCTL_Q_SET_SERVICE_SEC;
+
+typedef struct {
+ WERROR status;
+} SVCCTL_R_SET_SERVICE_SEC;
+
+
#endif /* _RPC_SVCCTL_H */