From f7eaf17216c91c66719b2393c7a8716fc55e4e5f Mon Sep 17 00:00:00 2001 From: Matthew Chapman Date: Thu, 18 Mar 1999 09:36:43 +0000 Subject: [PATCH] Added SVC_START_SERVICE rpc. An NT PDC will attempt to start the NETLOGON service on its BDC's prior to initiating SAM replication. For now just return success. (This used to be commit 113d03a38a34e5c4115dab59349078093bcd4888) --- source3/include/proto.h | 2 ++ source3/include/rpc_svcctl.h | 22 +++++++++++++++ source3/rpc_parse/parse_svc.c | 48 +++++++++++++++++++++++++++++++++ source3/rpc_server/srv_svcctl.c | 37 +++++++++++++++++++++++++ 4 files changed, 109 insertions(+) diff --git a/source3/include/proto.h b/source3/include/proto.h index 46dc35b2aaf..e64a7a92aae 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -2591,6 +2591,8 @@ void svc_io_q_open_service(char *desc, SVC_Q_OPEN_SERVICE *q_u, prs_struct *ps, void make_svc_r_open_service(SVC_R_OPEN_SERVICE *r_u, POLICY_HND *hnd, uint32 status) ; void svc_io_r_open_service(char *desc, SVC_R_OPEN_SERVICE *r_u, prs_struct *ps, int depth); +void svc_io_q_start_service(char *desc, SVC_Q_START_SERVICE *q_s, prs_struct *ps, int depth); +void svc_io_r_start_service(char *desc, SVC_R_START_SERVICE *r_s, prs_struct *ps, int depth); void make_svc_query_svc_cfg(QUERY_SERVICE_CONFIG *q_u, uint32 service_type, uint32 start_type, uint32 error_control, diff --git a/source3/include/rpc_svcctl.h b/source3/include/rpc_svcctl.h index c32ba87ba96..8a2a771d64f 100644 --- a/source3/include/rpc_svcctl.h +++ b/source3/include/rpc_svcctl.h @@ -31,6 +31,7 @@ #define SVC_QUERY_SVC_CONFIG 0x11 #define SVC_QUERY_DISP_NAME 0x14 #define SVC_OPEN_SERVICE 0x10 +#define SVC_START_SERVICE 0x13 #define SVC_CLOSE 0x00 @@ -72,6 +73,27 @@ typedef struct r_svc_open_service_info } SVC_R_OPEN_SERVICE; +#define MAX_SVC_ARGS 4 + +/* SVC_Q_START_SERVICE */ +typedef struct q_svc_start_service_info +{ + POLICY_HND pol; + + uint32 argc; + uint32 ptr_argv; + uint32 argc2; + UNISTR2 argv[MAX_SVC_ARGS]; + +} SVC_Q_START_SERVICE; + +/* SVC_R_START_SERVICE */ +typedef struct r_svc_start_service_info +{ + uint32 status; + +} SVC_R_START_SERVICE; + /* QUERY_SERVICE_CONFIG */ typedef struct query_service_config_info diff --git a/source3/rpc_parse/parse_svc.c b/source3/rpc_parse/parse_svc.c index e8cdd35a2c3..f936df24b91 100644 --- a/source3/rpc_parse/parse_svc.c +++ b/source3/rpc_parse/parse_svc.c @@ -162,6 +162,54 @@ void svc_io_r_open_service(char *desc, SVC_R_OPEN_SERVICE *r_u, prs_struct *ps, prs_uint32("status ", ps, depth, &(r_u->status)); } +/******************************************************************* +reads or writes a SVC_Q_START_SERVICE structure. +********************************************************************/ +void svc_io_q_start_service(char *desc, SVC_Q_START_SERVICE *q_s, prs_struct *ps, int depth) +{ + if (q_s == NULL) return; + + prs_debug(ps, depth, desc, "svc_io_q_start_service"); + depth++; + + prs_align(ps); + smb_io_pol_hnd("", &(q_s->pol), ps, depth); + + prs_align(ps); + prs_uint32("argc ", ps, depth, &(q_s->argc )); + prs_uint32("ptr_argv", ps, depth, &(q_s->ptr_argv)); + + if (q_s->ptr_argv != 0) + { + int i; + + prs_uint32("argc2 ", ps, depth, &(q_s->argc2)); + + if (q_s->argc2 > MAX_SVC_ARGS) + { + q_s->argc = q_s->argc2 = MAX_SVC_ARGS; + } + + for (i = 0; i < q_s->argc2; i++) + { + smb_io_unistr2("", &(q_s->argv[i]), 1, ps, depth); + } + } +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ +void svc_io_r_start_service(char *desc, SVC_R_START_SERVICE *r_s, prs_struct *ps, int depth) +{ + if (r_s == NULL) return; + + prs_debug(ps, depth, desc, "svc_io_r_start_service"); + depth++; + + prs_uint32("status", ps, depth, &(r_s->status)); +} + /******************************************************************* make_svc_query_svc_cfg ********************************************************************/ diff --git a/source3/rpc_server/srv_svcctl.c b/source3/rpc_server/srv_svcctl.c index d52816df800..6a420c14931 100644 --- a/source3/rpc_server/srv_svcctl.c +++ b/source3/rpc_server/srv_svcctl.c @@ -125,6 +125,42 @@ static void api_svc_open_service( uint16 vuid, prs_struct *data, svc_reply_open_service(&q_u, rdata); } +/******************************************************************* + svc_reply_start_service + ********************************************************************/ +static void svc_reply_start_service(SVC_Q_START_SERVICE *q_s, + prs_struct *rdata) +{ + SVC_R_START_SERVICE r_s; + + DEBUG(5,("svc_start_service: %d\n", __LINE__)); + + r_s.status = 0x0; + + if (find_lsa_policy_by_hnd(&q_s->pol) == -1) + { + r_s.status = 0xC000000 | NT_STATUS_INVALID_HANDLE; + } + + /* start the service here */ + + /* store the response in the SMB stream */ + svc_io_r_start_service("", &r_s, rdata, 0); + + DEBUG(5,("svc_start_service: %d\n", __LINE__)); +} + +/******************************************************************* + api_svc_start_service + ********************************************************************/ +static void api_svc_start_service( uint16 vuid, prs_struct *data, + prs_struct *rdata ) +{ + SVC_Q_START_SERVICE q_u; + svc_io_q_start_service("", &q_u, data, 0); + svc_reply_start_service(&q_u, rdata); +} + /******************************************************************* svc_reply_open_sc_man ********************************************************************/ @@ -338,6 +374,7 @@ static struct api_struct api_svc_cmds[] = { "SVC_OPEN_SERVICE" , SVC_OPEN_SERVICE , api_svc_open_service }, { "SVC_ENUM_SVCS_STATUS", SVC_ENUM_SVCS_STATUS, api_svc_enum_svcs_status }, { "SVC_QUERY_DISP_NAME" , SVC_QUERY_DISP_NAME , api_svc_query_disp_name }, + { "SVC_START_SERVICE" , SVC_START_SERVICE , api_svc_start_service }, { NULL , 0 , NULL } }; -- 2.34.1