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