svcctl: use offered/needed for buffer sizes as in spoolss.
[ira/wip.git] / librpc / idl / svcctl.idl
index 500d4949e3bb885757cc24c0d443defaf76198b4..2f461d688984f7bbb3ff66bf4ab405c21878c319 100644 (file)
@@ -9,6 +9,7 @@ import "misc.idl", "security.idl";
   version(2.0),
   pointer_default(unique),
   endpoint("ncacn_np:[\\pipe\\svcctl]", "ncalrpc:"),
+  helper("../librpc/ndr/ndr_svcctl.h"),
   helpstring("Service Control")
 ] interface svcctl
 {
@@ -18,21 +19,56 @@ import "misc.idl", "security.idl";
                uint32 lock_duration;
        } SERVICE_LOCK_STATUS;
 
+       typedef [v1_enum] enum {
+               SVCCTL_STATE_UNKNOWN            = 0x00000000,   /* only used internally to smbd */
+               SVCCTL_STOPPED                  = 0x00000001,
+               SVCCTL_START_PENDING            = 0x00000002,
+               SVCCTL_STOP_PENDING             = 0x00000003,
+               SVCCTL_RUNNING                  = 0x00000004,
+               SVCCTL_CONTINUE_PENDING         = 0x00000005,
+               SVCCTL_PAUSE_PENDING            = 0x00000006,
+               SVCCTL_PAUSED                   = 0x00000007
+       } svcctl_ServiceStatus;
+
+       const int SVCCTL_ACCEPT_NONE                    = 0x00000000;
+
+       typedef [bitmap32bit] bitmap {
+               SVCCTL_ACCEPT_STOP                      = 0x00000001,
+               SVCCTL_ACCEPT_PAUSE_CONTINUE            = 0x00000002,
+               SVCCTL_ACCEPT_SHUTDOWN                  = 0x00000004,
+               SVCCTL_ACCEPT_PARAMCHANGE               = 0x00000008,
+               SVCCTL_ACCEPT_NETBINDCHANGE             = 0x00000010,
+               SVCCTL_ACCEPT_HARDWAREPROFILECHANGE     = 0x00000020,
+               SVCCTL_ACCEPT_POWEREVENT                = 0x00000040
+       } svcctl_ControlsAccepted;
+
        typedef struct {
                uint32 type;
-               uint32 state;
-               uint32 controls_accepted;
+               svcctl_ServiceStatus state;
+               svcctl_ControlsAccepted controls_accepted;
                WERROR win32_exit_code;
                uint32 service_exit_code;
                uint32 check_point;
                uint32 wait_hint;
        } SERVICE_STATUS;
 
-       typedef struct {
+       typedef [public] struct {
+               SERVICE_STATUS status;
+               uint32 process_id;
+               uint32 service_flags;
+       } SERVICE_STATUS_PROCESS;
+
+       typedef [public,gensize] struct {
+               [relative] nstring *service_name;
+               [relative] nstring *display_name;
+               SERVICE_STATUS status;
+       } ENUM_SERVICE_STATUSW;
+
+       typedef [public,gensize] struct {
                [relative] astring *service_name;
                [relative] astring *display_name;
                SERVICE_STATUS status;
-       } ENUM_SERVICE_STATUS;
+       } ENUM_SERVICE_STATUSA;
 
        const int SERVICE_TYPE_KERNEL_DRIVER       = 0x01;
        const int SERVICE_TYPE_FS_DRIVER           = 0x02;
@@ -42,10 +78,7 @@ import "misc.idl", "security.idl";
        const int SERVICE_TYPE_WIN32_OWN_PROCESS   = 0x10;
        const int SERVICE_TYPE_WIN32_SHARE_PROCESS = 0x20;
        const int SERVICE_TYPE_WIN32=SERVICE_TYPE_WIN32_OWN_PROCESS|SERVICE_TYPE_WIN32_SHARE_PROCESS;
