This commit was manufactured by cvs2svn to create branch 'SAMBA_3_0'.
[bbaumbach/samba-autobuild/.git] / source / rpc_parse / parse_lsa.c
1 /* 
2  *  Unix SMB/CIFS implementation.
3  *  RPC Pipe client / server routines
4  *  Copyright (C) Andrew Tridgell              1992-1997,
5  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6  *  Copyright (C) Paul Ashton                       1997,
7  *  Copyright (C) Andrew Bartlett                   2002,
8  *  Copyright (C) Jim McDonough                     2002.
9  *  
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *  
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *  
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  */
24
25 #include "includes.h"
26
27 #undef DBGC_CLASS
28 #define DBGC_CLASS DBGC_RPC_PARSE
29
30 static BOOL lsa_io_trans_names(const char *desc, LSA_TRANS_NAME_ENUM *trn, prs_struct *ps, int depth);
31
32 /*******************************************************************
33  Inits a LSA_TRANS_NAME structure.
34 ********************************************************************/
35
36 void init_lsa_trans_name(LSA_TRANS_NAME *trn, UNISTR2 *uni_name,
37                          uint16 sid_name_use, const char *name, uint32 idx)
38 {
39         int len_name = strlen(name);
40
41         if(len_name == 0)
42                 len_name = 1;
43
44         trn->sid_name_use = sid_name_use;
45         init_uni_hdr(&trn->hdr_name, len_name);
46         init_unistr2(uni_name, name, len_name);
47         trn->domain_idx = idx;
48 }
49
50 /*******************************************************************
51  Reads or writes a LSA_TRANS_NAME structure.
52 ********************************************************************/
53
54 static BOOL lsa_io_trans_name(const char *desc, LSA_TRANS_NAME *trn, prs_struct *ps, 
55                               int depth)
56 {
57         prs_debug(ps, depth, desc, "lsa_io_trans_name");
58         depth++;
59
60         if(!prs_align(ps))
61                 return False;
62         
63         if(!prs_uint16("sid_name_use", ps, depth, &trn->sid_name_use))
64                 return False;
65         if(!prs_align(ps))
66                 return False;
67         
68         if(!smb_io_unihdr ("hdr_name", &trn->hdr_name, ps, depth))
69                 return False;
70         if(!prs_uint32("domain_idx  ", ps, depth, &trn->domain_idx))
71                 return False;
72
73         return True;
74 }
75
76 /*******************************************************************
77  Reads or writes a DOM_R_REF structure.
78 ********************************************************************/
79
80 static BOOL lsa_io_dom_r_ref(const char *desc, DOM_R_REF *r_r, prs_struct *ps, 
81                              int depth)
82 {
83         unsigned int i;
84
85         prs_debug(ps, depth, desc, "lsa_io_dom_r_ref");
86         depth++;
87
88         if(!prs_align(ps))
89                 return False;
90         
91         if(!prs_uint32("num_ref_doms_1", ps, depth, &r_r->num_ref_doms_1)) /* num referenced domains? */
92                 return False;
93         if(!prs_uint32("ptr_ref_dom   ", ps, depth, &r_r->ptr_ref_dom)) /* undocumented buffer pointer. */
94                 return False;
95         if(!prs_uint32("max_entries   ", ps, depth, &r_r->max_entries)) /* 32 - max number of entries */
96                 return False;
97
98         SMB_ASSERT_ARRAY(r_r->hdr_ref_dom, r_r->num_ref_doms_1);
99
100         if (r_r->ptr_ref_dom != 0) {
101
102                 if(!prs_uint32("num_ref_doms_2", ps, depth, &r_r->num_ref_doms_2)) /* 4 - num referenced domains? */
103                         return False;
104
105                 SMB_ASSERT_ARRAY(r_r->ref_dom, r_r->num_ref_doms_2);
106
107                 for (i = 0; i < r_r->num_ref_doms_1; i++) {
108                         fstring t;
109
110                         slprintf(t, sizeof(t) - 1, "dom_ref[%d] ", i);
111                         if(!smb_io_unihdr(t, &r_r->hdr_ref_dom[i].hdr_dom_name, ps, depth))
112                                 return False;
113
114                         slprintf(t, sizeof(t) - 1, "sid_ptr[%d] ", i);
115                         if(!prs_uint32(t, ps, depth, &r_r->hdr_ref_dom[i].ptr_dom_sid))
116                                 return False;
117                 }
118
119                 for (i = 0; i < r_r->num_ref_doms_2; i++) {
120                         fstring t;
121
122                         if (r_r->hdr_ref_dom[i].hdr_dom_name.buffer != 0) {
123                                 slprintf(t, sizeof(t) - 1, "dom_ref[%d] ", i);
124                                 if(!smb_io_unistr2(t, &r_r->ref_dom[i].uni_dom_name, True, ps, depth)) /* domain name unicode string */
125                                         return False;
126                                 if(!prs_align(ps))
127                                         return False;
128                         }
129
130                         if (r_r->hdr_ref_dom[i].ptr_dom_sid != 0) {
131                                 slprintf(t, sizeof(t) - 1, "sid_ptr[%d] ", i);
132                                 if(!smb_io_dom_sid2(t, &r_r->ref_dom[i].ref_dom, ps, depth)) /* referenced domain SIDs */
133                                         return False;
134                         }
135                 }
136         }
137
138         return True;
139 }
140
141 /*******************************************************************
142  Inits an LSA_SEC_QOS structure.
143 ********************************************************************/
144
145 void init_lsa_sec_qos(LSA_SEC_QOS *qos, uint16 imp_lev, uint8 ctxt, uint8 eff)
146 {
147         DEBUG(5, ("init_lsa_sec_qos\n"));
148
149         qos->len = 0x0c; /* length of quality of service block, in bytes */
150         qos->sec_imp_level = imp_lev;
151         qos->sec_ctxt_mode = ctxt;
152         qos->effective_only = eff;
153 }
154
155 /*******************************************************************
156  Reads or writes an LSA_SEC_QOS structure.
157 ********************************************************************/
158
159 static BOOL lsa_io_sec_qos(const char *desc,  LSA_SEC_QOS *qos, prs_struct *ps, 
160                            int depth)
161 {
162         uint32 start;
163
164         prs_debug(ps, depth, desc, "lsa_io_obj_qos");
165         depth++;
166
167         if(!prs_align(ps))
168                 return False;
169         
170         start = prs_offset(ps);
171
172         /* these pointers had _better_ be zero, because we don't know
173            what they point to!
174          */
175         if(!prs_uint32("len           ", ps, depth, &qos->len)) /* 0x18 - length (in bytes) inc. the length field. */
176                 return False;
177         if(!prs_uint16("sec_imp_level ", ps, depth, &qos->sec_imp_level ))
178                 return False;
179         if(!prs_uint8 ("sec_ctxt_mode ", ps, depth, &qos->sec_ctxt_mode ))
180                 return False;
181         if(!prs_uint8 ("effective_only", ps, depth, &qos->effective_only))
182                 return False;
183
184         if (qos->len != prs_offset(ps) - start) {
185                 DEBUG(3,("lsa_io_sec_qos: length %x does not match size %x\n",
186                          qos->len, prs_offset(ps) - start));
187         }
188
189         return True;
190 }
191
192 /*******************************************************************
193  Inits an LSA_OBJ_ATTR structure.
194 ********************************************************************/
195
196 static void init_lsa_obj_attr(LSA_OBJ_ATTR *attr, uint32 attributes, LSA_SEC_QOS *qos)
197 {
198         DEBUG(5, ("init_lsa_obj_attr\n"));
199
200         attr->len = 0x18; /* length of object attribute block, in bytes */
201         attr->ptr_root_dir = 0;
202         attr->ptr_obj_name = 0;
203         attr->attributes = attributes;
204         attr->ptr_sec_desc = 0;
205         
206         if (qos != NULL) {
207                 attr->ptr_sec_qos = 1;
208                 attr->sec_qos = qos;
209         } else {
210                 attr->ptr_sec_qos = 0;
211                 attr->sec_qos = NULL;
212         }
213 }
214
215 /*******************************************************************
216  Reads or writes an LSA_OBJ_ATTR structure.
217 ********************************************************************/
218
219 static BOOL lsa_io_obj_attr(const char *desc, LSA_OBJ_ATTR *attr, prs_struct *ps, 
220                             int depth)
221 {
222         uint32 start;
223
224         prs_debug(ps, depth, desc, "lsa_io_obj_attr");
225         depth++;
226
227         if(!prs_align(ps))
228                 return False;
229         
230         start = prs_offset(ps);
231
232         /* these pointers had _better_ be zero, because we don't know
233            what they point to!
234          */
235         if(!prs_uint32("len         ", ps, depth, &attr->len)) /* 0x18 - length (in bytes) inc. the length field. */
236                 return False;
237         if(!prs_uint32("ptr_root_dir", ps, depth, &attr->ptr_root_dir)) /* 0 - root directory (pointer) */
238                 return False;
239         if(!prs_uint32("ptr_obj_name", ps, depth, &attr->ptr_obj_name)) /* 0 - object name (pointer) */
240                 return False;
241         if(!prs_uint32("attributes  ", ps, depth, &attr->attributes)) /* 0 - attributes (undocumented) */
242                 return False;
243         if(!prs_uint32("ptr_sec_desc", ps, depth, &attr->ptr_sec_desc)) /* 0 - security descriptior (pointer) */
244                 return False;
245         if(!prs_uint32("ptr_sec_qos ", ps, depth, &attr->ptr_sec_qos )) /* security quality of service (pointer) */
246                 return False;
247
248         /* code commented out as it's not necessary true (tested with hyena). JFM, 11/22/2001 */
249 #if 0
250         if (attr->len != prs_offset(ps) - start) {
251                 DEBUG(3,("lsa_io_obj_attr: length %x does not match size %x\n",
252                          attr->len, prs_offset(ps) - start));
253                 return False;
254         }
255 #endif
256
257         if (attr->ptr_sec_qos != 0) {
258                 if (UNMARSHALLING(ps))
259                         if (!(attr->sec_qos = (LSA_SEC_QOS *)prs_alloc_mem(ps,sizeof(LSA_SEC_QOS))))
260                                 return False;
261
262                 if(!lsa_io_sec_qos("sec_qos", attr->sec_qos, ps, depth))
263                         return False;
264         }
265
266         return True;
267 }
268
269
270 /*******************************************************************
271  Inits an LSA_Q_OPEN_POL structure.
272 ********************************************************************/
273
274 void init_q_open_pol(LSA_Q_OPEN_POL *r_q, uint16 system_name,
275                      uint32 attributes, uint32 desired_access,
276                      LSA_SEC_QOS *qos)
277 {
278         DEBUG(5, ("init_open_pol: attr:%d da:%d\n", attributes, 
279                   desired_access));
280
281         r_q->ptr = 1; /* undocumented pointer */
282
283         r_q->des_access = desired_access;
284
285         r_q->system_name = system_name;
286         init_lsa_obj_attr(&r_q->attr, attributes, qos);
287 }
288
289 /*******************************************************************
290  Reads or writes an LSA_Q_OPEN_POL structure.
291 ********************************************************************/
292
293 BOOL lsa_io_q_open_pol(const char *desc, LSA_Q_OPEN_POL *r_q, prs_struct *ps, 
294                        int depth)
295 {
296         prs_debug(ps, depth, desc, "lsa_io_q_open_pol");
297         depth++;
298
299         if(!prs_uint32("ptr       ", ps, depth, &r_q->ptr))
300                 return False;
301         if(!prs_uint16("system_name", ps, depth, &r_q->system_name))
302                 return False;
303         if(!prs_align( ps ))
304                 return False;
305
306         if(!lsa_io_obj_attr("", &r_q->attr, ps, depth))
307                 return False;
308
309         if(!prs_uint32("des_access", ps, depth, &r_q->des_access))
310                 return False;
311
312         return True;
313 }
314
315 /*******************************************************************
316  Reads or writes an LSA_R_OPEN_POL structure.
317 ********************************************************************/
318
319 BOOL lsa_io_r_open_pol(const char *desc, LSA_R_OPEN_POL *r_p, prs_struct *ps, 
320                        int depth)
321 {
322         prs_debug(ps, depth, desc, "lsa_io_r_open_pol");
323         depth++;
324
325         if(!smb_io_pol_hnd("", &r_p->pol, ps, depth))
326                 return False;
327
328         if(!prs_ntstatus("status", ps, depth, &r_p->status))
329                 return False;
330
331         return True;
332 }
333
334 /*******************************************************************
335  Inits an LSA_Q_OPEN_POL2 structure.
336 ********************************************************************/
337
338 void init_q_open_pol2(LSA_Q_OPEN_POL2 *r_q, const char *server_name,
339                         uint32 attributes, uint32 desired_access,
340                         LSA_SEC_QOS *qos)
341 {
342         DEBUG(5, ("init_q_open_pol2: attr:%d da:%d\n", attributes, 
343                   desired_access));
344
345         r_q->ptr = 1; /* undocumented pointer */
346
347         r_q->des_access = desired_access;
348
349         init_unistr2(&r_q->uni_server_name, server_name, 
350                      strlen(server_name) + 1);
351
352         init_lsa_obj_attr(&r_q->attr, attributes, qos);
353 }
354
355 /*******************************************************************
356  Reads or writes an LSA_Q_OPEN_POL2 structure.
357 ********************************************************************/
358
359 BOOL lsa_io_q_open_pol2(const char *desc, LSA_Q_OPEN_POL2 *r_q, prs_struct *ps, 
360                         int depth)
361 {
362         prs_debug(ps, depth, desc, "lsa_io_q_open_pol2");
363         depth++;
364
365         if(!prs_uint32("ptr       ", ps, depth, &r_q->ptr))
366                 return False;
367
368         if(!smb_io_unistr2 ("", &r_q->uni_server_name, r_q->ptr, ps, depth))
369                 return False;
370         if(!lsa_io_obj_attr("", &r_q->attr, ps, depth))
371                 return False;
372
373         if(!prs_uint32("des_access", ps, depth, &r_q->des_access))
374                 return False;
375
376         return True;
377 }
378
379 /*******************************************************************
380  Reads or writes an LSA_R_OPEN_POL2 structure.
381 ********************************************************************/
382
383 BOOL lsa_io_r_open_pol2(const char *desc, LSA_R_OPEN_POL2 *r_p, prs_struct *ps, 
384                         int depth)
385 {
386         prs_debug(ps, depth, desc, "lsa_io_r_open_pol2");
387         depth++;
388
389         if(!smb_io_pol_hnd("", &r_p->pol, ps, depth))
390                 return False;
391
392         if(!prs_ntstatus("status", ps, depth, &r_p->status))
393                 return False;
394
395         return True;
396 }
397
398 /*******************************************************************
399 makes an LSA_Q_QUERY_SEC_OBJ structure.
400 ********************************************************************/
401
402 void init_q_query_sec_obj(LSA_Q_QUERY_SEC_OBJ *q_q, const POLICY_HND *hnd, 
403                           uint32 sec_info)
404 {
405         DEBUG(5, ("init_q_query_sec_obj\n"));
406
407         q_q->pol = *hnd;
408         q_q->sec_info = sec_info;
409
410         return;
411 }
412
413 /*******************************************************************
414  Reads or writes an LSA_Q_QUERY_SEC_OBJ structure.
415 ********************************************************************/
416
417 BOOL lsa_io_q_query_sec_obj(const char *desc, LSA_Q_QUERY_SEC_OBJ *q_q, 
418                             prs_struct *ps, int depth)
419 {
420         prs_debug(ps, depth, desc, "lsa_io_q_query_sec_obj");
421         depth++;
422
423         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
424                 return False;
425
426         if (!prs_uint32("sec_info", ps, depth, &q_q->sec_info))
427                 return False;
428
429         return True;
430
431
432 /*******************************************************************
433  Reads or writes a LSA_R_QUERY_SEC_OBJ structure.
434 ********************************************************************/
435
436 BOOL lsa_io_r_query_sec_obj(const char *desc, LSA_R_QUERY_SEC_OBJ *r_u, 
437                             prs_struct *ps, int depth)
438 {
439         prs_debug(ps, depth, desc, "lsa_io_r_query_sec_obj");
440         depth++;
441
442         if (!prs_align(ps))
443                 return False;
444
445         if (!prs_uint32("ptr", ps, depth, &r_u->ptr))
446                 return False;
447
448         if (r_u->ptr != 0) {
449                 if (!sec_io_desc_buf("sec", &r_u->buf, ps, depth))
450                         return False;
451         }
452
453         if (!prs_ntstatus("status", ps, depth, &r_u->status))
454                 return False;
455
456         return True;
457 }
458
459 /*******************************************************************
460  Inits an LSA_Q_QUERY_INFO structure.
461 ********************************************************************/
462
463 void init_q_query(LSA_Q_QUERY_INFO *q_q, POLICY_HND *hnd, uint16 info_class)
464 {
465         DEBUG(5, ("init_q_query\n"));
466
467         memcpy(&q_q->pol, hnd, sizeof(q_q->pol));
468
469         q_q->info_class = info_class;
470 }
471
472 /*******************************************************************
473  Reads or writes an LSA_Q_QUERY_INFO structure.
474 ********************************************************************/
475
476 BOOL lsa_io_q_query(const char *desc, LSA_Q_QUERY_INFO *q_q, prs_struct *ps, 
477                     int depth)
478 {
479         prs_debug(ps, depth, desc, "lsa_io_q_query");
480         depth++;
481
482         if(!smb_io_pol_hnd("", &q_q->pol, ps, depth))
483                 return False;
484
485         if(!prs_uint16("info_class", ps, depth, &q_q->info_class))
486                 return False;
487
488         return True;
489 }
490
491 /*******************************************************************
492 makes an LSA_Q_ENUM_TRUST_DOM structure.
493 ********************************************************************/
494 BOOL init_q_enum_trust_dom(LSA_Q_ENUM_TRUST_DOM * q_e, POLICY_HND *pol,
495                            uint32 enum_context, uint32 preferred_len)
496 {
497         DEBUG(5, ("init_q_enum_trust_dom\n"));
498
499         q_e->pol = *pol;
500         q_e->enum_context = enum_context;
501         q_e->preferred_len = preferred_len;
502
503         return True;
504 }
505
506 /*******************************************************************
507  Reads or writes an LSA_Q_ENUM_TRUST_DOM structure.
508 ********************************************************************/
509
510 BOOL lsa_io_q_enum_trust_dom(const char *desc, LSA_Q_ENUM_TRUST_DOM *q_e, 
511                              prs_struct *ps, int depth)
512 {
513         prs_debug(ps, depth, desc, "lsa_io_q_enum_trust_dom");
514         depth++;
515
516         if(!smb_io_pol_hnd("", &q_e->pol, ps, depth))
517                 return False;
518
519         if(!prs_uint32("enum_context ", ps, depth, &q_e->enum_context))
520                 return False;
521         if(!prs_uint32("preferred_len", ps, depth, &q_e->preferred_len))
522                 return False;
523
524         return True;
525 }
526
527 /*******************************************************************
528  Inits an LSA_R_ENUM_TRUST_DOM structure.
529 ********************************************************************/
530
531 void init_r_enum_trust_dom(TALLOC_CTX *ctx, LSA_R_ENUM_TRUST_DOM *r_e, uint32 enum_context,
532                            uint32 req_num_domains, uint32 num_domains, TRUSTDOM **td)
533 {
534         unsigned int i;
535
536         DEBUG(5, ("init_r_enum_trust_dom\n"));
537         
538         r_e->enum_context = enum_context;
539         r_e->num_domains = num_domains;
540         r_e->ptr_enum_domains = 0;
541         r_e->num_domains2 = num_domains;
542         
543         if (num_domains != 0) {
544         
545                 /* 
546                  * allocating empty arrays of unicode headers, strings
547                  * and sids of enumerated trusted domains
548                  */
549                 if (!(r_e->hdr_domain_name = (UNIHDR2 *)talloc(ctx,sizeof(UNIHDR2) * num_domains))) {
550                         r_e->status = NT_STATUS_NO_MEMORY;
551                         return;
552                 }
553                 
554                 if (!(r_e->uni_domain_name = (UNISTR2 *)talloc(ctx,sizeof(UNISTR2) * num_domains))) {
555                         r_e->status = NT_STATUS_NO_MEMORY;
556                         return;
557                 }
558
559                 if (!(r_e->domain_sid = (DOM_SID2 *)talloc(ctx,sizeof(DOM_SID2) * num_domains))) {
560                         r_e->status = NT_STATUS_NO_MEMORY;
561                         return;
562                 }
563                                 
564                 for (i = 0; i < num_domains; i++) {
565                         
566                         /* don't know what actually is this for */
567                         r_e->ptr_enum_domains = 1;
568                         
569                         init_uni_hdr2(&r_e->hdr_domain_name[i], strlen_w((td[i])->name));
570                         init_dom_sid2(&r_e->domain_sid[i], &(td[i])->sid);
571                         
572                         init_unistr2_w(ctx, &r_e->uni_domain_name[i], (td[i])->name);
573                         
574                 };
575         }
576
577 }
578
579 /*******************************************************************
580  Reads or writes an LSA_R_ENUM_TRUST_DOM structure.
581 ********************************************************************/
582
583 BOOL lsa_io_r_enum_trust_dom(const char *desc, LSA_R_ENUM_TRUST_DOM *r_e, 
584                              prs_struct *ps, int depth)
585 {
586         prs_debug(ps, depth, desc, "lsa_io_r_enum_trust_dom");
587         depth++;
588
589         if(!prs_uint32("enum_context    ", ps, depth, &r_e->enum_context))
590                 return False;
591         if(!prs_uint32("num_domains     ", ps, depth, &r_e->num_domains))
592                 return False;
593         if(!prs_uint32("ptr_enum_domains", ps, depth, &r_e->ptr_enum_domains))
594                 return False;
595
596         if (r_e->ptr_enum_domains) {
597                 int i, num_domains;
598
599                 if(!prs_uint32("num_domains2", ps, depth, &r_e->num_domains2))
600                         return False;
601
602                 num_domains = r_e->num_domains2;
603
604                 if (UNMARSHALLING(ps)) {
605                         if (!(r_e->hdr_domain_name = (UNIHDR2 *)prs_alloc_mem(ps,sizeof(UNIHDR2) * num_domains)))
606                                 return False;
607
608                         if (!(r_e->uni_domain_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2) * num_domains)))
609                                 return False;
610
611                         if (!(r_e->domain_sid = (DOM_SID2 *)prs_alloc_mem(ps,sizeof(DOM_SID2) * num_domains)))
612                                 return False;
613                 }
614
615                 for (i = 0; i < num_domains; i++) {
616                         if(!smb_io_unihdr2 ("", &r_e->hdr_domain_name[i], ps, 
617                                             depth))
618                                 return False;
619                 }
620                 
621                 for (i = 0; i < num_domains; i++) {
622                         if(!smb_io_unistr2 ("", &r_e->uni_domain_name[i],
623                                             r_e->hdr_domain_name[i].buffer,
624                                             ps, depth))
625                                 return False;
626                         if(!smb_io_dom_sid2("", &r_e->domain_sid[i], ps, 
627                                             depth))
628                                 return False;
629                 }
630         }
631
632         if(!prs_ntstatus("status", ps, depth, &r_e->status))
633                 return False;
634
635         return True;
636 }
637
638 /*******************************************************************
639 reads or writes a dom query structure.
640 ********************************************************************/
641
642 static BOOL lsa_io_dom_query(const char *desc, DOM_QUERY *d_q, prs_struct *ps, int depth)
643 {
644         if (d_q == NULL)
645                 return False;
646
647         prs_debug(ps, depth, desc, "lsa_io_dom_query");
648         depth++;
649
650         if(!prs_align(ps))
651                 return False;
652
653         if(!prs_uint16("uni_dom_max_len", ps, depth, &d_q->uni_dom_max_len)) /* domain name string length * 2 */
654                 return False;
655         if(!prs_uint16("uni_dom_str_len", ps, depth, &d_q->uni_dom_str_len)) /* domain name string length * 2 */
656                 return False;
657
658         if(!prs_uint32("buffer_dom_name", ps, depth, &d_q->buffer_dom_name)) /* undocumented domain name string buffer pointer */
659                 return False;
660         if(!prs_uint32("buffer_dom_sid ", ps, depth, &d_q->buffer_dom_sid)) /* undocumented domain SID string buffer pointer */
661                 return False;
662
663         if(!smb_io_unistr2("unistr2", &d_q->uni_domain_name, d_q->buffer_dom_name, ps, depth)) /* domain name (unicode string) */
664                 return False;
665
666         if(!prs_align(ps))
667                 return False;
668
669         if (d_q->buffer_dom_sid != 0) {
670                 if(!smb_io_dom_sid2("", &d_q->dom_sid, ps, depth)) /* domain SID */
671                         return False;
672         } else {
673                 memset((char *)&d_q->dom_sid, '\0', sizeof(d_q->dom_sid));
674         }
675
676         return True;
677 }
678
679 /*******************************************************************
680 reads or writes a structure.
681 ********************************************************************/
682
683 static BOOL lsa_io_dom_query_2(const char *desc, DOM_QUERY_2 *d_q, prs_struct *ps, int depth)
684 {
685         uint32 ptr = 1;
686
687         if (d_q == NULL)
688                 return False;
689
690         prs_debug(ps, depth, desc, "lsa_io_dom_query_2");
691         depth++;
692
693         if (!prs_align(ps))
694                 return False;
695
696         if (!prs_uint32("auditing_enabled", ps, depth, &d_q->auditing_enabled))
697                 return False;
698         if (!prs_uint32("ptr   ", ps, depth, &ptr))
699                 return False;
700         if (!prs_uint32("count1", ps, depth, &d_q->count1))
701                 return False;
702         if (!prs_uint32("count2", ps, depth, &d_q->count2))
703                 return False;
704
705         if (UNMARSHALLING(ps)) {
706                 d_q->auditsettings = (uint32 *)talloc_zero(ps->mem_ctx, d_q->count2 * sizeof(uint32));
707         }
708
709         if (d_q->auditsettings == NULL) {
710                 DEBUG(1, ("lsa_io_dom_query_2: NULL auditsettings!\n"));
711                 return False;
712         }
713
714         if (!prs_uint32s(False, "auditsettings", ps, depth, d_q->auditsettings, d_q->count2))
715                 return False;
716
717     return True;
718 }
719
720 /*******************************************************************
721  Reads or writes a dom query structure.
722 ********************************************************************/
723
724 static BOOL lsa_io_dom_query_3(const char *desc, DOM_QUERY_3 *d_q, prs_struct *ps, int depth)
725 {
726         return lsa_io_dom_query("", d_q, ps, depth);
727 }
728
729 /*******************************************************************
730  Reads or writes a dom query structure.
731 ********************************************************************/
732
733 static BOOL lsa_io_dom_query_5(const char *desc, DOM_QUERY_5 *d_q, prs_struct *ps, int depth)
734 {
735         return lsa_io_dom_query("", d_q, ps, depth);
736 }
737
738 /*******************************************************************
739  Reads or writes a dom query structure.
740 ********************************************************************/
741
742 static BOOL lsa_io_dom_query_6(const char *desc, DOM_QUERY_6 *d_q, prs_struct *ps, int depth)
743 {
744         if (d_q == NULL)
745                 return False;
746
747         prs_debug(ps, depth, desc, "lsa_io_dom_query_6");
748         depth++;
749
750         if (!prs_uint16("server_role", ps, depth, &d_q->server_role))
751                 return False;
752
753         return True;
754 }
755
756 /*******************************************************************
757  Reads or writes an LSA_R_QUERY_INFO structure.
758 ********************************************************************/
759
760 BOOL lsa_io_r_query(const char *desc, LSA_R_QUERY_INFO *r_q, prs_struct *ps,
761                     int depth)
762 {
763         prs_debug(ps, depth, desc, "lsa_io_r_query");
764         depth++;
765
766         if(!prs_uint32("undoc_buffer", ps, depth, &r_q->undoc_buffer))
767                 return False;
768
769         if (r_q->undoc_buffer != 0) {
770                 if(!prs_uint16("info_class", ps, depth, &r_q->info_class))
771                         return False;
772
773                 if(!prs_align(ps))
774                         return False;
775
776                 switch (r_q->info_class) {
777                 case 2:
778                         if(!lsa_io_dom_query_2("", &r_q->dom.id2, ps, depth))
779                                 return False;
780                         break;
781                 case 3:
782                         if(!lsa_io_dom_query_3("", &r_q->dom.id3, ps, depth))
783                                 return False;
784                         break;
785                 case 5:
786                         if(!lsa_io_dom_query_5("", &r_q->dom.id5, ps, depth))
787                                 return False;
788                         break;
789                 case 6:
790                         if(!lsa_io_dom_query_6("", &r_q->dom.id6, ps, depth))
791                                 return False;
792                         break;
793                 default:
794                         /* PANIC! */
795                         break;
796                 }
797         }
798
799         if(!prs_align(ps))
800                 return False;
801
802         if(!prs_ntstatus("status", ps, depth, &r_q->status))
803                 return False;
804
805         return True;
806 }
807
808 /*******************************************************************
809  Inits a LSA_SID_ENUM structure.
810 ********************************************************************/
811
812 static void init_lsa_sid_enum(TALLOC_CTX *mem_ctx, LSA_SID_ENUM *sen, 
813                        int num_entries, DOM_SID *sids)
814 {
815         int i;
816
817         DEBUG(5, ("init_lsa_sid_enum\n"));
818
819         sen->num_entries  = num_entries;
820         sen->ptr_sid_enum = (num_entries != 0);
821         sen->num_entries2 = num_entries;
822
823         /* Allocate memory for sids and sid pointers */
824
825         if (num_entries == 0) return;
826
827         if ((sen->ptr_sid = (uint32 *)talloc_zero(mem_ctx, num_entries * 
828                                              sizeof(uint32))) == NULL) {
829                 DEBUG(3, ("init_lsa_sid_enum(): out of memory for ptr_sid\n"));
830                 return;
831         }
832
833         if ((sen->sid = (DOM_SID2 *)talloc_zero(mem_ctx, num_entries * 
834                                            sizeof(DOM_SID2))) == NULL) {
835                 DEBUG(3, ("init_lsa_sid_enum(): out of memory for sids\n"));
836                 return;
837         }
838
839         /* Copy across SIDs and SID pointers */
840
841         for (i = 0; i < num_entries; i++) {
842                 sen->ptr_sid[i] = 1;
843                 init_dom_sid2(&sen->sid[i], &sids[i]);
844         }
845 }
846
847 /*******************************************************************
848  Reads or writes a LSA_SID_ENUM structure.
849 ********************************************************************/
850
851 static BOOL lsa_io_sid_enum(const char *desc, LSA_SID_ENUM *sen, prs_struct *ps, 
852                             int depth)
853 {
854         unsigned int i;
855
856         prs_debug(ps, depth, desc, "lsa_io_sid_enum");
857         depth++;
858
859         if(!prs_align(ps))
860                 return False;
861         
862         if(!prs_uint32("num_entries ", ps, depth, &sen->num_entries))
863                 return False;
864         if(!prs_uint32("ptr_sid_enum", ps, depth, &sen->ptr_sid_enum))
865                 return False;
866
867         /*
868            if the ptr is NULL, leave here. checked from a real w2k trace.
869            JFM, 11/23/2001
870          */
871         
872         if (sen->ptr_sid_enum==0)
873                 return True;
874
875         if(!prs_uint32("num_entries2", ps, depth, &sen->num_entries2))
876                 return False;
877
878         /* Mallocate memory if we're unpacking from the wire */
879
880         if (UNMARSHALLING(ps)) {
881                 if ((sen->ptr_sid = (uint32 *)prs_alloc_mem( ps,
882                         sen->num_entries * sizeof(uint32))) == NULL) {
883                         DEBUG(3, ("init_lsa_sid_enum(): out of memory for "
884                                   "ptr_sid\n"));
885                         return False;
886                 }
887
888                 if ((sen->sid = (DOM_SID2 *)prs_alloc_mem( ps,
889                         sen->num_entries * sizeof(DOM_SID2))) == NULL) {
890                         DEBUG(3, ("init_lsa_sid_enum(): out of memory for "
891                                   "sids\n"));
892                         return False;
893                 }
894         }
895
896         for (i = 0; i < sen->num_entries; i++) {        
897                 fstring temp;
898
899                 slprintf(temp, sizeof(temp) - 1, "ptr_sid[%d]", i);
900                 if(!prs_uint32(temp, ps, depth, &sen->ptr_sid[i])) {
901                         return False;
902                 }
903         }
904
905         for (i = 0; i < sen->num_entries; i++) {
906                 fstring temp;
907
908                 slprintf(temp, sizeof(temp) - 1, "sid[%d]", i);
909                 if(!smb_io_dom_sid2(temp, &sen->sid[i], ps, depth)) {
910                         return False;
911                 }
912         }
913
914         return True;
915 }
916
917 /*******************************************************************
918  Inits an LSA_R_ENUM_TRUST_DOM structure.
919 ********************************************************************/
920
921 void init_q_lookup_sids(TALLOC_CTX *mem_ctx, LSA_Q_LOOKUP_SIDS *q_l, 
922                         POLICY_HND *hnd, int num_sids, DOM_SID *sids,
923                         uint16 level)
924 {
925         DEBUG(5, ("init_r_enum_trust_dom\n"));
926
927         ZERO_STRUCTP(q_l);
928
929         memcpy(&q_l->pol, hnd, sizeof(q_l->pol));
930         init_lsa_sid_enum(mem_ctx, &q_l->sids, num_sids, sids);
931         
932         q_l->level.value = level;
933 }
934
935 /*******************************************************************
936  Reads or writes a LSA_Q_LOOKUP_SIDS structure.
937 ********************************************************************/
938
939 BOOL lsa_io_q_lookup_sids(const char *desc, LSA_Q_LOOKUP_SIDS *q_s, prs_struct *ps,
940                           int depth)
941 {
942         prs_debug(ps, depth, desc, "lsa_io_q_lookup_sids");
943         depth++;
944
945         if(!prs_align(ps))
946                 return False;
947         
948         if(!smb_io_pol_hnd("pol_hnd", &q_s->pol, ps, depth)) /* policy handle */
949                 return False;
950         if(!lsa_io_sid_enum("sids   ", &q_s->sids, ps, depth)) /* sids to be looked up */
951                 return False;
952         if(!lsa_io_trans_names("names  ", &q_s->names, ps, depth)) /* translated names */
953                 return False;
954         if(!smb_io_lookup_level("switch ", &q_s->level, ps, depth)) /* lookup level */
955                 return False;
956
957         if(!prs_uint32("mapped_count", ps, depth, &q_s->mapped_count))
958                 return False;
959
960         return True;
961 }
962
963 /*******************************************************************
964  Reads or writes a structure.
965 ********************************************************************/
966
967 static BOOL lsa_io_trans_names(const char *desc, LSA_TRANS_NAME_ENUM *trn,
968                 prs_struct *ps, int depth)
969 {
970         unsigned int i;
971
972         prs_debug(ps, depth, desc, "lsa_io_trans_names");
973         depth++;
974
975         if(!prs_align(ps))
976                 return False;
977    
978         if(!prs_uint32("num_entries    ", ps, depth, &trn->num_entries))
979                 return False;
980         if(!prs_uint32("ptr_trans_names", ps, depth, &trn->ptr_trans_names))
981                 return False;
982
983         if (trn->ptr_trans_names != 0) {
984                 if(!prs_uint32("num_entries2   ", ps, depth, 
985                                &trn->num_entries2))
986                         return False;
987
988                 if (UNMARSHALLING(ps)) {
989                         if ((trn->name = (LSA_TRANS_NAME *)
990                              prs_alloc_mem(ps, trn->num_entries * 
991                                     sizeof(LSA_TRANS_NAME))) == NULL) {
992                                 return False;
993                         }
994
995                         if ((trn->uni_name = (UNISTR2 *)
996                              prs_alloc_mem(ps, trn->num_entries *
997                                     sizeof(UNISTR2))) == NULL) {
998                                 return False;
999                         }
1000                 }
1001
1002                 for (i = 0; i < trn->num_entries2; i++) {
1003                         fstring t;
1004                         slprintf(t, sizeof(t) - 1, "name[%d] ", i);
1005
1006                         if(!lsa_io_trans_name(t, &trn->name[i], ps, depth)) /* translated name */
1007                                 return False;
1008                 }
1009
1010                 for (i = 0; i < trn->num_entries2; i++) {
1011                         fstring t;
1012                         slprintf(t, sizeof(t) - 1, "name[%d] ", i);
1013
1014                         if(!smb_io_unistr2(t, &trn->uni_name[i], trn->name[i].hdr_name.buffer, ps, depth))
1015                                 return False;
1016                         if(!prs_align(ps))
1017                                 return False;
1018                 }
1019         }
1020
1021         return True;
1022 }
1023
1024 /*******************************************************************
1025  Reads or writes a structure.
1026 ********************************************************************/
1027
1028 BOOL lsa_io_r_lookup_sids(const char *desc, LSA_R_LOOKUP_SIDS *r_s, 
1029                           prs_struct *ps, int depth)
1030 {
1031         prs_debug(ps, depth, desc, "lsa_io_r_lookup_sids");
1032         depth++;
1033
1034         if(!prs_align(ps))
1035                 return False;
1036         
1037         if(!prs_uint32("ptr_dom_ref", ps, depth, &r_s->ptr_dom_ref))
1038                 return False;
1039
1040         if (r_s->ptr_dom_ref != 0)
1041                 if(!lsa_io_dom_r_ref ("dom_ref", r_s->dom_ref, ps, depth)) /* domain reference info */
1042                         return False;
1043
1044         if(!lsa_io_trans_names("names  ", r_s->names, ps, depth)) /* translated names */
1045                 return False;
1046
1047         if(!prs_align(ps))
1048                 return False;
1049
1050         if(!prs_uint32("mapped_count", ps, depth, &r_s->mapped_count))
1051                 return False;
1052
1053         if(!prs_ntstatus("status      ", ps, depth, &r_s->status))
1054                 return False;
1055
1056         return True;
1057 }
1058
1059 /*******************************************************************
1060 makes a structure.
1061 ********************************************************************/
1062
1063 void init_q_lookup_names(TALLOC_CTX *mem_ctx, LSA_Q_LOOKUP_NAMES *q_l, 
1064                          POLICY_HND *hnd, int num_names, const char **names)
1065 {
1066         unsigned int i;
1067
1068         DEBUG(5, ("init_q_lookup_names\n"));
1069
1070         ZERO_STRUCTP(q_l);
1071
1072         q_l->pol = *hnd;
1073         q_l->num_entries = num_names;
1074         q_l->num_entries2 = num_names;
1075         q_l->lookup_level = 1;
1076
1077         if ((q_l->uni_name = (UNISTR2 *)talloc_zero(
1078                 mem_ctx, num_names * sizeof(UNISTR2))) == NULL) {
1079                 DEBUG(3, ("init_q_lookup_names(): out of memory\n"));
1080                 return;
1081         }
1082
1083         if ((q_l->hdr_name = (UNIHDR *)talloc_zero(
1084                 mem_ctx, num_names * sizeof(UNIHDR))) == NULL) {
1085                 DEBUG(3, ("init_q_lookup_names(): out of memory\n"));
1086                 return;
1087         }
1088
1089         for (i = 0; i < num_names; i++) {
1090                 int len;
1091                 len = strlen(names[i]);
1092
1093                 init_uni_hdr(&q_l->hdr_name[i], len);
1094                 init_unistr2(&q_l->uni_name[i], names[i], len);
1095         }
1096 }
1097
1098 /*******************************************************************
1099 reads or writes a structure.
1100 ********************************************************************/
1101
1102 BOOL lsa_io_q_lookup_names(const char *desc, LSA_Q_LOOKUP_NAMES *q_r, 
1103                            prs_struct *ps, int depth)
1104 {
1105         unsigned int i;
1106
1107         prs_debug(ps, depth, desc, "lsa_io_q_lookup_names");
1108         depth++;
1109
1110         if(!prs_align(ps))
1111                 return False;
1112
1113         if(!smb_io_pol_hnd("", &q_r->pol, ps, depth)) /* policy handle */
1114                 return False;
1115
1116         if(!prs_align(ps))
1117                 return False;
1118         if(!prs_uint32("num_entries    ", ps, depth, &q_r->num_entries))
1119                 return False;
1120         if(!prs_uint32("num_entries2   ", ps, depth, &q_r->num_entries2))
1121                 return False;
1122
1123         if (UNMARSHALLING(ps)) {
1124                 if (q_r->num_entries) {
1125                         if ((q_r->hdr_name = (UNIHDR *)prs_alloc_mem(ps,
1126                                         q_r->num_entries * sizeof(UNIHDR))) == NULL)
1127                                 return False;
1128                         if ((q_r->uni_name = (UNISTR2 *)prs_alloc_mem(ps,
1129                                         q_r->num_entries * sizeof(UNISTR2))) == NULL)
1130                                 return False;
1131                 }
1132         }
1133
1134         for (i = 0; i < q_r->num_entries; i++) {
1135                 if(!prs_align(ps))
1136                         return False;
1137                 if(!smb_io_unihdr("hdr_name", &q_r->hdr_name[i], ps, depth)) /* pointer names */
1138                         return False;
1139         }
1140
1141         for (i = 0; i < q_r->num_entries; i++) {
1142                 if(!prs_align(ps))
1143                         return False;
1144                 if(!smb_io_unistr2("dom_name", &q_r->uni_name[i], q_r->hdr_name[i].buffer, ps, depth)) /* names to be looked up */
1145                         return False;
1146         }
1147
1148         if(!prs_align(ps))
1149                 return False;
1150         if(!prs_uint32("num_trans_entries ", ps, depth, &q_r->num_trans_entries))
1151                 return False;
1152         if(!prs_uint32("ptr_trans_sids ", ps, depth, &q_r->ptr_trans_sids))
1153                 return False;
1154         if(!prs_uint32("lookup_level   ", ps, depth, &q_r->lookup_level))
1155                 return False;
1156         if(!prs_uint32("mapped_count   ", ps, depth, &q_r->mapped_count))
1157                 return False;
1158
1159         return True;
1160 }
1161
1162 /*******************************************************************
1163 reads or writes a structure.
1164 ********************************************************************/
1165
1166 BOOL lsa_io_r_lookup_names(const char *desc, LSA_R_LOOKUP_NAMES *r_r, 
1167                            prs_struct *ps, int depth)
1168 {
1169         unsigned int i;
1170
1171         prs_debug(ps, depth, desc, "lsa_io_r_lookup_names");
1172         depth++;
1173
1174         if(!prs_align(ps))
1175                 return False;
1176
1177         if(!prs_uint32("ptr_dom_ref", ps, depth, &r_r->ptr_dom_ref))
1178                 return False;
1179
1180         if (r_r->ptr_dom_ref != 0)
1181                 if(!lsa_io_dom_r_ref("", r_r->dom_ref, ps, depth))
1182                         return False;
1183
1184         if(!prs_uint32("num_entries", ps, depth, &r_r->num_entries))
1185                 return False;
1186         if(!prs_uint32("ptr_entries", ps, depth, &r_r->ptr_entries))
1187                 return False;
1188
1189         if (r_r->ptr_entries != 0) {
1190                 if(!prs_uint32("num_entries2", ps, depth, &r_r->num_entries2))
1191                         return False;
1192
1193                 if (r_r->num_entries2 != r_r->num_entries) {
1194                         /* RPC fault */
1195                         return False;
1196                 }
1197
1198                 if (UNMARSHALLING(ps)) {
1199                         if ((r_r->dom_rid = (DOM_RID2 *)prs_alloc_mem(ps, r_r->num_entries2 * sizeof(DOM_RID2)))
1200                             == NULL) {
1201                                 DEBUG(3, ("lsa_io_r_lookup_names(): out of memory\n"));
1202                                 return False;
1203                         }
1204                 }
1205
1206                 for (i = 0; i < r_r->num_entries2; i++)
1207                         if(!smb_io_dom_rid2("", &r_r->dom_rid[i], ps, depth)) /* domain RIDs being looked up */
1208                                 return False;
1209         }
1210
1211         if(!prs_uint32("mapped_count", ps, depth, &r_r->mapped_count))
1212                 return False;
1213
1214         if(!prs_ntstatus("status      ", ps, depth, &r_r->status))
1215                 return False;
1216
1217         return True;
1218 }
1219
1220
1221 /*******************************************************************
1222  Inits an LSA_Q_CLOSE structure.
1223 ********************************************************************/
1224
1225 void init_lsa_q_close(LSA_Q_CLOSE *q_c, POLICY_HND *hnd)
1226 {
1227         DEBUG(5, ("init_lsa_q_close\n"));
1228
1229         memcpy(&q_c->pol, hnd, sizeof(q_c->pol));
1230 }
1231
1232 /*******************************************************************
1233  Reads or writes an LSA_Q_CLOSE structure.
1234 ********************************************************************/
1235
1236 BOOL lsa_io_q_close(const char *desc, LSA_Q_CLOSE *q_c, prs_struct *ps, int depth)
1237 {
1238         prs_debug(ps, depth, desc, "lsa_io_q_close");
1239         depth++;
1240
1241         if(!smb_io_pol_hnd("", &q_c->pol, ps, depth))
1242                 return False;
1243
1244         return True;
1245 }
1246
1247 /*******************************************************************
1248  Reads or writes an LSA_R_CLOSE structure.
1249 ********************************************************************/
1250
1251 BOOL lsa_io_r_close(const char *desc,  LSA_R_CLOSE *r_c, prs_struct *ps, int depth)
1252 {
1253         prs_debug(ps, depth, desc, "lsa_io_r_close");
1254         depth++;
1255
1256         if(!smb_io_pol_hnd("", &r_c->pol, ps, depth))
1257                 return False;
1258
1259         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1260                 return False;
1261
1262         return True;
1263 }
1264
1265 /*******************************************************************
1266  Reads or writes an LSA_Q_OPEN_SECRET structure.
1267 ********************************************************************/
1268
1269 BOOL lsa_io_q_open_secret(const char *desc, LSA_Q_OPEN_SECRET *q_c, prs_struct *ps, int depth)
1270 {
1271         prs_debug(ps, depth, desc, "lsa_io_q_open_secret");
1272         depth++;
1273
1274         /* Don't bother to read or write at present... */
1275         return True;
1276 }
1277
1278 /*******************************************************************
1279  Reads or writes an LSA_R_OPEN_SECRET structure.
1280 ********************************************************************/
1281
1282 BOOL lsa_io_r_open_secret(const char *desc, LSA_R_OPEN_SECRET *r_c, prs_struct *ps, int depth)
1283 {
1284         prs_debug(ps, depth, desc, "lsa_io_r_open_secret");
1285         depth++;
1286
1287         if(!prs_align(ps))
1288                 return False;
1289    
1290         if(!prs_uint32("dummy1", ps, depth, &r_c->dummy1))
1291                 return False;
1292         if(!prs_uint32("dummy2", ps, depth, &r_c->dummy2))
1293                 return False;
1294         if(!prs_uint32("dummy3", ps, depth, &r_c->dummy3))
1295                 return False;
1296         if(!prs_uint32("dummy4", ps, depth, &r_c->dummy4))
1297                 return False;
1298         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1299                 return False;
1300
1301         return True;
1302 }
1303
1304 /*******************************************************************
1305  Inits an LSA_Q_ENUM_PRIVS structure.
1306 ********************************************************************/
1307
1308 void init_q_enum_privs(LSA_Q_ENUM_PRIVS *q_q, POLICY_HND *hnd, uint32 enum_context, uint32 pref_max_length)
1309 {
1310         DEBUG(5, ("init_q_enum_privs\n"));
1311
1312         memcpy(&q_q->pol, hnd, sizeof(q_q->pol));
1313
1314         q_q->enum_context = enum_context;
1315         q_q->pref_max_length = pref_max_length;
1316 }
1317
1318 /*******************************************************************
1319 reads or writes a structure.
1320 ********************************************************************/
1321 BOOL lsa_io_q_enum_privs(const char *desc, LSA_Q_ENUM_PRIVS *q_q, prs_struct *ps, int depth)
1322 {
1323         if (q_q == NULL)
1324                 return False;
1325
1326         prs_debug(ps, depth, desc, "lsa_io_q_enum_privs");
1327         depth++;
1328
1329         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
1330                 return False;
1331
1332         if(!prs_uint32("enum_context   ", ps, depth, &q_q->enum_context))
1333                 return False;
1334         if(!prs_uint32("pref_max_length", ps, depth, &q_q->pref_max_length))
1335                 return False;
1336
1337         return True;
1338 }
1339
1340 /*******************************************************************
1341 reads or writes a structure.
1342 ********************************************************************/
1343 static BOOL lsa_io_priv_entries(const char *desc, LSA_PRIV_ENTRY *entries, uint32 count, prs_struct *ps, int depth)
1344 {
1345         uint32 i;
1346
1347         if (entries == NULL)
1348                 return False;
1349
1350         prs_debug(ps, depth, desc, "lsa_io_priv_entries");
1351         depth++;
1352
1353         if(!prs_align(ps))
1354                 return False;
1355
1356         for (i = 0; i < count; i++) {
1357                 if (!smb_io_unihdr("", &entries[i].hdr_name, ps, depth))
1358                         return False;
1359                 if(!prs_uint32("luid_low ", ps, depth, &entries[i].luid_low))
1360                         return False;
1361                 if(!prs_uint32("luid_high", ps, depth, &entries[i].luid_high))
1362                         return False;
1363         }
1364
1365         for (i = 0; i < count; i++)
1366                 if (!smb_io_unistr2("", &entries[i].name, entries[i].hdr_name.buffer, ps, depth))
1367                         return False;
1368
1369         return True;
1370 }
1371
1372 /*******************************************************************
1373  Inits an LSA_R_ENUM_PRIVS structure.
1374 ********************************************************************/
1375
1376 void init_lsa_r_enum_privs(LSA_R_ENUM_PRIVS *r_u, uint32 enum_context,
1377                           uint32 count, LSA_PRIV_ENTRY *entries)
1378 {
1379         DEBUG(5, ("init_lsa_r_enum_privs\n"));
1380
1381         r_u->enum_context=enum_context;
1382         r_u->count=count;
1383         
1384         if (entries!=NULL) {
1385                 r_u->ptr=1;
1386                 r_u->count1=count;
1387                 r_u->privs=entries;
1388         } else {
1389                 r_u->ptr=0;
1390                 r_u->count1=0;
1391                 r_u->privs=NULL;
1392         }               
1393 }
1394
1395 /*******************************************************************
1396 reads or writes a structure.
1397 ********************************************************************/
1398 BOOL lsa_io_r_enum_privs(const char *desc, LSA_R_ENUM_PRIVS *r_q, prs_struct *ps, int depth)
1399 {
1400         if (r_q == NULL)
1401                 return False;
1402
1403         prs_debug(ps, depth, desc, "lsa_io_r_enum_privs");
1404         depth++;
1405
1406         if(!prs_align(ps))
1407                 return False;
1408
1409         if(!prs_uint32("enum_context", ps, depth, &r_q->enum_context))
1410                 return False;
1411         if(!prs_uint32("count", ps, depth, &r_q->count))
1412                 return False;
1413         if(!prs_uint32("ptr", ps, depth, &r_q->ptr))
1414                 return False;
1415
1416         if (r_q->ptr) {
1417                 if(!prs_uint32("count1", ps, depth, &r_q->count1))
1418                         return False;
1419
1420                 if (UNMARSHALLING(ps))
1421                         if (!(r_q->privs = (LSA_PRIV_ENTRY *)prs_alloc_mem(ps, sizeof(LSA_PRIV_ENTRY) * r_q->count1)))
1422                                 return False;
1423
1424                 if (!lsa_io_priv_entries("", r_q->privs, r_q->count1, ps, depth))
1425                         return False;
1426         }
1427
1428         if(!prs_align(ps))
1429                 return False;
1430
1431         if(!prs_ntstatus("status", ps, depth, &r_q->status))
1432                 return False;
1433
1434         return True;
1435 }
1436
1437 void init_lsa_priv_get_dispname(LSA_Q_PRIV_GET_DISPNAME *trn, POLICY_HND *hnd, const char *name, uint16 lang_id, uint16 lang_id_sys)
1438 {
1439         int len_name = strlen(name);
1440
1441         if(len_name == 0)
1442                 len_name = 1;
1443
1444         memcpy(&trn->pol, hnd, sizeof(trn->pol));
1445
1446         init_uni_hdr(&trn->hdr_name, len_name);
1447         init_unistr2(&trn->name, name, len_name);
1448         trn->lang_id = lang_id;
1449         trn->lang_id_sys = lang_id_sys;
1450 }
1451
1452 /*******************************************************************
1453 reads or writes a structure.
1454 ********************************************************************/
1455 BOOL lsa_io_q_priv_get_dispname(const char *desc, LSA_Q_PRIV_GET_DISPNAME *q_q, prs_struct *ps, int depth)
1456 {
1457         if (q_q == NULL)
1458                 return False;
1459
1460         prs_debug(ps, depth, desc, "lsa_io_q_priv_get_dispname");
1461         depth++;
1462
1463         if(!prs_align(ps))
1464                 return False;
1465
1466         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
1467                 return False;
1468
1469         if (!smb_io_unihdr("hdr_name", &q_q->hdr_name, ps, depth))
1470                 return False;
1471
1472         if (!smb_io_unistr2("name", &q_q->name, q_q->hdr_name.buffer, ps, depth))
1473                 return False;
1474
1475         if(!prs_uint16("lang_id    ", ps, depth, &q_q->lang_id))
1476                 return False;
1477         if(!prs_uint16("lang_id_sys", ps, depth, &q_q->lang_id_sys))
1478                 return False;
1479
1480         return True;
1481 }
1482
1483 /*******************************************************************
1484 reads or writes a structure.
1485 ********************************************************************/
1486 BOOL lsa_io_r_priv_get_dispname(const char *desc, LSA_R_PRIV_GET_DISPNAME *r_q, prs_struct *ps, int depth)
1487 {
1488         if (r_q == NULL)
1489                 return False;
1490
1491         prs_debug(ps, depth, desc, "lsa_io_r_priv_get_dispname");
1492         depth++;
1493
1494         if (!prs_align(ps))
1495                 return False;
1496
1497         if (!prs_uint32("ptr_info", ps, depth, &r_q->ptr_info))
1498                 return False;
1499
1500         if (r_q->ptr_info){
1501                 if (!smb_io_unihdr("hdr_name", &r_q->hdr_desc, ps, depth))
1502                         return False;
1503
1504                 if (!smb_io_unistr2("desc", &r_q->desc, r_q->hdr_desc.buffer, ps, depth))
1505                         return False;
1506         }
1507 /*
1508         if(!prs_align(ps))
1509                 return False;
1510 */
1511         if(!prs_uint16("lang_id", ps, depth, &r_q->lang_id))
1512                 return False;
1513
1514         if(!prs_align(ps))
1515                 return False;
1516         if(!prs_ntstatus("status", ps, depth, &r_q->status))
1517                 return False;
1518
1519         return True;
1520 }
1521
1522 /*
1523   initialise a LSA_Q_ENUM_ACCOUNTS structure
1524 */
1525 void init_lsa_q_enum_accounts(LSA_Q_ENUM_ACCOUNTS *trn, POLICY_HND *hnd, uint32 enum_context, uint32 pref_max_length)
1526 {
1527         memcpy(&trn->pol, hnd, sizeof(trn->pol));
1528
1529         trn->enum_context = enum_context;
1530         trn->pref_max_length = pref_max_length;
1531 }
1532
1533 /*******************************************************************
1534 reads or writes a structure.
1535 ********************************************************************/
1536 BOOL lsa_io_q_enum_accounts(const char *desc, LSA_Q_ENUM_ACCOUNTS *q_q, prs_struct *ps, int depth)
1537 {
1538         if (q_q == NULL)
1539                 return False;
1540
1541         prs_debug(ps, depth, desc, "lsa_io_q_enum_accounts");
1542         depth++;
1543
1544         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
1545                 return False;
1546
1547         if(!prs_uint32("enum_context   ", ps, depth, &q_q->enum_context))
1548                 return False;
1549         if(!prs_uint32("pref_max_length", ps, depth, &q_q->pref_max_length))
1550                 return False;
1551
1552         return True;
1553 }
1554
1555
1556 /*******************************************************************
1557  Inits an LSA_R_ENUM_PRIVS structure.
1558 ********************************************************************/
1559
1560 void init_lsa_r_enum_accounts(LSA_R_ENUM_ACCOUNTS *r_u, uint32 enum_context)
1561 {
1562         DEBUG(5, ("init_lsa_r_enum_accounts\n"));
1563
1564         r_u->enum_context=enum_context;
1565         if (r_u->enum_context!=0) {
1566                 r_u->sids.num_entries=enum_context;
1567                 r_u->sids.ptr_sid_enum=1;
1568                 r_u->sids.num_entries2=enum_context;
1569         } else {
1570                 r_u->sids.num_entries=0;
1571                 r_u->sids.ptr_sid_enum=0;
1572                 r_u->sids.num_entries2=0;
1573         }
1574 }
1575
1576 /*******************************************************************
1577 reads or writes a structure.
1578 ********************************************************************/
1579 BOOL lsa_io_r_enum_accounts(const char *desc, LSA_R_ENUM_ACCOUNTS *r_q, prs_struct *ps, int depth)
1580 {
1581         if (r_q == NULL)
1582                 return False;
1583
1584         prs_debug(ps, depth, desc, "lsa_io_r_enum_accounts");
1585         depth++;
1586
1587         if (!prs_align(ps))
1588                 return False;
1589
1590         if(!prs_uint32("enum_context", ps, depth, &r_q->enum_context))
1591                 return False;
1592
1593         if (!lsa_io_sid_enum("sids", &r_q->sids, ps, depth))
1594                 return False;
1595
1596         if (!prs_align(ps))
1597                 return False;
1598
1599         if(!prs_ntstatus("status", ps, depth, &r_q->status))
1600                 return False;
1601
1602         return True;
1603 }
1604
1605
1606 /*******************************************************************
1607  Reads or writes an LSA_Q_UNK_GET_CONNUSER structure.
1608 ********************************************************************/
1609
1610 BOOL lsa_io_q_unk_get_connuser(const char *desc, LSA_Q_UNK_GET_CONNUSER *q_c, prs_struct *ps, int depth)
1611 {
1612         prs_debug(ps, depth, desc, "lsa_io_q_unk_get_connuser");
1613         depth++;
1614
1615         if(!prs_align(ps))
1616                 return False;
1617    
1618         if(!prs_uint32("ptr_srvname", ps, depth, &q_c->ptr_srvname))
1619                 return False;
1620
1621         if(!smb_io_unistr2("uni2_srvname", &q_c->uni2_srvname, q_c->ptr_srvname, ps, depth)) /* server name to be looked up */
1622                 return False;
1623
1624         if (!prs_align(ps))
1625           return False;
1626
1627         if(!prs_uint32("unk1", ps, depth, &q_c->unk1))
1628                 return False;
1629         if(!prs_uint32("unk2", ps, depth, &q_c->unk2))
1630                 return False;
1631         if(!prs_uint32("unk3", ps, depth, &q_c->unk3))
1632                 return False;
1633
1634         /* Don't bother to read or write at present... */
1635         return True;
1636 }
1637
1638 /*******************************************************************
1639  Reads or writes an LSA_R_UNK_GET_CONNUSER structure.
1640 ********************************************************************/
1641
1642 BOOL lsa_io_r_unk_get_connuser(const char *desc, LSA_R_UNK_GET_CONNUSER *r_c, prs_struct *ps, int depth)
1643 {
1644         prs_debug(ps, depth, desc, "lsa_io_r_unk_get_connuser");
1645         depth++;
1646
1647         if(!prs_align(ps))
1648                 return False;
1649    
1650         if(!prs_uint32("ptr_user_name", ps, depth, &r_c->ptr_user_name))
1651                 return False;
1652         if(!smb_io_unihdr("hdr_user_name", &r_c->hdr_user_name, ps, depth))
1653                 return False;
1654         if(!smb_io_unistr2("uni2_user_name", &r_c->uni2_user_name, r_c->ptr_user_name, ps, depth))
1655                 return False;
1656
1657         if (!prs_align(ps))
1658           return False;
1659         
1660         if(!prs_uint32("unk1", ps, depth, &r_c->unk1))
1661                 return False;
1662
1663         if(!prs_uint32("ptr_dom_name", ps, depth, &r_c->ptr_dom_name))
1664                 return False;
1665         if(!smb_io_unihdr("hdr_dom_name", &r_c->hdr_dom_name, ps, depth))
1666                 return False;
1667         if(!smb_io_unistr2("uni2_dom_name", &r_c->uni2_dom_name, r_c->ptr_dom_name, ps, depth))
1668                 return False;
1669
1670         if (!prs_align(ps))
1671           return False;
1672         
1673         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1674                 return False;
1675
1676         return True;
1677 }
1678
1679 void init_lsa_q_open_account(LSA_Q_OPENACCOUNT *trn, POLICY_HND *hnd, DOM_SID *sid, uint32 desired_access)
1680 {
1681         memcpy(&trn->pol, hnd, sizeof(trn->pol));
1682
1683         init_dom_sid2(&trn->sid, sid);
1684         trn->access = desired_access;
1685 }
1686
1687 /*******************************************************************
1688  Reads or writes an LSA_Q_OPENACCOUNT structure.
1689 ********************************************************************/
1690
1691 BOOL lsa_io_q_open_account(const char *desc, LSA_Q_OPENACCOUNT *r_c, prs_struct *ps, int depth)
1692 {
1693         prs_debug(ps, depth, desc, "lsa_io_q_open_account");
1694         depth++;
1695
1696         if(!prs_align(ps))
1697                 return False;
1698  
1699         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1700                 return False;
1701
1702         if(!smb_io_dom_sid2("sid", &r_c->sid, ps, depth)) /* domain SID */
1703                 return False;
1704
1705         if(!prs_uint32("access", ps, depth, &r_c->access))
1706                 return False;
1707   
1708         return True;
1709 }
1710
1711 /*******************************************************************
1712  Reads or writes an LSA_R_OPENACCOUNT structure.
1713 ********************************************************************/
1714
1715 BOOL lsa_io_r_open_account(const char *desc, LSA_R_OPENACCOUNT  *r_c, prs_struct *ps, int depth)
1716 {
1717         prs_debug(ps, depth, desc, "lsa_io_r_open_account");
1718         depth++;
1719
1720         if(!prs_align(ps))
1721                 return False;
1722  
1723         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1724                 return False;
1725
1726         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1727                 return False;
1728
1729         return True;
1730 }
1731
1732
1733 void init_lsa_q_enum_privsaccount(LSA_Q_ENUMPRIVSACCOUNT *trn, POLICY_HND *hnd)
1734 {
1735         memcpy(&trn->pol, hnd, sizeof(trn->pol));
1736
1737 }
1738
1739 /*******************************************************************
1740  Reads or writes an LSA_Q_ENUMPRIVSACCOUNT structure.
1741 ********************************************************************/
1742
1743 BOOL lsa_io_q_enum_privsaccount(const char *desc, LSA_Q_ENUMPRIVSACCOUNT *r_c, prs_struct *ps, int depth)
1744 {
1745         prs_debug(ps, depth, desc, "lsa_io_q_enum_privsaccount");
1746         depth++;
1747
1748         if(!prs_align(ps))
1749                 return False;
1750  
1751         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1752                 return False;
1753
1754         return True;
1755 }
1756
1757 /*******************************************************************
1758  Reads or writes an LUID structure.
1759 ********************************************************************/
1760
1761 static BOOL lsa_io_luid(const char *desc, LUID *r_c, prs_struct *ps, int depth)
1762 {
1763         prs_debug(ps, depth, desc, "lsa_io_luid");
1764         depth++;
1765
1766         if(!prs_align(ps))
1767                 return False;
1768  
1769         if(!prs_uint32("low", ps, depth, &r_c->low))
1770                 return False;
1771
1772         if(!prs_uint32("high", ps, depth, &r_c->high))
1773                 return False;
1774
1775         return True;
1776 }
1777
1778 /*******************************************************************
1779  Reads or writes an LUID_ATTR structure.
1780 ********************************************************************/
1781
1782 static BOOL lsa_io_luid_attr(const char *desc, LUID_ATTR *r_c, prs_struct *ps, int depth)
1783 {
1784         prs_debug(ps, depth, desc, "lsa_io_luid_attr");
1785         depth++;
1786
1787         if(!prs_align(ps))
1788                 return False;
1789  
1790         if (!lsa_io_luid(desc, &r_c->luid, ps, depth))
1791                 return False;
1792
1793         if(!prs_uint32("attr", ps, depth, &r_c->attr))
1794                 return False;
1795
1796         return True;
1797 }
1798
1799 /*******************************************************************
1800  Reads or writes an PRIVILEGE_SET structure.
1801 ********************************************************************/
1802
1803 static BOOL lsa_io_privilege_set(const char *desc, PRIVILEGE_SET *r_c, prs_struct *ps, int depth)
1804 {
1805         uint32 i;
1806
1807         prs_debug(ps, depth, desc, "lsa_io_privilege_set");
1808         depth++;
1809
1810         if(!prs_align(ps))
1811                 return False;
1812  
1813         if(!prs_uint32("count", ps, depth, &r_c->count))
1814                 return False;
1815         if(!prs_uint32("control", ps, depth, &r_c->control))
1816                 return False;
1817
1818         for (i=0; i<r_c->count; i++) {
1819                 if (!lsa_io_luid_attr(desc, &r_c->set[i], ps, depth))
1820                         return False;
1821         }
1822         
1823         return True;
1824 }
1825
1826 void init_lsa_r_enum_privsaccount(LSA_R_ENUMPRIVSACCOUNT *r_u, LUID_ATTR *set, uint32 count, uint32 control)
1827 {
1828         r_u->ptr=1;
1829         r_u->count=count;
1830         r_u->set.set=set;
1831         r_u->set.count=count;
1832         r_u->set.control=control;
1833         DEBUG(10,("init_lsa_r_enum_privsaccount: %d %d privileges\n", r_u->count, r_u->set.count));
1834 }
1835
1836 /*******************************************************************
1837  Reads or writes an LSA_R_ENUMPRIVSACCOUNT structure.
1838 ********************************************************************/
1839
1840 BOOL lsa_io_r_enum_privsaccount(const char *desc, LSA_R_ENUMPRIVSACCOUNT *r_c, prs_struct *ps, int depth)
1841 {
1842         prs_debug(ps, depth, desc, "lsa_io_r_enum_privsaccount");
1843         depth++;
1844
1845         if(!prs_align(ps))
1846                 return False;
1847  
1848         if(!prs_uint32("ptr", ps, depth, &r_c->ptr))
1849                 return False;
1850
1851         if (r_c->ptr!=0) {
1852                 if(!prs_uint32("count", ps, depth, &r_c->count))
1853                         return False;
1854
1855                 /* malloc memory if unmarshalling here */
1856
1857                 if (UNMARSHALLING(ps) && r_c->count!=0) {
1858                         if (!(r_c->set.set = (LUID_ATTR *)prs_alloc_mem(ps,sizeof(LUID_ATTR) * r_c->count)))
1859                                 return False;
1860
1861                 }
1862                 
1863                 if(!lsa_io_privilege_set(desc, &r_c->set, ps, depth))
1864                         return False;
1865         }
1866
1867         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1868                 return False;
1869
1870         return True;
1871 }
1872
1873
1874
1875 /*******************************************************************
1876  Reads or writes an  LSA_Q_GETSYSTEMACCOUNTstructure.
1877 ********************************************************************/
1878
1879 BOOL lsa_io_q_getsystemaccount(const char *desc, LSA_Q_GETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1880 {
1881         prs_debug(ps, depth, desc, "lsa_io_q_getsystemaccount");
1882         depth++;
1883
1884         if(!prs_align(ps))
1885                 return False;
1886  
1887         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1888                 return False;
1889
1890         return True;
1891 }
1892
1893 /*******************************************************************
1894  Reads or writes an  LSA_R_GETSYSTEMACCOUNTstructure.
1895 ********************************************************************/
1896
1897 BOOL lsa_io_r_getsystemaccount(const char *desc, LSA_R_GETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1898 {
1899         prs_debug(ps, depth, desc, "lsa_io_r_getsystemaccount");
1900         depth++;
1901
1902         if(!prs_align(ps))
1903                 return False;
1904  
1905         if(!prs_uint32("access", ps, depth, &r_c->access))
1906                 return False;
1907
1908         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1909                 return False;
1910
1911         return True;
1912 }
1913
1914
1915 /*******************************************************************
1916  Reads or writes an LSA_Q_SETSYSTEMACCOUNT structure.
1917 ********************************************************************/
1918
1919 BOOL lsa_io_q_setsystemaccount(const char *desc, LSA_Q_SETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1920 {
1921         prs_debug(ps, depth, desc, "lsa_io_q_setsystemaccount");
1922         depth++;
1923
1924         if(!prs_align(ps))
1925                 return False;
1926  
1927         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1928                 return False;
1929
1930         if(!prs_uint32("access", ps, depth, &r_c->access))
1931                 return False;
1932
1933         return True;
1934 }
1935
1936 /*******************************************************************
1937  Reads or writes an LSA_R_SETSYSTEMACCOUNT structure.
1938 ********************************************************************/
1939
1940 BOOL lsa_io_r_setsystemaccount(const char *desc, LSA_R_SETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1941 {
1942         prs_debug(ps, depth, desc, "lsa_io_r_setsystemaccount");
1943         depth++;
1944
1945         if(!prs_align(ps))
1946                 return False;
1947  
1948         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1949                 return False;
1950
1951         return True;
1952 }
1953
1954
1955 void init_lsa_q_lookupprivvalue(LSA_Q_LOOKUPPRIVVALUE *trn, POLICY_HND *hnd, const char *name)
1956 {
1957         int len_name = strlen(name);
1958         memcpy(&trn->pol, hnd, sizeof(trn->pol));
1959
1960         if(len_name == 0)
1961                 len_name = 1;
1962
1963         init_uni_hdr(&trn->hdr_right, len_name);
1964         init_unistr2(&trn->uni2_right, name, len_name);
1965 }
1966
1967 /*******************************************************************
1968  Reads or writes an LSA_Q_LOOKUPPRIVVALUE  structure.
1969 ********************************************************************/
1970
1971 BOOL lsa_io_q_lookupprivvalue(const char *desc, LSA_Q_LOOKUPPRIVVALUE  *r_c, prs_struct *ps, int depth)
1972 {
1973         prs_debug(ps, depth, desc, "lsa_io_q_lookupprivvalue");
1974         depth++;
1975
1976         if(!prs_align(ps))
1977                 return False;
1978  
1979         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1980                 return False;
1981         if(!smb_io_unihdr ("hdr_name", &r_c->hdr_right, ps, depth))
1982                 return False;
1983         if(!smb_io_unistr2("uni2_right", &r_c->uni2_right, r_c->hdr_right.buffer, ps, depth))
1984                 return False;
1985
1986         return True;
1987 }
1988
1989 /*******************************************************************
1990  Reads or writes an  LSA_R_LOOKUPPRIVVALUE structure.
1991 ********************************************************************/
1992
1993 BOOL lsa_io_r_lookupprivvalue(const char *desc, LSA_R_LOOKUPPRIVVALUE  *r_c, prs_struct *ps, int depth)
1994 {
1995         prs_debug(ps, depth, desc, "lsa_io_r_lookupprivvalue");
1996         depth++;
1997
1998         if(!prs_align(ps))
1999                 return False;
2000                 
2001         if(!lsa_io_luid("luid", &r_c->luid, ps, depth))
2002                 return False;
2003  
2004         if(!prs_ntstatus("status", ps, depth, &r_c->status))
2005                 return False;
2006
2007         return True;
2008 }
2009
2010
2011 /*******************************************************************
2012  Reads or writes an LSA_Q_ADDPRIVS structure.
2013 ********************************************************************/
2014
2015 BOOL lsa_io_q_addprivs(const char *desc, LSA_Q_ADDPRIVS *r_c, prs_struct *ps, int depth)
2016 {
2017         prs_debug(ps, depth, desc, "lsa_io_q_addprivs");
2018         depth++;
2019
2020         if(!prs_align(ps))
2021                 return False;
2022  
2023         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
2024                 return False;
2025         
2026         if(!prs_uint32("count", ps, depth, &r_c->count))
2027                 return False;
2028
2029         if (UNMARSHALLING(ps) && r_c->count!=0) {
2030                 if (!(r_c->set.set = (LUID_ATTR *)prs_alloc_mem(ps,sizeof(LUID_ATTR) * r_c->count)))
2031                         return False;
2032         }
2033         
2034         if(!lsa_io_privilege_set(desc, &r_c->set, ps, depth))
2035                 return False;
2036         
2037         return True;
2038 }
2039
2040 /*******************************************************************
2041  Reads or writes an LSA_R_ADDPRIVS structure.
2042 ********************************************************************/
2043
2044 BOOL lsa_io_r_addprivs(const char *desc, LSA_R_ADDPRIVS *r_c, prs_struct *ps, int depth)
2045 {
2046         prs_debug(ps, depth, desc, "lsa_io_r_addprivs");
2047         depth++;
2048
2049         if(!prs_align(ps))
2050                 return False;
2051  
2052         if(!prs_ntstatus("status", ps, depth, &r_c->status))
2053                 return False;
2054
2055         return True;
2056 }
2057
2058 /*******************************************************************
2059  Reads or writes an LSA_Q_REMOVEPRIVS structure.
2060 ********************************************************************/
2061
2062 BOOL lsa_io_q_removeprivs(const char *desc, LSA_Q_REMOVEPRIVS *r_c, prs_struct *ps, int depth)
2063 {
2064         prs_debug(ps, depth, desc, "lsa_io_q_removeprivs");
2065         depth++;
2066
2067         if(!prs_align(ps))
2068                 return False;
2069  
2070         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
2071                 return False;
2072         
2073         if(!prs_uint32("allrights", ps, depth, &r_c->allrights))
2074                 return False;
2075
2076         if(!prs_uint32("ptr", ps, depth, &r_c->ptr))
2077                 return False;
2078
2079         /* 
2080          * JFM: I'm not sure at all if the count is inside the ptr
2081          * never seen one with ptr=0
2082          */
2083
2084         if (r_c->ptr!=0) {
2085                 if(!prs_uint32("count", ps, depth, &r_c->count))
2086                         return False;
2087
2088                 if (UNMARSHALLING(ps) && r_c->count!=0) {
2089                         if (!(r_c->set.set = (LUID_ATTR *)prs_alloc_mem(ps,sizeof(LUID_ATTR) * r_c->count)))
2090                                 return False;
2091                 }
2092
2093                 if(!lsa_io_privilege_set(desc, &r_c->set, ps, depth))
2094                         return False;
2095         }
2096
2097         return True;
2098 }
2099
2100 /*******************************************************************
2101  Reads or writes an LSA_R_REMOVEPRIVS structure.
2102 ********************************************************************/
2103
2104 BOOL lsa_io_r_removeprivs(const char *desc, LSA_R_REMOVEPRIVS *r_c, prs_struct *ps, int depth)
2105 {
2106         prs_debug(ps, depth, desc, "lsa_io_r_removeprivs");
2107         depth++;
2108
2109         if(!prs_align(ps))
2110                 return False;
2111  
2112         if(!prs_ntstatus("status", ps, depth, &r_c->status))
2113                 return False;
2114
2115         return True;
2116 }
2117
2118 BOOL policy_handle_is_valid(const POLICY_HND *hnd)
2119 {
2120         POLICY_HND zero_pol;
2121
2122         ZERO_STRUCT(zero_pol);
2123         return ((memcmp(&zero_pol, hnd, sizeof(POLICY_HND)) == 0) ? False : True );
2124 }
2125
2126 /*******************************************************************
2127  Reads or writes an LSA_DNS_DOM_INFO structure.
2128 ********************************************************************/
2129
2130 BOOL lsa_io_dns_dom_info(const char *desc, LSA_DNS_DOM_INFO *info,
2131                          prs_struct *ps, int depth)
2132 {
2133         prs_debug(ps, depth, desc, "lsa_io_dns_dom_info");
2134         depth++;
2135
2136         if(!prs_align(ps))
2137                 return False;
2138         if(!smb_io_unihdr("nb_name", &info->hdr_nb_dom_name, ps, depth))
2139                 return False;
2140         if(!smb_io_unihdr("dns_name", &info->hdr_dns_dom_name, ps, depth))
2141                 return False;
2142         if(!smb_io_unihdr("forest", &info->hdr_forest_name, ps, depth))
2143                 return False;
2144
2145         if(!prs_align(ps))
2146                 return False;
2147         if (!prs_uint8s(False, "dom_guid", ps, depth, info->dom_guid.info, GUID_SIZE))
2148                 return False;
2149
2150         if(!prs_align(ps))
2151                 return False;
2152         if(!prs_uint32("dom_sid", ps, depth, &info->ptr_dom_sid))
2153                 return False;
2154
2155         if(!smb_io_unistr2("nb_name", &info->uni_nb_dom_name,
2156                            info->hdr_nb_dom_name.buffer, ps, depth))
2157                 return False;
2158         if(!smb_io_unistr2("dns_name", &info->uni_dns_dom_name, 
2159                            info->hdr_dns_dom_name.buffer, ps, depth))
2160                 return False;
2161         if(!smb_io_unistr2("forest", &info->uni_forest_name, 
2162                            info->hdr_forest_name.buffer, ps, depth))
2163                 return False;
2164
2165         if(!smb_io_dom_sid2("dom_sid", &info->dom_sid, ps, depth))
2166                 return False;
2167
2168         return True;
2169         
2170 }
2171
2172 /*******************************************************************
2173  Inits an LSA_Q_QUERY_INFO2 structure.
2174 ********************************************************************/
2175
2176 void init_q_query2(LSA_Q_QUERY_INFO2 *q_q, POLICY_HND *hnd, uint16 info_class)
2177 {
2178         DEBUG(5, ("init_q_query2\n"));
2179
2180         memcpy(&q_q->pol, hnd, sizeof(q_q->pol));
2181
2182         q_q->info_class = info_class;
2183 }
2184
2185 /*******************************************************************
2186  Reads or writes an LSA_Q_QUERY_DNSDOMINFO structure.
2187 ********************************************************************/
2188
2189 BOOL lsa_io_q_query_info2(const char *desc, LSA_Q_QUERY_INFO2 *q_c,
2190                           prs_struct *ps, int depth)
2191 {
2192         prs_debug(ps, depth, desc, "lsa_io_q_query_info2");
2193         depth++;
2194
2195         if(!prs_align(ps))
2196                 return False;
2197  
2198         if(!smb_io_pol_hnd("pol", &q_c->pol, ps, depth))
2199                 return False;
2200         
2201         if(!prs_uint16("info_class", ps, depth, &q_c->info_class))
2202                 return False;
2203
2204         return True;
2205 }
2206
2207 /*******************************************************************
2208  Reads or writes an LSA_R_QUERY_DNSDOMINFO structure.
2209 ********************************************************************/
2210
2211 BOOL lsa_io_r_query_info2(const char *desc, LSA_R_QUERY_INFO2 *r_c,
2212                           prs_struct *ps, int depth)
2213 {
2214         prs_debug(ps, depth, desc, "lsa_io_r_query_info2");
2215         depth++;
2216
2217         if(!prs_align(ps))
2218                 return False;
2219
2220         if(!prs_uint32("ptr", ps, depth, &r_c->ptr))
2221                 return False;
2222         if(!prs_uint16("info_class", ps, depth, &r_c->info_class))
2223                 return False;
2224         switch(r_c->info_class) {
2225         case 0x000c:
2226                 if (!lsa_io_dns_dom_info("info12", &r_c->info.dns_dom_info,
2227                                          ps, depth))
2228                         return False;
2229                 break;
2230         default:
2231                 DEBUG(0,("lsa_io_r_query_info2: unknown info class %d\n",
2232                          r_c->info_class));
2233                 return False;
2234         }
2235
2236         if(!prs_align(ps))
2237                 return False;
2238         if(!prs_ntstatus("status", ps, depth, &r_c->status))
2239                 return False;
2240
2241         return True;
2242 }
2243
2244
2245 /*******************************************************************
2246  Inits an LSA_Q_ENUM_ACCT_RIGHTS structure.
2247 ********************************************************************/
2248 void init_q_enum_acct_rights(LSA_Q_ENUM_ACCT_RIGHTS *q_q, 
2249                              POLICY_HND *hnd, 
2250                              uint32 count, 
2251                              DOM_SID *sid)
2252 {
2253         DEBUG(5, ("init_q_enum_acct_rights\n"));
2254
2255         q_q->pol = *hnd;
2256         init_dom_sid2(&q_q->sid, sid);
2257 }
2258
2259 /*******************************************************************
2260 reads or writes a LSA_Q_ENUM_ACCT_RIGHTS structure.
2261 ********************************************************************/
2262 BOOL lsa_io_q_enum_acct_rights(const char *desc, LSA_Q_ENUM_ACCT_RIGHTS *q_q, prs_struct *ps, int depth)
2263 {
2264         
2265         if (q_q == NULL)
2266                 return False;
2267
2268         prs_debug(ps, depth, desc, "lsa_io_q_enum_acct_rights");
2269         depth++;
2270
2271         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
2272                 return False;
2273
2274         if(!smb_io_dom_sid2("sid", &q_q->sid, ps, depth))
2275                 return False;
2276
2277         return True;
2278 }
2279
2280
2281 /*******************************************************************
2282 reads or writes a LSA_R_ENUM_ACCT_RIGHTS structure.
2283 ********************************************************************/
2284 BOOL lsa_io_r_enum_acct_rights(const char *desc, LSA_R_ENUM_ACCT_RIGHTS *r_c, prs_struct *ps, int depth)
2285 {
2286         prs_debug(ps, depth, desc, "lsa_io_r_enum_acct_rights");
2287         depth++;
2288
2289         if(!prs_uint32("count   ", ps, depth, &r_c->count))
2290                 return False;
2291
2292         if(!smb_io_unistr2_array("rights", &r_c->rights, ps, depth))
2293                 return False;
2294
2295         if(!prs_align(ps))
2296                 return False;
2297
2298         if(!prs_ntstatus("status", ps, depth, &r_c->status))
2299                 return False;
2300
2301         return True;
2302 }
2303
2304
2305 /*******************************************************************
2306  Inits an LSA_Q_ADD_ACCT_RIGHTS structure.
2307 ********************************************************************/
2308 void init_q_add_acct_rights(LSA_Q_ADD_ACCT_RIGHTS *q_q, 
2309                             POLICY_HND *hnd, 
2310                             DOM_SID *sid,
2311                             uint32 count, 
2312                             const char **rights)
2313 {
2314         DEBUG(5, ("init_q_add_acct_rights\n"));
2315
2316         q_q->pol = *hnd;
2317         init_dom_sid2(&q_q->sid, sid);
2318         init_unistr2_array(&q_q->rights, count, rights);
2319         q_q->count = 5;
2320 }
2321
2322
2323 /*******************************************************************
2324 reads or writes a LSA_Q_ADD_ACCT_RIGHTS structure.
2325 ********************************************************************/
2326 BOOL lsa_io_q_add_acct_rights(const char *desc, LSA_Q_ADD_ACCT_RIGHTS *q_q, prs_struct *ps, int depth)
2327 {
2328         prs_debug(ps, depth, desc, "lsa_io_q_add_acct_rights");
2329         depth++;
2330
2331         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
2332                 return False;
2333
2334         if(!smb_io_dom_sid2("sid", &q_q->sid, ps, depth))
2335                 return False;
2336
2337         if(!prs_uint32("count", ps, depth, &q_q->rights.count))
2338                 return False;
2339
2340         if(!smb_io_unistr2_array("rights", &q_q->rights, ps, depth))
2341                 return False;
2342
2343         return True;
2344 }
2345
2346 /*******************************************************************
2347 reads or writes a LSA_R_ENUM_ACCT_RIGHTS structure.
2348 ********************************************************************/
2349 BOOL lsa_io_r_add_acct_rights(const char *desc, LSA_R_ADD_ACCT_RIGHTS *r_c, prs_struct *ps, int depth)
2350 {
2351         prs_debug(ps, depth, desc, "lsa_io_r_add_acct_rights");
2352         depth++;
2353
2354         if(!prs_ntstatus("status", ps, depth, &r_c->status))
2355                 return False;
2356
2357         return True;
2358 }
2359
2360
2361 /*******************************************************************
2362  Inits an LSA_Q_REMOVE_ACCT_RIGHTS structure.
2363 ********************************************************************/
2364 void init_q_remove_acct_rights(LSA_Q_REMOVE_ACCT_RIGHTS *q_q, 
2365                                POLICY_HND *hnd, 
2366                                DOM_SID *sid,
2367                                uint32 removeall,
2368                                uint32 count, 
2369                                const char **rights)
2370 {
2371         DEBUG(5, ("init_q_remove_acct_rights\n"));
2372
2373         q_q->pol = *hnd;
2374         init_dom_sid2(&q_q->sid, sid);
2375         q_q->removeall = removeall;
2376         init_unistr2_array(&q_q->rights, count, rights);
2377         q_q->count = 5;
2378 }
2379
2380
2381 /*******************************************************************
2382 reads or writes a LSA_Q_REMOVE_ACCT_RIGHTS structure.
2383 ********************************************************************/
2384 BOOL lsa_io_q_remove_acct_rights(const char *desc, LSA_Q_REMOVE_ACCT_RIGHTS *q_q, prs_struct *ps, int depth)
2385 {
2386         prs_debug(ps, depth, desc, "lsa_io_q_remove_acct_rights");
2387         depth++;
2388
2389         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
2390                 return False;
2391
2392         if(!smb_io_dom_sid2("sid", &q_q->sid, ps, depth))
2393                 return False;
2394
2395         if(!prs_uint32("removeall", ps, depth, &q_q->removeall))
2396                 return False;
2397
2398         if(!prs_uint32("count", ps, depth, &q_q->rights.count))
2399                 return False;
2400
2401         if(!smb_io_unistr2_array("rights", &q_q->rights, ps, depth))
2402                 return False;
2403
2404         return True;
2405 }
2406
2407 /*******************************************************************
2408 reads or writes a LSA_R_ENUM_ACCT_RIGHTS structure.
2409 ********************************************************************/
2410 BOOL lsa_io_r_remove_acct_rights(const char *desc, LSA_R_REMOVE_ACCT_RIGHTS *r_c, prs_struct *ps, int depth)
2411 {
2412         prs_debug(ps, depth, desc, "lsa_io_r_remove_acct_rights");
2413         depth++;
2414
2415         if(!prs_ntstatus("status", ps, depth, &r_c->status))
2416                 return False;
2417
2418         return True;
2419 }