BIG patch...
[ira/wip.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                     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         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         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         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         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         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         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         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 void init_lsa_q_enum_accounts(LSA_Q_ENUM_ACCOUNTS *trn, POLICY_HND *hnd, uint32 enum_context, uint32 pref_max_length)
1523 {
1524         memcpy(&trn->pol, hnd, sizeof(trn->pol));
1525
1526         trn->enum_context = enum_context;
1527         trn->pref_max_length = pref_max_length;
1528 }
1529
1530 /*******************************************************************
1531 reads or writes a structure.
1532 ********************************************************************/
1533 BOOL lsa_io_q_enum_accounts(const char *desc, LSA_Q_ENUM_ACCOUNTS *q_q, prs_struct *ps, int depth)
1534 {
1535         if (q_q == NULL)
1536                 return False;
1537
1538         prs_debug(ps, depth, desc, "lsa_io_q_enum_accounts");
1539         depth++;
1540
1541         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
1542                 return False;
1543
1544         if(!prs_uint32("enum_context   ", ps, depth, &q_q->enum_context))
1545                 return False;
1546         if(!prs_uint32("pref_max_length", ps, depth, &q_q->pref_max_length))
1547                 return False;
1548
1549         return True;
1550 }
1551
1552 /*******************************************************************
1553  Inits an LSA_R_ENUM_PRIVS structure.
1554 ********************************************************************/
1555
1556 void init_lsa_r_enum_accounts(LSA_R_ENUM_ACCOUNTS *r_u, uint32 enum_context)
1557 {
1558         DEBUG(5, ("init_lsa_r_enum_accounts\n"));
1559
1560         r_u->enum_context=enum_context;
1561         if (r_u->enum_context!=0) {
1562                 r_u->sids.num_entries=enum_context;
1563                 r_u->sids.ptr_sid_enum=1;
1564                 r_u->sids.num_entries2=enum_context;
1565         } else {
1566                 r_u->sids.num_entries=0;
1567                 r_u->sids.ptr_sid_enum=0;
1568                 r_u->sids.num_entries2=0;
1569         }
1570 }
1571
1572 /*******************************************************************
1573 reads or writes a structure.
1574 ********************************************************************/
1575 BOOL lsa_io_r_enum_accounts(const char *desc, LSA_R_ENUM_ACCOUNTS *r_q, prs_struct *ps, int depth)
1576 {
1577         if (r_q == NULL)
1578                 return False;
1579
1580         prs_debug(ps, depth, desc, "lsa_io_r_enum_accounts");
1581         depth++;
1582
1583         if (!prs_align(ps))
1584                 return False;
1585
1586         if(!prs_uint32("enum_context", ps, depth, &r_q->enum_context))
1587                 return False;
1588
1589         if (!lsa_io_sid_enum("sids", &r_q->sids, ps, depth))
1590                 return False;
1591
1592         if (!prs_align(ps))
1593                 return False;
1594
1595         if(!prs_ntstatus("status", ps, depth, &r_q->status))
1596                 return False;
1597
1598         return True;
1599 }
1600
1601
1602 /*******************************************************************
1603  Reads or writes an LSA_Q_UNK_GET_CONNUSER structure.
1604 ********************************************************************/
1605
1606 BOOL lsa_io_q_unk_get_connuser(const char *desc, LSA_Q_UNK_GET_CONNUSER *q_c, prs_struct *ps, int depth)
1607 {
1608         prs_debug(ps, depth, desc, "lsa_io_q_unk_get_connuser");
1609         depth++;
1610
1611         if(!prs_align(ps))
1612                 return False;
1613    
1614         if(!prs_uint32("ptr_srvname", ps, depth, &q_c->ptr_srvname))
1615                 return False;
1616
1617         if(!smb_io_unistr2("uni2_srvname", &q_c->uni2_srvname, q_c->ptr_srvname, ps, depth)) /* server name to be looked up */
1618                 return False;
1619
1620         if (!prs_align(ps))
1621           return False;
1622
1623         if(!prs_uint32("unk1", ps, depth, &q_c->unk1))
1624                 return False;
1625         if(!prs_uint32("unk2", ps, depth, &q_c->unk2))
1626                 return False;
1627         if(!prs_uint32("unk3", ps, depth, &q_c->unk3))
1628                 return False;
1629
1630         /* Don't bother to read or write at present... */
1631         return True;
1632 }
1633
1634 /*******************************************************************
1635  Reads or writes an LSA_R_UNK_GET_CONNUSER structure.
1636 ********************************************************************/
1637
1638 BOOL lsa_io_r_unk_get_connuser(const char *desc, LSA_R_UNK_GET_CONNUSER *r_c, prs_struct *ps, int depth)
1639 {
1640         prs_debug(ps, depth, desc, "lsa_io_r_unk_get_connuser");
1641         depth++;
1642
1643         if(!prs_align(ps))
1644                 return False;
1645    
1646         if(!prs_uint32("ptr_user_name", ps, depth, &r_c->ptr_user_name))
1647                 return False;
1648         if(!smb_io_unihdr("hdr_user_name", &r_c->hdr_user_name, ps, depth))
1649                 return False;
1650         if(!smb_io_unistr2("uni2_user_name", &r_c->uni2_user_name, r_c->ptr_user_name, ps, depth))
1651                 return False;
1652
1653         if (!prs_align(ps))
1654           return False;
1655         
1656         if(!prs_uint32("unk1", ps, depth, &r_c->unk1))
1657                 return False;
1658
1659         if(!prs_uint32("ptr_dom_name", ps, depth, &r_c->ptr_dom_name))
1660                 return False;
1661         if(!smb_io_unihdr("hdr_dom_name", &r_c->hdr_dom_name, ps, depth))
1662                 return False;
1663         if(!smb_io_unistr2("uni2_dom_name", &r_c->uni2_dom_name, r_c->ptr_dom_name, ps, depth))
1664                 return False;
1665
1666         if (!prs_align(ps))
1667           return False;
1668         
1669         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1670                 return False;
1671
1672         return True;
1673 }
1674
1675 void init_lsa_q_open_account(LSA_Q_OPENACCOUNT *trn, POLICY_HND *hnd, DOM_SID *sid, uint32 desired_access)
1676 {
1677         memcpy(&trn->pol, hnd, sizeof(trn->pol));
1678
1679         init_dom_sid2(&trn->sid, sid);
1680         trn->access = desired_access;
1681 }
1682
1683 /*******************************************************************
1684  Reads or writes an LSA_Q_OPENACCOUNT structure.
1685 ********************************************************************/
1686
1687 BOOL lsa_io_q_open_account(const char *desc, LSA_Q_OPENACCOUNT *r_c, prs_struct *ps, int depth)
1688 {
1689         prs_debug(ps, depth, desc, "lsa_io_q_open_account");
1690         depth++;
1691
1692         if(!prs_align(ps))
1693                 return False;
1694  
1695         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1696                 return False;
1697
1698         if(!smb_io_dom_sid2("sid", &r_c->sid, ps, depth)) /* domain SID */
1699                 return False;
1700
1701         if(!prs_uint32("access", ps, depth, &r_c->access))
1702                 return False;
1703   
1704         return True;
1705 }
1706
1707 /*******************************************************************
1708  Reads or writes an LSA_R_OPENACCOUNT structure.
1709 ********************************************************************/
1710
1711 BOOL lsa_io_r_open_account(const char *desc, LSA_R_OPENACCOUNT  *r_c, prs_struct *ps, int depth)
1712 {
1713         prs_debug(ps, depth, desc, "lsa_io_r_open_account");
1714         depth++;
1715
1716         if(!prs_align(ps))
1717                 return False;
1718  
1719         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1720                 return False;
1721
1722         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1723                 return False;
1724
1725         return True;
1726 }
1727
1728
1729 void init_lsa_q_enum_privsaccount(LSA_Q_ENUMPRIVSACCOUNT *trn, POLICY_HND *hnd)
1730 {
1731         memcpy(&trn->pol, hnd, sizeof(trn->pol));
1732
1733 }
1734
1735 /*******************************************************************
1736  Reads or writes an LSA_Q_ENUMPRIVSACCOUNT structure.
1737 ********************************************************************/
1738
1739 BOOL lsa_io_q_enum_privsaccount(const char *desc, LSA_Q_ENUMPRIVSACCOUNT *r_c, prs_struct *ps, int depth)
1740 {
1741         prs_debug(ps, depth, desc, "lsa_io_q_enum_privsaccount");
1742         depth++;
1743
1744         if(!prs_align(ps))
1745                 return False;
1746  
1747         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1748                 return False;
1749
1750         return True;
1751 }
1752
1753 /*******************************************************************
1754  Reads or writes an LUID structure.
1755 ********************************************************************/
1756
1757 static BOOL lsa_io_luid(const char *desc, LUID *r_c, prs_struct *ps, int depth)
1758 {
1759         prs_debug(ps, depth, desc, "lsa_io_luid");
1760         depth++;
1761
1762         if(!prs_align(ps))
1763                 return False;
1764  
1765         if(!prs_uint32("low", ps, depth, &r_c->low))
1766                 return False;
1767
1768         if(!prs_uint32("high", ps, depth, &r_c->high))
1769                 return False;
1770
1771         return True;
1772 }
1773
1774 /*******************************************************************
1775  Reads or writes an LUID_ATTR structure.
1776 ********************************************************************/
1777
1778 static BOOL lsa_io_luid_attr(const char *desc, LUID_ATTR *r_c, prs_struct *ps, int depth)
1779 {
1780         prs_debug(ps, depth, desc, "lsa_io_luid_attr");
1781         depth++;
1782
1783         if(!prs_align(ps))
1784                 return False;
1785  
1786         if (!lsa_io_luid(desc, &r_c->luid, ps, depth))
1787                 return False;
1788
1789         if(!prs_uint32("attr", ps, depth, &r_c->attr))
1790                 return False;
1791
1792         return True;
1793 }
1794
1795 /*******************************************************************
1796  Reads or writes an PRIVILEGE_SET structure.
1797 ********************************************************************/
1798
1799 static BOOL lsa_io_privilege_set(const char *desc, PRIVILEGE_SET *r_c, prs_struct *ps, int depth)
1800 {
1801         uint32 i;
1802
1803         prs_debug(ps, depth, desc, "lsa_io_privilege_set");
1804         depth++;
1805
1806         if(!prs_align(ps))
1807                 return False;
1808  
1809         if(!prs_uint32("count", ps, depth, &r_c->count))
1810                 return False;
1811         if(!prs_uint32("control", ps, depth, &r_c->control))
1812                 return False;
1813
1814         for (i=0; i<r_c->count; i++) {
1815                 if (!lsa_io_luid_attr(desc, &r_c->set[i], ps, depth))
1816                         return False;
1817         }
1818         
1819         return True;
1820 }
1821
1822 void init_lsa_r_enum_privsaccount(LSA_R_ENUMPRIVSACCOUNT *r_u, LUID_ATTR *set, uint32 count, uint32 control)
1823 {
1824         r_u->ptr=1;
1825         r_u->count=count;
1826         r_u->set.set=set;
1827         r_u->set.count=count;
1828         r_u->set.control=control;
1829         DEBUG(10,("init_lsa_r_enum_privsaccount: %d %d privileges\n", r_u->count, r_u->set.count));
1830 }
1831
1832 /*******************************************************************
1833  Reads or writes an LSA_R_ENUMPRIVSACCOUNT structure.
1834 ********************************************************************/
1835
1836 BOOL lsa_io_r_enum_privsaccount(const char *desc, LSA_R_ENUMPRIVSACCOUNT *r_c, prs_struct *ps, int depth)
1837 {
1838         prs_debug(ps, depth, desc, "lsa_io_r_enum_privsaccount");
1839         depth++;
1840
1841         if(!prs_align(ps))
1842                 return False;
1843  
1844         if(!prs_uint32("ptr", ps, depth, &r_c->ptr))
1845                 return False;
1846
1847         if (r_c->ptr!=0) {
1848                 if(!prs_uint32("count", ps, depth, &r_c->count))
1849                         return False;
1850
1851                 /* malloc memory if unmarshalling here */
1852
1853                 if (UNMARSHALLING(ps) && r_c->count!=0) {
1854                         if (!(r_c->set.set = (LUID_ATTR *)prs_alloc_mem(ps,sizeof(LUID_ATTR) * r_c->count)))
1855                                 return False;
1856
1857                 }
1858                 
1859                 if(!lsa_io_privilege_set(desc, &r_c->set, ps, depth))
1860                         return False;
1861         }
1862
1863         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1864                 return False;
1865
1866         return True;
1867 }
1868
1869
1870
1871 /*******************************************************************
1872  Reads or writes an  LSA_Q_GETSYSTEMACCOUNTstructure.
1873 ********************************************************************/
1874
1875 BOOL lsa_io_q_getsystemaccount(const char *desc, LSA_Q_GETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1876 {
1877         prs_debug(ps, depth, desc, "lsa_io_q_getsystemaccount");
1878         depth++;
1879
1880         if(!prs_align(ps))
1881                 return False;
1882  
1883         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1884                 return False;
1885
1886         return True;
1887 }
1888
1889 /*******************************************************************
1890  Reads or writes an  LSA_R_GETSYSTEMACCOUNTstructure.
1891 ********************************************************************/
1892
1893 BOOL lsa_io_r_getsystemaccount(const char *desc, LSA_R_GETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1894 {
1895         prs_debug(ps, depth, desc, "lsa_io_r_getsystemaccount");
1896         depth++;
1897
1898         if(!prs_align(ps))
1899                 return False;
1900  
1901         if(!prs_uint32("access", ps, depth, &r_c->access))
1902                 return False;
1903
1904         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1905                 return False;
1906
1907         return True;
1908 }
1909
1910
1911 /*******************************************************************
1912  Reads or writes an LSA_Q_SETSYSTEMACCOUNT structure.
1913 ********************************************************************/
1914
1915 BOOL lsa_io_q_setsystemaccount(const char *desc, LSA_Q_SETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1916 {
1917         prs_debug(ps, depth, desc, "lsa_io_q_setsystemaccount");
1918         depth++;
1919
1920         if(!prs_align(ps))
1921                 return False;
1922  
1923         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1924                 return False;
1925
1926         if(!prs_uint32("access", ps, depth, &r_c->access))
1927                 return False;
1928
1929         return True;
1930 }
1931
1932 /*******************************************************************
1933  Reads or writes an LSA_R_SETSYSTEMACCOUNT structure.
1934 ********************************************************************/
1935
1936 BOOL lsa_io_r_setsystemaccount(const char *desc, LSA_R_SETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1937 {
1938         prs_debug(ps, depth, desc, "lsa_io_r_setsystemaccount");
1939         depth++;
1940
1941         if(!prs_align(ps))
1942                 return False;
1943  
1944         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1945                 return False;
1946
1947         return True;
1948 }
1949
1950
1951 void init_lsa_q_lookupprivvalue(LSA_Q_LOOKUPPRIVVALUE *trn, POLICY_HND *hnd, const char *name)
1952 {
1953         int len_name = strlen(name);
1954         memcpy(&trn->pol, hnd, sizeof(trn->pol));
1955
1956         if(len_name == 0)
1957                 len_name = 1;
1958
1959         init_uni_hdr(&trn->hdr_right, len_name);
1960         init_unistr2(&trn->uni2_right, name, len_name);
1961 }
1962
1963 /*******************************************************************
1964  Reads or writes an LSA_Q_LOOKUPPRIVVALUE  structure.
1965 ********************************************************************/
1966
1967 BOOL lsa_io_q_lookupprivvalue(const char *desc, LSA_Q_LOOKUPPRIVVALUE  *r_c, prs_struct *ps, int depth)
1968 {
1969         prs_debug(ps, depth, desc, "lsa_io_q_lookupprivvalue");
1970         depth++;
1971
1972         if(!prs_align(ps))
1973                 return False;
1974  
1975         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1976                 return False;
1977         if(!smb_io_unihdr ("hdr_name", &r_c->hdr_right, ps, depth))
1978                 return False;
1979         if(!smb_io_unistr2("uni2_right", &r_c->uni2_right, r_c->hdr_right.buffer, ps, depth))
1980                 return False;
1981
1982         return True;
1983 }
1984
1985 /*******************************************************************
1986  Reads or writes an  LSA_R_LOOKUPPRIVVALUE structure.
1987 ********************************************************************/
1988
1989 BOOL lsa_io_r_lookupprivvalue(const char *desc, LSA_R_LOOKUPPRIVVALUE  *r_c, prs_struct *ps, int depth)
1990 {
1991         prs_debug(ps, depth, desc, "lsa_io_r_lookupprivvalue");
1992         depth++;
1993
1994         if(!prs_align(ps))
1995                 return False;
1996                 
1997         if(!lsa_io_luid("luid", &r_c->luid, ps, depth))
1998                 return False;
1999  
2000         if(!prs_ntstatus("status", ps, depth, &r_c->status))
2001                 return False;
2002
2003         return True;
2004 }
2005
2006
2007 /*******************************************************************
2008  Reads or writes an LSA_Q_ADDPRIVS structure.
2009 ********************************************************************/
2010
2011 BOOL lsa_io_q_addprivs(const char *desc, LSA_Q_ADDPRIVS *r_c, prs_struct *ps, int depth)
2012 {
2013         prs_debug(ps, depth, desc, "lsa_io_q_addprivs");
2014         depth++;
2015
2016         if(!prs_align(ps))
2017                 return False;
2018  
2019         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
2020                 return False;
2021         
2022         if(!prs_uint32("count", ps, depth, &r_c->count))
2023                 return False;
2024
2025         if (UNMARSHALLING(ps) && r_c->count!=0) {
2026                 if (!(r_c->set.set = (LUID_ATTR *)prs_alloc_mem(ps,sizeof(LUID_ATTR) * r_c->count)))
2027                         return False;
2028         }
2029         
2030         if(!lsa_io_privilege_set(desc, &r_c->set, ps, depth))
2031                 return False;
2032         
2033         return True;
2034 }
2035
2036 /*******************************************************************
2037  Reads or writes an LSA_R_ADDPRIVS structure.
2038 ********************************************************************/
2039
2040 BOOL lsa_io_r_addprivs(const char *desc, LSA_R_ADDPRIVS *r_c, prs_struct *ps, int depth)
2041 {
2042         prs_debug(ps, depth, desc, "lsa_io_r_addprivs");
2043         depth++;
2044
2045         if(!prs_align(ps))
2046                 return False;
2047  
2048         if(!prs_ntstatus("status", ps, depth, &r_c->status))
2049                 return False;
2050
2051         return True;
2052 }
2053
2054 /*******************************************************************
2055  Reads or writes an LSA_Q_REMOVEPRIVS structure.
2056 ********************************************************************/
2057
2058 BOOL lsa_io_q_removeprivs(const char *desc, LSA_Q_REMOVEPRIVS *r_c, prs_struct *ps, int depth)
2059 {
2060         prs_debug(ps, depth, desc, "lsa_io_q_removeprivs");
2061         depth++;
2062
2063         if(!prs_align(ps))
2064                 return False;
2065  
2066         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
2067                 return False;
2068         
2069         if(!prs_uint32("allrights", ps, depth, &r_c->allrights))
2070                 return False;
2071
2072         if(!prs_uint32("ptr", ps, depth, &r_c->ptr))
2073                 return False;
2074
2075         /* 
2076          * JFM: I'm not sure at all if the count is inside the ptr
2077          * never seen one with ptr=0
2078          */
2079
2080         if (r_c->ptr!=0) {
2081                 if(!prs_uint32("count", ps, depth, &r_c->count))
2082                         return False;
2083
2084                 if (UNMARSHALLING(ps) && r_c->count!=0) {
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 }