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