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
->handle
, 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
))
414 /*******************************************************************
415 reads or writes a structure.
416 ********************************************************************/
418 BOOL
reg_io_r_delete_key(const char *desc
, REG_R_DELETE_KEY
*r_u
, prs_struct
*ps
, int depth
)
423 prs_debug(ps
, depth
, desc
, "reg_io_r_delete_key");
429 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
435 /*******************************************************************
437 ********************************************************************/
439 void init_reg_q_query_key(REG_Q_QUERY_KEY
*q_o
, POLICY_HND
*hnd
, const char *class)
443 memcpy(&q_o
->pol
, hnd
, sizeof(q_o
->pol
));
444 init_unistr4(&q_o
->class, class, UNI_STR_TERMINATE
);
447 /*******************************************************************
448 reads or writes a structure.
449 ********************************************************************/
451 BOOL
reg_io_q_query_key(const char *desc
, REG_Q_QUERY_KEY
*q_u
, prs_struct
*ps
, int depth
)
456 prs_debug(ps
, depth
, desc
, "reg_io_q_query_key");
462 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
464 if(!prs_unistr4("class", ps
, depth
, &q_u
->class))
474 /*******************************************************************
475 reads or writes a structure.
476 ********************************************************************/
478 BOOL
reg_io_r_query_key(const char *desc
, REG_R_QUERY_KEY
*r_u
, prs_struct
*ps
, int depth
)
483 prs_debug(ps
, depth
, desc
, "reg_io_r_query_key");
489 if(!prs_unistr4("class", ps
, depth
, &r_u
->class))
495 if(!prs_uint32("num_subkeys ", ps
, depth
, &r_u
->num_subkeys
))
497 if(!prs_uint32("max_subkeylen ", ps
, depth
, &r_u
->max_subkeylen
))
499 if(!prs_uint32("reserved ", ps
, depth
, &r_u
->reserved
))
501 if(!prs_uint32("num_values ", ps
, depth
, &r_u
->num_values
))
503 if(!prs_uint32("max_valnamelen", ps
, depth
, &r_u
->max_valnamelen
))
505 if(!prs_uint32("max_valbufsize", ps
, depth
, &r_u
->max_valbufsize
))
507 if(!prs_uint32("sec_desc ", ps
, depth
, &r_u
->sec_desc
))
509 if(!smb_io_time("mod_time ", &r_u
->mod_time
, ps
, depth
))
512 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
518 /*******************************************************************
520 ********************************************************************/
522 void init_reg_q_getversion(REG_Q_GETVERSION
*q_o
, POLICY_HND
*hnd
)
524 memcpy(&q_o
->pol
, hnd
, sizeof(q_o
->pol
));
528 /*******************************************************************
529 reads or writes a structure.
530 ********************************************************************/
532 BOOL
reg_io_q_getversion(const char *desc
, REG_Q_GETVERSION
*q_u
, prs_struct
*ps
, int depth
)
537 prs_debug(ps
, depth
, desc
, "reg_io_q_getversion");
543 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
549 /*******************************************************************
550 reads or writes a structure.
551 ********************************************************************/
553 BOOL
reg_io_r_getversion(const char *desc
, REG_R_GETVERSION
*r_u
, prs_struct
*ps
, int depth
)
558 prs_debug(ps
, depth
, desc
, "reg_io_r_getversion");
564 if(!prs_uint32("win_version", ps
, depth
, &r_u
->win_version
))
566 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
573 /*******************************************************************
574 reads or writes a structure.
575 ********************************************************************/
577 BOOL
reg_io_q_restore_key(const char *desc
, REG_Q_RESTORE_KEY
*q_u
, prs_struct
*ps
, int depth
)
582 prs_debug(ps
, depth
, desc
, "reg_io_q_restore_key");
588 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
591 if(!prs_unistr4("filename", ps
, depth
, &q_u
->filename
))
594 if(!prs_uint32("flags", ps
, depth
, &q_u
->flags
))
600 /*******************************************************************
601 reads or writes a structure.
602 ********************************************************************/
604 BOOL
reg_io_r_restore_key(const char *desc
, REG_R_RESTORE_KEY
*r_u
, prs_struct
*ps
, int depth
)
609 prs_debug(ps
, depth
, desc
, "reg_io_r_restore_key");
615 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
621 /*******************************************************************
622 ********************************************************************/
624 void init_q_reg_save_key( REG_Q_SAVE_KEY
*q_u
, POLICY_HND
*handle
, const char *fname
)
626 memcpy(&q_u
->pol
, handle
, sizeof(q_u
->pol
));
627 init_unistr4( &q_u
->filename
, fname
, UNI_STR_TERMINATE
);
628 q_u
->sec_attr
= NULL
;
631 /*******************************************************************
632 reads or writes a structure.
633 ********************************************************************/
635 BOOL
reg_io_q_save_key(const char *desc
, REG_Q_SAVE_KEY
*q_u
, prs_struct
*ps
, int depth
)
640 prs_debug(ps
, depth
, desc
, "reg_io_q_save_key");
646 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
649 if(!prs_unistr4("filename", ps
, depth
, &q_u
->filename
))
652 #if 0 /* reg_io_sec_attr() */
653 if(!prs_uint32("unknown", ps
, depth
, &q_u
->unknown
))
660 /*******************************************************************
661 reads or writes a structure.
662 ********************************************************************/
664 BOOL
reg_io_r_save_key(const char *desc
, REG_R_SAVE_KEY
*r_u
, prs_struct
*ps
, int depth
)
669 prs_debug(ps
, depth
, desc
, "reg_io_r_save_key");
675 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
681 /*******************************************************************
682 Inits an REG_Q_CLOSE structure.
683 ********************************************************************/
685 void init_reg_q_close(REG_Q_CLOSE
*q_c
, POLICY_HND
*hnd
)
687 DEBUG(5,("init_reg_q_close\n"));
689 memcpy(&q_c
->pol
, hnd
, sizeof(q_c
->pol
));
692 /*******************************************************************
693 reads or writes a structure.
694 ********************************************************************/
696 BOOL
reg_io_q_close(const char *desc
, REG_Q_CLOSE
*q_u
, prs_struct
*ps
, int depth
)
701 prs_debug(ps
, depth
, desc
, "reg_io_q_close");
707 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
715 /*******************************************************************
716 reads or writes a structure.
717 ********************************************************************/
719 BOOL
reg_io_r_close(const char *desc
, REG_R_CLOSE
*r_u
, prs_struct
*ps
, int depth
)
724 prs_debug(ps
, depth
, desc
, "reg_io_r_close");
730 if(!smb_io_pol_hnd("", &r_u
->pol
, ps
, depth
))
735 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
741 /*******************************************************************
743 ********************************************************************/
745 void init_reg_q_set_key_sec(REG_Q_SET_KEY_SEC
*q_u
, POLICY_HND
*pol
,
746 uint32 sec_info
, SEC_DESC_BUF
*sec_desc_buf
)
748 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
750 q_u
->sec_info
= sec_info
;
753 init_buf_hdr(&q_u
->hdr_sec
, sec_desc_buf
->len
, sec_desc_buf
->len
);
754 q_u
->data
= sec_desc_buf
;
757 /*******************************************************************
758 reads or writes a structure.
759 ********************************************************************/
761 BOOL
reg_io_q_set_key_sec(const char *desc
, REG_Q_SET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
766 prs_debug(ps
, depth
, desc
, "reg_io_q_set_key_sec");
772 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
775 if(!prs_uint32("sec_info", ps
, depth
, &q_u
->sec_info
))
777 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
780 if(!reg_io_hdrbuf_sec(q_u
->ptr
, NULL
, &q_u
->hdr_sec
, q_u
->data
, ps
, depth
))
786 /*******************************************************************
787 reads or writes a structure.
788 ********************************************************************/
790 BOOL
reg_io_r_set_key_sec(const char *desc
, REG_R_SET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
795 prs_debug(ps
, depth
, desc
, "reg_io_r_set_key_sec");
801 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
808 /*******************************************************************
810 ********************************************************************/
812 void init_reg_q_get_key_sec(REG_Q_GET_KEY_SEC
*q_u
, POLICY_HND
*pol
,
813 uint32 sec_info
, uint32 sec_buf_size
,
816 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
818 q_u
->sec_info
= sec_info
;
820 q_u
->ptr
= psdb
!= NULL
? 1 : 0;
823 init_buf_hdr(&q_u
->hdr_sec
, sec_buf_size
, 0);
826 /*******************************************************************
827 reads or writes a structure.
828 ********************************************************************/
830 BOOL
reg_io_q_get_key_sec(const char *desc
, REG_Q_GET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
835 prs_debug(ps
, depth
, desc
, "reg_io_q_get_key_sec");
841 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
844 if(!prs_uint32("sec_info", ps
, depth
, &q_u
->sec_info
))
846 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
849 if(!reg_io_hdrbuf_sec(q_u
->ptr
, NULL
, &q_u
->hdr_sec
, q_u
->data
, ps
, depth
))
856 /*******************************************************************
858 ********************************************************************/
859 void init_reg_r_get_key_sec(REG_R_GET_KEY_SEC
*r_i
, POLICY_HND
*pol
,
860 uint32 buf_len
, uint8
*buf
,
864 init_buf_hdr(&r_i
->hdr_sec
, buf_len
, buf_len
);
865 init_sec_desc_buf(r_i
->data
, buf_len
, 1);
867 r_i
->status
= status
; /* 0x0000 0000 or 0x0000 007a */
871 /*******************************************************************
872 reads or writes a structure.
873 ********************************************************************/
875 BOOL
reg_io_r_get_key_sec(const char *desc
, REG_R_GET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
880 prs_debug(ps
, depth
, desc
, "reg_io_r_get_key_sec");
886 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
890 if(!smb_io_hdrbuf("", &q_u
->hdr_sec
, ps
, depth
))
892 if(!sec_io_desc_buf("", &q_u
->data
, ps
, depth
))
898 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
904 /*******************************************************************
906 ********************************************************************/
908 BOOL
init_reg_q_info(REG_Q_INFO
*q_u
, POLICY_HND
*pol
, const char *val_name
,
909 REGVAL_BUFFER
*value_output
)
916 init_unistr4(&q_u
->name
, val_name
, UNI_STR_TERMINATE
);
918 q_u
->ptr_reserved
= 1;
921 q_u
->ptr_bufsize
= 1;
922 q_u
->bufsize
= value_output
->buf_max_len
;
927 q_u
->buflen
= value_output
->buf_max_len
;
929 q_u
->ptr_buflen2
= 1;
935 /*******************************************************************
936 reads or writes a structure.
937 ********************************************************************/
939 BOOL
reg_io_q_info(const char *desc
, REG_Q_INFO
*q_u
, prs_struct
*ps
, int depth
)
944 prs_debug(ps
, depth
, desc
, "reg_io_q_info");
950 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
952 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
958 if(!prs_uint32("ptr_reserved", ps
, depth
, &(q_u
->ptr_reserved
)))
961 if(!prs_uint32("ptr_buf", ps
, depth
, &(q_u
->ptr_buf
)))
965 if(!prs_uint32("ptr_bufsize", ps
, depth
, &(q_u
->ptr_bufsize
)))
967 if(!prs_uint32("bufsize", ps
, depth
, &(q_u
->bufsize
)))
969 if(!prs_uint32("buf_unk", ps
, depth
, &(q_u
->buf_unk
)))
973 if(!prs_uint32("unk1", ps
, depth
, &(q_u
->unk1
)))
976 if(!prs_uint32("ptr_buflen", ps
, depth
, &(q_u
->ptr_buflen
)))
979 if (q_u
->ptr_buflen
) {
980 if(!prs_uint32("buflen", ps
, depth
, &(q_u
->buflen
)))
982 if(!prs_uint32("ptr_buflen2", ps
, depth
, &(q_u
->ptr_buflen2
)))
984 if(!prs_uint32("buflen2", ps
, depth
, &(q_u
->buflen2
)))
991 /*******************************************************************
993 New version to replace older init_reg_r_info()
994 ********************************************************************/
996 BOOL
init_reg_r_info(uint32 include_keyval
, REG_R_INFO
*r_u
,
997 REGISTRY_VALUE
*val
, WERROR status
)
1005 r_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1006 *r_u
->type
= val
->type
;
1008 buf_len
= reg_init_regval_buffer( &buf2
, val
);
1010 r_u
->buf_max_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1011 *r_u
->buf_max_len
= buf_len
;
1013 r_u
->buf_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1014 *r_u
->buf_len
= buf_len
;
1016 /* if include_keyval is not set, don't send the key value, just
1017 the buflen data. probably used by NT5 to allocate buffer space - SK */
1019 if ( include_keyval
) {
1020 r_u
->value
= TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER
);
1021 /* steal the memory */
1025 r_u
->status
= status
;
1030 /*******************************************************************
1031 reads or writes a structure.
1032 ********************************************************************/
1034 BOOL
reg_io_r_info(const char *desc
, REG_R_INFO
*r_u
, prs_struct
*ps
, int depth
)
1039 prs_debug(ps
, depth
, desc
, "reg_io_r_info");
1045 if ( !prs_pointer("type", ps
, depth
, (void**)&r_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1048 if ( !prs_pointer("value", ps
, depth
, (void**)&r_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1053 if ( !prs_pointer("buf_max_len", ps
, depth
, (void**)&r_u
->buf_max_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1055 if ( !prs_pointer("buf_len", ps
, depth
, (void**)&r_u
->buf_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1058 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1064 /*******************************************************************
1066 ********************************************************************/
1068 void init_reg_q_enum_val(REG_Q_ENUM_VALUE
*q_u
, POLICY_HND
*pol
,
1070 uint32 max_name_len
, uint32 max_buf_len
)
1074 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1076 q_u
->val_index
= val_idx
;
1078 q_u
->name
.size
= max_name_len
*2;
1079 q_u
->name
.string
= TALLOC_ZERO_P( get_talloc_ctx(), UNISTR2
);
1080 q_u
->name
.string
->uni_max_len
= max_name_len
;
1082 q_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1085 q_u
->value
= TALLOC_ZERO_P( get_talloc_ctx(), REGVAL_BUFFER
);
1086 q_u
->value
->buf_max_len
= max_buf_len
;
1088 q_u
->buffer_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1089 *q_u
->buffer_len
= max_buf_len
;
1091 q_u
->name_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1092 *q_u
->name_len
= 0x0;
1095 /*******************************************************************
1097 ********************************************************************/
1099 void init_reg_r_enum_val(REG_R_ENUM_VALUE
*r_u
, REGISTRY_VALUE
*val
)
1107 DEBUG(10,("init_reg_r_enum_val: Valuename => [%s]\n", val
->valuename
));
1109 init_unistr4( &r_u
->name
, val
->valuename
, UNI_STR_TERMINATE
);
1113 r_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1114 *r_u
->type
= val
->type
;
1116 /* REG_SZ & REG_MULTI_SZ must be converted to UNICODE */
1118 r_u
->value
= TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER
);
1119 real_size
= reg_init_regval_buffer( r_u
->value
, val
);
1123 r_u
->buffer_len1
= TALLOC_P( get_talloc_ctx(), uint32
);
1124 *r_u
->buffer_len1
= real_size
;
1125 r_u
->buffer_len2
= TALLOC_P( get_talloc_ctx(), uint32
);
1126 *r_u
->buffer_len2
= real_size
;
1129 /*******************************************************************
1130 reads or writes a structure.
1131 ********************************************************************/
1133 BOOL
reg_io_q_enum_val(const char *desc
, REG_Q_ENUM_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1138 prs_debug(ps
, depth
, desc
, "reg_io_q_enum_val");
1144 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1147 if(!prs_uint32("val_index", ps
, depth
, &q_u
->val_index
))
1150 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1155 if(!prs_pointer("type", ps
, depth
, (void**)&q_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1158 if ( !prs_pointer("value", ps
, depth
, (void**)&q_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1163 if(!prs_pointer("buffer_len", ps
, depth
, (void**)&q_u
->buffer_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1165 if(!prs_pointer("name_len", ps
, depth
, (void**)&q_u
->name_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1171 /*******************************************************************
1172 reads or writes a structure.
1173 ********************************************************************/
1175 BOOL
reg_io_r_enum_val(const char *desc
, REG_R_ENUM_VALUE
*r_u
, prs_struct
*ps
, int depth
)
1180 prs_debug(ps
, depth
, desc
, "reg_io_r_enum_val");
1186 if(!prs_unistr4("name", ps
, depth
, &r_u
->name
))
1191 if(!prs_pointer("type", ps
, depth
, (void**)&r_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1194 if ( !prs_pointer("value", ps
, depth
, (void**)&r_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1199 if(!prs_pointer("buffer_len1", ps
, depth
, (void**)&r_u
->buffer_len1
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1201 if(!prs_pointer("buffer_len2", ps
, depth
, (void**)&r_u
->buffer_len2
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1204 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1210 /*******************************************************************
1212 ********************************************************************/
1214 void init_reg_q_set_val(REG_Q_SET_VALUE
*q_u
, POLICY_HND
*pol
,
1215 char *val_name
, uint32 type
,
1220 memcpy(&q_u
->handle
, pol
, sizeof(q_u
->handle
));
1222 init_unistr4(&q_u
->name
, val_name
, UNI_STR_TERMINATE
);
1226 q_u
->size
= val
->buf_len
;
1229 /*******************************************************************
1230 reads or writes a structure.
1231 ********************************************************************/
1233 BOOL
reg_io_q_set_value(const char *desc
, REG_Q_SET_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1238 prs_debug(ps
, depth
, desc
, "reg_io_q_set_value");
1244 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
1247 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1252 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
1255 if(!smb_io_rpc_blob("value", &q_u
->value
, ps
, depth
))
1260 if(!prs_uint32("size", ps
, depth
, &q_u
->size
))
1266 /*******************************************************************
1267 reads or writes a structure.
1268 ********************************************************************/
1270 BOOL
reg_io_r_set_value(const char *desc
, REG_R_SET_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1275 prs_debug(ps
, depth
, desc
, "reg_io_r_set_value");
1281 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
1287 /*******************************************************************
1289 ********************************************************************/
1291 void init_reg_q_enum_key(REG_Q_ENUM_KEY
*q_u
, POLICY_HND
*pol
, uint32 key_idx
)
1293 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1295 q_u
->key_index
= key_idx
;
1296 q_u
->key_name_len
= 0;
1297 q_u
->unknown_1
= 0x0414;
1300 q_u
->unknown_2
= 0x0000020A;
1301 memset(q_u
->pad1
, 0, sizeof(q_u
->pad1
));
1304 memset(q_u
->pad2
, 0, sizeof(q_u
->pad2
));
1307 unix_to_nt_time(&q_u
->time
, 0); /* current time? */
1310 /*******************************************************************
1311 makes a reply structure.
1312 ********************************************************************/
1314 void init_reg_r_enum_key(REG_R_ENUM_KEY
*r_u
, char *subkey
)
1319 init_unistr4( &r_u
->keyname
, subkey
, STR_TERMINATE
);
1320 r_u
->classname
= TALLOC_ZERO_P( get_talloc_ctx(), UNISTR4
);
1321 r_u
->time
= TALLOC_ZERO_P( get_talloc_ctx(), NTTIME
);
1324 /*******************************************************************
1325 reads or writes a structure.
1326 ********************************************************************/
1328 BOOL
reg_io_q_enum_key(const char *desc
, REG_Q_ENUM_KEY
*q_u
, prs_struct
*ps
, int depth
)
1333 prs_debug(ps
, depth
, desc
, "reg_io_q_enum_key");
1339 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1342 if(!prs_uint32("key_index", ps
, depth
, &q_u
->key_index
))
1344 if(!prs_uint16("key_name_len", ps
, depth
, &q_u
->key_name_len
))
1346 if(!prs_uint16("unknown_1", ps
, depth
, &q_u
->unknown_1
))
1349 if(!prs_uint32("ptr1", ps
, depth
, &q_u
->ptr1
))
1352 if (q_u
->ptr1
!= 0) {
1353 if(!prs_uint32("unknown_2", ps
, depth
, &q_u
->unknown_2
))
1355 if(!prs_uint8s(False
, "pad1", ps
, depth
, q_u
->pad1
, sizeof(q_u
->pad1
)))
1359 if(!prs_uint32("ptr2", ps
, depth
, &q_u
->ptr2
))
1362 if (q_u
->ptr2
!= 0) {
1363 if(!prs_uint8s(False
, "pad2", ps
, depth
, q_u
->pad2
, sizeof(q_u
->pad2
)))
1367 if(!prs_uint32("ptr3", ps
, depth
, &q_u
->ptr3
))
1370 if (q_u
->ptr3
!= 0) {
1371 if(!smb_io_time("", &q_u
->time
, ps
, depth
))
1378 /*******************************************************************
1379 reads or writes a structure.
1380 ********************************************************************/
1382 BOOL
reg_io_r_enum_key(const char *desc
, REG_R_ENUM_KEY
*q_u
, prs_struct
*ps
, int depth
)
1387 prs_debug(ps
, depth
, desc
, "reg_io_r_enum_key");
1392 if ( !prs_unistr4( "keyname", ps
, depth
, &q_u
->keyname
) )
1397 if (!prs_pointer("class", ps
, depth
, (void**)&q_u
->classname
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1402 if (!prs_pointer("time", ps
, depth
, (void**)&q_u
->time
, sizeof(NTTIME
), (PRS_POINTER_CAST
)smb_io_nttime
))
1407 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
1413 /*******************************************************************
1415 ********************************************************************/
1417 void init_reg_q_open_entry(REG_Q_OPEN_ENTRY
*q_u
, POLICY_HND
*pol
,
1418 char *key_name
, uint32 access_desired
)
1420 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1422 init_unistr4(&q_u
->name
, key_name
, UNI_STR_TERMINATE
);
1424 q_u
->unknown_0
= 0x00000000;
1425 q_u
->access
= access_desired
;
1428 /*******************************************************************
1429 reads or writes a structure.
1430 ********************************************************************/
1432 BOOL
reg_io_q_open_entry(const char *desc
, REG_Q_OPEN_ENTRY
*q_u
, prs_struct
*ps
, int depth
)
1437 prs_debug(ps
, depth
, desc
, "reg_io_q_open_entry");
1443 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1445 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1451 if(!prs_uint32("unknown_0 ", ps
, depth
, &q_u
->unknown_0
))
1453 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
1459 /*******************************************************************
1460 reads or writes a structure.
1461 ********************************************************************/
1463 BOOL
reg_io_r_open_entry(const char *desc
, REG_R_OPEN_ENTRY
*r_u
, prs_struct
*ps
, int depth
)
1468 prs_debug(ps
, depth
, desc
, "reg_io_r_open_entry");
1474 if(!smb_io_pol_hnd("handle", &r_u
->handle
, ps
, depth
))
1477 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1483 /*******************************************************************
1485 ********************************************************************/
1487 void init_reg_q_shutdown(REG_Q_SHUTDOWN
*q_u
, const char *msg
,
1488 uint32 timeout
, BOOL do_reboot
, BOOL force
)
1490 q_u
->server
= TALLOC_P( get_talloc_ctx(), uint16
);
1493 q_u
->message
= TALLOC_P( get_talloc_ctx(), UNISTR4
);
1494 init_unistr4( q_u
->message
, msg
, UNI_FLAGS_NONE
);
1496 q_u
->timeout
= timeout
;
1498 q_u
->reboot
= do_reboot
? 1 : 0;
1499 q_u
->force
= force
? 1 : 0;
1502 /*******************************************************************
1503 Inits a REG_Q_SHUTDOWN_EX structure.
1504 ********************************************************************/
1506 void init_reg_q_shutdown_ex(REG_Q_SHUTDOWN_EX
* q_u_ex
, const char *msg
,
1507 uint32 timeout
, BOOL do_reboot
, BOOL force
, uint32 reason
)
1513 init_reg_q_shutdown( &q_u
, msg
, timeout
, do_reboot
, force
);
1517 q_u_ex
->server
= q_u
.server
;
1518 q_u_ex
->message
= q_u
.message
;
1520 q_u_ex
->reboot
= q_u
.reboot
;
1521 q_u_ex
->force
= q_u
.force
;
1523 q_u_ex
->reason
= reason
;
1526 /*******************************************************************
1527 reads or writes a structure.
1528 ********************************************************************/
1530 BOOL
reg_io_q_shutdown(const char *desc
, REG_Q_SHUTDOWN
*q_u
, prs_struct
*ps
,
1536 prs_debug(ps
, depth
, desc
, "reg_io_q_shutdown");
1542 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1545 if (!prs_pointer("message", ps
, depth
, (void**)&q_u
->message
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1551 if (!prs_uint32("timeout", ps
, depth
, &(q_u
->timeout
)))
1554 if (!prs_uint8("force ", ps
, depth
, &(q_u
->force
)))
1556 if (!prs_uint8("reboot ", ps
, depth
, &(q_u
->reboot
)))
1563 /*******************************************************************
1564 reads or writes a structure.
1565 ********************************************************************/
1566 BOOL
reg_io_r_shutdown(const char *desc
, REG_R_SHUTDOWN
*r_u
, prs_struct
*ps
,
1572 prs_debug(ps
, depth
, desc
, "reg_io_r_shutdown");
1578 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1584 /*******************************************************************
1585 reads or writes a REG_Q_SHUTDOWN_EX structure.
1586 ********************************************************************/
1588 BOOL
reg_io_q_shutdown_ex(const char *desc
, REG_Q_SHUTDOWN_EX
*q_u
, prs_struct
*ps
,
1594 prs_debug(ps
, depth
, desc
, "reg_io_q_shutdown_ex");
1600 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1603 if (!prs_pointer("message", ps
, depth
, (void**)&q_u
->message
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1609 if (!prs_uint32("timeout", ps
, depth
, &(q_u
->timeout
)))
1612 if (!prs_uint8("force ", ps
, depth
, &(q_u
->force
)))
1614 if (!prs_uint8("reboot ", ps
, depth
, &(q_u
->reboot
)))
1619 if (!prs_uint32("reason", ps
, depth
, &(q_u
->reason
)))
1626 /*******************************************************************
1627 reads or writes a REG_R_SHUTDOWN_EX structure.
1628 ********************************************************************/
1629 BOOL
reg_io_r_shutdown_ex(const char *desc
, REG_R_SHUTDOWN_EX
*r_u
, prs_struct
*ps
,
1635 prs_debug(ps
, depth
, desc
, "reg_io_r_shutdown_ex");
1641 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1649 /*******************************************************************
1651 ********************************************************************/
1652 void init_reg_q_abort_shutdown(REG_Q_ABORT_SHUTDOWN
*q_u
)
1654 q_u
->server
= TALLOC_P( get_talloc_ctx(), uint16
);
1658 /*******************************************************************
1659 reads or writes a structure.
1660 ********************************************************************/
1661 BOOL
reg_io_q_abort_shutdown(const char *desc
, REG_Q_ABORT_SHUTDOWN
*q_u
,
1662 prs_struct
*ps
, int depth
)
1667 prs_debug(ps
, depth
, desc
, "reg_io_q_abort_shutdown");
1673 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1679 /*******************************************************************
1680 reads or writes a structure.
1681 ********************************************************************/
1682 BOOL
reg_io_r_abort_shutdown(const char *desc
, REG_R_ABORT_SHUTDOWN
*r_u
,
1683 prs_struct
*ps
, int depth
)
1688 prs_debug(ps
, depth
, desc
, "reg_io_r_abort_shutdown");
1694 if (!prs_werror("status", ps
, depth
, &r_u
->status
))