f22bf10ff8ee007d6670061bf9ac1b15508cb7de
[tprouty/samba.git] / source / 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_set_key_sec(REG_Q_SET_KEY_SEC *q_i, POLICY_HND *pol, 
548                                 uint32 buf_len, SEC_DESC *sec_desc)
549 {
550         if (q_i == NULL) return;
551
552         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
553
554         q_i->unknown = 0x4;
555
556         q_i->ptr = 1;
557         make_buf_hdr(&(q_i->hdr_sec), buf_len, buf_len);
558         make_sec_desc_buf(&(q_i->data), buf_len, sec_desc);
559 }
560
561 /*******************************************************************
562 reads or writes a structure.
563 ********************************************************************/
564 void reg_io_q_set_key_sec(char *desc,  REG_Q_SET_KEY_SEC *r_q, prs_struct *ps, int depth)
565 {
566         if (r_q == NULL) return;
567
568         prs_debug(ps, depth, desc, "reg_io_q_set_key_sec");
569         depth++;
570
571         prs_align(ps);
572         
573         smb_io_pol_hnd("", &(r_q->pol), ps, depth); 
574
575         prs_uint32("unknown", ps, depth, &(r_q->unknown));
576         prs_uint32("ptr    ", ps, depth, &(r_q->ptr    ));
577
578         if (r_q->ptr != 0)
579         {
580                 uint32 hdr_offset;
581                 uint32 old_offset;
582                 smb_io_hdrbuf_pre("hdr_sec", &(r_q->hdr_sec), ps, depth, &hdr_offset);
583                 old_offset = ps->offset;
584                 sec_io_desc_buf("data   ", &(r_q->data   ), ps, depth);
585                 smb_io_hdrbuf_post("hdr_sec", &(r_q->hdr_sec), ps, depth, hdr_offset,
586                                    r_q->data.max_len, r_q->data.len);
587                 ps->offset = old_offset + r_q->data.len + sizeof(uint32) * 3;
588                 prs_align(ps);
589         }
590 }
591
592 /*******************************************************************
593 reads or writes a structure.
594 ********************************************************************/
595 void reg_io_r_set_key_sec(char *desc, REG_R_SET_KEY_SEC *r_q, prs_struct *ps, int depth)
596 {
597         if (r_q == NULL) return;
598
599         prs_debug(ps, depth, desc, "reg_io_r_set_key_sec");
600         depth++;
601
602         prs_align(ps);
603         
604         prs_uint32("status", ps, depth, &(r_q->status));
605 }
606
607
608 /*******************************************************************
609 makes a structure.
610 ********************************************************************/
611 void make_reg_q_get_key_sec(REG_Q_GET_KEY_SEC *q_i, POLICY_HND *pol, 
612                                 uint32 buf_len, SEC_DESC_BUF *sec_buf)
613 {
614         if (q_i == NULL) return;
615
616         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
617
618         q_i->unknown = 0x7;
619
620         q_i->ptr = sec_buf != NULL ? 1 : 0;
621         q_i->data = sec_buf;
622
623         if (sec_buf != NULL)
624         {
625                 make_buf_hdr(&(q_i->hdr_sec), buf_len, 0);
626                 make_sec_desc_buf(q_i->data, buf_len, NULL);
627         }
628 }
629
630 /*******************************************************************
631 reads or writes a structure.
632 ********************************************************************/
633 void reg_io_q_get_key_sec(char *desc,  REG_Q_GET_KEY_SEC *r_q, prs_struct *ps, int depth)
634 {
635         if (r_q == NULL) return;
636
637         prs_debug(ps, depth, desc, "reg_io_q_get_key_sec");
638         depth++;
639
640         prs_align(ps);
641         
642         smb_io_pol_hnd("", &(r_q->pol), ps, depth); 
643
644         prs_uint32("unknown", ps, depth, &(r_q->unknown));
645         prs_uint32("ptr    ", ps, depth, &(r_q->ptr    ));
646
647         if (r_q->ptr != 0)
648         {
649                 uint32 hdr_offset;
650                 uint32 old_offset;
651                 smb_io_hdrbuf_pre("hdr_sec", &(r_q->hdr_sec), ps, depth, &hdr_offset);
652                 old_offset = ps->offset;
653                 sec_io_desc_buf("data   ", r_q->data   , ps, depth);
654                 smb_io_hdrbuf_post("hdr_sec", &(r_q->hdr_sec), ps, depth, hdr_offset,
655                                    r_q->data->max_len, r_q->data->len);
656                 ps->offset = old_offset + r_q->data->len + sizeof(uint32) * 3;
657                 prs_align(ps);
658         }
659 }
660
661 #if 0
662 /*******************************************************************
663 makes a structure.
664 ********************************************************************/
665  void make_reg_r_get_key_sec(REG_R_GET_KEY_SEC *r_i, POLICY_HND *pol, 
666                                 uint32 buf_len, uint8 *buf,
667                                 uint32 status)
668 {
669         if (r_i == NULL) return;
670
671         r_i->ptr = 1;
672         make_buf_hdr(&(r_i->hdr_sec), buf_len, buf_len);
673         make_sec_desc_buf(r_i->data, buf_len, 1);
674
675         r_i->status = status; /* 0x0000 0000 or 0x0000 007a */
676 }
677 #endif 
678
679 /*******************************************************************
680 reads or writes a structure.
681 ********************************************************************/
682 void reg_io_r_get_key_sec(char *desc,  REG_R_GET_KEY_SEC *r_q, prs_struct *ps, int depth)
683 {
684         if (r_q == NULL) return;
685
686         prs_debug(ps, depth, desc, "reg_io_r_get_key_sec");
687         depth++;
688
689         prs_align(ps);
690         
691         prs_uint32("ptr      ", ps, depth, &(r_q->ptr      ));
692
693         if (r_q->ptr != 0)
694         {
695                 smb_io_hdrbuf("", &(r_q->hdr_sec), ps, depth);
696                 sec_io_desc_buf("", r_q->data, ps, depth);
697
698                 prs_align(ps);
699         }
700
701         prs_uint32("status", ps, depth, &(r_q->status));
702 }
703
704
705 /*******************************************************************
706 makes a structure.
707 ********************************************************************/
708 void make_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char *product_type,
709                                 time_t unix_time, uint8 major, uint8 minor)
710 {
711         int len_type  = strlen(product_type);
712
713         if (q_i == NULL) return;
714
715         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
716
717         make_uni_hdr(&(q_i->hdr_type), len_type, len_type, 1);
718         make_unistr2(&(q_i->uni_type), product_type, len_type);
719
720         q_i->ptr1 = 1;
721         unix_to_nt_time(&(q_i->time), unix_time);
722         q_i->major_version1 = major;
723         q_i->minor_version1 = minor;
724         memset(q_i->pad1, 0, sizeof(q_i->pad1));
725
726         q_i->ptr2 = 1;
727         q_i->major_version2 = major;
728         q_i->minor_version2 = minor;
729         memset(q_i->pad2, 0, sizeof(q_i->pad2));
730
731         q_i->ptr3 = 1;
732         q_i->unknown = 0x00000000;
733 }
734
735 /*******************************************************************
736 reads or writes a structure.
737 ********************************************************************/
738 void reg_io_q_info(char *desc,  REG_Q_INFO *r_q, prs_struct *ps, int depth)
739 {
740         if (r_q == NULL) return;
741
742         prs_debug(ps, depth, desc, "reg_io_q_info");
743         depth++;
744
745         prs_align(ps);
746         
747         smb_io_pol_hnd("", &(r_q->pol), ps, depth); 
748         smb_io_unihdr ("", &(r_q->hdr_type), ps, depth);
749         smb_io_unistr2("", &(r_q->uni_type), r_q->hdr_type.buffer, ps, depth);
750
751         prs_align(ps);
752         
753         prs_uint32("ptr1", ps, depth, &(r_q->ptr1));
754
755         if (r_q->ptr1 != 0)
756         {
757                 smb_io_time("", &(r_q->time), ps, depth);
758                 prs_uint8 ("major_version1", ps, depth, &(r_q->major_version1));
759                 prs_uint8 ("minor_version1", ps, depth, &(r_q->minor_version1));
760                 prs_uint8s(False, "pad1", ps, depth, r_q->pad1, sizeof(r_q->pad1));
761         }
762
763         prs_uint32("ptr2", ps, depth, &(r_q->ptr2));
764
765         if (r_q->ptr2 != 0)
766         {
767                 prs_uint8 ("major_version2", ps, depth, &(r_q->major_version2));
768                 prs_uint8 ("minor_version2", ps, depth, &(r_q->minor_version2));
769                 prs_uint8s(False, "pad2", ps, depth, r_q->pad2, sizeof(r_q->pad2));
770         }
771
772         prs_uint32("ptr3", ps, depth, &(r_q->ptr3));
773
774         if (r_q->ptr3 != 0)
775         {
776                 prs_uint32("unknown", ps, depth, &(r_q->unknown));
777         }
778 }
779
780
781 /*******************************************************************
782 creates a structure.
783 ********************************************************************/
784 void make_reg_r_info(REG_R_INFO *r_r,
785                                 uint32 level, char *os_type,
786                                 uint32 unknown_0, uint32 unknown_1,
787                                 uint32 status)
788 {
789         uint8 buf[512];
790         int len = struni2((uint16*)buf, os_type);
791
792         r_r->ptr1 = 1;
793         r_r->level = level;
794
795         r_r->ptr_type = 1;
796         make_buffer2(&(r_r->uni_type), buf, len*2);
797
798         r_r->ptr2 = 1;
799         r_r->unknown_0 = unknown_0;
800
801         r_r->ptr3 = 1;
802         r_r->unknown_1 = unknown_1;
803
804         r_r->status = status;
805 }
806
807 /*******************************************************************
808 reads or writes a structure.
809 ********************************************************************/
810 void reg_io_r_info(char *desc, REG_R_INFO *r_r, prs_struct *ps, int depth)
811 {
812         if (r_r == NULL) return;
813
814         prs_debug(ps, depth, desc, "reg_io_r_info");
815         depth++;
816
817         prs_align(ps);
818         
819         prs_uint32("ptr1", ps, depth, &(r_r->ptr1));
820
821         if (r_r->ptr1 != 0)
822         {
823                 prs_uint32("level", ps, depth, &(r_r->level));
824                 prs_uint32("ptr_type", ps, depth, &(r_r->ptr_type));
825
826                 smb_io_buffer2("uni_type", &(r_r->uni_type), r_r->ptr_type, ps, depth);
827
828                 prs_uint32("ptr2", ps, depth, &(r_r->ptr2));
829
830                 if (r_r->ptr2 != 0)
831                 {
832                         prs_uint32("unknown_0", ps, depth, &(r_r->unknown_0));
833                 }
834
835                 prs_uint32("ptr3", ps, depth, &(r_r->ptr3));
836
837                 if (r_r->ptr3 != 0)
838                 {
839                         prs_uint32("unknown_1", ps, depth, &(r_r->unknown_1));
840                 }
841
842         }
843         prs_uint32("status", ps, depth, &(r_r->status));
844 }
845
846 /*******************************************************************
847 makes a structure.
848 ********************************************************************/
849 void make_reg_q_enum_val(REG_Q_ENUM_VALUE *q_i, POLICY_HND *pol,
850                                 uint32 val_idx, uint32 max_val_len,
851                                 uint32 max_buf_len)
852 {
853         if (q_i == NULL) return;
854
855         ZERO_STRUCTP(q_i);
856
857         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
858
859         q_i->val_index = val_idx;
860         make_uni_hdr(&q_i->hdr_name, max_val_len, 0, 1);
861         q_i->uni_name.uni_max_len = max_val_len;
862         
863         q_i->ptr_type = 1;
864         q_i->type = 0x0;
865
866         q_i->ptr_value = 1;
867         q_i->buf_value.buf_max_len = max_buf_len;
868
869         q_i->ptr1 = 1;
870         q_i->len_value1 = max_buf_len;
871
872         q_i->ptr2 = 1;
873         q_i->len_value2 = 0;
874 }
875
876 /*******************************************************************
877 reads or writes a structure.
878 ********************************************************************/
879 void reg_io_q_enum_val(char *desc,  REG_Q_ENUM_VALUE *q_q, prs_struct *ps, int depth)
880 {
881         if (q_q == NULL) return;
882
883         prs_debug(ps, depth, desc, "reg_io_q_enum_val");
884         depth++;
885
886         prs_align(ps);
887         
888         smb_io_pol_hnd("", &(q_q->pol), ps, depth); 
889         
890         prs_uint32("val_index", ps, depth, &(q_q->val_index));
891         smb_io_unihdr ("hdr_name", &(q_q->hdr_name), ps, depth);
892         smb_io_unistr2("uni_name", &(q_q->uni_name), q_q->hdr_name.buffer, ps, depth);
893         prs_align(ps);
894
895         prs_uint32("ptr_type", ps, depth, &(q_q->ptr_type));
896
897         if (q_q->ptr_type != 0)
898         {
899                 prs_uint32("type", ps, depth, &(q_q->type));
900         }
901
902         prs_uint32("ptr_value", ps, depth, &(q_q->ptr_value));
903         smb_io_buffer2("buf_value", &(q_q->buf_value), q_q->ptr_value, ps, depth);
904         prs_align(ps);
905
906         prs_uint32("ptr1", ps, depth, &(q_q->ptr1));
907         if (q_q->ptr1 != 0)
908         {
909                 prs_uint32("len_value1", ps, depth, &(q_q->len_value1));
910         }
911         prs_uint32("ptr2", ps, depth, &(q_q->ptr2));
912         if (q_q->ptr2 != 0)
913         {
914                 prs_uint32("len_value2", ps, depth, &(q_q->len_value2));
915         }
916 }
917
918 /*******************************************************************
919 reads or writes a structure.
920 ********************************************************************/
921 void reg_io_r_enum_val(char *desc,  REG_R_ENUM_VALUE *r_q, prs_struct *ps, int depth)
922 {
923         if (r_q == NULL) return;
924
925         prs_debug(ps, depth, desc, "reg_io_r_enum_val");
926         depth++;
927
928         prs_align(ps);
929         
930         smb_io_unihdr ("hdr_name", &(r_q->hdr_name), ps, depth);
931         smb_io_unistr2("uni_name", &(r_q->uni_name), r_q->hdr_name.buffer, ps, depth);
932         prs_align(ps);
933
934         prs_uint32("ptr_type", ps, depth, &(r_q->ptr_type));
935
936         if (r_q->ptr_type != 0)
937         {
938                 prs_uint32("type", ps, depth, &(r_q->type));
939         }
940
941         prs_uint32("ptr_value", ps, depth, &(r_q->ptr_value));
942         smb_io_buffer2("buf_value", r_q->buf_value, r_q->ptr_value, ps, depth);
943         prs_align(ps);
944
945         prs_uint32("ptr1", ps, depth, &(r_q->ptr1));
946         if (r_q->ptr1 != 0)
947         {
948                 prs_uint32("len_value1", ps, depth, &(r_q->len_value1));
949         }
950
951         prs_uint32("ptr2", ps, depth, &(r_q->ptr2));
952         if (r_q->ptr2 != 0)
953         {
954                 prs_uint32("len_value2", ps, depth, &(r_q->len_value2));
955         }
956
957         prs_uint32("status", ps, depth, &(r_q->status));
958 }
959
960 /*******************************************************************
961 makes a structure.
962 ********************************************************************/
963 void make_reg_q_create_val(REG_Q_CREATE_VALUE *q_i, POLICY_HND *pol,
964                                 char *val_name, uint32 type,
965                                 BUFFER3 *val)
966 {
967         int val_len = strlen(val_name) + 1;
968
969         if (q_i == NULL) return;
970
971         ZERO_STRUCTP(q_i);
972
973         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
974
975         make_uni_hdr(&q_i->hdr_name, val_len, val_len, 1);
976         make_unistr2(&(q_i->uni_name), val_name, val_len);
977         
978         q_i->type      = type;
979         q_i->buf_value = val;
980 }
981
982 /*******************************************************************
983 reads or writes a structure.
984 ********************************************************************/
985 void reg_io_q_create_val(char *desc,  REG_Q_CREATE_VALUE *q_q, prs_struct *ps, int depth)
986 {
987         if (q_q == NULL) return;
988
989         prs_debug(ps, depth, desc, "reg_io_q_create_val");
990         depth++;
991
992         prs_align(ps);
993         
994         smb_io_pol_hnd("", &(q_q->pol), ps, depth); 
995         
996         smb_io_unihdr ("hdr_name", &(q_q->hdr_name), ps, depth);
997         smb_io_unistr2("uni_name", &(q_q->uni_name), q_q->hdr_name.buffer, ps, depth);
998         prs_align(ps);
999
1000         prs_uint32("type", ps, depth, &(q_q->type));
1001         smb_io_buffer3("buf_value", q_q->buf_value, ps, depth);
1002         prs_align(ps);
1003 }
1004
1005 /*******************************************************************
1006 reads or writes a structure.
1007 ********************************************************************/
1008 void reg_io_r_create_val(char *desc,  REG_R_CREATE_VALUE *r_q, prs_struct *ps, int depth)
1009 {
1010         if (r_q == NULL) return;
1011
1012         prs_debug(ps, depth, desc, "reg_io_r_create_val");
1013         depth++;
1014
1015         prs_align(ps);
1016         
1017         prs_uint32("status", ps, depth, &(r_q->status));
1018 }
1019
1020 /*******************************************************************
1021 makes a structure.
1022 ********************************************************************/
1023 void make_reg_q_enum_key(REG_Q_ENUM_KEY *q_i, POLICY_HND *pol, uint32 key_idx)
1024 {
1025         if (q_i == NULL) return;
1026
1027         memcpy(&(q_i->pol), pol, sizeof(q_i->pol));
1028
1029         q_i->key_index = key_idx;
1030         q_i->key_name_len = 0;
1031         q_i->unknown_1 = 0x0414;
1032
1033         q_i->ptr1 = 1;
1034         q_i->unknown_2 = 0x0000020A;
1035         memset(q_i->pad1, 0, sizeof(q_i->pad1));
1036
1037         q_i->ptr2 = 1;
1038         memset(q_i->pad2, 0, sizeof(q_i->pad2));
1039
1040         q_i->ptr3 = 1;
1041         unix_to_nt_time(&q_i->time, 0);            /* current time? */
1042 }
1043
1044 /*******************************************************************
1045 reads or writes a structure.
1046 ********************************************************************/
1047 void reg_io_q_enum_key(char *desc,  REG_Q_ENUM_KEY *q_q, prs_struct *ps, int depth)
1048 {
1049         if (q_q == NULL) return;
1050
1051         prs_debug(ps, depth, desc, "reg_io_q_enum_key");
1052         depth++;
1053
1054         prs_align(ps);
1055         
1056         smb_io_pol_hnd("", &(q_q->pol), ps, depth); 
1057         
1058         prs_uint32("key_index", ps, depth, &(q_q->key_index));
1059         prs_uint16("key_name_len", ps, depth, &(q_q->key_name_len));
1060         prs_uint16("unknown_1", ps, depth, &(q_q->unknown_1));
1061
1062         prs_uint32("ptr1", ps, depth, &(q_q->ptr1));
1063
1064         if (q_q->ptr1 != 0)
1065         {
1066                 prs_uint32("unknown_2", ps, depth, &(q_q->unknown_2));
1067                 prs_uint8s(False, "pad1", ps, depth, q_q->pad1, sizeof(q_q->pad1));
1068         }
1069
1070         prs_uint32("ptr2", ps, depth, &(q_q->ptr2));
1071
1072         if (q_q->ptr2 != 0)
1073         {
1074                 prs_uint8s(False, "pad2", ps, depth, q_q->pad2, sizeof(q_q->pad2));
1075         }
1076
1077         prs_uint32("ptr3", ps, depth, &(q_q->ptr3));
1078
1079         if (q_q->ptr3 != 0)
1080         {
1081                 smb_io_time("", &(q_q->time), ps, depth);
1082         }
1083 }
1084
1085 /*******************************************************************
1086 reads or writes a structure.
1087 ********************************************************************/
1088 void reg_io_r_enum_key(char *desc,  REG_R_ENUM_KEY *r_q, prs_struct *ps, int depth)
1089 {
1090         if (r_q == NULL) return;
1091
1092         prs_debug(ps, depth, desc, "reg_io_r_enum_key");
1093         depth++;
1094
1095         prs_align(ps);
1096         
1097         prs_uint16("key_name_len", ps, depth, &(r_q->key_name_len));
1098         prs_uint16("unknown_1", ps, depth, &(r_q->unknown_1));
1099
1100         prs_uint32("ptr1", ps, depth, &(r_q->ptr1));
1101
1102         if (r_q->ptr1 != 0)
1103         {
1104                 prs_uint32("unknown_2", ps, depth, &(r_q->unknown_2));
1105                 prs_uint32("unknown_3", ps, depth, &(r_q->unknown_3));
1106                 smb_io_unistr3("key_name", &(r_q->key_name), ps, depth);
1107                 prs_align(ps);
1108         }
1109
1110         prs_uint32("ptr2", ps, depth, &(r_q->ptr2));
1111
1112         if (r_q->ptr2 != 0)
1113         {
1114                 prs_uint8s(False, "pad2", ps, depth, r_q->pad2, sizeof(r_q->pad2));
1115         }
1116
1117         prs_uint32("ptr3", ps, depth, &(r_q->ptr3));
1118
1119         if (r_q->ptr3 != 0)
1120         {
1121                 smb_io_time("", &(r_q->time), ps, depth);
1122         }
1123
1124         prs_uint32("status", ps, depth, &(r_q->status));
1125 }
1126
1127
1128 /*******************************************************************
1129 makes a structure.
1130 ********************************************************************/
1131 void make_reg_q_open_entry(REG_Q_OPEN_ENTRY *r_q, POLICY_HND *pol,
1132                                 char *key_name, uint32 unk)
1133 {
1134         int len_name = strlen(key_name)+1;
1135
1136         if (r_q == NULL) return;
1137
1138         memcpy(&(r_q->pol), pol, sizeof(r_q->pol));
1139
1140         make_uni_hdr(&(r_q->hdr_name), len_name, len_name, 1);
1141         make_unistr2(&(r_q->uni_name), key_name, len_name);
1142
1143         r_q->unknown_0 = 0x00000000;
1144         r_q->unknown_1 = unk;
1145 }
1146
1147 /*******************************************************************
1148 reads or writes a structure.
1149 ********************************************************************/
1150 void reg_io_q_open_entry(char *desc,  REG_Q_OPEN_ENTRY *r_q, prs_struct *ps, int depth)
1151 {
1152         if (r_q == NULL) return;
1153
1154         prs_debug(ps, depth, desc, "reg_io_q_entry");
1155         depth++;
1156
1157         prs_align(ps);
1158         
1159         smb_io_pol_hnd("", &(r_q->pol), ps, depth);
1160         smb_io_unihdr ("", &(r_q->hdr_name), ps, depth);
1161         smb_io_unistr2("", &(r_q->uni_name), r_q->hdr_name.buffer, ps, depth);
1162
1163         prs_align(ps);
1164         
1165         prs_uint32("unknown_0", ps, depth, &(r_q->unknown_0));
1166         prs_uint32("unknown_1", ps, depth, &(r_q->unknown_1));
1167 }
1168
1169
1170 /*******************************************************************
1171 creates a structure.
1172 ********************************************************************/
1173 void make_reg_r_open_entry(REG_R_OPEN_ENTRY *r_r,
1174                                 POLICY_HND *pol, uint32 status)
1175 {
1176         if (r_r == NULL) return;
1177
1178         memcpy(&(r_r->pol), pol, sizeof(r_r->pol));
1179         r_r->status = status;
1180 }
1181
1182 /*******************************************************************
1183 reads or writes a structure.
1184 ********************************************************************/
1185 void reg_io_r_open_entry(char *desc,  REG_R_OPEN_ENTRY *r_r, prs_struct *ps, int depth)
1186 {
1187         if (r_r == NULL) return;
1188
1189         prs_debug(ps, depth, desc, "reg_io_r_open_entry");
1190         depth++;
1191
1192         prs_align(ps);
1193         
1194         smb_io_pol_hnd("", &(r_r->pol), ps, depth);
1195
1196         prs_uint32("status", ps, depth, &(r_r->status));
1197 }
1198