smbpasswd -W docs patch from Aruna Prabakar <aruna.prabakar@hp.com>
[Samba.git] / source / rpc_server / srv_reg.c
blob17725240387f3d7c394c91ed9b272f06da078368
1 /*
2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997,
7 * Copyright (C) Marc Jacobsen 2000,
8 * Copyright (C) Jeremy Allison 2001,
9 * Copyright (C) Gerald Carter 2002,
10 * Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003.
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 /* This is the interface for the registry functions. */
29 #include "includes.h"
31 #undef DBGC_CLASS
32 #define DBGC_CLASS DBGC_RPC_SRV
34 /*******************************************************************
35 api_reg_close
36 ********************************************************************/
38 static BOOL api_reg_close(pipes_struct *p)
40 REG_Q_CLOSE q_u;
41 REG_R_CLOSE r_u;
42 prs_struct *data = &p->in_data.data;
43 prs_struct *rdata = &p->out_data.rdata;
45 ZERO_STRUCT(q_u);
46 ZERO_STRUCT(r_u);
48 /* grab the reg unknown 1 */
49 if(!reg_io_q_close("", &q_u, data, 0))
50 return False;
52 r_u.status = _reg_close(p, &q_u, &r_u);
54 if(!reg_io_r_close("", &r_u, rdata, 0))
55 return False;
57 return True;
60 /*******************************************************************
61 api_reg_open_khlm
62 ********************************************************************/
64 static BOOL api_reg_open_hklm(pipes_struct *p)
66 REG_Q_OPEN_HIVE q_u;
67 REG_R_OPEN_HIVE r_u;
68 prs_struct *data = &p->in_data.data;
69 prs_struct *rdata = &p->out_data.rdata;
71 ZERO_STRUCT(q_u);
72 ZERO_STRUCT(r_u);
74 /* grab the reg open */
75 if(!reg_io_q_open_hive("", &q_u, data, 0))
76 return False;
78 r_u.status = _reg_open_hklm(p, &q_u, &r_u);
80 if(!reg_io_r_open_hive("", &r_u, rdata, 0))
81 return False;
83 return True;
86 /*******************************************************************
87 api_reg_open_khu
88 ********************************************************************/
90 static BOOL api_reg_open_hku(pipes_struct *p)
92 REG_Q_OPEN_HIVE q_u;
93 REG_R_OPEN_HIVE r_u;
94 prs_struct *data = &p->in_data.data;
95 prs_struct *rdata = &p->out_data.rdata;
97 ZERO_STRUCT(q_u);
98 ZERO_STRUCT(r_u);
100 /* grab the reg open */
101 if(!reg_io_q_open_hive("", &q_u, data, 0))
102 return False;
104 r_u.status = _reg_open_hku(p, &q_u, &r_u);
106 if(!reg_io_r_open_hive("", &r_u, rdata, 0))
107 return False;
109 return True;
112 /*******************************************************************
113 api_reg_open_khcr
114 ********************************************************************/
116 static BOOL api_reg_open_hkcr(pipes_struct *p)
118 REG_Q_OPEN_HIVE q_u;
119 REG_R_OPEN_HIVE r_u;
120 prs_struct *data = &p->in_data.data;
121 prs_struct *rdata = &p->out_data.rdata;
123 ZERO_STRUCT(q_u);
124 ZERO_STRUCT(r_u);
126 /* grab the reg open */
127 if(!reg_io_q_open_hive("", &q_u, data, 0))
128 return False;
130 r_u.status = _reg_open_hkcr(p, &q_u, &r_u);
132 if(!reg_io_r_open_hive("", &r_u, rdata, 0))
133 return False;
135 return True;
139 /*******************************************************************
140 api_reg_open_entry
141 ********************************************************************/
143 static BOOL api_reg_open_entry(pipes_struct *p)
145 REG_Q_OPEN_ENTRY q_u;
146 REG_R_OPEN_ENTRY r_u;
147 prs_struct *data = &p->in_data.data;
148 prs_struct *rdata = &p->out_data.rdata;
150 ZERO_STRUCT(q_u);
151 ZERO_STRUCT(r_u);
153 /* grab the reg open entry */
154 if(!reg_io_q_open_entry("", &q_u, data, 0))
155 return False;
157 /* construct reply. */
158 r_u.status = _reg_open_entry(p, &q_u, &r_u);
160 if(!reg_io_r_open_entry("", &r_u, rdata, 0))
161 return False;
163 return True;
166 /*******************************************************************
167 api_reg_query_value
168 ********************************************************************/
170 static BOOL api_reg_query_value(pipes_struct *p)
172 REG_Q_QUERY_VALUE q_u;
173 REG_R_QUERY_VALUE r_u;
174 prs_struct *data = &p->in_data.data;
175 prs_struct *rdata = &p->out_data.rdata;
177 ZERO_STRUCT(q_u);
178 ZERO_STRUCT(r_u);
180 /* grab the reg unknown 0x11*/
181 if(!reg_io_q_query_value("", &q_u, data, 0))
182 return False;
184 r_u.status = _reg_query_value(p, &q_u, &r_u);
186 if(!reg_io_r_query_value("", &r_u, rdata, 0))
187 return False;
189 return True;
192 /*******************************************************************
193 api_reg_shutdown
194 ********************************************************************/
196 static BOOL api_reg_shutdown(pipes_struct *p)
198 REG_Q_SHUTDOWN q_u;
199 REG_R_SHUTDOWN r_u;
200 prs_struct *data = &p->in_data.data;
201 prs_struct *rdata = &p->out_data.rdata;
203 ZERO_STRUCT(q_u);
204 ZERO_STRUCT(r_u);
206 /* grab the reg shutdown */
207 if(!reg_io_q_shutdown("", &q_u, data, 0))
208 return False;
210 r_u.status = _reg_shutdown(p, &q_u, &r_u);
212 if(!reg_io_r_shutdown("", &r_u, rdata, 0))
213 return False;
215 return True;
218 /*******************************************************************
219 api_reg_shutdown_ex
220 ********************************************************************/
222 static BOOL api_reg_shutdown_ex(pipes_struct *p)
224 REG_Q_SHUTDOWN_EX q_u;
225 REG_R_SHUTDOWN_EX r_u;
226 prs_struct *data = &p->in_data.data;
227 prs_struct *rdata = &p->out_data.rdata;
229 ZERO_STRUCT(q_u);
230 ZERO_STRUCT(r_u);
232 /* grab the reg shutdown ex */
233 if(!reg_io_q_shutdown_ex("", &q_u, data, 0))
234 return False;
236 r_u.status = _reg_shutdown_ex(p, &q_u, &r_u);
238 if(!reg_io_r_shutdown_ex("", &r_u, rdata, 0))
239 return False;
241 return True;
244 /*******************************************************************
245 api_reg_abort_shutdown
246 ********************************************************************/
248 static BOOL api_reg_abort_shutdown(pipes_struct *p)
250 REG_Q_ABORT_SHUTDOWN q_u;
251 REG_R_ABORT_SHUTDOWN r_u;
252 prs_struct *data = &p->in_data.data;
253 prs_struct *rdata = &p->out_data.rdata;
255 ZERO_STRUCT(q_u);
256 ZERO_STRUCT(r_u);
258 /* grab the reg shutdown */
259 if(!reg_io_q_abort_shutdown("", &q_u, data, 0))
260 return False;
262 r_u.status = _reg_abort_shutdown(p, &q_u, &r_u);
264 if(!reg_io_r_abort_shutdown("", &r_u, rdata, 0))
265 return False;
267 return True;
271 /*******************************************************************
272 api_reg_query_key
273 ********************************************************************/
275 static BOOL api_reg_query_key(pipes_struct *p)
277 REG_Q_QUERY_KEY q_u;
278 REG_R_QUERY_KEY r_u;
279 prs_struct *data = &p->in_data.data;
280 prs_struct *rdata = &p->out_data.rdata;
282 ZERO_STRUCT(q_u);
283 ZERO_STRUCT(r_u);
285 if(!reg_io_q_query_key("", &q_u, data, 0))
286 return False;
288 r_u.status = _reg_query_key(p, &q_u, &r_u);
290 if(!reg_io_r_query_key("", &r_u, rdata, 0))
291 return False;
293 return True;
296 /*******************************************************************
297 api_reg_getversion
298 ********************************************************************/
300 static BOOL api_reg_getversion(pipes_struct *p)
302 REG_Q_GETVERSION q_u;
303 REG_R_GETVERSION r_u;
304 prs_struct *data = &p->in_data.data;
305 prs_struct *rdata = &p->out_data.rdata;
307 ZERO_STRUCT(q_u);
308 ZERO_STRUCT(r_u);
310 if(!reg_io_q_getversion("", &q_u, data, 0))
311 return False;
313 r_u.status = _reg_getversion(p, &q_u, &r_u);
315 if(!reg_io_r_getversion("", &r_u, rdata, 0))
316 return False;
318 return True;
321 /*******************************************************************
322 api_reg_enum_key
323 ********************************************************************/
325 static BOOL api_reg_enum_key(pipes_struct *p)
327 REG_Q_ENUM_KEY q_u;
328 REG_R_ENUM_KEY r_u;
329 prs_struct *data = &p->in_data.data;
330 prs_struct *rdata = &p->out_data.rdata;
332 ZERO_STRUCT(q_u);
333 ZERO_STRUCT(r_u);
335 if(!reg_io_q_enum_key("", &q_u, data, 0))
336 return False;
338 r_u.status = _reg_enum_key(p, &q_u, &r_u);
340 if(!reg_io_r_enum_key("", &r_u, rdata, 0))
341 return False;
343 return True;
346 /*******************************************************************
347 api_reg_enum_value
348 ********************************************************************/
350 static BOOL api_reg_enum_value(pipes_struct *p)
352 REG_Q_ENUM_VALUE q_u;
353 REG_R_ENUM_VALUE r_u;
354 prs_struct *data = &p->in_data.data;
355 prs_struct *rdata = &p->out_data.rdata;
357 ZERO_STRUCT(q_u);
358 ZERO_STRUCT(r_u);
360 if(!reg_io_q_enum_val("", &q_u, data, 0))
361 return False;
363 r_u.status = _reg_enum_value(p, &q_u, &r_u);
365 if(!reg_io_r_enum_val("", &r_u, rdata, 0))
366 return False;
368 return True;
371 /*******************************************************************
372 ******************************************************************/
374 static BOOL api_reg_restore_key(pipes_struct *p)
376 REG_Q_RESTORE_KEY q_u;
377 REG_R_RESTORE_KEY r_u;
378 prs_struct *data = &p->in_data.data;
379 prs_struct *rdata = &p->out_data.rdata;
381 ZERO_STRUCT(q_u);
382 ZERO_STRUCT(r_u);
384 if(!reg_io_q_restore_key("", &q_u, data, 0))
385 return False;
387 r_u.status = _reg_restore_key(p, &q_u, &r_u);
389 if(!reg_io_r_restore_key("", &r_u, rdata, 0))
390 return False;
392 return True;
395 /*******************************************************************
396 ********************************************************************/
398 static BOOL api_reg_save_key(pipes_struct *p)
400 REG_Q_SAVE_KEY q_u;
401 REG_R_SAVE_KEY r_u;
402 prs_struct *data = &p->in_data.data;
403 prs_struct *rdata = &p->out_data.rdata;
405 ZERO_STRUCT(q_u);
406 ZERO_STRUCT(r_u);
408 if(!reg_io_q_save_key("", &q_u, data, 0))
409 return False;
411 r_u.status = _reg_save_key(p, &q_u, &r_u);
413 if(!reg_io_r_save_key("", &r_u, rdata, 0))
414 return False;
416 return True;
419 /*******************************************************************
420 api_reg_open_hkpd
421 ********************************************************************/
423 static BOOL api_reg_open_hkpd(pipes_struct *p)
425 REG_Q_OPEN_HIVE q_u;
426 REG_R_OPEN_HIVE r_u;
427 prs_struct *data = &p->in_data.data;
428 prs_struct *rdata = &p->out_data.rdata;
430 ZERO_STRUCT(q_u);
431 ZERO_STRUCT(r_u);
433 /* grab the reg open */
434 if(!reg_io_q_open_hive("", &q_u, data, 0))
435 return False;
437 r_u.status = _reg_open_hkpd(p, &q_u, &r_u);
439 if(!reg_io_r_open_hive("", &r_u, rdata, 0))
440 return False;
442 return True;
445 /*******************************************************************
446 api_reg_open_hkpd
447 ********************************************************************/
448 static BOOL api_reg_open_hkpt(pipes_struct *p)
450 REG_Q_OPEN_HIVE q_u;
451 REG_R_OPEN_HIVE r_u;
452 prs_struct *data = &p->in_data.data;
453 prs_struct *rdata = &p->out_data.rdata;
455 ZERO_STRUCT(q_u);
456 ZERO_STRUCT(r_u);
458 /* grab the reg open */
459 if(!reg_io_q_open_hive("", &q_u, data, 0))
460 return False;
462 r_u.status = _reg_open_hkpt(p, &q_u, &r_u);
464 if(!reg_io_r_open_hive("", &r_u, rdata, 0))
465 return False;
467 return True;
470 /*******************************************************************
471 ******************************************************************/
473 static BOOL api_reg_create_key_ex(pipes_struct *p)
475 REG_Q_CREATE_KEY_EX q_u;
476 REG_R_CREATE_KEY_EX r_u;
477 prs_struct *data = &p->in_data.data;
478 prs_struct *rdata = &p->out_data.rdata;
480 ZERO_STRUCT(q_u);
481 ZERO_STRUCT(r_u);
483 if(!reg_io_q_create_key_ex("", &q_u, data, 0))
484 return False;
486 r_u.status = _reg_create_key_ex(p, &q_u, &r_u);
488 if(!reg_io_r_create_key_ex("", &r_u, rdata, 0))
489 return False;
491 return True;
494 /*******************************************************************
495 ******************************************************************/
497 static BOOL api_reg_set_value(pipes_struct *p)
499 REG_Q_SET_VALUE q_u;
500 REG_R_SET_VALUE r_u;
501 prs_struct *data = &p->in_data.data;
502 prs_struct *rdata = &p->out_data.rdata;
504 ZERO_STRUCT(q_u);
505 ZERO_STRUCT(r_u);
507 if(!reg_io_q_set_value("", &q_u, data, 0))
508 return False;
510 r_u.status = _reg_set_value(p, &q_u, &r_u);
512 if(!reg_io_r_set_value("", &r_u, rdata, 0))
513 return False;
515 return True;
518 /*******************************************************************
519 ******************************************************************/
521 static BOOL api_reg_delete_key(pipes_struct *p)
523 REG_Q_DELETE_KEY q_u;
524 REG_R_DELETE_KEY r_u;
525 prs_struct *data = &p->in_data.data;
526 prs_struct *rdata = &p->out_data.rdata;
528 ZERO_STRUCT(q_u);
529 ZERO_STRUCT(r_u);
531 if(!reg_io_q_delete_key("", &q_u, data, 0))
532 return False;
534 r_u.status = _reg_delete_key(p, &q_u, &r_u);
536 if(!reg_io_r_delete_key("", &r_u, rdata, 0))
537 return False;
539 return True;
542 /*******************************************************************
543 ******************************************************************/
545 static BOOL api_reg_delete_value(pipes_struct *p)
547 REG_Q_DELETE_VALUE q_u;
548 REG_R_DELETE_VALUE r_u;
549 prs_struct *data = &p->in_data.data;
550 prs_struct *rdata = &p->out_data.rdata;
552 ZERO_STRUCT(q_u);
553 ZERO_STRUCT(r_u);
555 if(!reg_io_q_delete_value("", &q_u, data, 0))
556 return False;
558 r_u.status = _reg_delete_value(p, &q_u, &r_u);
560 if(!reg_io_r_delete_value("", &r_u, rdata, 0))
561 return False;
563 return True;
567 /*******************************************************************
568 ******************************************************************/
570 static BOOL api_reg_get_key_sec(pipes_struct *p)
572 REG_Q_GET_KEY_SEC q_u;
573 REG_R_GET_KEY_SEC r_u;
574 prs_struct *data = &p->in_data.data;
575 prs_struct *rdata = &p->out_data.rdata;
577 ZERO_STRUCT(q_u);
578 ZERO_STRUCT(r_u);
580 if(!reg_io_q_get_key_sec("", &q_u, data, 0))
581 return False;
583 r_u.status = _reg_get_key_sec(p, &q_u, &r_u);
585 if(!reg_io_r_get_key_sec("", &r_u, rdata, 0))
586 return False;
588 return True;
592 /*******************************************************************
593 ******************************************************************/
595 static BOOL api_reg_set_key_sec(pipes_struct *p)
597 REG_Q_SET_KEY_SEC q_u;
598 REG_R_SET_KEY_SEC r_u;
599 prs_struct *data = &p->in_data.data;
600 prs_struct *rdata = &p->out_data.rdata;
602 ZERO_STRUCT(q_u);
603 ZERO_STRUCT(r_u);
605 if(!reg_io_q_set_key_sec("", &q_u, data, 0))
606 return False;
608 r_u.status = _reg_set_key_sec(p, &q_u, &r_u);
610 if(!reg_io_r_set_key_sec("", &r_u, rdata, 0))
611 return False;
613 return True;
617 /*******************************************************************
618 array of \PIPE\reg operations
619 ********************************************************************/
621 static struct api_struct api_reg_cmds[] =
623 { "REG_CLOSE" , REG_CLOSE , api_reg_close },
624 { "REG_OPEN_ENTRY" , REG_OPEN_ENTRY , api_reg_open_entry },
625 { "REG_OPEN_HKCR" , REG_OPEN_HKCR , api_reg_open_hkcr },
626 { "REG_OPEN_HKLM" , REG_OPEN_HKLM , api_reg_open_hklm },
627 { "REG_OPEN_HKPD" , REG_OPEN_HKPD , api_reg_open_hkpd },
628 { "REG_OPEN_HKPT" , REG_OPEN_HKPT , api_reg_open_hkpt },
629 { "REG_OPEN_HKU" , REG_OPEN_HKU , api_reg_open_hku },
630 { "REG_ENUM_KEY" , REG_ENUM_KEY , api_reg_enum_key },
631 { "REG_ENUM_VALUE" , REG_ENUM_VALUE , api_reg_enum_value },
632 { "REG_QUERY_KEY" , REG_QUERY_KEY , api_reg_query_key },
633 { "REG_QUERY_VALUE" , REG_QUERY_VALUE , api_reg_query_value },
634 { "REG_SHUTDOWN" , REG_SHUTDOWN , api_reg_shutdown },
635 { "REG_SHUTDOWN_EX" , REG_SHUTDOWN_EX , api_reg_shutdown_ex },
636 { "REG_ABORT_SHUTDOWN" , REG_ABORT_SHUTDOWN , api_reg_abort_shutdown },
637 { "REG_GETVERSION" , REG_GETVERSION , api_reg_getversion },
638 { "REG_SAVE_KEY" , REG_SAVE_KEY , api_reg_save_key },
639 { "REG_RESTORE_KEY" , REG_RESTORE_KEY , api_reg_restore_key },
640 { "REG_CREATE_KEY_EX" , REG_CREATE_KEY_EX , api_reg_create_key_ex },
641 { "REG_SET_VALUE" , REG_SET_VALUE , api_reg_set_value },
642 { "REG_DELETE_KEY" , REG_DELETE_KEY , api_reg_delete_key },
643 { "REG_DELETE_VALUE" , REG_DELETE_VALUE , api_reg_delete_value },
644 { "REG_GET_KEY_SEC" , REG_GET_KEY_SEC , api_reg_get_key_sec },
645 { "REG_SET_KEY_SEC" , REG_SET_KEY_SEC , api_reg_set_key_sec }
648 void reg_get_pipe_fns( struct api_struct **fns, int *n_fns )
650 *fns = api_reg_cmds;
651 *n_fns = sizeof(api_reg_cmds) / sizeof(struct api_struct);
654 NTSTATUS rpc_reg_init(void)
657 return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "winreg", "winreg", api_reg_cmds,
658 sizeof(api_reg_cmds) / sizeof(struct api_struct));