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 1999.
8 * Copyright (C) Simo Sorce 2000.
9 * Copyright (C) Jeremy Cooper 2004
10 * Copyright (C) Gerald Carter 2002-2005.
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.
30 #define DBGC_CLASS DBGC_RPC_PARSE
32 /*******************************************************************
33 Fill in a REGVAL_BUFFER for the data given a REGISTRY_VALUE
34 *******************************************************************/
36 uint32
reg_init_regval_buffer( REGVAL_BUFFER
*buf2
, REGISTRY_VALUE
*val
)
43 real_size
= regval_size(val
);
44 init_regval_buffer( buf2
, (unsigned char*)regval_data_p(val
), real_size
);
49 /*******************************************************************
50 Inits a hive connect request structure
51 ********************************************************************/
53 void init_reg_q_open_hive( REG_Q_OPEN_HIVE
*q_o
, uint32 access_desired
)
56 q_o
->server
= TALLOC_P( get_talloc_ctx(), uint16
);
58 smb_panic("init_reg_q_open_hive: talloc fail.\n");
63 q_o
->access
= access_desired
;
66 /*******************************************************************
67 Marshalls a hive connect request
68 ********************************************************************/
70 BOOL
reg_io_q_open_hive(const char *desc
, REG_Q_OPEN_HIVE
*q_u
,
71 prs_struct
*ps
, int depth
)
73 prs_debug(ps
, depth
, desc
, "reg_io_q_open_hive");
79 if(!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
84 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
91 /*******************************************************************
92 Unmarshalls a hive connect response
93 ********************************************************************/
95 BOOL
reg_io_r_open_hive(const char *desc
, REG_R_OPEN_HIVE
*r_u
,
96 prs_struct
*ps
, int depth
)
101 prs_debug(ps
, depth
, desc
, "reg_io_r_open_hive");
107 if(!smb_io_pol_hnd("", &r_u
->pol
, ps
, depth
))
110 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
116 /*******************************************************************
118 ********************************************************************/
120 void init_reg_q_flush_key(REG_Q_FLUSH_KEY
*q_u
, POLICY_HND
*pol
)
122 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
125 /*******************************************************************
126 reads or writes a structure.
127 ********************************************************************/
129 BOOL
reg_io_q_flush_key(const char *desc
, REG_Q_FLUSH_KEY
*q_u
, prs_struct
*ps
, int depth
)
134 prs_debug(ps
, depth
, desc
, "reg_io_q_flush_key");
140 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
146 /*******************************************************************
147 Unmarshalls a registry key flush response
148 ********************************************************************/
150 BOOL
reg_io_r_flush_key(const char *desc
, REG_R_FLUSH_KEY
*r_u
,
151 prs_struct
*ps
, int depth
)
156 prs_debug(ps
, depth
, desc
, "reg_io_r_flush_key");
162 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
168 /*******************************************************************
169 reads or writes SEC_DESC_BUF and SEC_DATA structures.
170 ********************************************************************/
172 static BOOL
reg_io_hdrbuf_sec(uint32 ptr
, uint32
*ptr3
, BUFHDR
*hdr_sec
,
173 SEC_DESC_BUF
*data
, prs_struct
*ps
, int depth
)
178 if(!smb_io_hdrbuf_pre("hdr_sec", hdr_sec
, ps
, depth
,
182 old_offset
= prs_offset(ps
);
185 if(!prs_uint32("ptr3", ps
, depth
, ptr3
))
189 if (ptr3
== NULL
|| *ptr3
!= 0) {
190 /* JRA - this next line is probably wrong... */
191 if(!sec_io_desc_buf("data ", &data
, ps
, depth
))
195 if(!smb_io_hdrbuf_post("hdr_sec", hdr_sec
, ps
, depth
,
196 hdr_offset
, data
->max_len
, data
->len
))
198 if(!prs_set_offset(ps
, old_offset
+ data
->len
+
199 sizeof(uint32
) * ((ptr3
!= NULL
) ? 5 : 3)))
209 /*******************************************************************
210 Inits a registry key create request
211 ********************************************************************/
213 void init_reg_q_create_key_ex(REG_Q_CREATE_KEY_EX
*q_c
, POLICY_HND
*hnd
,
214 char *name
, char *key_class
, uint32 access_desired
,
215 SEC_DESC_BUF
*sec_buf
)
219 memcpy(&q_c
->handle
, hnd
, sizeof(q_c
->handle
));
222 init_unistr4( &q_c
->name
, name
, UNI_STR_TERMINATE
);
223 init_unistr4( &q_c
->key_class
, key_class
, UNI_STR_TERMINATE
);
225 q_c
->access
= access_desired
;
227 q_c
->sec_info
= TALLOC_P( get_talloc_ctx(), uint32
);
228 if (!q_c
->sec_info
) {
229 smb_panic("init_reg_q_create_key_ex: talloc fail\n");
232 *q_c
->sec_info
= DACL_SECURITY_INFORMATION
| SACL_SECURITY_INFORMATION
;
236 init_buf_hdr(&q_c
->hdr_sec
, sec_buf
->len
, sec_buf
->len
);
238 q_c
->disposition
= TALLOC_P( get_talloc_ctx(), uint32
);
239 if (!q_c
->disposition
) {
240 smb_panic("init_reg_q_create_key_ex: talloc fail\n");
245 /*******************************************************************
246 Marshalls a registry key create request
247 ********************************************************************/
249 BOOL
reg_io_q_create_key_ex(const char *desc
, REG_Q_CREATE_KEY_EX
*q_u
,
250 prs_struct
*ps
, int depth
)
255 prs_debug(ps
, depth
, desc
, "reg_io_q_create_key_ex");
261 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
264 if(!prs_unistr4 ("name", ps
, depth
, &q_u
->name
))
269 if(!prs_unistr4 ("key_class", ps
, depth
, &q_u
->key_class
))
274 if(!prs_uint32("options", ps
, depth
, &q_u
->options
))
276 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
279 if(!prs_pointer("sec_info", ps
, depth
, (void**)&q_u
->sec_info
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
282 if ( q_u
->sec_info
) {
283 if(!prs_uint32("ptr2", ps
, depth
, &q_u
->ptr2
))
285 if(!reg_io_hdrbuf_sec(q_u
->ptr2
, &q_u
->ptr3
, &q_u
->hdr_sec
, q_u
->data
, ps
, depth
))
289 if(!prs_pointer("disposition", ps
, depth
, (void**)&q_u
->disposition
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
295 /*******************************************************************
296 Unmarshalls a registry key create response
297 ********************************************************************/
299 BOOL
reg_io_r_create_key_ex(const char *desc
, REG_R_CREATE_KEY_EX
*r_u
,
300 prs_struct
*ps
, int depth
)
305 prs_debug(ps
, depth
, desc
, "reg_io_r_create_key_ex");
311 if(!smb_io_pol_hnd("", &r_u
->handle
, ps
, depth
))
313 if(!prs_uint32("disposition", ps
, depth
, &r_u
->disposition
))
316 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
323 /*******************************************************************
325 ********************************************************************/
327 void init_reg_q_delete_val(REG_Q_DELETE_VALUE
*q_c
, POLICY_HND
*hnd
,
332 memcpy(&q_c
->handle
, hnd
, sizeof(q_c
->handle
));
333 init_unistr4(&q_c
->name
, name
, UNI_STR_TERMINATE
);
336 /*******************************************************************
337 reads or writes a structure.
338 ********************************************************************/
340 BOOL
reg_io_q_delete_value(const char *desc
, REG_Q_DELETE_VALUE
*q_u
,
341 prs_struct
*ps
, int depth
)
346 prs_debug(ps
, depth
, desc
, "reg_io_q_delete_value");
352 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
355 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
362 /*******************************************************************
363 reads or writes a structure.
364 ********************************************************************/
366 BOOL
reg_io_r_delete_value(const char *desc
, REG_R_DELETE_VALUE
*r_u
,
367 prs_struct
*ps
, int depth
)
372 prs_debug(ps
, depth
, desc
, "reg_io_r_delete_value");
378 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
384 /*******************************************************************
386 ********************************************************************/
388 void init_reg_q_delete_key(REG_Q_DELETE_KEY
*q_c
, POLICY_HND
*hnd
,
393 memcpy(&q_c
->handle
, hnd
, sizeof(q_c
->handle
));
395 init_unistr4(&q_c
->name
, name
, UNI_STR_TERMINATE
);
398 /*******************************************************************
399 reads or writes a structure.
400 ********************************************************************/
402 BOOL
reg_io_q_delete_key(const char *desc
, REG_Q_DELETE_KEY
*q_u
,
403 prs_struct
*ps
, int depth
)
408 prs_debug(ps
, depth
, desc
, "reg_io_q_delete_key");
414 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
417 if(!prs_unistr4("", ps
, depth
, &q_u
->name
))
423 /*******************************************************************
424 reads or writes a structure.
425 ********************************************************************/
427 BOOL
reg_io_r_delete_key(const char *desc
, REG_R_DELETE_KEY
*r_u
, prs_struct
*ps
, int depth
)
432 prs_debug(ps
, depth
, desc
, "reg_io_r_delete_key");
438 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
444 /*******************************************************************
446 ********************************************************************/
448 void init_reg_q_query_key(REG_Q_QUERY_KEY
*q_o
, POLICY_HND
*hnd
, const char *key_class
)
452 memcpy(&q_o
->pol
, hnd
, sizeof(q_o
->pol
));
453 init_unistr4(&q_o
->key_class
, key_class
, UNI_STR_TERMINATE
);
456 /*******************************************************************
457 reads or writes a structure.
458 ********************************************************************/
460 BOOL
reg_io_q_query_key(const char *desc
, REG_Q_QUERY_KEY
*q_u
, prs_struct
*ps
, int depth
)
465 prs_debug(ps
, depth
, desc
, "reg_io_q_query_key");
471 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
473 if(!prs_unistr4("key_class", ps
, depth
, &q_u
->key_class
))
480 /*******************************************************************
481 reads or writes a structure.
482 ********************************************************************/
484 BOOL
reg_io_r_query_key(const char *desc
, REG_R_QUERY_KEY
*r_u
, prs_struct
*ps
, int depth
)
489 prs_debug(ps
, depth
, desc
, "reg_io_r_query_key");
495 if(!prs_unistr4("key_class", ps
, depth
, &r_u
->key_class
))
501 if(!prs_uint32("num_subkeys ", ps
, depth
, &r_u
->num_subkeys
))
503 if(!prs_uint32("max_subkeylen ", ps
, depth
, &r_u
->max_subkeylen
))
505 if(!prs_uint32("reserved ", ps
, depth
, &r_u
->reserved
))
507 if(!prs_uint32("num_values ", ps
, depth
, &r_u
->num_values
))
509 if(!prs_uint32("max_valnamelen", ps
, depth
, &r_u
->max_valnamelen
))
511 if(!prs_uint32("max_valbufsize", ps
, depth
, &r_u
->max_valbufsize
))
513 if(!prs_uint32("sec_desc ", ps
, depth
, &r_u
->sec_desc
))
515 if(!smb_io_time("mod_time ", &r_u
->mod_time
, ps
, depth
))
518 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
524 /*******************************************************************
526 ********************************************************************/
528 void init_reg_q_getversion(REG_Q_GETVERSION
*q_o
, POLICY_HND
*hnd
)
530 memcpy(&q_o
->pol
, hnd
, sizeof(q_o
->pol
));
534 /*******************************************************************
535 reads or writes a structure.
536 ********************************************************************/
538 BOOL
reg_io_q_getversion(const char *desc
, REG_Q_GETVERSION
*q_u
, prs_struct
*ps
, int depth
)
543 prs_debug(ps
, depth
, desc
, "reg_io_q_getversion");
549 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
555 /*******************************************************************
556 reads or writes a structure.
557 ********************************************************************/
559 BOOL
reg_io_r_getversion(const char *desc
, REG_R_GETVERSION
*r_u
, prs_struct
*ps
, int depth
)
564 prs_debug(ps
, depth
, desc
, "reg_io_r_getversion");
570 if(!prs_uint32("win_version", ps
, depth
, &r_u
->win_version
))
572 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
579 /*******************************************************************
580 reads or writes a structure.
581 ********************************************************************/
583 BOOL
reg_io_q_restore_key(const char *desc
, REG_Q_RESTORE_KEY
*q_u
, prs_struct
*ps
, int depth
)
588 prs_debug(ps
, depth
, desc
, "reg_io_q_restore_key");
594 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
597 if(!prs_unistr4("filename", ps
, depth
, &q_u
->filename
))
600 if(!prs_uint32("flags", ps
, depth
, &q_u
->flags
))
606 /*******************************************************************
607 reads or writes a structure.
608 ********************************************************************/
610 BOOL
reg_io_r_restore_key(const char *desc
, REG_R_RESTORE_KEY
*r_u
, prs_struct
*ps
, int depth
)
615 prs_debug(ps
, depth
, desc
, "reg_io_r_restore_key");
621 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
627 /*******************************************************************
628 ********************************************************************/
630 void init_q_reg_save_key( REG_Q_SAVE_KEY
*q_u
, POLICY_HND
*handle
, const char *fname
)
632 memcpy(&q_u
->pol
, handle
, sizeof(q_u
->pol
));
633 init_unistr4( &q_u
->filename
, fname
, UNI_STR_TERMINATE
);
634 q_u
->sec_attr
= NULL
;
637 /*******************************************************************
638 reads or writes a structure.
639 ********************************************************************/
641 BOOL
reg_io_q_save_key(const char *desc
, REG_Q_SAVE_KEY
*q_u
, prs_struct
*ps
, int depth
)
646 prs_debug(ps
, depth
, desc
, "reg_io_q_save_key");
652 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
655 if(!prs_unistr4("filename", ps
, depth
, &q_u
->filename
))
658 #if 0 /* reg_io_sec_attr() */
659 if(!prs_uint32("unknown", ps
, depth
, &q_u
->unknown
))
666 /*******************************************************************
667 reads or writes a structure.
668 ********************************************************************/
670 BOOL
reg_io_r_save_key(const char *desc
, REG_R_SAVE_KEY
*r_u
, prs_struct
*ps
, int depth
)
675 prs_debug(ps
, depth
, desc
, "reg_io_r_save_key");
681 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
687 /*******************************************************************
688 Inits an REG_Q_CLOSE structure.
689 ********************************************************************/
691 void init_reg_q_close(REG_Q_CLOSE
*q_c
, POLICY_HND
*hnd
)
693 DEBUG(5,("init_reg_q_close\n"));
695 memcpy(&q_c
->pol
, hnd
, sizeof(q_c
->pol
));
698 /*******************************************************************
699 reads or writes a structure.
700 ********************************************************************/
702 BOOL
reg_io_q_close(const char *desc
, REG_Q_CLOSE
*q_u
, prs_struct
*ps
, int depth
)
707 prs_debug(ps
, depth
, desc
, "reg_io_q_close");
713 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
721 /*******************************************************************
722 reads or writes a structure.
723 ********************************************************************/
725 BOOL
reg_io_r_close(const char *desc
, REG_R_CLOSE
*r_u
, prs_struct
*ps
, int depth
)
730 prs_debug(ps
, depth
, desc
, "reg_io_r_close");
736 if(!smb_io_pol_hnd("", &r_u
->pol
, ps
, depth
))
741 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
747 /*******************************************************************
749 ********************************************************************/
751 void init_reg_q_set_key_sec(REG_Q_SET_KEY_SEC
*q_u
, POLICY_HND
*pol
,
752 uint32 sec_info
, SEC_DESC_BUF
*sec_desc_buf
)
754 memcpy(&q_u
->handle
, pol
, sizeof(q_u
->handle
));
756 q_u
->sec_info
= sec_info
;
759 init_buf_hdr(&q_u
->hdr_sec
, sec_desc_buf
->len
, sec_desc_buf
->len
);
760 q_u
->data
= sec_desc_buf
;
763 /*******************************************************************
764 reads or writes a structure.
765 ********************************************************************/
767 BOOL
reg_io_q_set_key_sec(const char *desc
, REG_Q_SET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
772 prs_debug(ps
, depth
, desc
, "reg_io_q_set_key_sec");
778 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
781 if(!prs_uint32("sec_info", ps
, depth
, &q_u
->sec_info
))
783 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
786 if(!reg_io_hdrbuf_sec(q_u
->ptr
, NULL
, &q_u
->hdr_sec
, q_u
->data
, ps
, depth
))
792 /*******************************************************************
793 reads or writes a structure.
794 ********************************************************************/
796 BOOL
reg_io_r_set_key_sec(const char *desc
, REG_R_SET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
801 prs_debug(ps
, depth
, desc
, "reg_io_r_set_key_sec");
807 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
814 /*******************************************************************
816 ********************************************************************/
818 void init_reg_q_get_key_sec(REG_Q_GET_KEY_SEC
*q_u
, POLICY_HND
*pol
,
819 uint32 sec_info
, uint32 sec_buf_size
,
822 memcpy(&q_u
->handle
, pol
, sizeof(q_u
->handle
));
824 q_u
->sec_info
= sec_info
;
826 q_u
->ptr
= psdb
!= NULL
? 1 : 0;
829 init_buf_hdr(&q_u
->hdr_sec
, sec_buf_size
, 0);
832 /*******************************************************************
833 reads or writes a structure.
834 ********************************************************************/
836 BOOL
reg_io_q_get_key_sec(const char *desc
, REG_Q_GET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
841 prs_debug(ps
, depth
, desc
, "reg_io_q_get_key_sec");
847 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
850 if(!prs_uint32("sec_info", ps
, depth
, &q_u
->sec_info
))
852 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
855 if(!reg_io_hdrbuf_sec(q_u
->ptr
, NULL
, &q_u
->hdr_sec
, q_u
->data
, ps
, depth
))
862 /*******************************************************************
864 ********************************************************************/
865 void init_reg_r_get_key_sec(REG_R_GET_KEY_SEC
*r_i
, POLICY_HND
*pol
,
866 uint32 buf_len
, uint8
*buf
,
870 init_buf_hdr(&r_i
->hdr_sec
, buf_len
, buf_len
);
871 init_sec_desc_buf(r_i
->data
, buf_len
, 1);
873 r_i
->status
= status
; /* 0x0000 0000 or 0x0000 007a */
877 /*******************************************************************
878 reads or writes a structure.
879 ********************************************************************/
881 BOOL
reg_io_r_get_key_sec(const char *desc
, REG_R_GET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
886 prs_debug(ps
, depth
, desc
, "reg_io_r_get_key_sec");
892 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
896 if(!smb_io_hdrbuf("", &q_u
->hdr_sec
, ps
, depth
))
898 if(!sec_io_desc_buf("", &q_u
->data
, ps
, depth
))
904 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
910 /*******************************************************************
912 ********************************************************************/
914 BOOL
init_reg_q_query_value(REG_Q_QUERY_VALUE
*q_u
, POLICY_HND
*pol
, const char *val_name
,
915 REGVAL_BUFFER
*value_output
)
922 init_unistr4(&q_u
->name
, val_name
, UNI_STR_TERMINATE
);
924 q_u
->ptr_reserved
= 1;
927 q_u
->ptr_bufsize
= 1;
928 q_u
->bufsize
= value_output
->buf_max_len
;
933 q_u
->buflen
= value_output
->buf_max_len
;
935 q_u
->ptr_buflen2
= 1;
941 /*******************************************************************
942 reads or writes a structure.
943 ********************************************************************/
945 BOOL
reg_io_q_query_value(const char *desc
, REG_Q_QUERY_VALUE
*q_u
, prs_struct
*ps
, int depth
)
950 prs_debug(ps
, depth
, desc
, "reg_io_q_query_value");
956 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
958 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
964 if(!prs_uint32("ptr_reserved", ps
, depth
, &(q_u
->ptr_reserved
)))
967 if(!prs_uint32("ptr_buf", ps
, depth
, &(q_u
->ptr_buf
)))
971 if(!prs_uint32("ptr_bufsize", ps
, depth
, &(q_u
->ptr_bufsize
)))
973 if(!prs_uint32("bufsize", ps
, depth
, &(q_u
->bufsize
)))
975 if(!prs_uint32("buf_unk", ps
, depth
, &(q_u
->buf_unk
)))
979 if(!prs_uint32("unk1", ps
, depth
, &(q_u
->unk1
)))
982 if(!prs_uint32("ptr_buflen", ps
, depth
, &(q_u
->ptr_buflen
)))
985 if (q_u
->ptr_buflen
) {
986 if(!prs_uint32("buflen", ps
, depth
, &(q_u
->buflen
)))
988 if(!prs_uint32("ptr_buflen2", ps
, depth
, &(q_u
->ptr_buflen2
)))
990 if(!prs_uint32("buflen2", ps
, depth
, &(q_u
->buflen2
)))
997 /*******************************************************************
999 New version to replace older init_reg_r_query_value()
1000 ********************************************************************/
1002 BOOL
init_reg_r_query_value(uint32 include_keyval
, REG_R_QUERY_VALUE
*r_u
,
1003 REGISTRY_VALUE
*val
, WERROR status
)
1011 r_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1015 *r_u
->type
= val
->type
;
1017 buf_len
= reg_init_regval_buffer( &buf2
, val
);
1019 r_u
->buf_max_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1020 if (!r_u
->buf_max_len
) {
1023 *r_u
->buf_max_len
= buf_len
;
1025 r_u
->buf_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1026 if (!r_u
->buf_len
) {
1029 *r_u
->buf_len
= buf_len
;
1031 /* if include_keyval is not set, don't send the key value, just
1032 the buflen data. probably used by NT5 to allocate buffer space - SK */
1034 if ( include_keyval
) {
1035 r_u
->value
= TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER
);
1039 /* steal the memory */
1043 r_u
->status
= status
;
1048 /*******************************************************************
1049 reads or writes a structure.
1050 ********************************************************************/
1052 BOOL
reg_io_r_query_value(const char *desc
, REG_R_QUERY_VALUE
*r_u
, prs_struct
*ps
, int depth
)
1057 prs_debug(ps
, depth
, desc
, "reg_io_r_query_value");
1063 if ( !prs_pointer("type", ps
, depth
, (void**)&r_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1066 if ( !prs_pointer("value", ps
, depth
, (void**)&r_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1071 if ( !prs_pointer("buf_max_len", ps
, depth
, (void**)&r_u
->buf_max_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1073 if ( !prs_pointer("buf_len", ps
, depth
, (void**)&r_u
->buf_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1076 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1082 /*******************************************************************
1084 ********************************************************************/
1086 void init_reg_q_enum_val(REG_Q_ENUM_VALUE
*q_u
, POLICY_HND
*pol
,
1088 uint32 max_name_len
, uint32 max_buf_len
)
1092 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1094 q_u
->val_index
= val_idx
;
1096 q_u
->name
.size
= max_name_len
*2;
1097 q_u
->name
.string
= TALLOC_ZERO_P( get_talloc_ctx(), UNISTR2
);
1098 if (!q_u
->name
.string
) {
1099 smb_panic("init_reg_q_enum_val: talloc fail\n");
1102 q_u
->name
.string
->uni_max_len
= max_name_len
;
1104 q_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1106 smb_panic("init_reg_q_enum_val: talloc fail\n");
1111 q_u
->value
= TALLOC_ZERO_P( get_talloc_ctx(), REGVAL_BUFFER
);
1113 smb_panic("init_reg_q_enum_val: talloc fail\n");
1117 q_u
->value
->buf_max_len
= max_buf_len
;
1119 q_u
->buffer_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1120 if (!q_u
->buffer_len
) {
1121 smb_panic("init_reg_q_enum_val: talloc fail\n");
1124 *q_u
->buffer_len
= max_buf_len
;
1126 q_u
->name_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1127 if (!q_u
->name_len
) {
1128 smb_panic("init_reg_q_enum_val: talloc fail\n");
1131 *q_u
->name_len
= 0x0;
1134 /*******************************************************************
1136 ********************************************************************/
1138 void init_reg_r_enum_val(REG_R_ENUM_VALUE
*r_u
, REGISTRY_VALUE
*val
)
1146 DEBUG(10,("init_reg_r_enum_val: Valuename => [%s]\n", val
->valuename
));
1148 init_unistr4( &r_u
->name
, val
->valuename
, UNI_STR_TERMINATE
);
1152 r_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1154 smb_panic("init_reg_r_enum_val: talloc fail\n");
1157 *r_u
->type
= val
->type
;
1159 /* REG_SZ & REG_MULTI_SZ must be converted to UNICODE */
1161 r_u
->value
= TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER
);
1163 smb_panic("init_reg_r_enum_val: talloc fail\n");
1166 real_size
= reg_init_regval_buffer( r_u
->value
, val
);
1170 r_u
->buffer_len1
= TALLOC_P( get_talloc_ctx(), uint32
);
1171 if (!r_u
->buffer_len1
) {
1172 smb_panic("init_reg_r_enum_val: talloc fail\n");
1175 *r_u
->buffer_len1
= real_size
;
1176 r_u
->buffer_len2
= TALLOC_P( get_talloc_ctx(), uint32
);
1177 if (!r_u
->buffer_len2
) {
1178 smb_panic("init_reg_r_enum_val: talloc fail\n");
1181 *r_u
->buffer_len2
= real_size
;
1184 /*******************************************************************
1185 reads or writes a structure.
1186 ********************************************************************/
1188 BOOL
reg_io_q_enum_val(const char *desc
, REG_Q_ENUM_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1193 prs_debug(ps
, depth
, desc
, "reg_io_q_enum_val");
1199 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1202 if(!prs_uint32("val_index", ps
, depth
, &q_u
->val_index
))
1205 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1210 if(!prs_pointer("type", ps
, depth
, (void**)&q_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1213 if ( !prs_pointer("value", ps
, depth
, (void**)&q_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1218 if(!prs_pointer("buffer_len", ps
, depth
, (void**)&q_u
->buffer_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1220 if(!prs_pointer("name_len", ps
, depth
, (void**)&q_u
->name_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1226 /*******************************************************************
1227 reads or writes a structure.
1228 ********************************************************************/
1230 BOOL
reg_io_r_enum_val(const char *desc
, REG_R_ENUM_VALUE
*r_u
, prs_struct
*ps
, int depth
)
1235 prs_debug(ps
, depth
, desc
, "reg_io_r_enum_val");
1241 if(!prs_unistr4("name", ps
, depth
, &r_u
->name
))
1246 if(!prs_pointer("type", ps
, depth
, (void**)&r_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1249 if ( !prs_pointer("value", ps
, depth
, (void**)&r_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1254 if(!prs_pointer("buffer_len1", ps
, depth
, (void**)&r_u
->buffer_len1
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1256 if(!prs_pointer("buffer_len2", ps
, depth
, (void**)&r_u
->buffer_len2
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1259 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1265 /*******************************************************************
1267 ********************************************************************/
1269 void init_reg_q_set_val(REG_Q_SET_VALUE
*q_u
, POLICY_HND
*pol
,
1270 char *val_name
, uint32 type
,
1275 memcpy(&q_u
->handle
, pol
, sizeof(q_u
->handle
));
1277 init_unistr4(&q_u
->name
, val_name
, UNI_STR_TERMINATE
);
1281 q_u
->size
= val
->buf_len
;
1284 /*******************************************************************
1285 reads or writes a structure.
1286 ********************************************************************/
1288 BOOL
reg_io_q_set_value(const char *desc
, REG_Q_SET_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1293 prs_debug(ps
, depth
, desc
, "reg_io_q_set_value");
1299 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
1302 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1307 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
1310 if(!smb_io_rpc_blob("value", &q_u
->value
, ps
, depth
))
1315 if(!prs_uint32("size", ps
, depth
, &q_u
->size
))
1321 /*******************************************************************
1322 reads or writes a structure.
1323 ********************************************************************/
1325 BOOL
reg_io_r_set_value(const char *desc
, REG_R_SET_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1330 prs_debug(ps
, depth
, desc
, "reg_io_r_set_value");
1336 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
1342 /*******************************************************************
1344 ********************************************************************/
1346 void init_reg_q_enum_key(REG_Q_ENUM_KEY
*q_u
, POLICY_HND
*pol
, uint32 key_idx
)
1348 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1350 q_u
->key_index
= key_idx
;
1351 q_u
->key_name_len
= 0;
1352 q_u
->unknown_1
= 0x0414;
1355 q_u
->unknown_2
= 0x0000020A;
1356 memset(q_u
->pad1
, 0, sizeof(q_u
->pad1
));
1359 memset(q_u
->pad2
, 0, sizeof(q_u
->pad2
));
1362 unix_to_nt_time(&q_u
->time
, 0); /* current time? */
1365 /*******************************************************************
1366 makes a reply structure.
1367 ********************************************************************/
1369 void init_reg_r_enum_key(REG_R_ENUM_KEY
*r_u
, char *subkey
)
1374 init_unistr4( &r_u
->keyname
, subkey
, UNI_STR_TERMINATE
);
1375 r_u
->classname
= TALLOC_ZERO_P( get_talloc_ctx(), UNISTR4
);
1376 if (!r_u
->classname
) {
1377 smb_panic("init_reg_r_enum_key: talloc fail\n");
1380 r_u
->time
= TALLOC_ZERO_P( get_talloc_ctx(), NTTIME
);
1382 smb_panic("init_reg_r_enum_key: talloc fail\n");
1387 /*******************************************************************
1388 reads or writes a structure.
1389 ********************************************************************/
1391 BOOL
reg_io_q_enum_key(const char *desc
, REG_Q_ENUM_KEY
*q_u
, prs_struct
*ps
, int depth
)
1396 prs_debug(ps
, depth
, desc
, "reg_io_q_enum_key");
1402 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1405 if(!prs_uint32("key_index", ps
, depth
, &q_u
->key_index
))
1407 if(!prs_uint16("key_name_len", ps
, depth
, &q_u
->key_name_len
))
1409 if(!prs_uint16("unknown_1", ps
, depth
, &q_u
->unknown_1
))
1412 if(!prs_uint32("ptr1", ps
, depth
, &q_u
->ptr1
))
1415 if (q_u
->ptr1
!= 0) {
1416 if(!prs_uint32("unknown_2", ps
, depth
, &q_u
->unknown_2
))
1418 if(!prs_uint8s(False
, "pad1", ps
, depth
, q_u
->pad1
, sizeof(q_u
->pad1
)))
1422 if(!prs_uint32("ptr2", ps
, depth
, &q_u
->ptr2
))
1425 if (q_u
->ptr2
!= 0) {
1426 if(!prs_uint8s(False
, "pad2", ps
, depth
, q_u
->pad2
, sizeof(q_u
->pad2
)))
1430 if(!prs_uint32("ptr3", ps
, depth
, &q_u
->ptr3
))
1433 if (q_u
->ptr3
!= 0) {
1434 if(!smb_io_time("", &q_u
->time
, ps
, depth
))
1441 /*******************************************************************
1442 reads or writes a structure.
1443 ********************************************************************/
1445 BOOL
reg_io_r_enum_key(const char *desc
, REG_R_ENUM_KEY
*q_u
, prs_struct
*ps
, int depth
)
1450 prs_debug(ps
, depth
, desc
, "reg_io_r_enum_key");
1455 if ( !prs_unistr4( "keyname", ps
, depth
, &q_u
->keyname
) )
1460 if (!prs_pointer("class", ps
, depth
, (void**)&q_u
->classname
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1465 if (!prs_pointer("time", ps
, depth
, (void**)&q_u
->time
, sizeof(NTTIME
), (PRS_POINTER_CAST
)smb_io_nttime
))
1470 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
1476 /*******************************************************************
1478 ********************************************************************/
1480 void init_reg_q_open_entry(REG_Q_OPEN_ENTRY
*q_u
, POLICY_HND
*pol
,
1481 char *key_name
, uint32 access_desired
)
1483 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1485 init_unistr4(&q_u
->name
, key_name
, UNI_STR_TERMINATE
);
1487 q_u
->unknown_0
= 0x00000000;
1488 q_u
->access
= access_desired
;
1491 /*******************************************************************
1492 reads or writes a structure.
1493 ********************************************************************/
1495 BOOL
reg_io_q_open_entry(const char *desc
, REG_Q_OPEN_ENTRY
*q_u
, prs_struct
*ps
, int depth
)
1500 prs_debug(ps
, depth
, desc
, "reg_io_q_open_entry");
1506 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1508 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1514 if(!prs_uint32("unknown_0 ", ps
, depth
, &q_u
->unknown_0
))
1516 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
1522 /*******************************************************************
1523 reads or writes a structure.
1524 ********************************************************************/
1526 BOOL
reg_io_r_open_entry(const char *desc
, REG_R_OPEN_ENTRY
*r_u
, prs_struct
*ps
, int depth
)
1531 prs_debug(ps
, depth
, desc
, "reg_io_r_open_entry");
1537 if(!smb_io_pol_hnd("handle", &r_u
->handle
, ps
, depth
))
1540 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1546 /*******************************************************************
1548 ********************************************************************/
1550 void init_reg_q_shutdown(REG_Q_SHUTDOWN
*q_u
, const char *msg
,
1551 uint32 timeout
, BOOL do_reboot
, BOOL force
)
1553 q_u
->server
= TALLOC_P( get_talloc_ctx(), uint16
);
1555 smb_panic("init_reg_q_shutdown: talloc fail\n");
1560 q_u
->message
= TALLOC_ZERO_P( get_talloc_ctx(), UNISTR4
);
1561 if (!q_u
->message
) {
1562 smb_panic("init_reg_q_shutdown: talloc fail\n");
1566 if ( msg
&& *msg
) {
1567 init_unistr4( q_u
->message
, msg
, UNI_FLAGS_NONE
);
1569 /* Win2000 is apparently very sensitive to these lengths */
1570 /* do a special case here */
1572 q_u
->message
->string
->uni_max_len
++;
1573 q_u
->message
->size
+= 2;
1577 q_u
->timeout
= timeout
;
1579 q_u
->reboot
= do_reboot
? 1 : 0;
1580 q_u
->force
= force
? 1 : 0;
1583 /*******************************************************************
1584 Inits a REG_Q_SHUTDOWN_EX structure.
1585 ********************************************************************/
1587 void init_reg_q_shutdown_ex(REG_Q_SHUTDOWN_EX
* q_u_ex
, const char *msg
,
1588 uint32 timeout
, BOOL do_reboot
, BOOL force
, uint32 reason
)
1594 init_reg_q_shutdown( &q_u
, msg
, timeout
, do_reboot
, force
);
1598 q_u_ex
->server
= q_u
.server
;
1599 q_u_ex
->message
= q_u
.message
;
1601 q_u_ex
->reboot
= q_u
.reboot
;
1602 q_u_ex
->force
= q_u
.force
;
1604 q_u_ex
->reason
= reason
;
1607 /*******************************************************************
1608 reads or writes a structure.
1609 ********************************************************************/
1611 BOOL
reg_io_q_shutdown(const char *desc
, REG_Q_SHUTDOWN
*q_u
, prs_struct
*ps
,
1617 prs_debug(ps
, depth
, desc
, "reg_io_q_shutdown");
1623 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1628 if (!prs_pointer("message", ps
, depth
, (void**)&q_u
->message
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1634 if (!prs_uint32("timeout", ps
, depth
, &(q_u
->timeout
)))
1637 if (!prs_uint8("force ", ps
, depth
, &(q_u
->force
)))
1639 if (!prs_uint8("reboot ", ps
, depth
, &(q_u
->reboot
)))
1646 /*******************************************************************
1647 reads or writes a structure.
1648 ********************************************************************/
1649 BOOL
reg_io_r_shutdown(const char *desc
, REG_R_SHUTDOWN
*r_u
, prs_struct
*ps
,
1655 prs_debug(ps
, depth
, desc
, "reg_io_r_shutdown");
1661 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1667 /*******************************************************************
1668 reads or writes a REG_Q_SHUTDOWN_EX structure.
1669 ********************************************************************/
1671 BOOL
reg_io_q_shutdown_ex(const char *desc
, REG_Q_SHUTDOWN_EX
*q_u
, prs_struct
*ps
,
1677 prs_debug(ps
, depth
, desc
, "reg_io_q_shutdown_ex");
1683 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1688 if (!prs_pointer("message", ps
, depth
, (void**)&q_u
->message
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1694 if (!prs_uint32("timeout", ps
, depth
, &(q_u
->timeout
)))
1697 if (!prs_uint8("force ", ps
, depth
, &(q_u
->force
)))
1699 if (!prs_uint8("reboot ", ps
, depth
, &(q_u
->reboot
)))
1704 if (!prs_uint32("reason", ps
, depth
, &(q_u
->reason
)))
1711 /*******************************************************************
1712 reads or writes a REG_R_SHUTDOWN_EX structure.
1713 ********************************************************************/
1714 BOOL
reg_io_r_shutdown_ex(const char *desc
, REG_R_SHUTDOWN_EX
*r_u
, prs_struct
*ps
,
1720 prs_debug(ps
, depth
, desc
, "reg_io_r_shutdown_ex");
1726 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1732 /*******************************************************************
1734 ********************************************************************/
1736 void init_reg_q_abort_shutdown(REG_Q_ABORT_SHUTDOWN
*q_u
)
1738 q_u
->server
= TALLOC_P( get_talloc_ctx(), uint16
);
1740 smb_panic("init_reg_q_abort_shutdown: talloc fail\n");
1746 /*******************************************************************
1747 reads or writes a structure.
1748 ********************************************************************/
1750 BOOL
reg_io_q_abort_shutdown(const char *desc
, REG_Q_ABORT_SHUTDOWN
*q_u
,
1751 prs_struct
*ps
, int depth
)
1756 prs_debug(ps
, depth
, desc
, "reg_io_q_abort_shutdown");
1762 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1770 /*******************************************************************
1771 reads or writes a structure.
1772 ********************************************************************/
1773 BOOL
reg_io_r_abort_shutdown(const char *desc
, REG_R_ABORT_SHUTDOWN
*r_u
,
1774 prs_struct
*ps
, int depth
)
1779 prs_debug(ps
, depth
, desc
, "reg_io_r_abort_shutdown");
1785 if (!prs_werror("status", ps
, depth
, &r_u
->status
))