2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Gerald (Jerry) Carter 2005.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #define DBGC_CLASS DBGC_RPC_PARSE
26 /*******************************************************************
27 ********************************************************************/
29 static BOOL
svcctl_io_service_status( const char *desc
, SERVICE_STATUS
*status
, prs_struct
*ps
, int depth
)
32 prs_debug(ps
, depth
, desc
, "svcctl_io_service_status");
35 if(!prs_uint32("type", ps
, depth
, &status
->type
))
38 if(!prs_uint32("state", ps
, depth
, &status
->state
))
41 if(!prs_uint32("controls_accepted", ps
, depth
, &status
->controls_accepted
))
44 if(!prs_uint32("win32_exit_code", ps
, depth
, &status
->win32_exit_code
))
47 if(!prs_uint32("service_exit_code", ps
, depth
, &status
->service_exit_code
))
50 if(!prs_uint32("check_point", ps
, depth
, &status
->check_point
))
53 if(!prs_uint32("wait_hint", ps
, depth
, &status
->wait_hint
))
59 /*******************************************************************
60 ********************************************************************/
62 static BOOL
svcctl_io_service_config( const char *desc
, SERVICE_CONFIG
*config
, prs_struct
*ps
, int depth
)
65 prs_debug(ps
, depth
, desc
, "svcctl_io_service_config");
68 if(!prs_uint32("service_type", ps
, depth
, &config
->service_type
))
70 if(!prs_uint32("start_type", ps
, depth
, &config
->start_type
))
72 if(!prs_uint32("error_control", ps
, depth
, &config
->error_control
))
75 if (!prs_io_unistr2_p("", ps
, depth
, &config
->executablepath
))
77 if (!prs_io_unistr2_p("", ps
, depth
, &config
->loadordergroup
))
80 if(!prs_uint32("tag_id", ps
, depth
, &config
->tag_id
))
83 if (!prs_io_unistr2_p("", ps
, depth
, &config
->dependencies
))
85 if (!prs_io_unistr2_p("", ps
, depth
, &config
->startname
))
87 if (!prs_io_unistr2_p("", ps
, depth
, &config
->displayname
))
90 if (!prs_io_unistr2("", ps
, depth
, config
->executablepath
))
92 if (!prs_io_unistr2("", ps
, depth
, config
->loadordergroup
))
94 if (!prs_io_unistr2("", ps
, depth
, config
->dependencies
))
96 if (!prs_io_unistr2("", ps
, depth
, config
->startname
))
98 if (!prs_io_unistr2("", ps
, depth
, config
->displayname
))
103 /*******************************************************************
104 ********************************************************************/
106 BOOL
svcctl_io_service_description( const char *desc
, UNISTR2
*svcdesc
, prs_struct
*ps
, int depth
)
109 prs_debug(ps
, depth
, desc
, "svcctl_io_service_description");
112 //DEBUG(10, ("_svcctl_io_service_description: descrption is [%s]\n",svcdesc));
113 if (!prs_io_unistr2("", ps
, depth
, svcdesc
))
120 /*******************************************************************
121 ********************************************************************/
123 BOOL
svcctl_io_enum_services_status( const char *desc
, ENUM_SERVICES_STATUS
*enum_status
, RPC_BUFFER
*buffer
, int depth
)
125 prs_struct
*ps
=&buffer
->prs
;
127 prs_debug(ps
, depth
, desc
, "svcctl_io_enum_services_status");
130 if ( !smb_io_relstr("servicename", buffer
, depth
, &enum_status
->servicename
) )
132 if ( !smb_io_relstr("displayname", buffer
, depth
, &enum_status
->displayname
) )
135 if ( !svcctl_io_service_status("svc_status", &enum_status
->status
, ps
, depth
) )
141 /*******************************************************************
142 ********************************************************************/
144 uint32
svcctl_sizeof_enum_services_status( ENUM_SERVICES_STATUS
*status
)
148 size
+= size_of_relative_string( &status
->servicename
);
149 size
+= size_of_relative_string( &status
->displayname
);
150 size
+= sizeof(SERVICE_STATUS
);
155 /*******************************************************************
156 ********************************************************************/
158 BOOL
svcctl_io_q_close_service(const char *desc
, SVCCTL_Q_CLOSE_SERVICE
*q_u
, prs_struct
*ps
, int depth
)
164 prs_debug(ps
, depth
, desc
, "svcctl_io_q_close_service");
170 if(!smb_io_pol_hnd("scm_pol", &q_u
->handle
, ps
, depth
))
177 /*******************************************************************
178 ********************************************************************/
180 BOOL
svcctl_io_r_close_service(const char *desc
, SVCCTL_R_CLOSE_SERVICE
*r_u
, prs_struct
*ps
, int depth
)
185 prs_debug(ps
, depth
, desc
, "svcctl_io_r_close_service");
191 if(!smb_io_pol_hnd("pol_handle", &r_u
->handle
, ps
, depth
))
194 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
200 /*******************************************************************
201 ********************************************************************/
203 BOOL
svcctl_io_q_open_scmanager(const char *desc
, SVCCTL_Q_OPEN_SCMANAGER
*q_u
, prs_struct
*ps
, int depth
)
208 prs_debug(ps
, depth
, desc
, "svcctl_io_q_open_scmanager");
214 if(!prs_pointer("servername", ps
, depth
, (void**)&q_u
->servername
, sizeof(UNISTR2
), (PRS_POINTER_CAST
)prs_io_unistr2
))
219 if(!prs_pointer("database", ps
, depth
, (void**)&q_u
->database
, sizeof(UNISTR2
), (PRS_POINTER_CAST
)prs_io_unistr2
))
224 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
230 /*******************************************************************
231 ********************************************************************/
233 BOOL
svcctl_io_r_open_scmanager(const char *desc
, SVCCTL_R_OPEN_SCMANAGER
*r_u
, prs_struct
*ps
, int depth
)
238 prs_debug(ps
, depth
, desc
, "svcctl_io_r_open_scmanager");
244 if(!smb_io_pol_hnd("scm_pol", &r_u
->handle
, ps
, depth
))
247 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
253 /*******************************************************************
254 ********************************************************************/
256 BOOL
svcctl_io_q_get_display_name(const char *desc
, SVCCTL_Q_GET_DISPLAY_NAME
*q_u
, prs_struct
*ps
, int depth
)
261 prs_debug(ps
, depth
, desc
, "svcctl_io_q_get_display_name");
267 if(!smb_io_pol_hnd("scm_pol", &q_u
->handle
, ps
, depth
))
270 if(!smb_io_unistr2("servicename", &q_u
->servicename
, 1, ps
, depth
))
276 if(!prs_uint32("display_name_len", ps
, depth
, &q_u
->display_name_len
))
282 /*******************************************************************
283 ********************************************************************/
285 BOOL
init_svcctl_r_get_display_name( SVCCTL_R_GET_DISPLAY_NAME
*r_u
, const char *displayname
)
287 r_u
->display_name_len
= strlen(displayname
);
288 init_unistr2( &r_u
->displayname
, displayname
, UNI_STR_TERMINATE
);
293 /*******************************************************************
294 ********************************************************************/
296 BOOL
svcctl_io_r_get_display_name(const char *desc
, SVCCTL_R_GET_DISPLAY_NAME
*r_u
, prs_struct
*ps
, int depth
)
301 prs_debug(ps
, depth
, desc
, "svcctl_io_r_get_display_name");
308 if(!smb_io_unistr2("displayname", &r_u
->displayname
, 1, ps
, depth
))
314 if(!prs_uint32("display_name_len", ps
, depth
, &r_u
->display_name_len
))
317 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
324 /*******************************************************************
325 ********************************************************************/
327 BOOL
svcctl_io_q_open_service(const char *desc
, SVCCTL_Q_OPEN_SERVICE
*q_u
, prs_struct
*ps
, int depth
)
332 prs_debug(ps
, depth
, desc
, "svcctl_io_q_open_service");
338 if(!smb_io_pol_hnd("scm_pol", &q_u
->handle
, ps
, depth
))
341 if(!smb_io_unistr2("servicename", &q_u
->servicename
, 1, ps
, depth
))
347 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
353 /*******************************************************************
354 ********************************************************************/
356 BOOL
svcctl_io_r_open_service(const char *desc
, SVCCTL_R_OPEN_SERVICE
*r_u
, prs_struct
*ps
, int depth
)
361 prs_debug(ps
, depth
, desc
, "svcctl_io_r_open_service");
367 if(!smb_io_pol_hnd("service_pol", &r_u
->handle
, ps
, depth
))
370 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
376 /*******************************************************************
377 ********************************************************************/
379 BOOL
svcctl_io_q_query_status(const char *desc
, SVCCTL_Q_QUERY_STATUS
*q_u
, prs_struct
*ps
, int depth
)
384 prs_debug(ps
, depth
, desc
, "svcctl_io_q_query_status");
390 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
396 /*******************************************************************
397 ********************************************************************/
399 BOOL
svcctl_io_r_query_status(const char *desc
, SVCCTL_R_QUERY_STATUS
*r_u
, prs_struct
*ps
, int depth
)
404 prs_debug(ps
, depth
, desc
, "svcctl_io_r_query_status");
410 if(!svcctl_io_service_status("service_status", &r_u
->svc_status
, ps
, depth
))
413 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
419 /*******************************************************************
420 ********************************************************************/
422 BOOL
svcctl_io_q_enum_services_status(const char *desc
, SVCCTL_Q_ENUM_SERVICES_STATUS
*q_u
, prs_struct
*ps
, int depth
)
427 prs_debug(ps
, depth
, desc
, "svcctl_io_q_enum_services_status");
433 if(!smb_io_pol_hnd("scm_pol", &q_u
->handle
, ps
, depth
))
436 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
438 if(!prs_uint32("state", ps
, depth
, &q_u
->state
))
440 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
443 if(!prs_pointer("resume", ps
, depth
, (void**)&q_u
->resume
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
449 /*******************************************************************
450 ********************************************************************/
452 BOOL
svcctl_io_r_enum_services_status(const char *desc
, SVCCTL_R_ENUM_SERVICES_STATUS
*r_u
, prs_struct
*ps
, int depth
)
457 prs_debug(ps
, depth
, desc
, "svcctl_io_r_enum_services_status");
463 if (!prs_rpcbuffer("", ps
, depth
, &r_u
->buffer
))
469 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
471 if(!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
474 if(!prs_pointer("resume", ps
, depth
, (void**)&r_u
->resume
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
477 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
483 /*******************************************************************
484 ********************************************************************/
486 BOOL
svcctl_io_q_start_service(const char *desc
, SVCCTL_Q_START_SERVICE
*q_u
, prs_struct
*ps
, int depth
)
491 prs_debug(ps
, depth
, desc
, "svcctl_io_q_start_service");
497 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
500 if(!prs_uint32("parmcount", ps
, depth
, &q_u
->parmcount
))
503 if ( !prs_pointer("rights", ps
, depth
, (void**)&q_u
->parameters
, sizeof(UNISTR4_ARRAY
), (PRS_POINTER_CAST
)prs_unistr4_array
) )
509 /*******************************************************************
510 ********************************************************************/
512 BOOL
svcctl_io_r_start_service(const char *desc
, SVCCTL_R_START_SERVICE
*r_u
, prs_struct
*ps
, int depth
)
517 prs_debug(ps
, depth
, desc
, "svcctl_io_r_start_service");
520 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
527 /*******************************************************************
528 ********************************************************************/
530 BOOL
svcctl_io_q_enum_dependent_services(const char *desc
, SVCCTL_Q_ENUM_DEPENDENT_SERVICES
*q_u
, prs_struct
*ps
, int depth
)
535 prs_debug(ps
, depth
, desc
, "svcctl_io_q_enum_dependent_services");
541 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
544 if(!prs_uint32("state", ps
, depth
, &q_u
->state
))
546 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
552 /*******************************************************************
553 ********************************************************************/
555 BOOL
svcctl_io_r_enum_dependent_services(const char *desc
, SVCCTL_R_ENUM_DEPENDENT_SERVICES
*r_u
, prs_struct
*ps
, int depth
)
560 prs_debug(ps
, depth
, desc
, "svcctl_io_r_enum_dependent_services");
566 if (!prs_rpcbuffer("", ps
, depth
, &r_u
->buffer
))
572 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
574 if(!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
577 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
583 /*******************************************************************
584 ********************************************************************/
586 BOOL
svcctl_io_q_control_service(const char *desc
, SVCCTL_Q_CONTROL_SERVICE
*q_u
, prs_struct
*ps
, int depth
)
591 prs_debug(ps
, depth
, desc
, "svcctl_io_q_control_service");
597 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
600 if(!prs_uint32("control", ps
, depth
, &q_u
->control
))
606 /*******************************************************************
607 ********************************************************************/
609 BOOL
svcctl_io_r_control_service(const char *desc
, SVCCTL_R_CONTROL_SERVICE
*r_u
, prs_struct
*ps
, int depth
)
614 prs_debug(ps
, depth
, desc
, "svcctl_io_r_control_service");
620 if(!svcctl_io_service_status("service_status", &r_u
->svc_status
, ps
, depth
))
623 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
630 /*******************************************************************
631 ********************************************************************/
633 BOOL
svcctl_io_q_query_service_config(const char *desc
, SVCCTL_Q_QUERY_SERVICE_CONFIG
*q_u
, prs_struct
*ps
, int depth
)
638 prs_debug(ps
, depth
, desc
, "svcctl_io_q_query_service_config");
644 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
647 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
653 /*******************************************************************
654 ********************************************************************/
656 BOOL
svcctl_io_r_query_service_config(const char *desc
, SVCCTL_R_QUERY_SERVICE_CONFIG
*r_u
, prs_struct
*ps
, int depth
)
661 prs_debug(ps
, depth
, desc
, "svcctl_io_r_query_service_config");
668 if(!svcctl_io_service_config("config", &r_u
->config
, ps
, depth
))
671 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
674 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
681 /*******************************************************************
682 ********************************************************************/
684 BOOL
svcctl_io_q_query_service_config2(const char *desc
, SVCCTL_Q_QUERY_SERVICE_CONFIG2
*q_u
, prs_struct
*ps
, int depth
)
689 prs_debug(ps
, depth
, desc
, "svcctl_io_q_query_service_config2");
695 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
698 if(!prs_uint32("info_level", ps
, depth
, &q_u
->info_level
))
701 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
708 /*******************************************************************
709 Creates a service description response buffer.
710 The format seems to be DWORD:length of buffer
711 DWORD:offset (fixed as four)
712 UNISTR: unicode description in the rest of the buffer
713 ********************************************************************/
715 void init_service_description_buffer(RPC_DATA_BLOB
*str
, const char *service_desc
, int blob_length
)
724 /* set up string lengths. */
726 str
->buf_len
= create_rpc_blob(str
, blob_length
);
727 DEBUG(10, ("init_service_description buffer: Allocated a blob of [%d] \n",str
->buf_len
));
729 if ( str
&& str
->buffer
&& str
->buf_len
) {
730 memset(str
->buffer
,0,str
->buf_len
);
731 memcpy(str
->buffer
, &offset
, sizeof(uint32
));
732 bp
= &str
->buffer
[4];
734 rpcstr_push(bp
, service_desc
,str
->buf_len
-4,0);
739 /*******************************************************************
740 ********************************************************************/
742 BOOL
svcctl_io_q_query_service_status_ex(const char *desc
, SVCCTL_Q_QUERY_SERVICE_STATUSEX
*q_u
, prs_struct
*ps
, int depth
)
747 prs_debug(ps
, depth
, desc
, "svcctl_io_q_query_service_status_ex");
753 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
756 if(!prs_uint32("info_level", ps
, depth
, &q_u
->info_level
))
759 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
766 /*******************************************************************
767 ********************************************************************/
769 BOOL
svcctl_io_r_query_service_status_ex(const char *desc
, SVCCTL_R_QUERY_SERVICE_STATUSEX
*r_u
, prs_struct
*ps
, int depth
)
774 prs_debug(ps
, depth
, desc
, "svcctl_io_r_query_service_status_ex");
777 if (!prs_rpcbuffer("", ps
, depth
, &r_u
->buffer
))
783 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
786 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
792 /*******************************************************************
793 ********************************************************************/
795 BOOL
svcctl_io_r_query_service_config2(const char *desc
, SVCCTL_R_QUERY_SERVICE_CONFIG2
*r_u
, prs_struct
*ps
, int depth
)
800 prs_debug(ps
, depth
, desc
, "svcctl_io_r_query_service_config2");
806 if(!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
809 if (r_u
->returned
> 4) {
810 if (!prs_uint32("offset", ps
, depth
, &r_u
->offset
))
812 if(!prs_unistr2(True
, "description ", ps
, depth
, r_u
->description
))
817 /* offset does double duty here */
819 if (!prs_uint32("offset", ps
, depth
, &r_u
->offset
))
823 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
826 if(!prs_werror("status", ps
, depth
, &r_u
->status
))