00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "includes.h"
00022
00023 #undef DBGC_CLASS
00024 #define DBGC_CLASS DBGC_RPC_SRV
00025
00026
00027
00028
00029 static BOOL api_svcctl_close_service(pipes_struct *p)
00030 {
00031 SVCCTL_Q_CLOSE_SERVICE q_u;
00032 SVCCTL_R_CLOSE_SERVICE r_u;
00033 prs_struct *data = &p->in_data.data;
00034 prs_struct *rdata = &p->out_data.rdata;
00035
00036 ZERO_STRUCT(q_u);
00037 ZERO_STRUCT(r_u);
00038
00039 if(!svcctl_io_q_close_service("", &q_u, data, 0))
00040 return False;
00041
00042 r_u.status = _svcctl_close_service(p, &q_u, &r_u);
00043
00044 if(!svcctl_io_r_close_service("", &r_u, rdata, 0))
00045 return False;
00046
00047 return True;
00048 }
00049
00050
00051
00052
00053 static BOOL api_svcctl_open_scmanager(pipes_struct *p)
00054 {
00055 SVCCTL_Q_OPEN_SCMANAGER q_u;
00056 SVCCTL_R_OPEN_SCMANAGER r_u;
00057 prs_struct *data = &p->in_data.data;
00058 prs_struct *rdata = &p->out_data.rdata;
00059
00060 ZERO_STRUCT(q_u);
00061 ZERO_STRUCT(r_u);
00062
00063 if(!svcctl_io_q_open_scmanager("", &q_u, data, 0))
00064 return False;
00065
00066 r_u.status = _svcctl_open_scmanager(p, &q_u, &r_u);
00067
00068 if(!svcctl_io_r_open_scmanager("", &r_u, rdata, 0))
00069 return False;
00070
00071 return True;
00072 }
00073
00074
00075
00076
00077 static BOOL api_svcctl_open_service(pipes_struct *p)
00078 {
00079 SVCCTL_Q_OPEN_SERVICE q_u;
00080 SVCCTL_R_OPEN_SERVICE r_u;
00081 prs_struct *data = &p->in_data.data;
00082 prs_struct *rdata = &p->out_data.rdata;
00083
00084 ZERO_STRUCT(q_u);
00085 ZERO_STRUCT(r_u);
00086
00087 if(!svcctl_io_q_open_service("", &q_u, data, 0))
00088 return False;
00089
00090 r_u.status = _svcctl_open_service(p, &q_u, &r_u);
00091
00092 if(!svcctl_io_r_open_service("", &r_u, rdata, 0))
00093 return False;
00094
00095 return True;
00096 }
00097
00098
00099
00100
00101 static BOOL api_svcctl_get_display_name(pipes_struct *p)
00102 {
00103 SVCCTL_Q_GET_DISPLAY_NAME q_u;
00104 SVCCTL_R_GET_DISPLAY_NAME r_u;
00105 prs_struct *data = &p->in_data.data;
00106 prs_struct *rdata = &p->out_data.rdata;
00107
00108 ZERO_STRUCT(q_u);
00109 ZERO_STRUCT(r_u);
00110
00111 if(!svcctl_io_q_get_display_name("", &q_u, data, 0))
00112 return False;
00113
00114 r_u.status = _svcctl_get_display_name(p, &q_u, &r_u);
00115
00116 if(!svcctl_io_r_get_display_name("", &r_u, rdata, 0))
00117 return False;
00118
00119 return True;
00120 }
00121
00122
00123
00124
00125 static BOOL api_svcctl_query_status(pipes_struct *p)
00126 {
00127 SVCCTL_Q_QUERY_STATUS q_u;
00128 SVCCTL_R_QUERY_STATUS r_u;
00129 prs_struct *data = &p->in_data.data;
00130 prs_struct *rdata = &p->out_data.rdata;
00131
00132 ZERO_STRUCT(q_u);
00133 ZERO_STRUCT(r_u);
00134
00135 if(!svcctl_io_q_query_status("", &q_u, data, 0))
00136 return False;
00137
00138 r_u.status = _svcctl_query_status(p, &q_u, &r_u);
00139
00140 if(!svcctl_io_r_query_status("", &r_u, rdata, 0))
00141 return False;
00142
00143 return True;
00144 }
00145
00146
00147
00148
00149 static BOOL api_svcctl_enum_services_status(pipes_struct *p)
00150 {
00151 SVCCTL_Q_ENUM_SERVICES_STATUS q_u;
00152 SVCCTL_R_ENUM_SERVICES_STATUS r_u;
00153 prs_struct *data = &p->in_data.data;
00154 prs_struct *rdata = &p->out_data.rdata;
00155
00156 ZERO_STRUCT(q_u);
00157 ZERO_STRUCT(r_u);
00158
00159 if(!svcctl_io_q_enum_services_status("", &q_u, data, 0))
00160 return False;
00161
00162 r_u.status = _svcctl_enum_services_status(p, &q_u, &r_u);
00163
00164 if(!svcctl_io_r_enum_services_status("", &r_u, rdata, 0))
00165 return False;
00166
00167 return True;
00168 }
00169
00170
00171
00172 static BOOL api_svcctl_query_service_status_ex(pipes_struct *p)
00173 {
00174 SVCCTL_Q_QUERY_SERVICE_STATUSEX q_u;
00175 SVCCTL_R_QUERY_SERVICE_STATUSEX r_u;
00176 prs_struct *data = &p->in_data.data;
00177 prs_struct *rdata = &p->out_data.rdata;
00178
00179 ZERO_STRUCT(q_u);
00180 ZERO_STRUCT(r_u);
00181
00182 if(!svcctl_io_q_query_service_status_ex("", &q_u, data, 0))
00183 return False;
00184
00185 r_u.status = _svcctl_query_service_status_ex(p, &q_u, &r_u);
00186
00187 if(!svcctl_io_r_query_service_status_ex("", &r_u, rdata, 0))
00188 return False;
00189
00190 return True;
00191 }
00192
00193
00194
00195 static BOOL api_svcctl_enum_dependent_services(pipes_struct *p)
00196 {
00197 SVCCTL_Q_ENUM_DEPENDENT_SERVICES q_u;
00198 SVCCTL_R_ENUM_DEPENDENT_SERVICES r_u;
00199 prs_struct *data = &p->in_data.data;
00200 prs_struct *rdata = &p->out_data.rdata;
00201
00202 ZERO_STRUCT(q_u);
00203 ZERO_STRUCT(r_u);
00204
00205 if(!svcctl_io_q_enum_dependent_services("", &q_u, data, 0))
00206 return False;
00207
00208 r_u.status = _svcctl_enum_dependent_services(p, &q_u, &r_u);
00209
00210 if(!svcctl_io_r_enum_dependent_services("", &r_u, rdata, 0))
00211 return False;
00212
00213 return True;
00214 }
00215
00216
00217
00218
00219 static BOOL api_svcctl_start_service(pipes_struct *p)
00220 {
00221 SVCCTL_Q_START_SERVICE q_u;
00222 SVCCTL_R_START_SERVICE r_u;
00223 prs_struct *data = &p->in_data.data;
00224 prs_struct *rdata = &p->out_data.rdata;
00225
00226 ZERO_STRUCT(q_u);
00227 ZERO_STRUCT(r_u);
00228
00229 if(!svcctl_io_q_start_service("", &q_u, data, 0))
00230 return False;
00231
00232 r_u.status = _svcctl_start_service(p, &q_u, &r_u);
00233
00234 if(!svcctl_io_r_start_service("", &r_u, rdata, 0))
00235 return False;
00236
00237 return True;
00238 }
00239
00240
00241
00242
00243 static BOOL api_svcctl_control_service(pipes_struct *p)
00244 {
00245 SVCCTL_Q_CONTROL_SERVICE q_u;
00246 SVCCTL_R_CONTROL_SERVICE r_u;
00247 prs_struct *data = &p->in_data.data;
00248 prs_struct *rdata = &p->out_data.rdata;
00249
00250 ZERO_STRUCT(q_u);
00251 ZERO_STRUCT(r_u);
00252
00253 if(!svcctl_io_q_control_service("", &q_u, data, 0))
00254 return False;
00255
00256 r_u.status = _svcctl_control_service(p, &q_u, &r_u);
00257
00258 if(!svcctl_io_r_control_service("", &r_u, rdata, 0))
00259 return False;
00260
00261 return True;
00262 }
00263
00264
00265
00266
00267 static BOOL api_svcctl_query_service_config(pipes_struct *p)
00268 {
00269 SVCCTL_Q_QUERY_SERVICE_CONFIG q_u;
00270 SVCCTL_R_QUERY_SERVICE_CONFIG r_u;
00271 prs_struct *data = &p->in_data.data;
00272 prs_struct *rdata = &p->out_data.rdata;
00273
00274 ZERO_STRUCT(q_u);
00275 ZERO_STRUCT(r_u);
00276
00277 if(!svcctl_io_q_query_service_config("", &q_u, data, 0))
00278 return False;
00279
00280 r_u.status = _svcctl_query_service_config(p, &q_u, &r_u);
00281
00282 if(!svcctl_io_r_query_service_config("", &r_u, rdata, 0))
00283 return False;
00284
00285 return True;
00286 }
00287
00288
00289
00290
00291 static BOOL api_svcctl_query_service_config2(pipes_struct *p)
00292 {
00293 SVCCTL_Q_QUERY_SERVICE_CONFIG2 q_u;
00294 SVCCTL_R_QUERY_SERVICE_CONFIG2 r_u;
00295 prs_struct *data = &p->in_data.data;
00296 prs_struct *rdata = &p->out_data.rdata;
00297
00298 ZERO_STRUCT(q_u);
00299 ZERO_STRUCT(r_u);
00300
00301 if(!svcctl_io_q_query_service_config2("", &q_u, data, 0))
00302 return False;
00303
00304 r_u.status = _svcctl_query_service_config2(p, &q_u, &r_u);
00305
00306 if(!svcctl_io_r_query_service_config2("", &r_u, rdata, 0))
00307 return False;
00308
00309 return True;
00310 }
00311
00312
00313
00314
00315 static BOOL api_svcctl_lock_service_db(pipes_struct *p)
00316 {
00317 SVCCTL_Q_LOCK_SERVICE_DB q_u;
00318 SVCCTL_R_LOCK_SERVICE_DB r_u;
00319 prs_struct *data = &p->in_data.data;
00320 prs_struct *rdata = &p->out_data.rdata;
00321
00322 ZERO_STRUCT(q_u);
00323 ZERO_STRUCT(r_u);
00324
00325 if(!svcctl_io_q_lock_service_db("", &q_u, data, 0))
00326 return False;
00327
00328 r_u.status = _svcctl_lock_service_db(p, &q_u, &r_u);
00329
00330 if(!svcctl_io_r_lock_service_db("", &r_u, rdata, 0))
00331 return False;
00332
00333 return True;
00334 }
00335
00336
00337
00338
00339
00340 static BOOL api_svcctl_unlock_service_db(pipes_struct *p)
00341 {
00342 SVCCTL_Q_UNLOCK_SERVICE_DB q_u;
00343 SVCCTL_R_UNLOCK_SERVICE_DB r_u;
00344 prs_struct *data = &p->in_data.data;
00345 prs_struct *rdata = &p->out_data.rdata;
00346
00347 ZERO_STRUCT(q_u);
00348 ZERO_STRUCT(r_u);
00349
00350 if(!svcctl_io_q_unlock_service_db("", &q_u, data, 0))
00351 return False;
00352
00353 r_u.status = _svcctl_unlock_service_db(p, &q_u, &r_u);
00354
00355 if(!svcctl_io_r_unlock_service_db("", &r_u, rdata, 0))
00356 return False;
00357
00358 return True;
00359 }
00360
00361
00362
00363
00364 static BOOL api_svcctl_query_security_sec(pipes_struct *p)
00365 {
00366 SVCCTL_Q_QUERY_SERVICE_SEC q_u;
00367 SVCCTL_R_QUERY_SERVICE_SEC r_u;
00368 prs_struct *data = &p->in_data.data;
00369 prs_struct *rdata = &p->out_data.rdata;
00370
00371 ZERO_STRUCT(q_u);
00372 ZERO_STRUCT(r_u);
00373
00374 if(!svcctl_io_q_query_service_sec("", &q_u, data, 0))
00375 return False;
00376
00377 r_u.status = _svcctl_query_service_sec(p, &q_u, &r_u);
00378
00379 if(!svcctl_io_r_query_service_sec("", &r_u, rdata, 0))
00380 return False;
00381
00382 return True;
00383 }
00384
00385
00386
00387
00388 static BOOL api_svcctl_set_security_sec(pipes_struct *p)
00389 {
00390 SVCCTL_Q_SET_SERVICE_SEC q_u;
00391 SVCCTL_R_SET_SERVICE_SEC r_u;
00392 prs_struct *data = &p->in_data.data;
00393 prs_struct *rdata = &p->out_data.rdata;
00394
00395 ZERO_STRUCT(q_u);
00396 ZERO_STRUCT(r_u);
00397
00398 if(!svcctl_io_q_set_service_sec("", &q_u, data, 0))
00399 return False;
00400
00401 r_u.status = _svcctl_set_service_sec(p, &q_u, &r_u);
00402
00403 if(!svcctl_io_r_set_service_sec("", &r_u, rdata, 0))
00404 return False;
00405
00406 return True;
00407 }
00408
00409
00410
00411
00412
00413
00414 static struct api_struct api_svcctl_cmds[] =
00415 {
00416 { "SVCCTL_CLOSE_SERVICE" , SVCCTL_CLOSE_SERVICE , api_svcctl_close_service },
00417 { "SVCCTL_OPEN_SCMANAGER_W" , SVCCTL_OPEN_SCMANAGER_W , api_svcctl_open_scmanager },
00418 { "SVCCTL_OPEN_SERVICE_W" , SVCCTL_OPEN_SERVICE_W , api_svcctl_open_service },
00419 { "SVCCTL_GET_DISPLAY_NAME" , SVCCTL_GET_DISPLAY_NAME , api_svcctl_get_display_name },
00420 { "SVCCTL_QUERY_STATUS" , SVCCTL_QUERY_STATUS , api_svcctl_query_status },
00421 { "SVCCTL_QUERY_SERVICE_CONFIG_W" , SVCCTL_QUERY_SERVICE_CONFIG_W , api_svcctl_query_service_config },
00422 { "SVCCTL_QUERY_SERVICE_CONFIG2_W" , SVCCTL_QUERY_SERVICE_CONFIG2_W , api_svcctl_query_service_config2 },
00423 { "SVCCTL_ENUM_SERVICES_STATUS_W" , SVCCTL_ENUM_SERVICES_STATUS_W , api_svcctl_enum_services_status },
00424 { "SVCCTL_ENUM_DEPENDENT_SERVICES_W" , SVCCTL_ENUM_DEPENDENT_SERVICES_W , api_svcctl_enum_dependent_services },
00425 { "SVCCTL_START_SERVICE_W" , SVCCTL_START_SERVICE_W , api_svcctl_start_service },
00426 { "SVCCTL_CONTROL_SERVICE" , SVCCTL_CONTROL_SERVICE , api_svcctl_control_service },
00427 { "SVCCTL_QUERY_SERVICE_STATUSEX_W" , SVCCTL_QUERY_SERVICE_STATUSEX_W , api_svcctl_query_service_status_ex },
00428 { "SVCCTL_LOCK_SERVICE_DB" , SVCCTL_LOCK_SERVICE_DB , api_svcctl_lock_service_db },
00429 { "SVCCTL_UNLOCK_SERVICE_DB" , SVCCTL_UNLOCK_SERVICE_DB , api_svcctl_unlock_service_db },
00430 { "SVCCTL_QUERY_SERVICE_SEC" , SVCCTL_QUERY_SERVICE_SEC , api_svcctl_query_security_sec },
00431 { "SVCCTL_SET_SERVICE_SEC" , SVCCTL_SET_SERVICE_SEC , api_svcctl_set_security_sec }
00432 };
00433
00434
00435 void svcctl_get_pipe_fns( struct api_struct **fns, int *n_fns )
00436 {
00437 *fns = api_svcctl_cmds;
00438 *n_fns = sizeof(api_svcctl_cmds) / sizeof(struct api_struct);
00439 }
00440
00441 NTSTATUS rpc_svcctl_init(void)
00442 {
00443 return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "svcctl", "ntsvcs", api_svcctl_cmds,
00444 sizeof(api_svcctl_cmds) / sizeof(struct api_struct));
00445 }