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 3 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, see <http://www.gnu.org/licenses/>.
23 #define DBGC_CLASS DBGC_RPC_PARSE
25 /*******************************************************************
26 ********************************************************************/
28 static bool svcctl_io_service_status( const char *desc
, SERVICE_STATUS
*status
, prs_struct
*ps
, int depth
)
31 prs_debug(ps
, depth
, desc
, "svcctl_io_service_status");
34 if(!prs_uint32("type", ps
, depth
, &status
->type
))
37 if(!prs_uint32("state", ps
, depth
, &status
->state
))
40 if(!prs_uint32("controls_accepted", ps
, depth
, &status
->controls_accepted
))
43 if(!prs_werror("win32_exit_code", ps
, depth
, &status
->win32_exit_code
))
46 if(!prs_uint32("service_exit_code", ps
, depth
, &status
->service_exit_code
))
49 if(!prs_uint32("check_point", ps
, depth
, &status
->check_point
))
52 if(!prs_uint32("wait_hint", ps
, depth
, &status
->wait_hint
))
58 /*******************************************************************
59 ********************************************************************/
61 static bool svcctl_io_service_config( const char *desc
, SERVICE_CONFIG
*config
, prs_struct
*ps
, int depth
)
64 prs_debug(ps
, depth
, desc
, "svcctl_io_service_config");
67 if(!prs_uint32("service_type", ps
, depth
, &config
->service_type
))
69 if(!prs_uint32("start_type", ps
, depth
, &config
->start_type
))
71 if(!prs_uint32("error_control", ps
, depth
, &config
->error_control
))
74 if (!prs_io_unistr2_p("", ps
, depth
, &config
->executablepath
))
76 if (!prs_io_unistr2_p("", ps
, depth
, &config
->loadordergroup
))
79 if(!prs_uint32("tag_id", ps
, depth
, &config
->tag_id
))
82 if (!prs_io_unistr2_p("", ps
, depth
, &config
->dependencies
))
84 if (!prs_io_unistr2_p("", ps
, depth
, &config
->startname
))
86 if (!prs_io_unistr2_p("", ps
, depth
, &config
->displayname
))
89 if (!prs_io_unistr2("", ps
, depth
, config
->executablepath
))
91 if (!prs_io_unistr2("", ps
, depth
, config
->loadordergroup
))
93 if (!prs_io_unistr2("", ps
, depth
, config
->dependencies
))
95 if (!prs_io_unistr2("", ps
, depth
, config
->startname
))
97 if (!prs_io_unistr2("", ps
, depth
, config
->displayname
))
103 /*******************************************************************
104 ********************************************************************/
106 bool svcctl_io_enum_services_status( const char *desc
, ENUM_SERVICES_STATUS
*enum_status
, RPC_BUFFER
*buffer
, int depth
)
108 prs_struct
*ps
=&buffer
->prs
;
110 prs_debug(ps
, depth
, desc
, "svcctl_io_enum_services_status");
113 if ( !smb_io_relstr("servicename", buffer
, depth
, &enum_status
->servicename
) )
115 if ( !smb_io_relstr("displayname", buffer
, depth
, &enum_status
->displayname
) )
118 if ( !svcctl_io_service_status("svc_status", &enum_status
->status
, ps
, depth
) )
124 /*******************************************************************
125 ********************************************************************/
127 bool svcctl_io_service_status_process( const char *desc
, SERVICE_STATUS_PROCESS
*status
, RPC_BUFFER
*buffer
, int depth
)
129 prs_struct
*ps
=&buffer
->prs
;
131 prs_debug(ps
, depth
, desc
, "svcctl_io_service_status_process");
134 if ( !svcctl_io_service_status("status", &status
->status
, ps
, depth
) )
139 if(!prs_uint32("process_id", ps
, depth
, &status
->process_id
))
141 if(!prs_uint32("service_flags", ps
, depth
, &status
->service_flags
))
147 /*******************************************************************
148 ********************************************************************/
150 uint32
svcctl_sizeof_enum_services_status( ENUM_SERVICES_STATUS
*status
)
154 size
+= size_of_relative_string( &status
->servicename
);
155 size
+= size_of_relative_string( &status
->displayname
);
156 size
+= sizeof(SERVICE_STATUS
);
161 /********************************************************************
162 ********************************************************************/
164 static uint32
sizeof_unistr2( UNISTR2
*string
)
171 size
= sizeof(uint32
) * 3; /* length fields */
172 size
+= 2 * string
->uni_max_len
; /* string data */
173 size
+= size
% 4; /* alignment */
178 /********************************************************************
179 ********************************************************************/
181 uint32
svcctl_sizeof_service_config( SERVICE_CONFIG
*config
)
185 size
= sizeof(uint32
) * 4; /* static uint32 fields */
187 /* now add the UNISTR2 + pointer sizes */
189 size
+= sizeof(uint32
) * sizeof_unistr2(config
->executablepath
);
190 size
+= sizeof(uint32
) * sizeof_unistr2(config
->loadordergroup
);
191 size
+= sizeof(uint32
) * sizeof_unistr2(config
->dependencies
);
192 size
+= sizeof(uint32
) * sizeof_unistr2(config
->startname
);
193 size
+= sizeof(uint32
) * sizeof_unistr2(config
->displayname
);
198 /*******************************************************************
199 ********************************************************************/
201 bool svcctl_io_q_enum_services_status(const char *desc
, SVCCTL_Q_ENUM_SERVICES_STATUS
*q_u
, prs_struct
*ps
, int depth
)
206 prs_debug(ps
, depth
, desc
, "svcctl_io_q_enum_services_status");
212 if(!smb_io_pol_hnd("scm_pol", &q_u
->handle
, ps
, depth
))
215 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
217 if(!prs_uint32("state", ps
, depth
, &q_u
->state
))
219 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
222 if(!prs_pointer("resume", ps
, depth
, (void*)&q_u
->resume
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
228 /*******************************************************************
229 ********************************************************************/
231 bool svcctl_io_r_enum_services_status(const char *desc
, SVCCTL_R_ENUM_SERVICES_STATUS
*r_u
, prs_struct
*ps
, int depth
)
236 prs_debug(ps
, depth
, desc
, "svcctl_io_r_enum_services_status");
242 if (!prs_rpcbuffer("", ps
, depth
, &r_u
->buffer
))
248 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
250 if(!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
253 if(!prs_pointer("resume", ps
, depth
, (void*)&r_u
->resume
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
256 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
262 /*******************************************************************
263 ********************************************************************/
265 bool svcctl_io_q_query_service_config(const char *desc
, SVCCTL_Q_QUERY_SERVICE_CONFIG
*q_u
, prs_struct
*ps
, int depth
)
270 prs_debug(ps
, depth
, desc
, "svcctl_io_q_query_service_config");
276 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
279 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
285 /*******************************************************************
286 ********************************************************************/
288 bool svcctl_io_r_query_service_config(const char *desc
, SVCCTL_R_QUERY_SERVICE_CONFIG
*r_u
, prs_struct
*ps
, int depth
)
293 prs_debug(ps
, depth
, desc
, "svcctl_io_r_query_service_config");
300 if(!svcctl_io_service_config("config", &r_u
->config
, ps
, depth
))
303 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
306 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
313 /*******************************************************************
314 ********************************************************************/
316 bool svcctl_io_q_query_service_config2(const char *desc
, SVCCTL_Q_QUERY_SERVICE_CONFIG2
*q_u
, prs_struct
*ps
, int depth
)
321 prs_debug(ps
, depth
, desc
, "svcctl_io_q_query_service_config2");
327 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
330 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
333 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
340 /*******************************************************************
341 ********************************************************************/
343 void init_service_description_buffer(SERVICE_DESCRIPTION
*desc
, const char *service_desc
)
345 desc
->unknown
= 0x04; /* always 0x0000 0004 (no idea what this is) */
346 init_unistr( &desc
->description
, service_desc
);
349 /*******************************************************************
350 ********************************************************************/
352 bool svcctl_io_service_description( const char *desc
, SERVICE_DESCRIPTION
*description
, RPC_BUFFER
*buffer
, int depth
)
354 prs_struct
*ps
= &buffer
->prs
;
356 prs_debug(ps
, depth
, desc
, "svcctl_io_service_description");
359 if ( !prs_uint32("unknown", ps
, depth
, &description
->unknown
) )
361 if ( !prs_unistr("description", ps
, depth
, &description
->description
) )
367 /*******************************************************************
368 ********************************************************************/
370 uint32
svcctl_sizeof_service_description( SERVICE_DESCRIPTION
*desc
)
375 /* make sure to include the terminating NULL */
376 return ( sizeof(uint32
) + (2*(str_len_uni(&desc
->description
)+1)) );
379 /*******************************************************************
380 ********************************************************************/
382 static bool svcctl_io_action( const char *desc
, SC_ACTION
*action
, prs_struct
*ps
, int depth
)
385 prs_debug(ps
, depth
, desc
, "svcctl_io_action");
388 if ( !prs_uint32("type", ps
, depth
, &action
->type
) )
390 if ( !prs_uint32("delay", ps
, depth
, &action
->delay
) )
396 /*******************************************************************
397 ********************************************************************/
399 bool svcctl_io_service_fa( const char *desc
, SERVICE_FAILURE_ACTIONS
*fa
, RPC_BUFFER
*buffer
, int depth
)
401 prs_struct
*ps
= &buffer
->prs
;
404 prs_debug(ps
, depth
, desc
, "svcctl_io_service_description");
407 if ( !prs_uint32("reset_period", ps
, depth
, &fa
->reset_period
) )
410 if ( !prs_pointer( desc
, ps
, depth
, (void*)&fa
->rebootmsg
, sizeof(UNISTR2
), (PRS_POINTER_CAST
)prs_io_unistr2
) )
412 if ( !prs_pointer( desc
, ps
, depth
, (void*)&fa
->command
, sizeof(UNISTR2
), (PRS_POINTER_CAST
)prs_io_unistr2
) )
415 if ( !prs_uint32("num_actions", ps
, depth
, &fa
->num_actions
) )
418 if ( UNMARSHALLING(ps
)) {
419 if (fa
->num_actions
) {
420 if ( !(fa
->actions
= TALLOC_ARRAY( talloc_tos(), SC_ACTION
, fa
->num_actions
)) ) {
421 DEBUG(0,("svcctl_io_service_fa: talloc() failure!\n"));
429 for ( i
=0; i
<fa
->num_actions
; i
++ ) {
430 if ( !svcctl_io_action( "actions", &fa
->actions
[i
], ps
, depth
) )
437 /*******************************************************************
438 ********************************************************************/
440 uint32
svcctl_sizeof_service_fa( SERVICE_FAILURE_ACTIONS
*fa
)
447 size
= sizeof(uint32
) * 2;
448 size
+= sizeof_unistr2( fa
->rebootmsg
);
449 size
+= sizeof_unistr2( fa
->command
);
450 size
+= sizeof(SC_ACTION
) * fa
->num_actions
;
455 /*******************************************************************
456 ********************************************************************/
458 bool svcctl_io_r_query_service_config2(const char *desc
, SVCCTL_R_QUERY_SERVICE_CONFIG2
*r_u
, prs_struct
*ps
, int depth
)
463 prs_debug(ps
, depth
, desc
, "svcctl_io_r_query_service_config2");
466 if ( !prs_align(ps
) )
469 if (!prs_rpcbuffer("", ps
, depth
, &r_u
->buffer
))
474 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
477 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
484 /*******************************************************************
485 ********************************************************************/
487 bool svcctl_io_q_query_service_status_ex(const char *desc
, SVCCTL_Q_QUERY_SERVICE_STATUSEX
*q_u
, prs_struct
*ps
, int depth
)
492 prs_debug(ps
, depth
, desc
, "svcctl_io_q_query_service_status_ex");
498 if(!smb_io_pol_hnd("service_pol", &q_u
->handle
, ps
, depth
))
501 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
504 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
511 /*******************************************************************
512 ********************************************************************/
514 bool svcctl_io_r_query_service_status_ex(const char *desc
, SVCCTL_R_QUERY_SERVICE_STATUSEX
*r_u
, prs_struct
*ps
, int depth
)
519 prs_debug(ps
, depth
, desc
, "svcctl_io_r_query_service_status_ex");
522 if (!prs_rpcbuffer("", ps
, depth
, &r_u
->buffer
))
528 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
531 if(!prs_werror("status", ps
, depth
, &r_u
->status
))