registry delete value command: "regdeleteval".
[vlendec/samba-autobuild/.git] / source3 / rpc_parse / parse_reg.c
1 /* 
2  *  Unix SMB/Netbios implementation.
3  *  Version 1.9.
4  *  RPC Pipe client / server routines
5  *  Copyright (C) Andrew Tridgell              1992-1997,
6  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
7  *  Copyright (C) Paul Ashton                       1997.
8  *  
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *  
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *  
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  */
23
24
25 #include "includes.h"
26
27 extern int DEBUGLEVEL;
28
29
30 /*******************************************************************
31 creates a structure.
32 ********************************************************************/
33 void make_reg_q_open_hklm(REG_Q_OPEN_HKLM *q_o,
34                                 uint16 unknown_0, uint32 level)
35 {
36         q_o->ptr = 1;
37         q_o->unknown_0 = unknown_0;
38         q_o->unknown_1 = 0x0; /* random - changes */
39         q_o->level = level;
40 }
41
42 /*******************************************************************
43 reads or writes a structure.
44 ********************************************************************/
45 void reg_io_q_open_hklm(char *desc,  REG_Q_OPEN_HKLM *r_q, prs_struct *ps, int depth)
46 {
47         if (r_q == NULL) return;
48
49         prs_debug(ps, depth, desc, "reg_io_q_open_hklm");
50         depth++;
51
52         prs_align(ps);
53         
54         prs_uint32("ptr      ", ps, depth, &(r_q->ptr      ));
55         if (r_q->ptr != 0)
56         {
57                 prs_uint16("unknown_0", ps, depth, &(r_q->unknown_0));
58                 prs_uint16("unknown_1", ps, depth, &(r_q->unknown_1));
59                 prs_uint32("level    ", ps, depth, &(r_q->level    ));
60         }
61 }
62
63
64 /*******************************************************************
65 reads or writes a structure.
66 ********************************************************************/
67 void reg_io_r_open_hklm(char *desc,  REG_R_OPEN_HKLM *r_r, prs_struct *ps, int depth)
68 {
69         if (r_r == NULL) return;
70
71         prs_debug(ps, depth, desc, "reg_io_r_open_hklm");
72         depth++;
73
74         prs_align(ps);
75         
76         smb_io_pol_hnd("", &(r_r->pol), ps, depth);
77
78         prs_uint32("status", ps, depth, &(r_r->status));
79 }
80
81
82 /*******************************************************************
83 creates a structure.
84 ********************************************************************/
85 void make_reg_q_flush_key(REG_Q_FLUSH_KEY *q_u, POLICY_HND *pol)
86 {
87         memcpy(&(q_u->pol), pol, sizeof(q_u->pol));
88 }
89
90 /*******************************************************************
91 reads or writes a structure.
92 ********************************************************************/
93 void reg_io_q_flush_key(char *desc,  REG_Q_FLUSH_KEY *r_q, prs_struct *ps, int depth)
94 {
95         if (r_q == NULL) return;
96
97         prs_debug(ps, depth, desc, "reg_io_q_flush_key");
98         depth++;
99
100         prs_align(ps);
101         
102         smb_io_pol_hnd("", &(r_q->pol), ps, depth);
103 }
104
105
106 /*******************************************************************
107 reads or writes a structure.
108 ********************************************************************/
109 void reg_io_r_flush_key(char *desc,  REG_R_FLUSH_KEY *r_r, prs_struct *ps, int depth)
110 {
111         if (r_r == NULL) return;
112
113         prs_debug(ps, depth, desc, "reg_io_r_flush_key");
114         depth++;
115
116         prs_align(ps);
117         
118         prs_uint32("status", ps, depth, &(r_r->status));
119 }
120
121
122
123 /*******************************************************************
124 creates a structure.
125 ********************************************************************/
126 void make_reg_q_create_key(REG_Q_CREATE_KEY *q_c, POLICY_HND *hnd,
127                                 char *name, char *class,
128                                 SEC_INFO *sam_access)
129 {
130         int len_name  = name  != NULL ? strlen(name ) + 1: 0;
131         int len_class = class != NULL ? strlen(class) + 1: 0;
132
133         static unsigned char data[] =
134         {
135                 0x01, 0x00, 0x00, 0x80,
136                 0x00, 0x00, 0x00, 0x00,
137                 0x00, 0x00, 0x00, 0x00,
138                 0x00, 0x00, 0x00, 0x00,
139                 0x00, 0x00, 0x00, 0x00
140         };
141
142         ZERO_STRUCTP(q_c);
143
144         memcpy(&(q_c->pnt_pol), hnd, sizeof(q_c->pnt_pol));
145
146         make_uni_hdr(&(q_c->hdr_name), len_name, len_name, 1);
147         make_unistr2(&(q_c->uni_name), name, len_name);
148
149         make_uni_hdr(&(q_c->hdr_class), len_class, len_class, 1);
150         make_unistr2(&(q_c->uni_class), class, len_class);
151
152         q_c->reserved = 0x00000000;
153         memcpy(&(q_c->sam_access), sam_access, sizeof(q_c->sam_access));
154
155         q_c->ptr1 = 1;
156         q_c->unknown_0 = 0x0000000C;
157
158         q_c->ptr2 = 1;
159         q_c->sec_len1 = 0x14;
160         q_c->sec_len2 = 0x14;
161         q_c->sec_len3 = 0x0;
162         q_c->sec_len4 = 0x14;
163         q_c->sec_len5 = 0x0;
164         q_c->sec_len6 = 0x14;
165
166         memcpy(&q_c->buf_unk, data, sizeof(q_c->buf_unk));
167
168         q_c->unknown_2 = 0x00000000;
169 }
170
171 /*******************************************************************
172 reads or writes a structure.
173 ********************************************************************/
174 void reg_io_q_create_key(char *desc,  REG_Q_CREATE_KEY *r_q, prs_struct *ps, int depth)
175 {
176         if (r_q == NULL) return;
177
178         prs_debug(ps, depth, desc, "reg_io_q_create_key");
179         depth++;
180
181         prs_align(ps);
182         
183         smb_io_pol_hnd("", &(r_q->pnt_pol), ps, depth);
184
185         smb_io_unihdr ("", &(r_q->hdr_name), ps, depth);
186         smb_io_unistr2("", &(r_q->uni_name), r_q->hdr_name.buffer, ps, depth);
187         prs_align(ps);
188
189         smb_io_unihdr ("", &(r_q->hdr_class), ps, depth);
190         smb_io_unistr2("", &(r_q->uni_class), r_q->hdr_class.buffer, ps, depth);
191         prs_align(ps);
192
193         prs_uint32("reserved", ps, depth, &(r_q->reserved));
194         sec_io_info("sam_access", &r_q->sam_access, ps, depth);
195
196         prs_uint32("ptr1", ps, depth, &(r_q->ptr1));
197         if (r_q->ptr2 != 0)
198         {
199                 prs_uint32("unknown_0", ps, depth, &(r_q->unknown_0));
200         }
201
202         prs_uint32("ptr2", ps, depth, &(r_q->ptr2));
203         if (r_q->ptr2)
204         {
205                 prs_uint32("sec_len1", ps, depth, &(r_q->sec_len1));
206                 prs_uint32("sec_len2", ps, depth, &(r_q->sec_len2));
207                 prs_uint32("sec_len3", ps, depth, &(r_q->sec_len3));
208                 prs_uint32("sec_len4", ps, depth, &(r_q->sec_len4));
209                 prs_uint32("sec_len5", ps, depth, &(r_q->sec_len5));
210                 prs_uint32("sec_len6", ps, depth, &(r_q->sec_len6));
211                 prs_uint8s(False, "buf_unk", ps, depth, r_q->buf_unk, sizeof(r_q->buf_unk));
212                 prs_align(ps);
213
214                 prs_uint32("unknown_2", ps, depth, &(r_q->unknown_2));
215         }
216
217         prs_align(ps);
218 }
219
220
221 /*******************************************************************
222 reads or writes a structure.
223 ********************************************************************/
224 void reg_io_r_create_key(char *desc,  REG_R_CREATE_KEY *r_r, prs_struct *ps, int depth)
225 {
226         if (r_r == NULL) return;
227
228         prs_debug(ps, depth, desc, "reg_io_r_create_key");
229         depth++;
230
231         prs_align(ps);
232         
233         smb_io_pol_hnd("", &(r_r->key_pol), ps, depth);
234         prs_uint32("unknown", ps, depth, &(r_r->unknown));
235
236         prs_uint32("status", ps, depth, &(r_r->status));
237 }
238
239
240 /*******************************************************************
241 creates a structure.
242 ********************************************************************/
243 void make_reg_q_delete_val(REG_Q_DELETE_VALUE *q_c, POLICY_HND *hnd,
244                                 char *name)
245 {
246         int len_name  = name  != NULL ? strlen(name ) + 1: 0;
247         ZERO_STRUCTP(q_c);
248
249         memcpy(&(q_c->pnt_pol), hnd, sizeof(q_c->pnt_pol));
250
251         make_uni_hdr(&(q_c->hdr_name), len_name, len_name, 1);
252         make_unistr2(&(q_c->uni_name), name, len_name);
253 }
254
255 /*******************************************************************
256 reads or writes a structure.
257 ********************************************************************/
258 void reg_io_q_delete_val(char *desc,  REG_Q_DELETE_VALUE *r_q, prs_struct *ps, int depth)
259 {
260         if (r_q == NULL) return;
261
262         prs_debug(ps, depth, desc, "reg_io_q_delete_val");
263         depth++;
264
265         prs_align(ps);
266         
267         smb_io_pol_hnd("", &(r_q->pnt_pol), ps, depth);
268
269         smb_io_unihdr ("", &(r_q->hdr_name), ps, depth);
270         smb_io_unistr2("", &(r_q->uni_name), r_q->hdr_name.buffer, ps, depth);
271         prs_align(ps);
272 }
273
274
275 /*******************************************************************
276 reads or writes a structure.
277 ********************************************************************/
278 void reg_io_r_delete_val(char *desc,  REG_R_DELETE_VALUE *r_r, prs_struct *ps, int depth)
279 {
280         if (r_r == NULL) return;
281
282         prs_debug(ps, depth, desc, "reg_io_r_delete_val");
283         depth++;
284
285         prs_align(ps);
286         
287         prs_uint32("status", ps, depth, &(r_r->status));
288 }
289
290
291 /*******************************************************************
292 creates a structure.
293 ********************************************************************/
294 void make_reg_q_delete_key(REG_Q_DELETE_KEY *q_c, POLICY_HND *hnd,
295                                 char *name)
296 {
297         int len_name  = name  != NULL ? strlen(name ) + 1: 0;
298         ZERO_STRUCTP(q_c);
299
300         memcpy(&(q_c->pnt_pol), hnd, sizeof(q_c->pnt_pol));
301
302         make_uni_hdr(&(q_c->hdr_name), len_name, len_name, 1);
303         make_unistr2(&(q_c->uni_name), name, len_name);
304 }
305
306 /*******************************************************************
307 reads or writes a structure.
308 ********************************************************************/
309 void reg_io_q_delete_key(char *desc,  REG_Q_DELETE_KEY *r_q, prs_struct *ps, int depth)
310 {
311         if (r_q == NULL) return;
312
313         prs_debug(ps, depth, desc, "reg_io_q_delete_key");
314         depth++;
315
316         prs_align(ps);
317         
318         smb_io_pol_hnd("", &(r_q->pnt_pol), ps, depth);
319
320         smb_io_unihdr ("", &(r_q->hdr_name), ps, depth);
321         smb_io_unistr2("", &(r_q->uni_name), r_q->hdr_name.buffer, ps, depth);
322         prs_align(ps);
323 }
324
325
326 /*******************************************************************
327 reads or writes a structure.
328 ********************************************************************/
329 void reg_io_r_delete_key(char *desc,  REG_R_DELETE_KEY *r_r, prs_struct *ps, int depth)
330 {
331         if (r_r == NULL) return;
332
333         prs_debug(ps, depth, desc, "reg_io_r_delete_key");
334         depth++;
335
336         prs_align(ps);
337         
338         prs_uint32("status", ps, depth, &(r_r->status));
339 }
340
341
342 /*******************************************************************
343 creates a structure.
344 ********************************************************************/
345 void make_reg_q_query_key(REG_Q_QUERY_KEY *q_o, POLICY_HND *hnd,
346                                 uint32 max_class_len)
347 {
348         ZERO_STRUCTP(q_o);
349
350         memcpy(&(q_o->pol), hnd, sizeof(q_o->pol));
351         make_uni_hdr(&q_o->hdr_class, max_class_len, 0, max_class_len > 0 ? 1 : 0);
352         q_o->uni_class.uni_max_len = max_class_len;
353 }
354
355 /*******************************************************************
356 reads or writes a structure.
357 ********************************************************************/
358 void reg_io_q_query_key(char *desc,  REG_Q_QUERY_KEY *r_q, prs_struct *ps, int depth)
359 {
360         if (r_q == NULL) return;
361
362         prs_debug(ps, depth, desc, "reg_io_q_query_key");
363         depth++;
364
365         prs_align(ps);
366         
367         smb_io_pol_hnd("", &(r_q->pol), ps, depth);
368         smb_io_unihdr ("", &(r_q->hdr_class), ps, depth);
369         smb_io_unistr2("", &(r_q->uni_class), r_q->hdr_class.buffer, ps, depth);
370
371         prs_align(ps);
372 }
373
374
375 /*******************************************************************
376 reads or writes a structure.
377 ********************************************************************/
378 void reg_io_r_query_key(char *desc,  REG_R_QUERY_KEY *r_r, prs_struct *ps, int depth)
379 {
380         if (r_r == NULL) return;
381
382         prs_debug(ps, depth, desc, "reg_io_r_query_key");
383         depth++;
384
385         prs_align(ps);
386         
387         smb_io_unihdr ("", &(r_r->hdr_class), ps, depth);
388         smb_io_unistr2("", &(r_r->uni_class), r_r->hdr_class.buffer, ps, depth);
389
390         prs_align(ps);
391
392         prs_uint32("num_subkeys   ", ps, depth, &(r_r->num_subkeys   ));
393         prs_uint32("max_subkeylen ", ps, depth, &(r_r->max_subkeylen ));
394         prs_uint32("mak_subkeysize", ps, depth, &(r_r->max_subkeysize));
395         prs_uint32("num_values    ", ps, depth, &(r_r->num_values    ));
396         prs_uint32("max_valnamelen", ps, depth, &(r_r->max_valnamelen));
397         prs_uint32("max_valbufsize", ps, depth, &(r_r->max_valbufsize));
398         prs_uint32("sec_desc      ", ps, depth, &(r_r->sec_desc      ));
399         smb_io_time("mod_time     ", &(r_r->mod_time), ps, depth);
400         
401         prs_uint32("status", ps, depth, &(r_r->status));
402 }
403
404
405 /*******************************************************************
406 creates a structure.
407 ********************************************************************/
408 void make_reg_q_unk_1a(REG_Q_UNK_1A *q_o, POLICY_HND *hnd)
409 {
410         memcpy(&(q_o->pol), hnd, sizeof(q_o->pol));
411 }
412
413 /*******************************************************************
414 reads or writes a structure.
415 ********************************************************************/
416 void reg_io_q_unk_1a(char *desc,  REG_Q_UNK_1A *r_q, prs_struct *ps, int depth)
417 {
418         if (r_q == NULL) return;
419
420         prs_debug(ps, depth, desc, "reg_io_q_unk_1a");
421         depth++;
422
423         prs_align(ps);
424         
425         smb_io_pol_hnd("", &(r_q->pol), ps, depth);
426 }
427
428
429 /*******************************************************************
430 reads or writes a structure.
431 ********************************************************************/
432 void reg_io_r_unk_1a(char *desc,  REG_R_UNK_1A *r_r, prs_struct *ps, int depth)
433 {
434         if (r_r == NULL) return;
435
436         prs_debug(ps, depth, desc, "reg_io_r_unk_1a");
437         depth++;
438
439         prs_align(ps);
440         
441         prs_uint32("unknown", ps, depth, &(r_r->unknown));
442         prs_uint32("status" , ps, depth, &(r_r->status ));
443 }
444
445
446 /*******************************************************************
447 creates a structure.
448 ********************************************************************/
449 void make_reg_q_open_hku(REG_Q_OPEN_HKU *q_o,
450                                 uint16 unknown_0, uint32 level)
451 {
452         q_o->ptr = 1;
453         q_o->unknown_0 = unknown_0;
454         q_o->unknown_1 = 0x0; /* random - changes */
455         q_o->level = level;
456 }
457
458 /*******************************************************************
459 reads or writes a structure.
460 ********************************************************************/
461 void reg_io_q_open_hku(char *desc,  REG_Q_OPEN_HKU *r_q, prs_struct *ps, int depth)
462 {
463         if (r_q == NULL) return;
464
465         prs_debug(ps, depth, desc, "reg_io_q_open_hku");
466         depth++;
467
468         prs_align(ps);
469         
470         prs_uint32("ptr      ", ps, depth, &(r_q->ptr      ));
471         if (r_q->ptr != 0)
472         {
473                 prs_uint16("unknown_0", ps, depth, &(r_q->unknown_0));
474                 prs_uint16("unknown_1", ps, depth, &(r_q->unknown_1));
475                 prs_uint32("level    ", ps, depth, &(r_q->level    ));
476         }
477 }
478
479
480 /*******************************************************************
481 reads or writes a structure.
482 ********************************************************************/
483 void reg_io_r_open_hku(char *desc,  REG_R_OPEN_HKU *r_r, prs_struct *ps, int depth)
484 {
485         if (r_r == NULL) return;
486
487         prs_debug(ps, depth, desc, "reg_io_r_open_hku");
488         depth++;
489
490         prs_align(ps);
491         
492         smb_io_pol_hnd("", &(r_r->pol), ps, depth);
493
494         prs_uint32("status", ps, depth, &(r_r->status));
495 }
496
497
498 /*******************************************************************
499 makes an REG_Q_CLOSE structure.
500 ********************************************************************/
501 void make_reg_q_close(REG_Q_CLOSE *q_c, POLICY_HND *hnd)
502 {
503         if (q_c == NULL || hnd == NULL) return;
504
505         DEBUG(5,("make_reg_q_close\n"));
506
507         memcpy(&(q_c->pol), hnd, sizeof(q_c->pol));
508 }
509
510 /*******************************************************************
511 reads or writes a structure.
512 ********************************************************************/
513 void reg_io_q_close(char *desc,  REG_Q_CLOSE *q_u, prs_struct *ps, int depth)
514 {
515         if (q_u == NULL) return;
516
517         prs_debug(ps, depth, desc, "reg_io_q_unknown_1");
518         depth++;
519
520         prs_align(ps);
521
522         smb_io_pol_hnd("", &(q_u->pol), ps, depth); 
523         prs_align(ps);
524 }
525
526 /*******************************************************************
527 reads or writes a structure.
528 ********************************************************************/
529 void reg_io_r_close(char *desc,  REG_R_CLOSE *r_u, prs_struct *ps, int depth)
530 {
531         if (r_u == NULL) return;
532
533         prs_debug(ps, depth, desc, "reg_io_r_unknown_1");
534         depth++;
535
536         prs_align(ps);
537
538         smb_io_pol_hnd("", &(r_u->pol), ps, depth); 
539         prs_align(ps);
540
541         prs_uint32("status", ps, depth, &(r_u->status));
542 }
543
544 /*******************************************************************
545 makes a structure.
546 ********************************************************************/
547 void make_reg_q_get_key_sec(REG_Q_GET_KEY_SEC *q_i, POLICY_HND *pol, 
548                                 uint32 buf_len, SEC_DESC_BUF *sec_buf)
549 {
550         if (q_i == NULL) return;
551
552         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
553
554         q_i->unknown = 0x7;
555
556         q_i->ptr = 1;
557         q_i->data = sec_buf;
558
559         make_buf_hdr(&(q_i->hdr_sec), buf_len, 0);
560         make_sec_desc_buf(q_i->data, buf_len, 0);
561 }
562
563 /*******************************************************************
564 reads or writes a structure.
565 ********************************************************************/
566 void reg_io_q_get_key_sec(char *desc,  REG_Q_GET_KEY_SEC *r_q, prs_struct *ps, int depth)
567 {
568         if (r_q == NULL) return;
569
570         prs_debug(ps, depth, desc, "reg_io_q_get_key_sec");
571         depth++;
572
573         prs_align(ps);
574         
575         smb_io_pol_hnd("", &(r_q->pol), ps, depth); 
576
577         prs_uint32("unknown", ps, depth, &(r_q->unknown));
578         prs_uint32("ptr    ", ps, depth, &(r_q->ptr    ));
579
580         if (r_q->ptr != 0)
581         {
582                 smb_io_hdrbuf  ("hdr_sec", &(r_q->hdr_sec), ps, depth);
583                 sec_io_desc_buf("data   ",   r_q->data    , ps, depth);
584
585                 prs_align(ps);
586         }
587 }
588
589 /*******************************************************************
590 makes a structure.
591 ********************************************************************/
592 void make_reg_r_get_key_sec(REG_R_GET_KEY_SEC *r_i, POLICY_HND *pol, 
593                                 uint32 buf_len, uint8 *buf,
594                                 uint32 status)
595 {
596         if (r_i == NULL) return;
597
598         r_i->ptr = 1;
599         make_buf_hdr(&(r_i->hdr_sec), buf_len, buf_len);
600         make_sec_desc_buf(r_i->data, buf_len, 1);
601
602         r_i->status = status; /* 0x0000 0000 or 0x0000 007a */
603 }
604
605 /*******************************************************************
606 reads or writes a structure.
607 ********************************************************************/
608 void reg_io_r_get_key_sec(char *desc,  REG_R_GET_KEY_SEC *r_q, prs_struct *ps, int depth)
609 {
610         if (r_q == NULL) return;
611
612         prs_debug(ps, depth, desc, "reg_io_r_get_key_sec");
613         depth++;
614
615         prs_align(ps);
616         
617         prs_uint32("ptr      ", ps, depth, &(r_q->ptr      ));
618
619         if (r_q->ptr != 0)
620         {
621                 smb_io_hdrbuf("", &(r_q->hdr_sec), ps, depth);
622                 sec_io_desc_buf("", r_q->data, ps, depth);
623
624                 prs_align(ps);
625         }
626
627         prs_uint32("status", ps, depth, &(r_q->status));
628 }
629
630
631 /*******************************************************************
632 makes a structure.
633 ********************************************************************/
634 void make_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char *product_type,
635                                 time_t unix_time, uint8 major, uint8 minor)
636 {
637         int len_type  = strlen(product_type);
638
639         if (q_i == NULL) return;
640
641         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
642
643         make_uni_hdr(&(q_i->hdr_type), len_type, len_type, 1);
644         make_unistr2(&(q_i->uni_type), product_type, len_type);
645
646         q_i->ptr1 = 1;
647         unix_to_nt_time(&(q_i->time), unix_time);
648         q_i->major_version1 = major;
649         q_i->minor_version1 = minor;
650         memset(q_i->pad1, 0, sizeof(q_i->pad1));
651
652         q_i->ptr2 = 1;
653         q_i->major_version2 = major;
654         q_i->minor_version2 = minor;
655         memset(q_i->pad2, 0, sizeof(q_i->pad2));
656
657         q_i->ptr3 = 1;
658         q_i->unknown = 0x00000000;
659 }
660
661 /*******************************************************************
662 reads or writes a structure.
663 ********************************************************************/
664 void reg_io_q_info(char *desc,  REG_Q_INFO *r_q, prs_struct *ps, int depth)
665 {
666         if (r_q == NULL) return;
667
668         prs_debug(ps, depth, desc, "reg_io_q_info");
669         depth++;
670
671         prs_align(ps);
672         
673         smb_io_pol_hnd("", &(r_q->pol), ps, depth); 
674         smb_io_unihdr ("", &(r_q->hdr_type), ps, depth);
675         smb_io_unistr2("", &(r_q->uni_type), r_q->hdr_type.buffer, ps, depth);
676
677         prs_align(ps);
678         
679         prs_uint32("ptr1", ps, depth, &(r_q->ptr1));
680
681         if (r_q->ptr1 != 0)
682         {
683                 smb_io_time("", &(r_q->time), ps, depth);
684                 prs_uint8 ("major_version1", ps, depth, &(r_q->major_version1));
685                 prs_uint8 ("minor_version1", ps, depth, &(r_q->minor_version1));
686                 prs_uint8s(False, "pad1", ps, depth, r_q->pad1, sizeof(r_q->pad1));
687         }
688
689         prs_uint32("ptr2", ps, depth, &(r_q->ptr2));
690
691         if (r_q->ptr2 != 0)
692         {
693                 prs_uint8 ("major_version2", ps, depth, &(r_q->major_version2));
694                 prs_uint8 ("minor_version2", ps, depth, &(r_q->minor_version2));
695                 prs_uint8s(False, "pad2", ps, depth, r_q->pad2, sizeof(r_q->pad2));
696         }
697
698         prs_uint32("ptr3", ps, depth, &(r_q->ptr3));
699
700         if (r_q->ptr3 != 0)
701         {
702                 prs_uint32("unknown", ps, depth, &(r_q->unknown));
703         }
704 }
705
706
707 /*******************************************************************
708 creates a structure.
709 ********************************************************************/
710 void make_reg_r_info(REG_R_INFO *r_r,
711                                 uint32 level, char *os_type,
712                                 uint32 unknown_0, uint32 unknown_1,
713                                 uint32 status)
714 {
715         uint8 buf[512];
716         int len = struni2((uint16*)buf, os_type);
717
718         r_r->ptr1 = 1;
719         r_r->level = level;
720
721         r_r->ptr_type = 1;
722         make_buffer2(&(r_r->uni_type), buf, len*2);
723
724         r_r->ptr2 = 1;
725         r_r->unknown_0 = unknown_0;
726
727         r_r->ptr3 = 1;
728         r_r->unknown_1 = unknown_1;
729
730         r_r->status = status;
731 }
732
733 /*******************************************************************
734 reads or writes a structure.
735 ********************************************************************/
736 void reg_io_r_info(char *desc, REG_R_INFO *r_r, prs_struct *ps, int depth)
737 {
738         if (r_r == NULL) return;
739
740         prs_debug(ps, depth, desc, "reg_io_r_info");
741         depth++;
742
743         prs_align(ps);
744         
745         prs_uint32("ptr1", ps, depth, &(r_r->ptr1));
746
747         if (r_r->ptr1 != 0)
748         {
749                 prs_uint32("level", ps, depth, &(r_r->level));
750                 prs_uint32("ptr_type", ps, depth, &(r_r->ptr_type));
751
752                 smb_io_buffer2("uni_type", &(r_r->uni_type), r_r->ptr_type, ps, depth);
753
754                 prs_uint32("ptr2", ps, depth, &(r_r->ptr2));
755
756                 if (r_r->ptr2 != 0)
757                 {
758                         prs_uint32("unknown_0", ps, depth, &(r_r->unknown_0));
759                 }
760
761                 prs_uint32("ptr3", ps, depth, &(r_r->ptr3));
762
763                 if (r_r->ptr3 != 0)
764                 {
765                         prs_uint32("unknown_1", ps, depth, &(r_r->unknown_1));
766                 }
767
768         }
769         prs_uint32("status", ps, depth, &(r_r->status));
770 }
771
772 /*******************************************************************
773 makes a structure.
774 ********************************************************************/
775 void make_reg_q_enum_val(REG_Q_ENUM_VALUE *q_i, POLICY_HND *pol,
776                                 uint32 val_idx, uint32 max_val_len,
777                                 uint32 max_buf_len)
778 {
779         if (q_i == NULL) return;
780
781         ZERO_STRUCTP(q_i);
782
783         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
784
785         q_i->val_index = val_idx;
786         make_uni_hdr(&q_i->hdr_name, max_val_len, 0, 1);
787         q_i->uni_name.uni_max_len = max_val_len;
788         
789         q_i->ptr_type = 1;
790         q_i->type = 0x0;
791
792         q_i->ptr_value = 1;
793         q_i->buf_value.buf_max_len = max_buf_len;
794
795         q_i->ptr1 = 1;
796         q_i->len_value1 = max_buf_len;
797
798         q_i->ptr2 = 1;
799         q_i->len_value2 = 0;
800 }
801
802 /*******************************************************************
803 reads or writes a structure.
804 ********************************************************************/
805 void reg_io_q_enum_val(char *desc,  REG_Q_ENUM_VALUE *q_q, prs_struct *ps, int depth)
806 {
807         if (q_q == NULL) return;
808
809         prs_debug(ps, depth, desc, "reg_io_q_enum_val");
810         depth++;
811
812         prs_align(ps);
813         
814         smb_io_pol_hnd("", &(q_q->pol), ps, depth); 
815         
816         prs_uint32("val_index", ps, depth, &(q_q->val_index));
817         smb_io_unihdr ("hdr_name", &(q_q->hdr_name), ps, depth);
818         smb_io_unistr2("uni_name", &(q_q->uni_name), q_q->hdr_name.buffer, ps, depth);
819         prs_align(ps);
820
821         prs_uint32("ptr_type", ps, depth, &(q_q->ptr_type));
822
823         if (q_q->ptr_type != 0)
824         {
825                 prs_uint32("type", ps, depth, &(q_q->type));
826         }
827
828         prs_uint32("ptr_value", ps, depth, &(q_q->ptr_value));
829         smb_io_buffer2("buf_value", &(q_q->buf_value), q_q->ptr_value, ps, depth);
830         prs_align(ps);
831
832         prs_uint32("ptr1", ps, depth, &(q_q->ptr1));
833         if (q_q->ptr1 != 0)
834         {
835                 prs_uint32("len_value1", ps, depth, &(q_q->len_value1));
836         }
837         prs_uint32("ptr2", ps, depth, &(q_q->ptr2));
838         if (q_q->ptr2 != 0)
839         {
840                 prs_uint32("len_value2", ps, depth, &(q_q->len_value2));
841         }
842 }
843
844 /*******************************************************************
845 reads or writes a structure.
846 ********************************************************************/
847 void reg_io_r_enum_val(char *desc,  REG_R_ENUM_VALUE *r_q, prs_struct *ps, int depth)
848 {
849         if (r_q == NULL) return;
850
851         prs_debug(ps, depth, desc, "reg_io_r_enum_val");
852         depth++;
853
854         prs_align(ps);
855         
856         smb_io_unihdr ("hdr_name", &(r_q->hdr_name), ps, depth);
857         smb_io_unistr2("uni_name", &(r_q->uni_name), r_q->hdr_name.buffer, ps, depth);
858         prs_align(ps);
859
860         prs_uint32("ptr_type", ps, depth, &(r_q->ptr_type));
861
862         if (r_q->ptr_type != 0)
863         {
864                 prs_uint32("type", ps, depth, &(r_q->type));
865         }
866
867         prs_uint32("ptr_value", ps, depth, &(r_q->ptr_value));
868         smb_io_buffer2("buf_value", r_q->buf_value, r_q->ptr_value, ps, depth);
869         prs_align(ps);
870
871         prs_uint32("ptr1", ps, depth, &(r_q->ptr1));
872         if (r_q->ptr1 != 0)
873         {
874                 prs_uint32("len_value1", ps, depth, &(r_q->len_value1));
875         }
876
877         prs_uint32("ptr2", ps, depth, &(r_q->ptr2));
878         if (r_q->ptr2 != 0)
879         {
880                 prs_uint32("len_value2", ps, depth, &(r_q->len_value2));
881         }
882
883         prs_uint32("status", ps, depth, &(r_q->status));
884 }
885
886 /*******************************************************************
887 makes a structure.
888 ********************************************************************/
889 void make_reg_q_create_val(REG_Q_CREATE_VALUE *q_i, POLICY_HND *pol,
890                                 char *val_name, uint32 type,
891                                 BUFFER3 *val)
892 {
893         int val_len = strlen(val_name) + 1;
894
895         if (q_i == NULL) return;
896
897         ZERO_STRUCTP(q_i);
898
899         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
900
901         make_uni_hdr(&q_i->hdr_name, val_len, val_len, 1);
902         make_unistr2(&(q_i->uni_name), val_name, val_len);
903         
904         q_i->type      = type;
905         q_i->buf_value = val;
906 }
907
908 /*******************************************************************
909 reads or writes a structure.
910 ********************************************************************/
911 void reg_io_q_create_val(char *desc,  REG_Q_CREATE_VALUE *q_q, prs_struct *ps, int depth)
912 {
913         if (q_q == NULL) return;
914
915         prs_debug(ps, depth, desc, "reg_io_q_create_val");
916         depth++;
917
918         prs_align(ps);
919         
920         smb_io_pol_hnd("", &(q_q->pol), ps, depth); 
921         
922         smb_io_unihdr ("hdr_name", &(q_q->hdr_name), ps, depth);
923         smb_io_unistr2("uni_name", &(q_q->uni_name), q_q->hdr_name.buffer, ps, depth);
924         prs_align(ps);
925
926         prs_uint32("type", ps, depth, &(q_q->type));
927         smb_io_buffer3("buf_value", q_q->buf_value, ps, depth);
928         prs_align(ps);
929 }
930
931 /*******************************************************************
932 reads or writes a structure.
933 ********************************************************************/
934 void reg_io_r_create_val(char *desc,  REG_R_CREATE_VALUE *r_q, prs_struct *ps, int depth)
935 {
936         if (r_q == NULL) return;
937
938         prs_debug(ps, depth, desc, "reg_io_r_create_val");
939         depth++;
940
941         prs_align(ps);
942         
943         prs_uint32("status", ps, depth, &(r_q->status));
944 }
945
946 /*******************************************************************
947 makes a structure.
948 ********************************************************************/
949 void make_reg_q_enum_key(REG_Q_ENUM_KEY *q_i, POLICY_HND *pol, uint32 key_idx)
950 {
951         if (q_i == NULL) return;
952
953         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
954
955         q_i->key_index = key_idx;
956         q_i->key_name_len = 0;
957         q_i->unknown_1 = 0x0414;
958
959         q_i->ptr1 = 1;
960         q_i->unknown_2 = 0x0000020A;
961         memset(q_i->pad1, 0, sizeof(q_i->pad1));
962
963         q_i->ptr2 = 1;
964         memset(q_i->pad2, 0, sizeof(q_i->pad2));
965
966         q_i->ptr3 = 1;
967         unix_to_nt_time(&q_i->time, 0);            /* current time? */
968 }
969
970 /*******************************************************************
971 reads or writes a structure.
972 ********************************************************************/
973 void reg_io_q_enum_key(char *desc,  REG_Q_ENUM_KEY *q_q, prs_struct *ps, int depth)
974 {
975         if (q_q == NULL) return;
976
977         prs_debug(ps, depth, desc, "reg_io_q_enum_key");
978         depth++;
979
980         prs_align(ps);
981         
982         smb_io_pol_hnd("", &(q_q->pol), ps, depth); 
983         
984         prs_uint32("key_index", ps, depth, &(q_q->key_index));
985         prs_uint16("key_name_len", ps, depth, &(q_q->key_name_len));
986         prs_uint16("unknown_1", ps, depth, &(q_q->unknown_1));
987
988         prs_uint32("ptr1", ps, depth, &(q_q->ptr1));
989
990         if (q_q->ptr1 != 0)
991         {
992                 prs_uint32("unknown_2", ps, depth, &(q_q->unknown_2));
993                 prs_uint8s(False, "pad1", ps, depth, q_q->pad1, sizeof(q_q->pad1));
994         }
995
996         prs_uint32("ptr2", ps, depth, &(q_q->ptr2));
997
998         if (q_q->ptr2 != 0)
999         {
1000                 prs_uint8s(False, "pad2", ps, depth, q_q->pad2, sizeof(q_q->pad2));
1001         }
1002
1003         prs_uint32("ptr3", ps, depth, &(q_q->ptr3));
1004
1005         if (q_q->ptr3 != 0)
1006         {
1007                 smb_io_time("", &(q_q->time), ps, depth);
1008         }
1009 }
1010
1011 /*******************************************************************
1012 reads or writes a structure.
1013 ********************************************************************/
1014 void reg_io_r_enum_key(char *desc,  REG_R_ENUM_KEY *r_q, prs_struct *ps, int depth)
1015 {
1016         if (r_q == NULL) return;
1017
1018         prs_debug(ps, depth, desc, "reg_io_r_enum_key");
1019         depth++;
1020
1021         prs_align(ps);
1022         
1023         prs_uint16("key_name_len", ps, depth, &(r_q->key_name_len));
1024         prs_uint16("unknown_1", ps, depth, &(r_q->unknown_1));
1025
1026         prs_uint32("ptr1", ps, depth, &(r_q->ptr1));
1027
1028         if (r_q->ptr1 != 0)
1029         {
1030                 prs_uint32("unknown_2", ps, depth, &(r_q->unknown_2));
1031                 prs_uint32("unknown_3", ps, depth, &(r_q->unknown_3));
1032                 smb_io_unistr3("key_name", &(r_q->key_name), ps, depth);
1033                 prs_align(ps);
1034         }
1035
1036         prs_uint32("ptr2", ps, depth, &(r_q->ptr2));
1037
1038         if (r_q->ptr2 != 0)
1039         {
1040                 prs_uint8s(False, "pad2", ps, depth, r_q->pad2, sizeof(r_q->pad2));
1041         }
1042
1043         prs_uint32("ptr3", ps, depth, &(r_q->ptr3));
1044
1045         if (r_q->ptr3 != 0)
1046         {
1047                 smb_io_time("", &(r_q->time), ps, depth);
1048         }
1049
1050         prs_uint32("status", ps, depth, &(r_q->status));
1051 }
1052
1053
1054 /*******************************************************************
1055 makes a structure.
1056 ********************************************************************/
1057 void make_reg_q_open_entry(REG_Q_OPEN_ENTRY *r_q, POLICY_HND *pol,
1058                                 char *key_name, uint32 unk)
1059 {
1060         int len_name = strlen(key_name)+1;
1061
1062         if (r_q == NULL) return;
1063
1064         memcpy(&(r_q->pol), pol, sizeof(r_q->pol));
1065
1066         make_uni_hdr(&(r_q->hdr_name), len_name, len_name, 1);
1067         make_unistr2(&(r_q->uni_name), key_name, len_name);
1068
1069         r_q->unknown_0 = 0x00000000;
1070         r_q->unknown_1 = unk;
1071 }
1072
1073 /*******************************************************************
1074 reads or writes a structure.
1075 ********************************************************************/
1076 void reg_io_q_open_entry(char *desc,  REG_Q_OPEN_ENTRY *r_q, prs_struct *ps, int depth)
1077 {
1078         if (r_q == NULL) return;
1079
1080         prs_debug(ps, depth, desc, "reg_io_q_entry");
1081         depth++;
1082
1083         prs_align(ps);
1084         
1085         smb_io_pol_hnd("", &(r_q->pol), ps, depth);
1086         smb_io_unihdr ("", &(r_q->hdr_name), ps, depth);
1087         smb_io_unistr2("", &(r_q->uni_name), r_q->hdr_name.buffer, ps, depth);
1088
1089         prs_align(ps);
1090         
1091         prs_uint32("unknown_0", ps, depth, &(r_q->unknown_0));
1092         prs_uint32("unknown_1", ps, depth, &(r_q->unknown_1));
1093 }
1094
1095
1096 /*******************************************************************
1097 creates a structure.
1098 ********************************************************************/
1099 void make_reg_r_open_entry(REG_R_OPEN_ENTRY *r_r,
1100                                 POLICY_HND *pol, uint32 status)
1101 {
1102         if (r_r == NULL) return;
1103
1104         memcpy(&(r_r->pol), pol, sizeof(r_r->pol));
1105         r_r->status = status;
1106 }
1107
1108 /*******************************************************************
1109 reads or writes a structure.
1110 ********************************************************************/
1111 void reg_io_r_open_entry(char *desc,  REG_R_OPEN_ENTRY *r_r, prs_struct *ps, int depth)
1112 {
1113         if (r_r == NULL) return;
1114
1115         prs_debug(ps, depth, desc, "reg_io_r_open_entry");
1116         depth++;
1117
1118         prs_align(ps);
1119         
1120         smb_io_pol_hnd("", &(r_r->pol), ps, depth);
1121
1122         prs_uint32("status", ps, depth, &(r_r->status));
1123 }
1124