-
-       const int SERVICE_STATE_ACTIVE   = 0x01;
-       const int SERVICE_STATE_INACTIVE = 0x02;
-       const int SERVICE_STATE_ALL      = 0x03;
+       const int SERVICE_TYPE_INTERACTIVE_PROCESS = 0x100;
 
        typedef [public,bitmap32bit] bitmap {
                SV_TYPE_WORKSTATION       = 0x00000001,
@@ -172,11 +205,27 @@ import "misc.idl", "security.idl";
 
        /*****************/
        /* Function 0x0b */
+
+       typedef [v1_enum] enum {
+               SVCCTL_SVC_ERROR_IGNORE         = 0x00000000,
+               SVCCTL_SVC_ERROR_NORMAL         = 0x00000001,
+               SVCCTL_SVC_ERROR_CRITICAL       = 0x00000002,
+               SVCCTL_SVC_ERROR_SEVERE         = 0x00000003
+       } svcctl_ErrorControl;
+
+       typedef [v1_enum] enum {
+               SVCCTL_BOOT_START               = 0x00000000,
+               SVCCTL_SYSTEM_START             = 0x00000001,
+               SVCCTL_AUTO_START               = 0x00000002,
+               SVCCTL_DEMAND_START             = 0x00000003,
+               SVCCTL_DISABLED                 = 0x00000004
+       } svcctl_StartType;
+
        WERROR svcctl_ChangeServiceConfigW(
                [in,ref] policy_handle *handle,
                [in] uint32 type,
-               [in] uint32 start,
-               [in] uint32 error,
+               [in] svcctl_StartType start_type,
+               [in] svcctl_ErrorControl error_control,
                [in,unique] [string,charset(UTF16)] uint16 *binary_path,
                [in,unique] [string,charset(UTF16)] uint16 *load_order_group,
                [out,ref] uint32 *tag_id,
@@ -194,8 +243,8 @@ import "misc.idl", "security.idl";
                [in,unique] [string,charset(UTF16)] uint16 *DisplayName,
                [in] uint32 desired_access,
                [in] uint32 type,
-               [in] uint32 start_type,
-               [in] uint32 error_control,
+               [in] svcctl_StartType start_type,
+               [in] svcctl_ErrorControl error_control,
                [in] [string,charset(UTF16)] uint16 binary_path[],
                [in,unique] [string,charset(UTF16)] uint16 *LoadOrderGroupKey,
                [in,out,unique] uint32 *TagId,
@@ -212,22 +261,29 @@ import "misc.idl", "security.idl";
        WERROR svcctl_EnumDependentServicesW(
                [in,ref] policy_handle *service,
                [in] uint32 state,
-               [out,ref,size_is(buf_size)] uint8 *service_status,
-               [in,range(0,0x40000)] uint32 buf_size,
-               [out,ref,range(0,0x40000)] uint32 *bytes_needed,
+               [out,ref,size_is(offered)] uint8 *service_status,
+               [in,range(0,0x40000)] uint32 offered,
+               [out,ref,range(0,0x40000)] uint32 *needed,
                [out,ref,range(0,0x40000)] uint32 *services_returned
        );
 
        /*****************/
        /* Function 0x0e */
+
+       typedef [v1_enum] enum {
+               SERVICE_STATE_ACTIVE    = 0x00000001,
+               SERVICE_STATE_INACTIVE  = 0x00000002,
+               SERVICE_STATE_ALL       = ( SERVICE_STATE_ACTIVE | SERVICE_STATE_INACTIVE )
+       } svcctl_ServiceState;
+
        WERROR svcctl_EnumServicesStatusW(
                [in,ref] policy_handle *handle,
                [in] uint32 type,
-               [in] uint32 state,
-               [out,ref,size_is(buf_size)] uint8 *service,
-               [in] [range(0,262144)] uint32 buf_size,
-               [out,ref] [range(0,262144)] uint32 *bytes_needed,
-               [out,ref] [range(0,262144)] uint32 *services_returned,
+               [in] svcctl_ServiceState state,
+               [out,ref,size_is(offered)] uint8 *service,
+               [in] [range(0,0x40000)] uint32 offered,
+               [out,ref] [range(0,0x40000)] uint32 *needed,
+               [out,ref] [range(0,0x40000)] uint32 *services_returned,
                [in,out,unique] uint32 *resume_handle
        );
 
@@ -320,8 +376,8 @@ import "misc.idl", "security.idl";
 
        typedef [public,gensize] struct {
                uint32 service_type;
-               uint32 start_type;
-               uint32 error_control;
+               svcctl_StartType start_type;
+               svcctl_ErrorControl error_control;
                [string,charset(UTF16)] [range(0,8192)] uint16 *executablepath;
                [string,charset(UTF16)] [range(0,8192)] uint16 *loadordergroup;
                uint32 tag_id;
@@ -333,17 +389,17 @@ import "misc.idl", "security.idl";
        WERROR svcctl_QueryServiceConfigW(
                [in,ref] policy_handle *handle,
                [out] QUERY_SERVICE_CONFIG *query,
-               [in] [range(0,8192)] uint32 buf_size,
-               [out,ref] [range(0,8192)] uint32 *bytes_needed
+               [in] [range(0,8192)] uint32 offered,
+               [out,ref] [range(0,8192)] uint32 *needed
        );
 
        /*****************/
        /* Function 0x12 */
        WERROR svcctl_QueryServiceLockStatusW(
                [in,ref] policy_handle *handle,
-               [in] uint32 buf_size,
+               [in] uint32 offered,
                [out,ref] SERVICE_LOCK_STATUS *lock_status,
-               [out,ref] uint32 *required_buf_size
+               [out,ref] uint32 *needed
        );
 
        /*****************/
@@ -386,8 +442,8 @@ import "misc.idl", "security.idl";
        WERROR svcctl_ChangeServiceConfigA(
                [in,ref] policy_handle *handle,
                [in] uint32 type,
-               [in] uint32 start,
-               [in] uint32 error,
+               [in] svcctl_StartType start_type,
+               [in] svcctl_ErrorControl error_control,
                [in,unique] [string,charset(UTF16)] uint16 *binary_path,
                [in,unique] [string,charset(UTF16)] uint16 *load_order_group,
                [out,ref] uint32 *tag_id,
@@ -405,8 +461,8 @@ import "misc.idl", "security.idl";
                [in,unique] [string,charset(UTF16)] uint16 *DisplayName,
                [in] uint32 desired_access,
                [in] uint32 type,
-               [in] uint32 start_type,
-               [in] uint32 error_control,
+               [in] svcctl_StartType start_type,
+               [in] svcctl_ErrorControl error_control,
                [in,unique] [string,charset(UTF16)] uint16 *binary_path,
                [in,unique] [string,charset(UTF16)] uint16 *LoadOrderGroupKey,
                [out,unique] uint32 *TagId,
@@ -420,9 +476,9 @@ import "misc.idl", "security.idl";
        WERROR svcctl_EnumDependentServicesA(
                [in,ref] policy_handle *service,
                [in] uint32 state,
-               [out,unique] ENUM_SERVICE_STATUS *service_status,
-               [in] uint32 buf_size,
-               [out,ref] uint32 *bytes_needed,
+               [out,unique] ENUM_SERVICE_STATUSA *service_status,
+               [in] uint32 offered,
+               [out,ref] uint32 *needed,
                [out,ref] uint32 *services_returned
        );
 
@@ -431,10 +487,10 @@ import "misc.idl", "security.idl";
        WERROR svcctl_EnumServicesStatusA(
                [in,ref] policy_handle *handle,
                [in] uint32 type,
-               [in] uint32 state,
-               [in] uint32 buf_size,
-               [out,size_is(buf_size)] uint8 service[*],
-               [out,ref] uint32 *bytes_needed,
+               [in] svcctl_ServiceState state,
+               [in] uint32 offered,
+               [out,size_is(offered)] uint8 service[*],
+               [out,ref] uint32 *needed,
                [out,ref] uint32 *services_returned,
                [in,out,unique] uint32 *resume_handle
        );
@@ -460,18 +516,18 @@ import "misc.idl", "security.idl";
        /* Function 0x1d */
        WERROR svcctl_QueryServiceConfigA(
                [in,ref] policy_handle *handle,
-               [out] uint8 query[buf_size], /*QUERYU_SERVICE_CONFIG */
-               [in] uint32 buf_size,
-               [out,ref] uint32 *bytes_needed
+               [out] uint8 query[offered], /*QUERYU_SERVICE_CONFIG */
+               [in] uint32 offered,
+               [out,ref] uint32 *needed
        );
 
        /*****************/
        /* Function 0x1e */
        WERROR svcctl_QueryServiceLockStatusA(
                [in,ref] policy_handle *handle,
-               [in] uint32 buf_size,
+               [in] uint32 offered,
                [out,ref] SERVICE_LOCK_STATUS *lock_status,
-               [out,ref] uint32 *required_buf_size
+               [out,ref] uint32 *needed
        );
 
        /*****************/
@@ -534,12 +590,36 @@ import "misc.idl", "security.idl";
                SERVICE_CONFIG_FAILURE_ACTIONS  = 0x00000002
        } svcctl_ConfigLevel;
 
+       typedef [gensize,public] struct {
+               [relative] nstring *description;
+       } SERVICE_DESCRIPTION;
+
+       typedef [v1_enum] enum {
+               SC_ACTION_NONE          = 0,
+               SC_ACTION_RESTART       = 1,
+               SC_ACTION_REBOOT        = 2,
+               SC_ACTION_RUN_COMMAND   = 3
+       } SC_ACTION_TYPE;
+
+       typedef struct {
+               SC_ACTION_TYPE type;
+               uint32 delay;
+       } SC_ACTION;
+
+       typedef [public,gensize] struct {
+               uint32 reset_period;
+               [relative] nstring *rebootmsg;
+               [relative] nstring *command;
+               [range(0,1024)] uint32 num_actions;
+               [relative] [size_is(num_actions)] SC_ACTION *actions;
+       } SERVICE_FAILURE_ACTIONS;
+
        WERROR svcctl_QueryServiceConfig2A(
                [in,ref] policy_handle *handle,
                [in] svcctl_ConfigLevel info_level,
-               [out] uint8 buffer[buf_size],
-               [in] uint32 buf_size,
-               [out,ref] uint32 *bytes_needed
+               [out] uint8 buffer[offered],
+               [in] uint32 offered,
+               [out,ref] uint32 *needed
        );
 
        /*****************/
@@ -547,9 +627,9 @@ import "misc.idl", "security.idl";
        WERROR svcctl_QueryServiceConfig2W(
                [in,ref] policy_handle *handle,
                [in] svcctl_ConfigLevel info_level,
-               [out,ref,size_is(buf_size)] uint8 *buffer,
-               [in] [range(0,8192)] uint32 buf_size,
-               [out,ref] [range(0,8192)] uint32 *bytes_needed
+               [out,ref,size_is(offered)] uint8 *buffer,
+               [in] [range(0,8192)] uint32 offered,
+               [out,ref] [range(0,8192)] uint32 *needed
        );
 
        /*****************/
@@ -562,9 +642,9 @@ import "misc.idl", "security.idl";
        WERROR svcctl_QueryServiceStatusEx(
                [in,ref] policy_handle *handle,
                [in] svcctl_StatusLevel info_level,
-               [out,ref,size_is(buf_size)] uint8 *buffer,
-               [in] [range(0,8192)] uint32 buf_size,
-               [out,ref] [range(0,8192)] uint32 *bytes_needed
+               [out,ref,size_is(offered)] uint8 *buffer,
+               [in] [range(0,8192)] uint32 offered,
+               [out,ref] [range(0,8192)] uint32 *needed
        );
 
        /*****************/
@@ -573,10 +653,10 @@ import "misc.idl", "security.idl";
                [in,ref] policy_handle *scmanager,
                [in] uint32 info_level,
                [in] uint32 type,
-               [in] uint32 state,
-               [out] uint8 services[buf_size],
-               [in] uint32 buf_size,
-               [out,ref] uint32 *bytes_needed,
+               [in] svcctl_ServiceState state,
+               [out] uint8 services[offered],
+               [in] uint32 offered,
+               [out,ref] uint32 *needed,
                [out,ref] uint32 *service_returned,
                [in,out,unique] uint32 *resume_handle,
                [out,ref] [string,charset(UTF16)] uint16 **group_name
@@ -588,12 +668,12 @@ import "misc.idl", "security.idl";
                [in,ref] policy_handle *scmanager,
                [in] uint32 info_level,
                [in] uint32 type,
-               [in] uint32 state,
-               [out,ref,size_is(buf_size)] uint8 *services,
-               [in] [range(0,262144)] uint32 buf_size,
-               [out,ref] [range(0,262144)] uint32 *bytes_needed,
-               [out,ref] [range(0,262144)] uint32 *service_returned,
-               [in,out,unique] [range(0,262144)] uint32 *resume_handle,
+               [in] svcctl_ServiceState state,
+               [out,ref,size_is(offered)] uint8 *services,
+               [in] [range(0,0x40000)] uint32 offered,
+               [out,ref] [range(0,0x40000)] uint32 *needed,
+               [out,ref] [range(0,0x40000)] uint32 *service_returned,
+               [in,out,unique] [range(0,0x40000)] uint32 *resume_handle,
                [in,unique] [string,charset(UTF16)] uint16 *group_name
        );