summaryrefslogtreecommitdiff
path: root/source3/rpc_parse/parse_svcctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/rpc_parse/parse_svcctl.c')
-rw-r--r--source3/rpc_parse/parse_svcctl.c174
1 files changed, 173 insertions, 1 deletions
diff --git a/source3/rpc_parse/parse_svcctl.c b/source3/rpc_parse/parse_svcctl.c
index 1c41a18b99..1f21cb2aab 100644
--- a/source3/rpc_parse/parse_svcctl.c
+++ b/source3/rpc_parse/parse_svcctl.c
@@ -100,6 +100,21 @@ static BOOL svcctl_io_service_config( const char *desc, SERVICE_CONFIG *config,
return True;
}
+/*******************************************************************
+********************************************************************/
+
+BOOL svcctl_io_service_description( const char *desc, UNISTR2 *svcdesc, prs_struct *ps, int depth )
+{
+
+ prs_debug(ps, depth, desc, "svcctl_io_service_description");
+ depth++;
+
+ //DEBUG(10, ("_svcctl_io_service_description: descrption is [%s]\n",svcdesc));
+ if (!prs_io_unistr2("", ps, depth, svcdesc))
+ return False;
+
+ return True;
+}
/*******************************************************************
@@ -142,6 +157,7 @@ uint32 svcctl_sizeof_enum_services_status( ENUM_SERVICES_STATUS *status )
BOOL svcctl_io_q_close_service(const char *desc, SVCCTL_Q_CLOSE_SERVICE *q_u, prs_struct *ps, int depth)
{
+
if (q_u == NULL)
return False;
@@ -170,7 +186,10 @@ BOOL svcctl_io_r_close_service(const char *desc, SVCCTL_R_CLOSE_SERVICE *r_u, pr
depth++;
if(!prs_align(ps))
- return False;
+ return False;
+
+ if(!smb_io_pol_hnd("pol_handle", &r_u->handle, ps, depth))
+ return False;
if(!prs_werror("status", ps, depth, &r_u->status))
return False;
@@ -642,6 +661,7 @@ BOOL svcctl_io_r_query_service_config(const char *desc, SVCCTL_R_QUERY_SERVICE_C
prs_debug(ps, depth, desc, "svcctl_io_r_query_service_config");
depth++;
+
if(!prs_align(ps))
return False;
@@ -654,6 +674,158 @@ BOOL svcctl_io_r_query_service_config(const char *desc, SVCCTL_R_QUERY_SERVICE_C
if(!prs_werror("status", ps, depth, &r_u->status))
return False;
+
+ return True;
+}
+
+/*******************************************************************
+********************************************************************/
+
+BOOL svcctl_io_q_query_service_config2(const char *desc, SVCCTL_Q_QUERY_SERVICE_CONFIG2 *q_u, prs_struct *ps, int depth)
+{
+ if (q_u == NULL)
+ return False;
+
+ prs_debug(ps, depth, desc, "svcctl_io_q_query_service_config2");
+ depth++;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!smb_io_pol_hnd("service_pol", &q_u->handle, ps, depth))
+ return False;
+
+ if(!prs_uint32("info_level", ps, depth, &q_u->info_level))
+ return False;
+
+ if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
+ return False;
+
+ return True;
+}
+
+
+/*******************************************************************
+ Creates a service description response buffer.
+ The format seems to be DWORD:length of buffer
+ DWORD:offset (fixed as four)
+ UNISTR: unicode description in the rest of the buffer
+********************************************************************/
+
+void init_service_description_buffer(RPC_DATA_BLOB *str, const char *service_desc, int blob_length)
+{
+ uint32 offset;
+ char *bp;
+
+ ZERO_STRUCTP(str);
+
+ offset = 4;
+
+ /* set up string lengths. */
+
+ str->buf_len = create_rpc_blob(str, blob_length);
+ DEBUG(10, ("init_service_description buffer: Allocated a blob of [%d] \n",str->buf_len));
+
+ if ( str && str->buffer && str->buf_len) {
+ memset(str->buffer,0,str->buf_len);
+ memcpy(str->buffer, &offset, sizeof(uint32));
+ bp = &str->buffer[4];
+ if (service_desc) {
+ rpcstr_push(bp, service_desc,str->buf_len-4,0);
+ }
+ }
+}
+
+/*******************************************************************
+********************************************************************/
+
+BOOL svcctl_io_q_query_service_status_ex(const char *desc, SVCCTL_Q_QUERY_SERVICE_STATUSEX *q_u, prs_struct *ps, int depth)
+{
+ if (q_u == NULL)
+ return False;
+
+ prs_debug(ps, depth, desc, "svcctl_io_q_query_service_status_ex");
+ depth++;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!smb_io_pol_hnd("service_pol", &q_u->handle, ps, depth))
+ return False;
+
+ if(!prs_uint32("info_level", ps, depth, &q_u->info_level))
+ return False;
+
+ if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
+ return False;
+
+ return True;
+
+}
+
+/*******************************************************************
+********************************************************************/
+
+BOOL svcctl_io_r_query_service_status_ex(const char *desc, SVCCTL_R_QUERY_SERVICE_STATUSEX *r_u, prs_struct *ps, int depth)
+{
+ if ( !r_u )
+ return False;
+
+ prs_debug(ps, depth, desc, "svcctl_io_r_query_service_status_ex");
+ depth++;
+
+ if (!prs_rpcbuffer("", ps, depth, &r_u->buffer))
+ return False;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!prs_uint32("needed", ps, depth, &r_u->needed))
+ return False;
+
+ if(!prs_werror("status", ps, depth, &r_u->status))
+ return False;
+
+ return True;
+}
+
+/*******************************************************************
+********************************************************************/
+
+BOOL svcctl_io_r_query_service_config2(const char *desc, SVCCTL_R_QUERY_SERVICE_CONFIG2 *r_u, prs_struct *ps, int depth)
+{
+ if ( !r_u )
+ return False;
+
+ prs_debug(ps, depth, desc, "svcctl_io_r_query_service_config2");
+ depth++;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!prs_uint32("returned", ps, depth, &r_u->returned))
+ return False;
+
+ if (r_u->returned > 4) {
+ if (!prs_uint32("offset", ps, depth, &r_u->offset))
+ return False;
+ if(!prs_unistr2(True, "description ", ps, depth, r_u->description))
+ return False;
+ if(!prs_align(ps))
+ return False;
+ } else {
+ /* offset does double duty here */
+ r_u->offset = 0;
+ if (!prs_uint32("offset", ps, depth, &r_u->offset))
+ return False;
+ }
+
+ if (!prs_uint32("needed", ps, depth, &r_u->needed))
+ return False;
+
+ if(!prs_werror("status", ps, depth, &r_u->status))
+ return False;
+
return True;
}