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 static 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
);
59 q_o
->access
= access_desired
;
62 /*******************************************************************
63 Marshalls a hive connect request
64 ********************************************************************/
66 BOOL
reg_io_q_open_hive(const char *desc
, REG_Q_OPEN_HIVE
*q_u
,
67 prs_struct
*ps
, int depth
)
69 prs_debug(ps
, depth
, desc
, "reg_io_q_open_hive");
75 if(!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
80 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
87 /*******************************************************************
88 Unmarshalls a hive connect response
89 ********************************************************************/
91 BOOL
reg_io_r_open_hive(const char *desc
, REG_R_OPEN_HIVE
*r_u
,
92 prs_struct
*ps
, int depth
)
97 prs_debug(ps
, depth
, desc
, "reg_io_r_open_hive");
103 if(!smb_io_pol_hnd("", &r_u
->pol
, ps
, depth
))
106 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
112 /*******************************************************************
114 ********************************************************************/
116 void init_reg_q_flush_key(REG_Q_FLUSH_KEY
*q_u
, POLICY_HND
*pol
)
118 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
121 /*******************************************************************
122 reads or writes a structure.
123 ********************************************************************/
125 BOOL
reg_io_q_flush_key(const char *desc
, REG_Q_FLUSH_KEY
*q_u
, prs_struct
*ps
, int depth
)
130 prs_debug(ps
, depth
, desc
, "reg_io_q_flush_key");
136 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
142 /*******************************************************************
143 Unmarshalls a registry key flush response
144 ********************************************************************/
146 BOOL
reg_io_r_flush_key(const char *desc
, REG_R_FLUSH_KEY
*r_u
,
147 prs_struct
*ps
, int depth
)
152 prs_debug(ps
, depth
, desc
, "reg_io_r_flush_key");
158 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
164 /*******************************************************************
165 reads or writes SEC_DESC_BUF and SEC_DATA structures.
166 ********************************************************************/
168 static BOOL
reg_io_hdrbuf_sec(uint32 ptr
, uint32
*ptr3
, BUFHDR
*hdr_sec
,
169 SEC_DESC_BUF
*data
, prs_struct
*ps
, int depth
)
174 if(!smb_io_hdrbuf_pre("hdr_sec", hdr_sec
, ps
, depth
,
178 old_offset
= prs_offset(ps
);
181 if(!prs_uint32("ptr3", ps
, depth
, ptr3
))
185 if (ptr3
== NULL
|| *ptr3
!= 0) {
186 /* JRA - this next line is probably wrong... */
187 if(!sec_io_desc_buf("data ", &data
, ps
, depth
))
191 if(!smb_io_hdrbuf_post("hdr_sec", hdr_sec
, ps
, depth
,
192 hdr_offset
, data
->max_len
, data
->len
))
194 if(!prs_set_offset(ps
, old_offset
+ data
->len
+
195 sizeof(uint32
) * ((ptr3
!= NULL
) ? 5 : 3)))
205 /*******************************************************************
206 Inits a registry key create request
207 ********************************************************************/
209 void init_reg_q_create_key(REG_Q_CREATE_KEY
*q_c
, POLICY_HND
*hnd
,
210 char *name
, char *class, uint32 access_desired
,
211 SEC_DESC_BUF
*sec_buf
)
215 memcpy(&q_c
->handle
, hnd
, sizeof(q_c
->handle
));
218 init_unistr4( &q_c
->name
, name
, UNI_STR_TERMINATE
);
219 init_unistr4( &q_c
->class, class, UNI_STR_TERMINATE
);
221 q_c
->access
= access_desired
;
223 q_c
->sec_info
= TALLOC_P( get_talloc_ctx(), uint32
);
224 *q_c
->sec_info
= DACL_SECURITY_INFORMATION
| SACL_SECURITY_INFORMATION
;
228 init_buf_hdr(&q_c
->hdr_sec
, sec_buf
->len
, sec_buf
->len
);
230 q_c
->unknown_2
= 0x00000000;
233 /*******************************************************************
234 Marshalls a registry key create request
235 ********************************************************************/
237 BOOL
reg_io_q_create_key(const char *desc
, REG_Q_CREATE_KEY
*q_u
,
238 prs_struct
*ps
, int depth
)
243 prs_debug(ps
, depth
, desc
, "reg_io_q_create_key");
249 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
252 if(!prs_unistr4 ("name", ps
, depth
, &q_u
->name
))
257 if(!prs_unistr4 ("class", ps
, depth
, &q_u
->class))
262 if(!prs_uint32("reserved", ps
, depth
, &q_u
->reserved
))
264 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
267 if(!prs_pointer("sec_info", ps
, depth
, (void**)&q_u
->sec_info
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
270 if(!prs_uint32("ptr2", ps
, depth
, &q_u
->ptr2
))
272 if(!reg_io_hdrbuf_sec(q_u
->ptr2
, &q_u
->ptr3
, &q_u
->hdr_sec
, q_u
->data
,
277 if(!prs_uint32("unknown_2", ps
, depth
, &q_u
->unknown_2
))
284 /*******************************************************************
285 Unmarshalls a registry key create response
286 ********************************************************************/
288 BOOL
reg_io_r_create_key(const char *desc
, REG_R_CREATE_KEY
*r_u
,
289 prs_struct
*ps
, int depth
)
294 prs_debug(ps
, depth
, desc
, "reg_io_r_create_key");
300 if(!smb_io_pol_hnd("", &r_u
->key_pol
, ps
, depth
))
302 if(!prs_uint32("unknown", ps
, depth
, &r_u
->unknown
))
305 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
312 /*******************************************************************
314 ********************************************************************/
316 void init_reg_q_delete_val(REG_Q_DELETE_VALUE
*q_c
, POLICY_HND
*hnd
,
321 memcpy(&q_c
->handle
, hnd
, sizeof(q_c
->handle
));
322 init_unistr4(&q_c
->name
, name
, UNI_STR_TERMINATE
);
325 /*******************************************************************
326 reads or writes a structure.
327 ********************************************************************/
329 BOOL
reg_io_q_delete_value(const char *desc
, REG_Q_DELETE_VALUE
*q_u
,
330 prs_struct
*ps
, int depth
)
335 prs_debug(ps
, depth
, desc
, "reg_io_q_delete_value");
341 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
344 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
353 /*******************************************************************
354 reads or writes a structure.
355 ********************************************************************/
357 BOOL
reg_io_r_delete_value(const char *desc
, REG_R_DELETE_VALUE
*r_u
,
358 prs_struct
*ps
, int depth
)
363 prs_debug(ps
, depth
, desc
, "reg_io_r_delete_value");
369 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
375 /*******************************************************************
377 ********************************************************************/
379 void init_reg_q_delete_key(REG_Q_DELETE_KEY
*q_c
, POLICY_HND
*hnd
,
384 memcpy(&q_c
->handle
, hnd
, sizeof(q_c
->handle
));
386 init_unistr4(&q_c
->name
, name
, UNI_STR_TERMINATE
);
389 /*******************************************************************
390 reads or writes a structure.
391 ********************************************************************/
393 BOOL
reg_io_q_delete_key(const char *desc
, REG_Q_DELETE_KEY
*q_u
,
394 prs_struct
*ps
, int depth
)
399 prs_debug(ps
, depth
, desc
, "reg_io_q_delete_key");
405 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
408 if(!prs_unistr4("", ps
, depth
, &q_u
->name
))
416 /*******************************************************************
417 reads or writes a structure.
418 ********************************************************************/
420 BOOL
reg_io_r_delete_key(const char *desc
, REG_R_DELETE_KEY
*r_u
, prs_struct
*ps
, int depth
)
425 prs_debug(ps
, depth
, desc
, "reg_io_r_delete_key");
431 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
437 /*******************************************************************
439 ********************************************************************/
441 void init_reg_q_query_key(REG_Q_QUERY_KEY
*q_o
, POLICY_HND
*hnd
, const char *class)
445 memcpy(&q_o
->pol
, hnd
, sizeof(q_o
->pol
));
446 init_unistr4(&q_o
->class, class, UNI_STR_TERMINATE
);
449 /*******************************************************************
450 reads or writes a structure.
451 ********************************************************************/
453 BOOL
reg_io_q_query_key(const char *desc
, REG_Q_QUERY_KEY
*q_u
, prs_struct
*ps
, int depth
)
458 prs_debug(ps
, depth
, desc
, "reg_io_q_query_key");
464 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
466 if(!prs_unistr4("class", ps
, depth
, &q_u
->class))
476 /*******************************************************************
477 reads or writes a structure.
478 ********************************************************************/
480 BOOL
reg_io_r_query_key(const char *desc
, REG_R_QUERY_KEY
*r_u
, prs_struct
*ps
, int depth
)
485 prs_debug(ps
, depth
, desc
, "reg_io_r_query_key");
491 if(!prs_unistr4("class", ps
, depth
, &r_u
->class))
497 if(!prs_uint32("num_subkeys ", ps
, depth
, &r_u
->num_subkeys
))
499 if(!prs_uint32("max_subkeylen ", ps
, depth
, &r_u
->max_subkeylen
))
501 if(!prs_uint32("reserved ", ps
, depth
, &r_u
->reserved
))
503 if(!prs_uint32("num_values ", ps
, depth
, &r_u
->num_values
))
505 if(!prs_uint32("max_valnamelen", ps
, depth
, &r_u
->max_valnamelen
))
507 if(!prs_uint32("max_valbufsize", ps
, depth
, &r_u
->max_valbufsize
))
509 if(!prs_uint32("sec_desc ", ps
, depth
, &r_u
->sec_desc
))
511 if(!smb_io_time("mod_time ", &r_u
->mod_time
, ps
, depth
))
514 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
520 /*******************************************************************
522 ********************************************************************/
524 void init_reg_q_getversion(REG_Q_GETVERSION
*q_o
, POLICY_HND
*hnd
)
526 memcpy(&q_o
->pol
, hnd
, sizeof(q_o
->pol
));
530 /*******************************************************************
531 reads or writes a structure.
532 ********************************************************************/
534 BOOL
reg_io_q_getversion(const char *desc
, REG_Q_GETVERSION
*q_u
, prs_struct
*ps
, int depth
)
539 prs_debug(ps
, depth
, desc
, "reg_io_q_getversion");
545 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
551 /*******************************************************************
552 reads or writes a structure.
553 ********************************************************************/
555 BOOL
reg_io_r_getversion(const char *desc
, REG_R_GETVERSION
*r_u
, prs_struct
*ps
, int depth
)
560 prs_debug(ps
, depth
, desc
, "reg_io_r_getversion");
566 if(!prs_uint32("win_version", ps
, depth
, &r_u
->win_version
))
568 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
575 /*******************************************************************
576 reads or writes a structure.
577 ********************************************************************/
579 BOOL
reg_io_q_restore_key(const char *desc
, REG_Q_RESTORE_KEY
*q_u
, prs_struct
*ps
, int depth
)
584 prs_debug(ps
, depth
, desc
, "reg_io_q_restore_key");
590 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
593 if(!prs_unistr4("filename", ps
, depth
, &q_u
->filename
))
596 if(!prs_uint32("flags", ps
, depth
, &q_u
->flags
))
602 /*******************************************************************
603 reads or writes a structure.
604 ********************************************************************/
606 BOOL
reg_io_r_restore_key(const char *desc
, REG_R_RESTORE_KEY
*r_u
, prs_struct
*ps
, int depth
)
611 prs_debug(ps
, depth
, desc
, "reg_io_r_restore_key");
617 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
623 /*******************************************************************
624 ********************************************************************/
626 void init_q_reg_save_key( REG_Q_SAVE_KEY
*q_u
, POLICY_HND
*handle
, const char *fname
)
628 memcpy(&q_u
->pol
, handle
, sizeof(q_u
->pol
));
629 init_unistr4( &q_u
->filename
, fname
, UNI_STR_TERMINATE
);
630 q_u
->sec_attr
= NULL
;
633 /*******************************************************************
634 reads or writes a structure.
635 ********************************************************************/
637 BOOL
reg_io_q_save_key(const char *desc
, REG_Q_SAVE_KEY
*q_u
, prs_struct
*ps
, int depth
)
642 prs_debug(ps
, depth
, desc
, "reg_io_q_save_key");
648 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
651 if(!prs_unistr4("filename", ps
, depth
, &q_u
->filename
))
654 #if 0 /* reg_io_sec_attr() */
655 if(!prs_uint32("unknown", ps
, depth
, &q_u
->unknown
))
662 /*******************************************************************
663 reads or writes a structure.
664 ********************************************************************/
666 BOOL
reg_io_r_save_key(const char *desc
, REG_R_SAVE_KEY
*r_u
, prs_struct
*ps
, int depth
)
671 prs_debug(ps
, depth
, desc
, "reg_io_r_save_key");
677 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
683 /*******************************************************************
684 Inits an REG_Q_CLOSE structure.
685 ********************************************************************/
687 void init_reg_q_close(REG_Q_CLOSE
*q_c
, POLICY_HND
*hnd
)
689 DEBUG(5,("init_reg_q_close\n"));
691 memcpy(&q_c
->pol
, hnd
, sizeof(q_c
->pol
));
694 /*******************************************************************
695 reads or writes a structure.
696 ********************************************************************/
698 BOOL
reg_io_q_close(const char *desc
, REG_Q_CLOSE
*q_u
, prs_struct
*ps
, int depth
)
703 prs_debug(ps
, depth
, desc
, "reg_io_q_close");
709 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
717 /*******************************************************************
718 reads or writes a structure.
719 ********************************************************************/
721 BOOL
reg_io_r_close(const char *desc
, REG_R_CLOSE
*r_u
, prs_struct
*ps
, int depth
)
726 prs_debug(ps
, depth
, desc
, "reg_io_r_close");
732 if(!smb_io_pol_hnd("", &r_u
->pol
, ps
, depth
))
737 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
743 /*******************************************************************
745 ********************************************************************/
747 void init_reg_q_set_key_sec(REG_Q_SET_KEY_SEC
*q_u
, POLICY_HND
*pol
,
748 uint32 sec_info
, SEC_DESC_BUF
*sec_desc_buf
)
750 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
752 q_u
->sec_info
= sec_info
;
755 init_buf_hdr(&q_u
->hdr_sec
, sec_desc_buf
->len
, sec_desc_buf
->len
);
756 q_u
->data
= sec_desc_buf
;
759 /*******************************************************************
760 reads or writes a structure.
761 ********************************************************************/
763 BOOL
reg_io_q_set_key_sec(const char *desc
, REG_Q_SET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
768 prs_debug(ps
, depth
, desc
, "reg_io_q_set_key_sec");
774 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
777 if(!prs_uint32("sec_info", ps
, depth
, &q_u
->sec_info
))
779 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
782 if(!reg_io_hdrbuf_sec(q_u
->ptr
, NULL
, &q_u
->hdr_sec
, q_u
->data
, ps
, depth
))
788 /*******************************************************************
789 reads or writes a structure.
790 ********************************************************************/
792 BOOL
reg_io_r_set_key_sec(const char *desc
, REG_R_SET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
797 prs_debug(ps
, depth
, desc
, "reg_io_r_set_key_sec");
803 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
810 /*******************************************************************
812 ********************************************************************/
814 void init_reg_q_get_key_sec(REG_Q_GET_KEY_SEC
*q_u
, POLICY_HND
*pol
,
815 uint32 sec_info
, uint32 sec_buf_size
,
818 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
820 q_u
->sec_info
= sec_info
;
822 q_u
->ptr
= psdb
!= NULL
? 1 : 0;
825 init_buf_hdr(&q_u
->hdr_sec
, sec_buf_size
, 0);
828 /*******************************************************************
829 reads or writes a structure.
830 ********************************************************************/
832 BOOL
reg_io_q_get_key_sec(const char *desc
, REG_Q_GET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
837 prs_debug(ps
, depth
, desc
, "reg_io_q_get_key_sec");
843 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
846 if(!prs_uint32("sec_info", ps
, depth
, &q_u
->sec_info
))
848 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
851 if(!reg_io_hdrbuf_sec(q_u
->ptr
, NULL
, &q_u
->hdr_sec
, q_u
->data
, ps
, depth
))
858 /*******************************************************************
860 ********************************************************************/
861 void init_reg_r_get_key_sec(REG_R_GET_KEY_SEC
*r_i
, POLICY_HND
*pol
,
862 uint32 buf_len
, uint8
*buf
,
866 init_buf_hdr(&r_i
->hdr_sec
, buf_len
, buf_len
);
867 init_sec_desc_buf(r_i
->data
, buf_len
, 1);
869 r_i
->status
= status
; /* 0x0000 0000 or 0x0000 007a */
873 /*******************************************************************
874 reads or writes a structure.
875 ********************************************************************/
877 BOOL
reg_io_r_get_key_sec(const char *desc
, REG_R_GET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
882 prs_debug(ps
, depth
, desc
, "reg_io_r_get_key_sec");
888 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
892 if(!smb_io_hdrbuf("", &q_u
->hdr_sec
, ps
, depth
))
894 if(!sec_io_desc_buf("", &q_u
->data
, ps
, depth
))
900 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
906 /*******************************************************************
908 ********************************************************************/
910 BOOL
init_reg_q_info(REG_Q_INFO
*q_u
, POLICY_HND
*pol
, const char *val_name
,
911 REGVAL_BUFFER
*value_output
)
918 init_unistr4(&q_u
->name
, val_name
, UNI_STR_TERMINATE
);
920 q_u
->ptr_reserved
= 1;
923 q_u
->ptr_bufsize
= 1;
924 q_u
->bufsize
= value_output
->buf_max_len
;
929 q_u
->buflen
= value_output
->buf_max_len
;
931 q_u
->ptr_buflen2
= 1;
937 /*******************************************************************
938 reads or writes a structure.
939 ********************************************************************/
941 BOOL
reg_io_q_info(const char *desc
, REG_Q_INFO
*q_u
, prs_struct
*ps
, int depth
)
946 prs_debug(ps
, depth
, desc
, "reg_io_q_info");
952 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
954 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
960 if(!prs_uint32("ptr_reserved", ps
, depth
, &(q_u
->ptr_reserved
)))
963 if(!prs_uint32("ptr_buf", ps
, depth
, &(q_u
->ptr_buf
)))
967 if(!prs_uint32("ptr_bufsize", ps
, depth
, &(q_u
->ptr_bufsize
)))
969 if(!prs_uint32("bufsize", ps
, depth
, &(q_u
->bufsize
)))
971 if(!prs_uint32("buf_unk", ps
, depth
, &(q_u
->buf_unk
)))
975 if(!prs_uint32("unk1", ps
, depth
, &(q_u
->unk1
)))
978 if(!prs_uint32("ptr_buflen", ps
, depth
, &(q_u
->ptr_buflen
)))
981 if (q_u
->ptr_buflen
) {
982 if(!prs_uint32("buflen", ps
, depth
, &(q_u
->buflen
)))
984 if(!prs_uint32("ptr_buflen2", ps
, depth
, &(q_u
->ptr_buflen2
)))
986 if(!prs_uint32("buflen2", ps
, depth
, &(q_u
->buflen2
)))
993 /*******************************************************************
995 New version to replace older init_reg_r_info()
996 ********************************************************************/
998 BOOL
init_reg_r_info(uint32 include_keyval
, REG_R_INFO
*r_u
,
999 REGISTRY_VALUE
*val
, WERROR status
)
1007 r_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1008 *r_u
->type
= val
->type
;
1010 buf_len
= reg_init_regval_buffer( &buf2
, val
);
1012 r_u
->buf_max_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1013 *r_u
->buf_max_len
= buf_len
;
1015 r_u
->buf_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1016 *r_u
->buf_len
= buf_len
;
1018 /* if include_keyval is not set, don't send the key value, just
1019 the buflen data. probably used by NT5 to allocate buffer space - SK */
1021 if ( include_keyval
) {
1022 r_u
->value
= TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER
);
1023 /* steal the memory */
1027 r_u
->status
= status
;
1032 /*******************************************************************
1033 reads or writes a structure.
1034 ********************************************************************/
1036 BOOL
reg_io_r_info(const char *desc
, REG_R_INFO
*r_u
, prs_struct
*ps
, int depth
)
1041 prs_debug(ps
, depth
, desc
, "reg_io_r_info");
1047 if ( !prs_pointer("type", ps
, depth
, (void**)&r_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1050 if ( !prs_pointer("value", ps
, depth
, (void**)&r_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1055 if ( !prs_pointer("buf_max_len", ps
, depth
, (void**)&r_u
->buf_max_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1057 if ( !prs_pointer("buf_len", ps
, depth
, (void**)&r_u
->buf_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1060 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1066 /*******************************************************************
1068 ********************************************************************/
1070 void init_reg_q_enum_val(REG_Q_ENUM_VALUE
*q_u
, POLICY_HND
*pol
,
1072 uint32 max_name_len
, uint32 max_buf_len
)
1076 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1078 q_u
->val_index
= val_idx
;
1080 q_u
->name
.size
= max_name_len
*2;
1081 q_u
->name
.string
= TALLOC_ZERO_P( get_talloc_ctx(), UNISTR2
);
1082 q_u
->name
.string
->uni_max_len
= max_name_len
;
1084 q_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1087 q_u
->value
= TALLOC_ZERO_P( get_talloc_ctx(), REGVAL_BUFFER
);
1088 q_u
->value
->buf_max_len
= max_buf_len
;
1090 q_u
->buffer_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1091 *q_u
->buffer_len
= max_buf_len
;
1093 q_u
->name_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1094 *q_u
->name_len
= 0x0;
1097 /*******************************************************************
1099 ********************************************************************/
1101 void init_reg_r_enum_val(REG_R_ENUM_VALUE
*r_u
, REGISTRY_VALUE
*val
)
1109 DEBUG(10,("init_reg_r_enum_val: Valuename => [%s]\n", val
->valuename
));
1111 init_unistr4( &r_u
->name
, val
->valuename
, UNI_STR_TERMINATE
);
1115 r_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1116 *r_u
->type
= val
->type
;
1118 /* REG_SZ & REG_MULTI_SZ must be converted to UNICODE */
1120 r_u
->value
= TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER
);
1121 real_size
= reg_init_regval_buffer( r_u
->value
, val
);
1125 r_u
->buffer_len1
= TALLOC_P( get_talloc_ctx(), uint32
);
1126 *r_u
->buffer_len1
= real_size
;
1127 r_u
->buffer_len2
= TALLOC_P( get_talloc_ctx(), uint32
);
1128 *r_u
->buffer_len2
= real_size
;
1131 /*******************************************************************
1132 reads or writes a structure.
1133 ********************************************************************/
1135 BOOL
reg_io_q_enum_val(const char *desc
, REG_Q_ENUM_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1140 prs_debug(ps
, depth
, desc
, "reg_io_q_enum_val");
1146 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1149 if(!prs_uint32("val_index", ps
, depth
, &q_u
->val_index
))
1152 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1157 if(!prs_pointer("type", ps
, depth
, (void**)&q_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1160 if ( !prs_pointer("value", ps
, depth
, (void**)&q_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1165 if(!prs_pointer("buffer_len", ps
, depth
, (void**)&q_u
->buffer_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1167 if(!prs_pointer("name_len", ps
, depth
, (void**)&q_u
->name_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1173 /*******************************************************************
1174 reads or writes a structure.
1175 ********************************************************************/
1177 BOOL
reg_io_r_enum_val(const char *desc
, REG_R_ENUM_VALUE
*r_u
, prs_struct
*ps
, int depth
)
1182 prs_debug(ps
, depth
, desc
, "reg_io_r_enum_val");
1188 if(!prs_unistr4("name", ps
, depth
, &r_u
->name
))
1193 if(!prs_pointer("type", ps
, depth
, (void**)&r_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1196 if ( !prs_pointer("value", ps
, depth
, (void**)&r_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1201 if(!prs_pointer("buffer_len1", ps
, depth
, (void**)&r_u
->buffer_len1
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1203 if(!prs_pointer("buffer_len2", ps
, depth
, (void**)&r_u
->buffer_len2
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1206 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1212 /*******************************************************************
1214 ********************************************************************/
1216 void init_reg_q_set_val(REG_Q_SET_VALUE
*q_u
, POLICY_HND
*pol
,
1217 char *val_name
, uint32 type
,
1222 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1224 init_unistr4(&q_u
->name
, val_name
, UNI_STR_TERMINATE
);
1228 q_u
->size
= val
->buf_len
;
1231 /*******************************************************************
1232 reads or writes a structure.
1233 ********************************************************************/
1235 BOOL
reg_io_q_set_value(const char *desc
, REG_Q_SET_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1240 prs_debug(ps
, depth
, desc
, "reg_io_q_set_value");
1246 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1249 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1254 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
1257 if(!smb_io_rpc_blob("value", &q_u
->value
, ps
, depth
))
1262 if(!prs_uint32("size", ps
, depth
, &q_u
->size
))
1268 /*******************************************************************
1269 reads or writes a structure.
1270 ********************************************************************/
1272 BOOL
reg_io_r_set_value(const char *desc
, REG_R_SET_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1277 prs_debug(ps
, depth
, desc
, "reg_io_r_set_value");
1283 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
1289 /*******************************************************************
1291 ********************************************************************/
1293 void init_reg_q_enum_key(REG_Q_ENUM_KEY
*q_u
, POLICY_HND
*pol
, uint32 key_idx
)
1295 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1297 q_u
->key_index
= key_idx
;
1298 q_u
->key_name_len
= 0;
1299 q_u
->unknown_1
= 0x0414;
1302 q_u
->unknown_2
= 0x0000020A;
1303 memset(q_u
->pad1
, 0, sizeof(q_u
->pad1
));
1306 memset(q_u
->pad2
, 0, sizeof(q_u
->pad2
));
1309 unix_to_nt_time(&q_u
->time
, 0); /* current time? */
1312 /*******************************************************************
1313 makes a reply structure.
1314 ********************************************************************/
1316 void init_reg_r_enum_key(REG_R_ENUM_KEY
*r_u
, char *subkey
)
1321 init_unistr4( &r_u
->keyname
, subkey
, STR_TERMINATE
);
1322 r_u
->classname
= TALLOC_ZERO_P( get_talloc_ctx(), UNISTR4
);
1323 r_u
->time
= TALLOC_ZERO_P( get_talloc_ctx(), NTTIME
);
1326 /*******************************************************************
1327 reads or writes a structure.
1328 ********************************************************************/
1330 BOOL
reg_io_q_enum_key(const char *desc
, REG_Q_ENUM_KEY
*q_u
, prs_struct
*ps
, int depth
)
1335 prs_debug(ps
, depth
, desc
, "reg_io_q_enum_key");
1341 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1344 if(!prs_uint32("key_index", ps
, depth
, &q_u
->key_index
))
1346 if(!prs_uint16("key_name_len", ps
, depth
, &q_u
->key_name_len
))
1348 if(!prs_uint16("unknown_1", ps
, depth
, &q_u
->unknown_1
))
1351 if(!prs_uint32("ptr1", ps
, depth
, &q_u
->ptr1
))
1354 if (q_u
->ptr1
!= 0) {
1355 if(!prs_uint32("unknown_2", ps
, depth
, &q_u
->unknown_2
))
1357 if(!prs_uint8s(False
, "pad1", ps
, depth
, q_u
->pad1
, sizeof(q_u
->pad1
)))
1361 if(!prs_uint32("ptr2", ps
, depth
, &q_u
->ptr2
))
1364 if (q_u
->ptr2
!= 0) {
1365 if(!prs_uint8s(False
, "pad2", ps
, depth
, q_u
->pad2
, sizeof(q_u
->pad2
)))
1369 if(!prs_uint32("ptr3", ps
, depth
, &q_u
->ptr3
))
1372 if (q_u
->ptr3
!= 0) {
1373 if(!smb_io_time("", &q_u
->time
, ps
, depth
))
1380 /*******************************************************************
1381 reads or writes a structure.
1382 ********************************************************************/
1384 BOOL
reg_io_r_enum_key(const char *desc
, REG_R_ENUM_KEY
*q_u
, prs_struct
*ps
, int depth
)
1389 prs_debug(ps
, depth
, desc
, "reg_io_r_enum_key");
1394 if ( !prs_unistr4( "keyname", ps
, depth
, &q_u
->keyname
) )
1399 if (!prs_pointer("class", ps
, depth
, (void**)&q_u
->classname
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1404 if (!prs_pointer("time", ps
, depth
, (void**)&q_u
->time
, sizeof(NTTIME
), (PRS_POINTER_CAST
)smb_io_nttime
))
1409 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
1415 /*******************************************************************
1417 ********************************************************************/
1419 void init_reg_q_open_entry(REG_Q_OPEN_ENTRY
*q_u
, POLICY_HND
*pol
,
1420 char *key_name
, uint32 access_desired
)
1422 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1424 init_unistr4(&q_u
->name
, key_name
, UNI_STR_TERMINATE
);
1426 q_u
->unknown_0
= 0x00000000;
1427 q_u
->access
= access_desired
;
1430 /*******************************************************************
1431 reads or writes a structure.
1432 ********************************************************************/
1434 BOOL
reg_io_q_open_entry(const char *desc
, REG_Q_OPEN_ENTRY
*q_u
, prs_struct
*ps
, int depth
)
1439 prs_debug(ps
, depth
, desc
, "reg_io_q_open_entry");
1445 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1447 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1453 if(!prs_uint32("unknown_0 ", ps
, depth
, &q_u
->unknown_0
))
1455 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
1461 /*******************************************************************
1463 ********************************************************************/
1465 void init_reg_r_open_entry(REG_R_OPEN_ENTRY
*r_u
,
1466 POLICY_HND
*pol
, WERROR werr
)
1468 if (W_ERROR_IS_OK(werr
)) {
1469 memcpy(&r_u
->pol
, pol
, sizeof(r_u
->pol
));
1471 ZERO_STRUCT(r_u
->pol
);
1476 /*******************************************************************
1477 reads or writes a structure.
1478 ********************************************************************/
1480 BOOL
reg_io_r_open_entry(const char *desc
, REG_R_OPEN_ENTRY
*r_u
, prs_struct
*ps
, int depth
)
1485 prs_debug(ps
, depth
, desc
, "reg_io_r_open_entry");
1491 if(!smb_io_pol_hnd("", &r_u
->pol
, ps
, depth
))
1494 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1500 /*******************************************************************
1502 ********************************************************************/
1504 void init_reg_q_shutdown(REG_Q_SHUTDOWN
*q_u
, const char *msg
,
1505 uint32 timeout
, BOOL do_reboot
, BOOL force
)
1507 q_u
->server
= TALLOC_P( get_talloc_ctx(), uint16
);
1510 q_u
->message
= TALLOC_P( get_talloc_ctx(), UNISTR4
);
1511 init_unistr4( q_u
->message
, msg
, UNI_FLAGS_NONE
);
1513 q_u
->timeout
= timeout
;
1515 q_u
->reboot
= do_reboot
? 1 : 0;
1516 q_u
->force
= force
? 1 : 0;
1519 /*******************************************************************
1520 Inits a REG_Q_SHUTDOWN_EX structure.
1521 ********************************************************************/
1523 void init_reg_q_shutdown_ex(REG_Q_SHUTDOWN_EX
* q_u_ex
, const char *msg
,
1524 uint32 timeout
, BOOL do_reboot
, BOOL force
, uint32 reason
)
1530 init_reg_q_shutdown( &q_u
, msg
, timeout
, do_reboot
, force
);
1534 q_u_ex
->server
= q_u
.server
;
1535 q_u_ex
->message
= q_u
.message
;
1537 q_u_ex
->reboot
= q_u
.reboot
;
1538 q_u_ex
->force
= q_u
.force
;
1540 q_u_ex
->reason
= reason
;
1543 /*******************************************************************
1544 reads or writes a structure.
1545 ********************************************************************/
1547 BOOL
reg_io_q_shutdown(const char *desc
, REG_Q_SHUTDOWN
*q_u
, prs_struct
*ps
,
1553 prs_debug(ps
, depth
, desc
, "reg_io_q_shutdown");
1559 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1562 if (!prs_pointer("message", ps
, depth
, (void**)&q_u
->message
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1568 if (!prs_uint32("timeout", ps
, depth
, &(q_u
->timeout
)))
1571 if (!prs_uint8("force ", ps
, depth
, &(q_u
->force
)))
1573 if (!prs_uint8("reboot ", ps
, depth
, &(q_u
->reboot
)))
1580 /*******************************************************************
1581 reads or writes a structure.
1582 ********************************************************************/
1583 BOOL
reg_io_r_shutdown(const char *desc
, REG_R_SHUTDOWN
*r_u
, prs_struct
*ps
,
1589 prs_debug(ps
, depth
, desc
, "reg_io_r_shutdown");
1595 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1601 /*******************************************************************
1602 reads or writes a REG_Q_SHUTDOWN_EX structure.
1603 ********************************************************************/
1605 BOOL
reg_io_q_shutdown_ex(const char *desc
, REG_Q_SHUTDOWN_EX
*q_u
, prs_struct
*ps
,
1611 prs_debug(ps
, depth
, desc
, "reg_io_q_shutdown_ex");
1617 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1620 if (!prs_pointer("message", ps
, depth
, (void**)&q_u
->message
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1626 if (!prs_uint32("timeout", ps
, depth
, &(q_u
->timeout
)))
1629 if (!prs_uint8("force ", ps
, depth
, &(q_u
->force
)))
1631 if (!prs_uint8("reboot ", ps
, depth
, &(q_u
->reboot
)))
1636 if (!prs_uint32("reason", ps
, depth
, &(q_u
->reason
)))
1643 /*******************************************************************
1644 reads or writes a REG_R_SHUTDOWN_EX structure.
1645 ********************************************************************/
1646 BOOL
reg_io_r_shutdown_ex(const char *desc
, REG_R_SHUTDOWN_EX
*r_u
, prs_struct
*ps
,
1652 prs_debug(ps
, depth
, desc
, "reg_io_r_shutdown_ex");
1658 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1666 /*******************************************************************
1668 ********************************************************************/
1669 void init_reg_q_abort_shutdown(REG_Q_ABORT_SHUTDOWN
*q_u
)
1671 q_u
->server
= TALLOC_P( get_talloc_ctx(), uint16
);
1675 /*******************************************************************
1676 reads or writes a structure.
1677 ********************************************************************/
1678 BOOL
reg_io_q_abort_shutdown(const char *desc
, REG_Q_ABORT_SHUTDOWN
*q_u
,
1679 prs_struct
*ps
, int depth
)
1684 prs_debug(ps
, depth
, desc
, "reg_io_q_abort_shutdown");
1690 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1696 /*******************************************************************
1697 reads or writes a structure.
1698 ********************************************************************/
1699 BOOL
reg_io_r_abort_shutdown(const char *desc
, REG_R_ABORT_SHUTDOWN
*r_u
,
1700 prs_struct
*ps
, int depth
)
1705 prs_debug(ps
, depth
, desc
, "reg_io_r_abort_shutdown");
1711 if (!prs_werror("status", ps
, depth
, &r_u
->status
))