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_ex(REG_Q_CREATE_KEY_EX
*q_c
, POLICY_HND
*hnd
,
210 char *name
, char *key_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
->key_class
, key_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_ex(const char *desc
, REG_Q_CREATE_KEY_EX
*q_u
,
238 prs_struct
*ps
, int depth
)
243 prs_debug(ps
, depth
, desc
, "reg_io_q_create_key_ex");
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 ("key_class", ps
, depth
, &q_u
->key_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_ex(const char *desc
, REG_R_CREATE_KEY_EX
*r_u
,
289 prs_struct
*ps
, int depth
)
294 prs_debug(ps
, depth
, desc
, "reg_io_r_create_key_ex");
300 if(!smb_io_pol_hnd("", &r_u
->handle
, ps
, depth
))
302 if(!prs_uint32("disposition", ps
, depth
, &r_u
->disposition
))
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
))
351 /*******************************************************************
352 reads or writes a structure.
353 ********************************************************************/
355 BOOL
reg_io_r_delete_value(const char *desc
, REG_R_DELETE_VALUE
*r_u
,
356 prs_struct
*ps
, int depth
)
361 prs_debug(ps
, depth
, desc
, "reg_io_r_delete_value");
367 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
373 /*******************************************************************
375 ********************************************************************/
377 void init_reg_q_delete_key(REG_Q_DELETE_KEY
*q_c
, POLICY_HND
*hnd
,
382 memcpy(&q_c
->handle
, hnd
, sizeof(q_c
->handle
));
384 init_unistr4(&q_c
->name
, name
, UNI_STR_TERMINATE
);
387 /*******************************************************************
388 reads or writes a structure.
389 ********************************************************************/
391 BOOL
reg_io_q_delete_key(const char *desc
, REG_Q_DELETE_KEY
*q_u
,
392 prs_struct
*ps
, int depth
)
397 prs_debug(ps
, depth
, desc
, "reg_io_q_delete_key");
403 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
406 if(!prs_unistr4("", ps
, depth
, &q_u
->name
))
412 /*******************************************************************
413 reads or writes a structure.
414 ********************************************************************/
416 BOOL
reg_io_r_delete_key(const char *desc
, REG_R_DELETE_KEY
*r_u
, prs_struct
*ps
, int depth
)
421 prs_debug(ps
, depth
, desc
, "reg_io_r_delete_key");
427 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
433 /*******************************************************************
435 ********************************************************************/
437 void init_reg_q_query_key(REG_Q_QUERY_KEY
*q_o
, POLICY_HND
*hnd
, const char *key_class
)
441 memcpy(&q_o
->pol
, hnd
, sizeof(q_o
->pol
));
442 init_unistr4(&q_o
->key_class
, key_class
, UNI_STR_TERMINATE
);
445 /*******************************************************************
446 reads or writes a structure.
447 ********************************************************************/
449 BOOL
reg_io_q_query_key(const char *desc
, REG_Q_QUERY_KEY
*q_u
, prs_struct
*ps
, int depth
)
454 prs_debug(ps
, depth
, desc
, "reg_io_q_query_key");
460 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
462 if(!prs_unistr4("key_class", ps
, depth
, &q_u
->key_class
))
469 /*******************************************************************
470 reads or writes a structure.
471 ********************************************************************/
473 BOOL
reg_io_r_query_key(const char *desc
, REG_R_QUERY_KEY
*r_u
, prs_struct
*ps
, int depth
)
478 prs_debug(ps
, depth
, desc
, "reg_io_r_query_key");
484 if(!prs_unistr4("key_class", ps
, depth
, &r_u
->key_class
))
490 if(!prs_uint32("num_subkeys ", ps
, depth
, &r_u
->num_subkeys
))
492 if(!prs_uint32("max_subkeylen ", ps
, depth
, &r_u
->max_subkeylen
))
494 if(!prs_uint32("reserved ", ps
, depth
, &r_u
->reserved
))
496 if(!prs_uint32("num_values ", ps
, depth
, &r_u
->num_values
))
498 if(!prs_uint32("max_valnamelen", ps
, depth
, &r_u
->max_valnamelen
))
500 if(!prs_uint32("max_valbufsize", ps
, depth
, &r_u
->max_valbufsize
))
502 if(!prs_uint32("sec_desc ", ps
, depth
, &r_u
->sec_desc
))
504 if(!smb_io_time("mod_time ", &r_u
->mod_time
, ps
, depth
))
507 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
513 /*******************************************************************
515 ********************************************************************/
517 void init_reg_q_getversion(REG_Q_GETVERSION
*q_o
, POLICY_HND
*hnd
)
519 memcpy(&q_o
->pol
, hnd
, sizeof(q_o
->pol
));
523 /*******************************************************************
524 reads or writes a structure.
525 ********************************************************************/
527 BOOL
reg_io_q_getversion(const char *desc
, REG_Q_GETVERSION
*q_u
, prs_struct
*ps
, int depth
)
532 prs_debug(ps
, depth
, desc
, "reg_io_q_getversion");
538 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
544 /*******************************************************************
545 reads or writes a structure.
546 ********************************************************************/
548 BOOL
reg_io_r_getversion(const char *desc
, REG_R_GETVERSION
*r_u
, prs_struct
*ps
, int depth
)
553 prs_debug(ps
, depth
, desc
, "reg_io_r_getversion");
559 if(!prs_uint32("win_version", ps
, depth
, &r_u
->win_version
))
561 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
568 /*******************************************************************
569 reads or writes a structure.
570 ********************************************************************/
572 BOOL
reg_io_q_restore_key(const char *desc
, REG_Q_RESTORE_KEY
*q_u
, prs_struct
*ps
, int depth
)
577 prs_debug(ps
, depth
, desc
, "reg_io_q_restore_key");
583 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
586 if(!prs_unistr4("filename", ps
, depth
, &q_u
->filename
))
589 if(!prs_uint32("flags", ps
, depth
, &q_u
->flags
))
595 /*******************************************************************
596 reads or writes a structure.
597 ********************************************************************/
599 BOOL
reg_io_r_restore_key(const char *desc
, REG_R_RESTORE_KEY
*r_u
, prs_struct
*ps
, int depth
)
604 prs_debug(ps
, depth
, desc
, "reg_io_r_restore_key");
610 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
616 /*******************************************************************
617 ********************************************************************/
619 void init_q_reg_save_key( REG_Q_SAVE_KEY
*q_u
, POLICY_HND
*handle
, const char *fname
)
621 memcpy(&q_u
->pol
, handle
, sizeof(q_u
->pol
));
622 init_unistr4( &q_u
->filename
, fname
, UNI_STR_TERMINATE
);
623 q_u
->sec_attr
= NULL
;
626 /*******************************************************************
627 reads or writes a structure.
628 ********************************************************************/
630 BOOL
reg_io_q_save_key(const char *desc
, REG_Q_SAVE_KEY
*q_u
, prs_struct
*ps
, int depth
)
635 prs_debug(ps
, depth
, desc
, "reg_io_q_save_key");
641 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
644 if(!prs_unistr4("filename", ps
, depth
, &q_u
->filename
))
647 #if 0 /* reg_io_sec_attr() */
648 if(!prs_uint32("unknown", ps
, depth
, &q_u
->unknown
))
655 /*******************************************************************
656 reads or writes a structure.
657 ********************************************************************/
659 BOOL
reg_io_r_save_key(const char *desc
, REG_R_SAVE_KEY
*r_u
, prs_struct
*ps
, int depth
)
664 prs_debug(ps
, depth
, desc
, "reg_io_r_save_key");
670 if(!prs_werror("status" , ps
, depth
, &r_u
->status
))
676 /*******************************************************************
677 Inits an REG_Q_CLOSE structure.
678 ********************************************************************/
680 void init_reg_q_close(REG_Q_CLOSE
*q_c
, POLICY_HND
*hnd
)
682 DEBUG(5,("init_reg_q_close\n"));
684 memcpy(&q_c
->pol
, hnd
, sizeof(q_c
->pol
));
687 /*******************************************************************
688 reads or writes a structure.
689 ********************************************************************/
691 BOOL
reg_io_q_close(const char *desc
, REG_Q_CLOSE
*q_u
, prs_struct
*ps
, int depth
)
696 prs_debug(ps
, depth
, desc
, "reg_io_q_close");
702 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
710 /*******************************************************************
711 reads or writes a structure.
712 ********************************************************************/
714 BOOL
reg_io_r_close(const char *desc
, REG_R_CLOSE
*r_u
, prs_struct
*ps
, int depth
)
719 prs_debug(ps
, depth
, desc
, "reg_io_r_close");
725 if(!smb_io_pol_hnd("", &r_u
->pol
, ps
, depth
))
730 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
736 /*******************************************************************
738 ********************************************************************/
740 void init_reg_q_set_key_sec(REG_Q_SET_KEY_SEC
*q_u
, POLICY_HND
*pol
,
741 uint32 sec_info
, SEC_DESC_BUF
*sec_desc_buf
)
743 memcpy(&q_u
->handle
, pol
, sizeof(q_u
->handle
));
745 q_u
->sec_info
= sec_info
;
748 init_buf_hdr(&q_u
->hdr_sec
, sec_desc_buf
->len
, sec_desc_buf
->len
);
749 q_u
->data
= sec_desc_buf
;
752 /*******************************************************************
753 reads or writes a structure.
754 ********************************************************************/
756 BOOL
reg_io_q_set_key_sec(const char *desc
, REG_Q_SET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
761 prs_debug(ps
, depth
, desc
, "reg_io_q_set_key_sec");
767 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
770 if(!prs_uint32("sec_info", ps
, depth
, &q_u
->sec_info
))
772 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
775 if(!reg_io_hdrbuf_sec(q_u
->ptr
, NULL
, &q_u
->hdr_sec
, q_u
->data
, ps
, depth
))
781 /*******************************************************************
782 reads or writes a structure.
783 ********************************************************************/
785 BOOL
reg_io_r_set_key_sec(const char *desc
, REG_R_SET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
790 prs_debug(ps
, depth
, desc
, "reg_io_r_set_key_sec");
796 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
803 /*******************************************************************
805 ********************************************************************/
807 void init_reg_q_get_key_sec(REG_Q_GET_KEY_SEC
*q_u
, POLICY_HND
*pol
,
808 uint32 sec_info
, uint32 sec_buf_size
,
811 memcpy(&q_u
->handle
, pol
, sizeof(q_u
->handle
));
813 q_u
->sec_info
= sec_info
;
815 q_u
->ptr
= psdb
!= NULL
? 1 : 0;
818 init_buf_hdr(&q_u
->hdr_sec
, sec_buf_size
, 0);
821 /*******************************************************************
822 reads or writes a structure.
823 ********************************************************************/
825 BOOL
reg_io_q_get_key_sec(const char *desc
, REG_Q_GET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
830 prs_debug(ps
, depth
, desc
, "reg_io_q_get_key_sec");
836 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
839 if(!prs_uint32("sec_info", ps
, depth
, &q_u
->sec_info
))
841 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
844 if(!reg_io_hdrbuf_sec(q_u
->ptr
, NULL
, &q_u
->hdr_sec
, q_u
->data
, ps
, depth
))
851 /*******************************************************************
853 ********************************************************************/
854 void init_reg_r_get_key_sec(REG_R_GET_KEY_SEC
*r_i
, POLICY_HND
*pol
,
855 uint32 buf_len
, uint8
*buf
,
859 init_buf_hdr(&r_i
->hdr_sec
, buf_len
, buf_len
);
860 init_sec_desc_buf(r_i
->data
, buf_len
, 1);
862 r_i
->status
= status
; /* 0x0000 0000 or 0x0000 007a */
866 /*******************************************************************
867 reads or writes a structure.
868 ********************************************************************/
870 BOOL
reg_io_r_get_key_sec(const char *desc
, REG_R_GET_KEY_SEC
*q_u
, prs_struct
*ps
, int depth
)
875 prs_debug(ps
, depth
, desc
, "reg_io_r_get_key_sec");
881 if(!prs_uint32("ptr ", ps
, depth
, &q_u
->ptr
))
885 if(!smb_io_hdrbuf("", &q_u
->hdr_sec
, ps
, depth
))
887 if(!sec_io_desc_buf("", &q_u
->data
, ps
, depth
))
893 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
899 /*******************************************************************
901 ********************************************************************/
903 BOOL
init_reg_q_query_value(REG_Q_QUERY_VALUE
*q_u
, POLICY_HND
*pol
, const char *val_name
,
904 REGVAL_BUFFER
*value_output
)
911 init_unistr4(&q_u
->name
, val_name
, UNI_STR_TERMINATE
);
913 q_u
->ptr_reserved
= 1;
916 q_u
->ptr_bufsize
= 1;
917 q_u
->bufsize
= value_output
->buf_max_len
;
922 q_u
->buflen
= value_output
->buf_max_len
;
924 q_u
->ptr_buflen2
= 1;
930 /*******************************************************************
931 reads or writes a structure.
932 ********************************************************************/
934 BOOL
reg_io_q_query_value(const char *desc
, REG_Q_QUERY_VALUE
*q_u
, prs_struct
*ps
, int depth
)
939 prs_debug(ps
, depth
, desc
, "reg_io_q_query_value");
945 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
947 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
953 if(!prs_uint32("ptr_reserved", ps
, depth
, &(q_u
->ptr_reserved
)))
956 if(!prs_uint32("ptr_buf", ps
, depth
, &(q_u
->ptr_buf
)))
960 if(!prs_uint32("ptr_bufsize", ps
, depth
, &(q_u
->ptr_bufsize
)))
962 if(!prs_uint32("bufsize", ps
, depth
, &(q_u
->bufsize
)))
964 if(!prs_uint32("buf_unk", ps
, depth
, &(q_u
->buf_unk
)))
968 if(!prs_uint32("unk1", ps
, depth
, &(q_u
->unk1
)))
971 if(!prs_uint32("ptr_buflen", ps
, depth
, &(q_u
->ptr_buflen
)))
974 if (q_u
->ptr_buflen
) {
975 if(!prs_uint32("buflen", ps
, depth
, &(q_u
->buflen
)))
977 if(!prs_uint32("ptr_buflen2", ps
, depth
, &(q_u
->ptr_buflen2
)))
979 if(!prs_uint32("buflen2", ps
, depth
, &(q_u
->buflen2
)))
986 /*******************************************************************
988 New version to replace older init_reg_r_query_value()
989 ********************************************************************/
991 BOOL
init_reg_r_query_value(uint32 include_keyval
, REG_R_QUERY_VALUE
*r_u
,
992 REGISTRY_VALUE
*val
, WERROR status
)
1000 r_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1001 *r_u
->type
= val
->type
;
1003 buf_len
= reg_init_regval_buffer( &buf2
, val
);
1005 r_u
->buf_max_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1006 *r_u
->buf_max_len
= buf_len
;
1008 r_u
->buf_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1009 *r_u
->buf_len
= buf_len
;
1011 /* if include_keyval is not set, don't send the key value, just
1012 the buflen data. probably used by NT5 to allocate buffer space - SK */
1014 if ( include_keyval
) {
1015 r_u
->value
= TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER
);
1016 /* steal the memory */
1020 r_u
->status
= status
;
1025 /*******************************************************************
1026 reads or writes a structure.
1027 ********************************************************************/
1029 BOOL
reg_io_r_query_value(const char *desc
, REG_R_QUERY_VALUE
*r_u
, prs_struct
*ps
, int depth
)
1034 prs_debug(ps
, depth
, desc
, "reg_io_r_query_value");
1040 if ( !prs_pointer("type", ps
, depth
, (void**)&r_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1043 if ( !prs_pointer("value", ps
, depth
, (void**)&r_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1048 if ( !prs_pointer("buf_max_len", ps
, depth
, (void**)&r_u
->buf_max_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1050 if ( !prs_pointer("buf_len", ps
, depth
, (void**)&r_u
->buf_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1053 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1059 /*******************************************************************
1061 ********************************************************************/
1063 void init_reg_q_enum_val(REG_Q_ENUM_VALUE
*q_u
, POLICY_HND
*pol
,
1065 uint32 max_name_len
, uint32 max_buf_len
)
1069 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1071 q_u
->val_index
= val_idx
;
1073 q_u
->name
.size
= max_name_len
*2;
1074 q_u
->name
.string
= TALLOC_ZERO_P( get_talloc_ctx(), UNISTR2
);
1075 q_u
->name
.string
->uni_max_len
= max_name_len
;
1077 q_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1080 q_u
->value
= TALLOC_ZERO_P( get_talloc_ctx(), REGVAL_BUFFER
);
1081 q_u
->value
->buf_max_len
= max_buf_len
;
1083 q_u
->buffer_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1084 *q_u
->buffer_len
= max_buf_len
;
1086 q_u
->name_len
= TALLOC_P( get_talloc_ctx(), uint32
);
1087 *q_u
->name_len
= 0x0;
1090 /*******************************************************************
1092 ********************************************************************/
1094 void init_reg_r_enum_val(REG_R_ENUM_VALUE
*r_u
, REGISTRY_VALUE
*val
)
1102 DEBUG(10,("init_reg_r_enum_val: Valuename => [%s]\n", val
->valuename
));
1104 init_unistr4( &r_u
->name
, val
->valuename
, UNI_STR_TERMINATE
);
1108 r_u
->type
= TALLOC_P( get_talloc_ctx(), uint32
);
1109 *r_u
->type
= val
->type
;
1111 /* REG_SZ & REG_MULTI_SZ must be converted to UNICODE */
1113 r_u
->value
= TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER
);
1114 real_size
= reg_init_regval_buffer( r_u
->value
, val
);
1118 r_u
->buffer_len1
= TALLOC_P( get_talloc_ctx(), uint32
);
1119 *r_u
->buffer_len1
= real_size
;
1120 r_u
->buffer_len2
= TALLOC_P( get_talloc_ctx(), uint32
);
1121 *r_u
->buffer_len2
= real_size
;
1124 /*******************************************************************
1125 reads or writes a structure.
1126 ********************************************************************/
1128 BOOL
reg_io_q_enum_val(const char *desc
, REG_Q_ENUM_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1133 prs_debug(ps
, depth
, desc
, "reg_io_q_enum_val");
1139 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1142 if(!prs_uint32("val_index", ps
, depth
, &q_u
->val_index
))
1145 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1150 if(!prs_pointer("type", ps
, depth
, (void**)&q_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1153 if ( !prs_pointer("value", ps
, depth
, (void**)&q_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1158 if(!prs_pointer("buffer_len", ps
, depth
, (void**)&q_u
->buffer_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1160 if(!prs_pointer("name_len", ps
, depth
, (void**)&q_u
->name_len
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1166 /*******************************************************************
1167 reads or writes a structure.
1168 ********************************************************************/
1170 BOOL
reg_io_r_enum_val(const char *desc
, REG_R_ENUM_VALUE
*r_u
, prs_struct
*ps
, int depth
)
1175 prs_debug(ps
, depth
, desc
, "reg_io_r_enum_val");
1181 if(!prs_unistr4("name", ps
, depth
, &r_u
->name
))
1186 if(!prs_pointer("type", ps
, depth
, (void**)&r_u
->type
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1189 if ( !prs_pointer("value", ps
, depth
, (void**)&r_u
->value
, sizeof(REGVAL_BUFFER
), (PRS_POINTER_CAST
)smb_io_regval_buffer
))
1194 if(!prs_pointer("buffer_len1", ps
, depth
, (void**)&r_u
->buffer_len1
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1196 if(!prs_pointer("buffer_len2", ps
, depth
, (void**)&r_u
->buffer_len2
, sizeof(uint32
), (PRS_POINTER_CAST
)prs_uint32
))
1199 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1205 /*******************************************************************
1207 ********************************************************************/
1209 void init_reg_q_set_val(REG_Q_SET_VALUE
*q_u
, POLICY_HND
*pol
,
1210 char *val_name
, uint32 type
,
1215 memcpy(&q_u
->handle
, pol
, sizeof(q_u
->handle
));
1217 init_unistr4(&q_u
->name
, val_name
, UNI_STR_TERMINATE
);
1221 q_u
->size
= val
->buf_len
;
1224 /*******************************************************************
1225 reads or writes a structure.
1226 ********************************************************************/
1228 BOOL
reg_io_q_set_value(const char *desc
, REG_Q_SET_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1233 prs_debug(ps
, depth
, desc
, "reg_io_q_set_value");
1239 if(!smb_io_pol_hnd("", &q_u
->handle
, ps
, depth
))
1242 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1247 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
1250 if(!smb_io_rpc_blob("value", &q_u
->value
, ps
, depth
))
1255 if(!prs_uint32("size", ps
, depth
, &q_u
->size
))
1261 /*******************************************************************
1262 reads or writes a structure.
1263 ********************************************************************/
1265 BOOL
reg_io_r_set_value(const char *desc
, REG_R_SET_VALUE
*q_u
, prs_struct
*ps
, int depth
)
1270 prs_debug(ps
, depth
, desc
, "reg_io_r_set_value");
1276 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
1282 /*******************************************************************
1284 ********************************************************************/
1286 void init_reg_q_enum_key(REG_Q_ENUM_KEY
*q_u
, POLICY_HND
*pol
, uint32 key_idx
)
1288 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1290 q_u
->key_index
= key_idx
;
1291 q_u
->key_name_len
= 0;
1292 q_u
->unknown_1
= 0x0414;
1295 q_u
->unknown_2
= 0x0000020A;
1296 memset(q_u
->pad1
, 0, sizeof(q_u
->pad1
));
1299 memset(q_u
->pad2
, 0, sizeof(q_u
->pad2
));
1302 unix_to_nt_time(&q_u
->time
, 0); /* current time? */
1305 /*******************************************************************
1306 makes a reply structure.
1307 ********************************************************************/
1309 void init_reg_r_enum_key(REG_R_ENUM_KEY
*r_u
, char *subkey
)
1314 init_unistr4( &r_u
->keyname
, subkey
, UNI_STR_TERMINATE
);
1315 r_u
->classname
= TALLOC_ZERO_P( get_talloc_ctx(), UNISTR4
);
1316 r_u
->time
= TALLOC_ZERO_P( get_talloc_ctx(), NTTIME
);
1319 /*******************************************************************
1320 reads or writes a structure.
1321 ********************************************************************/
1323 BOOL
reg_io_q_enum_key(const char *desc
, REG_Q_ENUM_KEY
*q_u
, prs_struct
*ps
, int depth
)
1328 prs_debug(ps
, depth
, desc
, "reg_io_q_enum_key");
1334 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1337 if(!prs_uint32("key_index", ps
, depth
, &q_u
->key_index
))
1339 if(!prs_uint16("key_name_len", ps
, depth
, &q_u
->key_name_len
))
1341 if(!prs_uint16("unknown_1", ps
, depth
, &q_u
->unknown_1
))
1344 if(!prs_uint32("ptr1", ps
, depth
, &q_u
->ptr1
))
1347 if (q_u
->ptr1
!= 0) {
1348 if(!prs_uint32("unknown_2", ps
, depth
, &q_u
->unknown_2
))
1350 if(!prs_uint8s(False
, "pad1", ps
, depth
, q_u
->pad1
, sizeof(q_u
->pad1
)))
1354 if(!prs_uint32("ptr2", ps
, depth
, &q_u
->ptr2
))
1357 if (q_u
->ptr2
!= 0) {
1358 if(!prs_uint8s(False
, "pad2", ps
, depth
, q_u
->pad2
, sizeof(q_u
->pad2
)))
1362 if(!prs_uint32("ptr3", ps
, depth
, &q_u
->ptr3
))
1365 if (q_u
->ptr3
!= 0) {
1366 if(!smb_io_time("", &q_u
->time
, ps
, depth
))
1373 /*******************************************************************
1374 reads or writes a structure.
1375 ********************************************************************/
1377 BOOL
reg_io_r_enum_key(const char *desc
, REG_R_ENUM_KEY
*q_u
, prs_struct
*ps
, int depth
)
1382 prs_debug(ps
, depth
, desc
, "reg_io_r_enum_key");
1387 if ( !prs_unistr4( "keyname", ps
, depth
, &q_u
->keyname
) )
1392 if (!prs_pointer("class", ps
, depth
, (void**)&q_u
->classname
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1397 if (!prs_pointer("time", ps
, depth
, (void**)&q_u
->time
, sizeof(NTTIME
), (PRS_POINTER_CAST
)smb_io_nttime
))
1402 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
1408 /*******************************************************************
1410 ********************************************************************/
1412 void init_reg_q_open_entry(REG_Q_OPEN_ENTRY
*q_u
, POLICY_HND
*pol
,
1413 char *key_name
, uint32 access_desired
)
1415 memcpy(&q_u
->pol
, pol
, sizeof(q_u
->pol
));
1417 init_unistr4(&q_u
->name
, key_name
, UNI_STR_TERMINATE
);
1419 q_u
->unknown_0
= 0x00000000;
1420 q_u
->access
= access_desired
;
1423 /*******************************************************************
1424 reads or writes a structure.
1425 ********************************************************************/
1427 BOOL
reg_io_q_open_entry(const char *desc
, REG_Q_OPEN_ENTRY
*q_u
, prs_struct
*ps
, int depth
)
1432 prs_debug(ps
, depth
, desc
, "reg_io_q_open_entry");
1438 if(!smb_io_pol_hnd("", &q_u
->pol
, ps
, depth
))
1440 if(!prs_unistr4("name", ps
, depth
, &q_u
->name
))
1446 if(!prs_uint32("unknown_0 ", ps
, depth
, &q_u
->unknown_0
))
1448 if(!prs_uint32("access", ps
, depth
, &q_u
->access
))
1454 /*******************************************************************
1455 reads or writes a structure.
1456 ********************************************************************/
1458 BOOL
reg_io_r_open_entry(const char *desc
, REG_R_OPEN_ENTRY
*r_u
, prs_struct
*ps
, int depth
)
1463 prs_debug(ps
, depth
, desc
, "reg_io_r_open_entry");
1469 if(!smb_io_pol_hnd("handle", &r_u
->handle
, ps
, depth
))
1472 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1478 /*******************************************************************
1480 ********************************************************************/
1482 void init_reg_q_shutdown(REG_Q_SHUTDOWN
*q_u
, const char *msg
,
1483 uint32 timeout
, BOOL do_reboot
, BOOL force
)
1485 q_u
->server
= TALLOC_P( get_talloc_ctx(), uint16
);
1488 q_u
->message
= TALLOC_P( get_talloc_ctx(), UNISTR4
);
1489 init_unistr4( q_u
->message
, msg
, UNI_FLAGS_NONE
);
1491 q_u
->timeout
= timeout
;
1493 q_u
->reboot
= do_reboot
? 1 : 0;
1494 q_u
->force
= force
? 1 : 0;
1497 /*******************************************************************
1498 Inits a REG_Q_SHUTDOWN_EX structure.
1499 ********************************************************************/
1501 void init_reg_q_shutdown_ex(REG_Q_SHUTDOWN_EX
* q_u_ex
, const char *msg
,
1502 uint32 timeout
, BOOL do_reboot
, BOOL force
, uint32 reason
)
1508 init_reg_q_shutdown( &q_u
, msg
, timeout
, do_reboot
, force
);
1512 q_u_ex
->server
= q_u
.server
;
1513 q_u_ex
->message
= q_u
.message
;
1515 q_u_ex
->reboot
= q_u
.reboot
;
1516 q_u_ex
->force
= q_u
.force
;
1518 q_u_ex
->reason
= reason
;
1521 /*******************************************************************
1522 reads or writes a structure.
1523 ********************************************************************/
1525 BOOL
reg_io_q_shutdown(const char *desc
, REG_Q_SHUTDOWN
*q_u
, prs_struct
*ps
,
1531 prs_debug(ps
, depth
, desc
, "reg_io_q_shutdown");
1537 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1540 if (!prs_pointer("message", ps
, depth
, (void**)&q_u
->message
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1546 if (!prs_uint32("timeout", ps
, depth
, &(q_u
->timeout
)))
1549 if (!prs_uint8("force ", ps
, depth
, &(q_u
->force
)))
1551 if (!prs_uint8("reboot ", ps
, depth
, &(q_u
->reboot
)))
1558 /*******************************************************************
1559 reads or writes a structure.
1560 ********************************************************************/
1561 BOOL
reg_io_r_shutdown(const char *desc
, REG_R_SHUTDOWN
*r_u
, prs_struct
*ps
,
1567 prs_debug(ps
, depth
, desc
, "reg_io_r_shutdown");
1573 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1579 /*******************************************************************
1580 reads or writes a REG_Q_SHUTDOWN_EX structure.
1581 ********************************************************************/
1583 BOOL
reg_io_q_shutdown_ex(const char *desc
, REG_Q_SHUTDOWN_EX
*q_u
, prs_struct
*ps
,
1589 prs_debug(ps
, depth
, desc
, "reg_io_q_shutdown_ex");
1595 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1598 if (!prs_pointer("message", ps
, depth
, (void**)&q_u
->message
, sizeof(UNISTR4
), (PRS_POINTER_CAST
)prs_unistr4
))
1604 if (!prs_uint32("timeout", ps
, depth
, &(q_u
->timeout
)))
1607 if (!prs_uint8("force ", ps
, depth
, &(q_u
->force
)))
1609 if (!prs_uint8("reboot ", ps
, depth
, &(q_u
->reboot
)))
1614 if (!prs_uint32("reason", ps
, depth
, &(q_u
->reason
)))
1621 /*******************************************************************
1622 reads or writes a REG_R_SHUTDOWN_EX structure.
1623 ********************************************************************/
1624 BOOL
reg_io_r_shutdown_ex(const char *desc
, REG_R_SHUTDOWN_EX
*r_u
, prs_struct
*ps
,
1630 prs_debug(ps
, depth
, desc
, "reg_io_r_shutdown_ex");
1636 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1644 /*******************************************************************
1646 ********************************************************************/
1647 void init_reg_q_abort_shutdown(REG_Q_ABORT_SHUTDOWN
*q_u
)
1649 q_u
->server
= TALLOC_P( get_talloc_ctx(), uint16
);
1653 /*******************************************************************
1654 reads or writes a structure.
1655 ********************************************************************/
1656 BOOL
reg_io_q_abort_shutdown(const char *desc
, REG_Q_ABORT_SHUTDOWN
*q_u
,
1657 prs_struct
*ps
, int depth
)
1662 prs_debug(ps
, depth
, desc
, "reg_io_q_abort_shutdown");
1668 if (!prs_pointer("server", ps
, depth
, (void**)&q_u
->server
, sizeof(uint16
), (PRS_POINTER_CAST
)prs_uint16
))
1674 /*******************************************************************
1675 reads or writes a structure.
1676 ********************************************************************/
1677 BOOL
reg_io_r_abort_shutdown(const char *desc
, REG_R_ABORT_SHUTDOWN
*r_u
,
1678 prs_struct
*ps
, int depth
)
1683 prs_debug(ps
, depth
, desc
, "reg_io_r_abort_shutdown");
1689 if (!prs_werror("status", ps
, depth
, &r_u
->status
))