29da2c6913f56f1c392ea2fda0968e742802eff4
[samba.git] / source3 / rpc_parse / parse_lsa.c
1 /* 
2  *  Unix SMB/Netbios implementation.
3  *  Version 1.9.
4  *  RPC Pipe client / server routines
5  *  Copyright (C) Andrew Tridgell              1992-1997,
6  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
7  *  Copyright (C) Paul Ashton                       1997.
8  *  
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *  
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *  
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  */
23
24 #include "includes.h"
25
26 extern int DEBUGLEVEL;
27
28 static BOOL lsa_io_trans_names(char *desc, LSA_TRANS_NAME_ENUM *trn, prs_struct *ps, int depth);
29
30 /*******************************************************************
31  Inits a LSA_TRANS_NAME structure.
32 ********************************************************************/
33
34 void init_lsa_trans_name(LSA_TRANS_NAME *trn, UNISTR2 *uni_name,
35                          uint16 sid_name_use, char *name, uint32 idx)
36 {
37         int len_name = strlen(name);
38
39         if(len_name == 0)
40                 len_name = 1;
41
42         trn->sid_name_use = sid_name_use;
43         init_uni_hdr(&trn->hdr_name, len_name);
44         init_unistr2(uni_name, name, len_name);
45         trn->domain_idx = idx;
46 }
47
48 /*******************************************************************
49  Reads or writes a LSA_TRANS_NAME structure.
50 ********************************************************************/
51
52 static BOOL lsa_io_trans_name(char *desc, LSA_TRANS_NAME *trn, prs_struct *ps, 
53                               int depth)
54 {
55         prs_debug(ps, depth, desc, "lsa_io_trans_name");
56         depth++;
57
58         if(!prs_align(ps))
59                 return False;
60         
61         if(!prs_uint16("sid_name_use", ps, depth, &trn->sid_name_use))
62                 return False;
63         if(!prs_align(ps))
64                 return False;
65         
66         if(!smb_io_unihdr ("hdr_name", &trn->hdr_name, ps, depth))
67                 return False;
68         if(!prs_uint32("domain_idx  ", ps, depth, &trn->domain_idx))
69                 return False;
70
71         return True;
72 }
73
74 /*******************************************************************
75  Reads or writes a DOM_R_REF structure.
76 ********************************************************************/
77
78 static BOOL lsa_io_dom_r_ref(char *desc, DOM_R_REF *r_r, prs_struct *ps, 
79                              int depth)
80 {
81         int i;
82
83         prs_debug(ps, depth, desc, "lsa_io_dom_r_ref");
84         depth++;
85
86         if(!prs_align(ps))
87                 return False;
88         
89         if(!prs_uint32("num_ref_doms_1", ps, depth, &r_r->num_ref_doms_1)) /* num referenced domains? */
90                 return False;
91         if(!prs_uint32("ptr_ref_dom   ", ps, depth, &r_r->ptr_ref_dom)) /* undocumented buffer pointer. */
92                 return False;
93         if(!prs_uint32("max_entries   ", ps, depth, &r_r->max_entries)) /* 32 - max number of entries */
94                 return False;
95
96         SMB_ASSERT_ARRAY(r_r->hdr_ref_dom, r_r->num_ref_doms_1);
97
98         if (r_r->ptr_ref_dom != 0) {
99
100                 if(!prs_uint32("num_ref_doms_2", ps, depth, &r_r->num_ref_doms_2)) /* 4 - num referenced domains? */
101                         return False;
102
103                 SMB_ASSERT_ARRAY(r_r->ref_dom, r_r->num_ref_doms_2);
104
105                 for (i = 0; i < r_r->num_ref_doms_1; i++) {
106                         fstring t;
107
108                         slprintf(t, sizeof(t) - 1, "dom_ref[%d] ", i);
109                         if(!smb_io_unihdr(t, &r_r->hdr_ref_dom[i].hdr_dom_name, ps, depth))
110                                 return False;
111
112                         slprintf(t, sizeof(t) - 1, "sid_ptr[%d] ", i);
113                         if(!prs_uint32(t, ps, depth, &r_r->hdr_ref_dom[i].ptr_dom_sid))
114                                 return False;
115                 }
116
117                 for (i = 0; i < r_r->num_ref_doms_2; i++) {
118                         fstring t;
119
120                         if (r_r->hdr_ref_dom[i].hdr_dom_name.buffer != 0) {
121                                 slprintf(t, sizeof(t) - 1, "dom_ref[%d] ", i);
122                                 if(!smb_io_unistr2(t, &r_r->ref_dom[i].uni_dom_name, True, ps, depth)) /* domain name unicode string */
123                                         return False;
124                                 if(!prs_align(ps))
125                                         return False;
126                         }
127
128                         if (r_r->hdr_ref_dom[i].ptr_dom_sid != 0) {
129                                 slprintf(t, sizeof(t) - 1, "sid_ptr[%d] ", i);
130                                 if(!smb_io_dom_sid2(t, &r_r->ref_dom[i].ref_dom, ps, depth)) /* referenced domain SIDs */
131                                         return False;
132                         }
133                 }
134         }
135
136         return True;
137 }
138
139 /*******************************************************************
140  Inits an LSA_SEC_QOS structure.
141 ********************************************************************/
142
143 void init_lsa_sec_qos(LSA_SEC_QOS *qos, uint16 imp_lev, uint8 ctxt, uint8 eff,
144                       uint32 unknown)
145 {
146         DEBUG(5, ("init_lsa_sec_qos\n"));
147
148         qos->len = 0x0c; /* length of quality of service block, in bytes */
149         qos->sec_imp_level = imp_lev;
150         qos->sec_ctxt_mode = ctxt;
151         qos->effective_only = eff;
152         qos->unknown = unknown;
153 }
154
155 /*******************************************************************
156  Reads or writes an LSA_SEC_QOS structure.
157 ********************************************************************/
158
159 static BOOL lsa_io_sec_qos(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         if(!prs_uint32("unknown       ", ps, depth, &qos->unknown))
184                 return False;
185
186         if (qos->len != prs_offset(ps) - start) {
187                 DEBUG(3,("lsa_io_sec_qos: length %x does not match size %x\n",
188                          qos->len, prs_offset(ps) - start));
189                 return False;
190         }
191
192         return True;
193 }
194
195 /*******************************************************************
196  Inits an LSA_OBJ_ATTR structure.
197 ********************************************************************/
198
199 void init_lsa_obj_attr(LSA_OBJ_ATTR *attr, uint32 attributes, LSA_SEC_QOS *qos)
200 {
201         DEBUG(5, ("init_lsa_obj_attr\n"));
202
203         attr->len = 0x18; /* length of object attribute block, in bytes */
204         attr->ptr_root_dir = 0;
205         attr->ptr_obj_name = 0;
206         attr->attributes = attributes;
207         attr->ptr_sec_desc = 0;
208         
209         if (qos != NULL) {
210                 attr->ptr_sec_qos = 1;
211                 attr->sec_qos = qos;
212         } else {
213                 attr->ptr_sec_qos = 0;
214                 attr->sec_qos = NULL;
215         }
216 }
217
218 /*******************************************************************
219  Reads or writes an LSA_OBJ_ATTR structure.
220 ********************************************************************/
221
222 static BOOL lsa_io_obj_attr(char *desc, LSA_OBJ_ATTR *attr, prs_struct *ps, 
223                             int depth)
224 {
225         uint32 start;
226
227         prs_debug(ps, depth, desc, "lsa_io_obj_attr");
228         depth++;
229
230         if(!prs_align(ps))
231                 return False;
232         
233         start = prs_offset(ps);
234
235         /* these pointers had _better_ be zero, because we don't know
236            what they point to!
237          */
238         if(!prs_uint32("len         ", ps, depth, &attr->len)) /* 0x18 - length (in bytes) inc. the length field. */
239                 return False;
240         if(!prs_uint32("ptr_root_dir", ps, depth, &attr->ptr_root_dir)) /* 0 - root directory (pointer) */
241                 return False;
242         if(!prs_uint32("ptr_obj_name", ps, depth, &attr->ptr_obj_name)) /* 0 - object name (pointer) */
243                 return False;
244         if(!prs_uint32("attributes  ", ps, depth, &attr->attributes)) /* 0 - attributes (undocumented) */
245                 return False;
246         if(!prs_uint32("ptr_sec_desc", ps, depth, &attr->ptr_sec_desc)) /* 0 - security descriptior (pointer) */
247                 return False;
248         if(!prs_uint32("ptr_sec_qos ", ps, depth, &attr->ptr_sec_qos )) /* security quality of service (pointer) */
249                 return False;
250
251         if (attr->len != prs_offset(ps) - start) {
252                 DEBUG(3,("lsa_io_obj_attr: length %x does not match size %x\n",
253                          attr->len, prs_offset(ps) - start));
254                 return False;
255         }
256
257         if (attr->ptr_sec_qos != 0 && attr->sec_qos != NULL) {
258                 if(!lsa_io_sec_qos("sec_qos", attr->sec_qos, ps, depth))
259                         return False;
260         }
261
262         return True;
263 }
264
265
266 /*******************************************************************
267  Inits an LSA_Q_OPEN_POL structure.
268 ********************************************************************/
269
270 void init_q_open_pol(LSA_Q_OPEN_POL *r_q, uint16 system_name,
271                      uint32 attributes, uint32 desired_access,
272                      LSA_SEC_QOS *qos)
273 {
274         DEBUG(5, ("init_open_pol: attr:%d da:%d\n", attributes, 
275                   desired_access));
276
277         r_q->ptr = 1; /* undocumented pointer */
278
279         if (qos == NULL)
280                 r_q->des_access = desired_access;
281
282         r_q->system_name = system_name;
283         init_lsa_obj_attr(&r_q->attr, attributes, qos);
284 }
285
286 /*******************************************************************
287  Reads or writes an LSA_Q_OPEN_POL structure.
288 ********************************************************************/
289
290 BOOL lsa_io_q_open_pol(char *desc, LSA_Q_OPEN_POL *r_q, prs_struct *ps, 
291                        int depth)
292 {
293         prs_debug(ps, depth, desc, "lsa_io_q_open_pol");
294         depth++;
295
296         if(!prs_uint32("ptr       ", ps, depth, &r_q->ptr))
297                 return False;
298         if(!prs_uint16("system_name", ps, depth, &r_q->system_name))
299                 return False;
300         if(!prs_align( ps ))
301                 return False;
302
303         if(!lsa_io_obj_attr("", &r_q->attr, ps, depth))
304                 return False;
305
306         if (r_q->attr.ptr_sec_qos == 0) {
307                 if(!prs_uint32("des_access", ps, depth, &r_q->des_access))
308                         return False;
309         }
310
311         return True;
312 }
313
314 /*******************************************************************
315  Reads or writes an LSA_R_OPEN_POL structure.
316 ********************************************************************/
317
318 BOOL lsa_io_r_open_pol(char *desc, LSA_R_OPEN_POL *r_p, prs_struct *ps, 
319                        int depth)
320 {
321         prs_debug(ps, depth, desc, "lsa_io_r_open_pol");
322         depth++;
323
324         if(!smb_io_pol_hnd("", &r_p->pol, ps, depth))
325                 return False;
326
327         if(!prs_ntstatus("status", ps, depth, &r_p->status))
328                 return False;
329
330         return True;
331 }
332
333 /*******************************************************************
334  Inits an LSA_Q_OPEN_POL2 structure.
335 ********************************************************************/
336
337 void init_q_open_pol2(LSA_Q_OPEN_POL2 *r_q, char *server_name,
338                         uint32 attributes, uint32 desired_access,
339                         LSA_SEC_QOS *qos)
340 {
341         DEBUG(5, ("init_q_open_pol2: attr:%d da:%d\n", attributes, 
342                   desired_access));
343
344         r_q->ptr = 1; /* undocumented pointer */
345
346         if (qos == NULL)
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(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 (r_q->attr.ptr_sec_qos == 0) {
374                 if(!prs_uint32("des_access", ps, depth, &r_q->des_access))
375                         return False;
376         }
377
378         return True;
379 }
380
381 /*******************************************************************
382  Reads or writes an LSA_R_OPEN_POL2 structure.
383 ********************************************************************/
384
385 BOOL lsa_io_r_open_pol2(char *desc, LSA_R_OPEN_POL2 *r_p, prs_struct *ps, 
386                         int depth)
387 {
388         prs_debug(ps, depth, desc, "lsa_io_r_open_pol2");
389         depth++;
390
391         if(!smb_io_pol_hnd("", &r_p->pol, ps, depth))
392                 return False;
393
394         if(!prs_ntstatus("status", ps, depth, &r_p->status))
395                 return False;
396
397         return True;
398 }
399
400 /*******************************************************************
401 makes an LSA_Q_QUERY_SEC_OBJ structure.
402 ********************************************************************/
403
404 void init_q_query_sec_obj(LSA_Q_QUERY_SEC_OBJ *q_q, const POLICY_HND *hnd, 
405                           uint32 sec_info)
406 {
407         DEBUG(5, ("init_q_query_sec_obj\n"));
408
409         q_q->pol = *hnd;
410         q_q->sec_info = sec_info;
411
412         return;
413 }
414
415 /*******************************************************************
416  Reads or writes an LSA_Q_QUERY_SEC_OBJ structure.
417 ********************************************************************/
418
419 BOOL lsa_io_q_query_sec_obj(char *desc, LSA_Q_QUERY_SEC_OBJ *q_q, 
420                             prs_struct *ps, int depth)
421 {
422         prs_debug(ps, depth, desc, "lsa_io_q_query_sec_obj");
423         depth++;
424
425         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
426                 return False;
427
428         if (!prs_uint32("sec_info", ps, depth, &q_q->sec_info))
429                 return False;
430
431         return True;
432
433
434 /*******************************************************************
435  Reads or writes a LSA_R_QUERY_SEC_OBJ structure.
436 ********************************************************************/
437
438 BOOL lsa_io_r_query_sec_obj(char *desc, LSA_R_QUERY_SEC_OBJ *r_u, 
439                             prs_struct *ps, int depth)
440 {
441         prs_debug(ps, depth, desc, "lsa_io_r_query_sec_obj");
442         depth++;
443
444         if (!prs_align(ps))
445                 return False;
446
447         if (!prs_uint32("ptr", ps, depth, &r_u->ptr))
448                 return False;
449
450         if (r_u->ptr != 0) {
451                 if (!sec_io_desc_buf("sec", &r_u->buf, ps, depth))
452                         return False;
453         }
454
455         if (!prs_ntstatus("status", ps, depth, &r_u->status))
456                 return False;
457
458         return True;
459 }
460
461 /*******************************************************************
462  Inits an LSA_Q_QUERY_INFO structure.
463 ********************************************************************/
464
465 void init_q_query(LSA_Q_QUERY_INFO *q_q, POLICY_HND *hnd, uint16 info_class)
466 {
467         DEBUG(5, ("init_q_query\n"));
468
469         memcpy(&q_q->pol, hnd, sizeof(q_q->pol));
470
471         q_q->info_class = info_class;
472 }
473
474 /*******************************************************************
475  Reads or writes an LSA_Q_QUERY_INFO structure.
476 ********************************************************************/
477
478 BOOL lsa_io_q_query(char *desc, LSA_Q_QUERY_INFO *q_q, prs_struct *ps, 
479                     int depth)
480 {
481         prs_debug(ps, depth, desc, "lsa_io_q_query");
482         depth++;
483
484         if(!smb_io_pol_hnd("", &q_q->pol, ps, depth))
485                 return False;
486
487         if(!prs_uint16("info_class", ps, depth, &q_q->info_class))
488                 return False;
489
490         return True;
491 }
492
493 /*******************************************************************
494 makes an LSA_Q_ENUM_TRUST_DOM structure.
495 ********************************************************************/
496 BOOL init_q_enum_trust_dom(LSA_Q_ENUM_TRUST_DOM * q_e, POLICY_HND *pol,
497                            uint32 enum_context, uint32 preferred_len)
498 {
499         DEBUG(5, ("init_q_enum_trust_dom\n"));
500
501         q_e->pol = *pol;
502         q_e->enum_context = enum_context;
503         q_e->preferred_len = preferred_len;
504
505         return True;
506 }
507
508 /*******************************************************************
509  Reads or writes an LSA_Q_ENUM_TRUST_DOM structure.
510 ********************************************************************/
511
512 BOOL lsa_io_q_enum_trust_dom(char *desc, LSA_Q_ENUM_TRUST_DOM *q_e, 
513                              prs_struct *ps, int depth)
514 {
515         prs_debug(ps, depth, desc, "lsa_io_q_enum_trust_dom");
516         depth++;
517
518         if(!smb_io_pol_hnd("", &q_e->pol, ps, depth))
519                 return False;
520
521         if(!prs_uint32("enum_context ", ps, depth, &q_e->enum_context))
522                 return False;
523         if(!prs_uint32("preferred_len", ps, depth, &q_e->preferred_len))
524                 return False;
525
526         return True;
527 }
528
529 /*******************************************************************
530  Inits an LSA_R_ENUM_TRUST_DOM structure.
531 ********************************************************************/
532
533 void init_r_enum_trust_dom(TALLOC_CTX *ctx, LSA_R_ENUM_TRUST_DOM *r_e, uint32 enum_context, 
534                            char *domain_name, DOM_SID *domain_sid,
535                            NTSTATUS status)
536 {
537         DEBUG(5, ("init_r_enum_trust_dom\n"));
538         
539         r_e->enum_context = enum_context;
540         
541         if (NT_STATUS_IS_OK(status)) {
542                 int len_domain_name = strlen(domain_name) + 1;
543                 
544                 r_e->num_domains  = 1;
545                 r_e->ptr_enum_domains = 1;
546                 r_e->num_domains2 = 1;
547                 
548                 if (!(r_e->hdr_domain_name = (UNIHDR2 *)talloc(ctx,sizeof(UNIHDR2))))
549                         return;
550
551                 if (!(r_e->uni_domain_name = (UNISTR2 *)talloc(ctx,sizeof(UNISTR2))))
552                         return;
553
554                 if (!(r_e->domain_sid = (DOM_SID2 *)talloc(ctx,sizeof(DOM_SID2))))
555                         return;
556
557                 init_uni_hdr2(&r_e->hdr_domain_name[0], len_domain_name);
558                 init_unistr2 (&r_e->uni_domain_name[0], domain_name, 
559                               len_domain_name);
560                 init_dom_sid2(&r_e->domain_sid[0], domain_sid);
561         } else {
562                 r_e->num_domains = 0;
563                 r_e->ptr_enum_domains = 0;
564         }
565         
566         r_e->status = status;
567 }
568
569 /*******************************************************************
570  Reads or writes an LSA_R_ENUM_TRUST_DOM structure.
571 ********************************************************************/
572
573 BOOL lsa_io_r_enum_trust_dom(char *desc, LSA_R_ENUM_TRUST_DOM *r_e, 
574                              prs_struct *ps, int depth)
575 {
576         prs_debug(ps, depth, desc, "lsa_io_r_enum_trust_dom");
577         depth++;
578
579         if(!prs_uint32("enum_context    ", ps, depth, &r_e->enum_context))
580                 return False;
581         if(!prs_uint32("num_domains     ", ps, depth, &r_e->num_domains))
582                 return False;
583         if(!prs_uint32("ptr_enum_domains", ps, depth, &r_e->ptr_enum_domains))
584                 return False;
585
586         if (r_e->ptr_enum_domains) {
587                 int i, num_domains;
588
589                 if(!prs_uint32("num_domains2", ps, depth, &r_e->num_domains2))
590                         return False;
591
592                 num_domains = r_e->num_domains2;
593
594                 if (UNMARSHALLING(ps)) {
595                         if (!(r_e->hdr_domain_name = (UNIHDR2 *)prs_alloc_mem(ps,sizeof(UNIHDR2) * num_domains)))
596                                 return False;
597
598                         if (!(r_e->uni_domain_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2) * num_domains)))
599                                 return False;
600
601                         if (!(r_e->domain_sid = (DOM_SID2 *)prs_alloc_mem(ps,sizeof(DOM_SID2) * num_domains)))
602                                 return False;
603                 }
604
605                 for (i = 0; i < num_domains; i++) {
606                         if(!smb_io_unihdr2 ("", &r_e->hdr_domain_name[i], ps, 
607                                             depth))
608                                 return False;
609                 }
610                 
611                 for (i = 0; i < num_domains; i++) {
612                         if(!smb_io_unistr2 ("", &r_e->uni_domain_name[i],
613                                             r_e->hdr_domain_name[i].buffer, 
614                                             ps, depth))
615                                 return False;
616                         if(!smb_io_dom_sid2("", &r_e->domain_sid[i], ps, 
617                                             depth))
618                                 return False;
619                 }
620         }
621
622         if(!prs_ntstatus("status", ps, depth, &r_e->status))
623                 return False;
624
625         return True;
626 }
627
628 /*******************************************************************
629 reads or writes a dom query structure.
630 ********************************************************************/
631
632 static BOOL lsa_io_dom_query(char *desc, DOM_QUERY *d_q, prs_struct *ps, int depth)
633 {
634         if (d_q == NULL)
635                 return False;
636
637         prs_debug(ps, depth, desc, "lsa_io_dom_query");
638         depth++;
639
640         if(!prs_align(ps))
641                 return False;
642
643         if(!prs_uint16("uni_dom_max_len", ps, depth, &d_q->uni_dom_max_len)) /* domain name string length * 2 */
644                 return False;
645         if(!prs_uint16("uni_dom_str_len", ps, depth, &d_q->uni_dom_str_len)) /* domain name string length * 2 */
646                 return False;
647
648         if(!prs_uint32("buffer_dom_name", ps, depth, &d_q->buffer_dom_name)) /* undocumented domain name string buffer pointer */
649                 return False;
650         if(!prs_uint32("buffer_dom_sid ", ps, depth, &d_q->buffer_dom_sid)) /* undocumented domain SID string buffer pointer */
651                 return False;
652
653         if(!smb_io_unistr2("unistr2", &d_q->uni_domain_name, d_q->buffer_dom_name, ps, depth)) /* domain name (unicode string) */
654                 return False;
655
656         if(!prs_align(ps))
657                 return False;
658
659         if (d_q->buffer_dom_sid != 0) {
660                 if(!smb_io_dom_sid2("", &d_q->dom_sid, ps, depth)) /* domain SID */
661                         return False;
662         } else {
663                 memset((char *)&d_q->dom_sid, '\0', sizeof(d_q->dom_sid));
664         }
665
666         return True;
667 }
668
669 /*******************************************************************
670 reads or writes a structure.
671 ********************************************************************/
672
673 static BOOL lsa_io_dom_query_2(char *desc, DOM_QUERY_2 *d_q, prs_struct *ps, int depth)
674 {
675         uint32 ptr = 1;
676
677         if (d_q == NULL)
678                 return False;
679
680         prs_debug(ps, depth, desc, "lsa_io_dom_query_2");
681         depth++;
682
683         if (!prs_align(ps))
684                 return False;
685
686         if (!prs_uint32("auditing_enabled", ps, depth, &d_q->auditing_enabled))
687                 return False;
688         if (!prs_uint32("ptr   ", ps, depth, &ptr))
689                 return False;
690         if (!prs_uint32("count1", ps, depth, &d_q->count1))
691                 return False;
692         if (!prs_uint32("count2", ps, depth, &d_q->count2))
693                 return False;
694
695         if (UNMARSHALLING(ps)) {
696                 d_q->auditsettings = (uint32 *)talloc_zero(ps->mem_ctx, d_q->count2 * sizeof(uint32));
697         }
698
699         if (d_q->auditsettings == NULL) {
700                 DEBUG(1, ("lsa_io_dom_query_2: NULL auditsettings!\n"));
701                 return False;
702         }
703
704         if (!prs_uint32s(False, "auditsettings", ps, depth, d_q->auditsettings, d_q->count2))
705                 return False;
706
707     return True;
708 }
709
710 /*******************************************************************
711  Reads or writes a dom query structure.
712 ********************************************************************/
713
714 static BOOL lsa_io_dom_query_3(char *desc, DOM_QUERY_3 *d_q, prs_struct *ps, int depth)
715 {
716         return lsa_io_dom_query("", d_q, ps, depth);
717 }
718
719 /*******************************************************************
720  Reads or writes a dom query structure.
721 ********************************************************************/
722
723 BOOL lsa_io_dom_query_5(char *desc, DOM_QUERY_5 *d_q, prs_struct *ps, int depth)
724 {
725         return lsa_io_dom_query("", d_q, ps, depth);
726 }
727
728 /*******************************************************************
729  Reads or writes a dom query structure.
730 ********************************************************************/
731
732 static BOOL lsa_io_dom_query_6(char *desc, DOM_QUERY_6 *d_q, prs_struct *ps, int depth)
733 {
734         if (d_q == NULL)
735                 return False;
736
737         prs_debug(ps, depth, desc, "lsa_io_dom_query_6");
738         depth++;
739
740         if (!prs_uint16("server_role", ps, depth, &d_q->server_role))
741                 return False;
742
743         return True;
744 }
745
746 /*******************************************************************
747  Reads or writes an LSA_R_QUERY_INFO structure.
748 ********************************************************************/
749
750 BOOL lsa_io_r_query(char *desc, LSA_R_QUERY_INFO *r_q, prs_struct *ps,
751                     int depth)
752 {
753         prs_debug(ps, depth, desc, "lsa_io_r_query");
754         depth++;
755
756         if(!prs_uint32("undoc_buffer", ps, depth, &r_q->undoc_buffer))
757                 return False;
758
759         if (r_q->undoc_buffer != 0) {
760                 if(!prs_uint16("info_class", ps, depth, &r_q->info_class))
761                         return False;
762
763                 if(!prs_align(ps))
764                         return False;
765
766                 switch (r_q->info_class) {
767                 case 2:
768                         if(!lsa_io_dom_query_2("", &r_q->dom.id2, ps, depth))
769                                 return False;
770                         break;
771                 case 3:
772                         if(!lsa_io_dom_query_3("", &r_q->dom.id3, ps, depth))
773                                 return False;
774                         break;
775                 case 5:
776                         if(!lsa_io_dom_query_5("", &r_q->dom.id5, ps, depth))
777                                 return False;
778                         break;
779                 case 6:
780                         if(!lsa_io_dom_query_6("", &r_q->dom.id6, ps, depth))
781                                 return False;
782                         break;
783                 default:
784                         /* PANIC! */
785                         break;
786                 }
787         }
788
789         if(!prs_align(ps))
790                 return False;
791
792         if(!prs_ntstatus("status", ps, depth, &r_q->status))
793                 return False;
794
795         return True;
796 }
797
798 /*******************************************************************
799  Inits a LSA_SID_ENUM structure.
800 ********************************************************************/
801
802 void init_lsa_sid_enum(TALLOC_CTX *mem_ctx, LSA_SID_ENUM *sen, 
803                        int num_entries, DOM_SID *sids)
804 {
805         int i;
806
807         DEBUG(5, ("init_lsa_sid_enum\n"));
808
809         sen->num_entries  = num_entries;
810         sen->ptr_sid_enum = (num_entries != 0);
811         sen->num_entries2 = num_entries;
812
813         /* Allocate memory for sids and sid pointers */
814
815         if (num_entries == 0) return;
816
817         if ((sen->ptr_sid = (uint32 *)talloc_zero(mem_ctx, num_entries * 
818                                              sizeof(uint32))) == NULL) {
819                 DEBUG(3, ("init_lsa_sid_enum(): out of memory for ptr_sid\n"));
820                 return;
821         }
822
823         if ((sen->sid = (DOM_SID2 *)talloc_zero(mem_ctx, num_entries * 
824                                            sizeof(DOM_SID2))) == NULL) {
825                 DEBUG(3, ("init_lsa_sid_enum(): out of memory for sids\n"));
826                 return;
827         }
828
829         /* Copy across SIDs and SID pointers */
830
831         for (i = 0; i < num_entries; i++) {
832                 sen->ptr_sid[i] = 1;
833                 init_dom_sid2(&sen->sid[i], &sids[i]);
834         }
835 }
836
837 /*******************************************************************
838  Reads or writes a LSA_SID_ENUM structure.
839 ********************************************************************/
840
841 static BOOL lsa_io_sid_enum(char *desc, LSA_SID_ENUM *sen, prs_struct *ps, 
842                             int depth)
843 {
844         int i;
845
846         prs_debug(ps, depth, desc, "lsa_io_sid_enum");
847         depth++;
848
849         if(!prs_align(ps))
850                 return False;
851         
852         if(!prs_uint32("num_entries ", ps, depth, &sen->num_entries))
853                 return False;
854         if(!prs_uint32("ptr_sid_enum", ps, depth, &sen->ptr_sid_enum))
855                 return False;
856         if(!prs_uint32("num_entries2", ps, depth, &sen->num_entries2))
857                 return False;
858
859         /* Mallocate memory if we're unpacking from the wire */
860
861         if (UNMARSHALLING(ps)) {
862                 if ((sen->ptr_sid = (uint32 *)prs_alloc_mem( ps,
863                         sen->num_entries * sizeof(uint32))) == NULL) {
864                         DEBUG(3, ("init_lsa_sid_enum(): out of memory for "
865                                   "ptr_sid\n"));
866                         return False;
867                 }
868
869                 if ((sen->sid = (DOM_SID2 *)prs_alloc_mem( ps,
870                         sen->num_entries * sizeof(DOM_SID2))) == NULL) {
871                         DEBUG(3, ("init_lsa_sid_enum(): out of memory for "
872                                   "sids\n"));
873                         return False;
874                 }
875         }
876
877         for (i = 0; i < sen->num_entries; i++) {        
878                 fstring temp;
879
880                 slprintf(temp, sizeof(temp) - 1, "ptr_sid[%d]", i);
881                 if(!prs_uint32(temp, ps, depth, &sen->ptr_sid[i])) {
882                         return False;
883                 }
884         }
885
886         for (i = 0; i < sen->num_entries; i++) {
887                 fstring temp;
888
889                 slprintf(temp, sizeof(temp) - 1, "sid[%d]", i);
890                 if(!smb_io_dom_sid2(temp, &sen->sid[i], ps, depth)) {
891                         return False;
892                 }
893         }
894
895         return True;
896 }
897
898 /*******************************************************************
899  Inits an LSA_R_ENUM_TRUST_DOM structure.
900 ********************************************************************/
901
902 void init_q_lookup_sids(TALLOC_CTX *mem_ctx, LSA_Q_LOOKUP_SIDS *q_l, 
903                         POLICY_HND *hnd, int num_sids, DOM_SID *sids,
904                         uint16 level)
905 {
906         DEBUG(5, ("init_r_enum_trust_dom\n"));
907
908         ZERO_STRUCTP(q_l);
909
910         memcpy(&q_l->pol, hnd, sizeof(q_l->pol));
911         init_lsa_sid_enum(mem_ctx, &q_l->sids, num_sids, sids);
912         
913         q_l->level.value = level;
914 }
915
916 /*******************************************************************
917  Reads or writes a LSA_Q_LOOKUP_SIDS structure.
918 ********************************************************************/
919
920 BOOL lsa_io_q_lookup_sids(char *desc, LSA_Q_LOOKUP_SIDS *q_s, prs_struct *ps,
921                           int depth)
922 {
923         prs_debug(ps, depth, desc, "lsa_io_q_lookup_sids");
924         depth++;
925
926         if(!prs_align(ps))
927                 return False;
928         
929         if(!smb_io_pol_hnd("pol_hnd", &q_s->pol, ps, depth)) /* policy handle */
930                 return False;
931         if(!lsa_io_sid_enum("sids   ", &q_s->sids, ps, depth)) /* sids to be looked up */
932                 return False;
933         if(!lsa_io_trans_names("names  ", &q_s->names, ps, depth)) /* translated names */
934                 return False;
935         if(!smb_io_lookup_level("switch ", &q_s->level, ps, depth)) /* lookup level */
936                 return False;
937
938         if(!prs_uint32("mapped_count", ps, depth, &q_s->mapped_count))
939                 return False;
940
941         return True;
942 }
943
944 /*******************************************************************
945  Reads or writes a structure.
946 ********************************************************************/
947
948 static BOOL lsa_io_trans_names(char *desc, LSA_TRANS_NAME_ENUM *trn,
949                 prs_struct *ps, int depth)
950 {
951         int i;
952
953         prs_debug(ps, depth, desc, "lsa_io_trans_names");
954         depth++;
955
956         if(!prs_align(ps))
957                 return False;
958    
959         if(!prs_uint32("num_entries    ", ps, depth, &trn->num_entries))
960                 return False;
961         if(!prs_uint32("ptr_trans_names", ps, depth, &trn->ptr_trans_names))
962                 return False;
963
964         if (trn->ptr_trans_names != 0) {
965                 if(!prs_uint32("num_entries2   ", ps, depth, 
966                                &trn->num_entries2))
967                         return False;
968
969                 if (UNMARSHALLING(ps)) {
970                         if ((trn->name = (LSA_TRANS_NAME *)
971                              prs_alloc_mem(ps, trn->num_entries * 
972                                     sizeof(LSA_TRANS_NAME))) == NULL) {
973                                 return False;
974                         }
975
976                         if ((trn->uni_name = (UNISTR2 *)
977                              prs_alloc_mem(ps, trn->num_entries *
978                                     sizeof(UNISTR2))) == NULL) {
979                                 return False;
980                         }
981                 }
982
983                 for (i = 0; i < trn->num_entries2; i++) {
984                         fstring t;
985                         slprintf(t, sizeof(t) - 1, "name[%d] ", i);
986
987                         if(!lsa_io_trans_name(t, &trn->name[i], ps, depth)) /* translated name */
988                                 return False;
989                 }
990
991                 for (i = 0; i < trn->num_entries2; i++) {
992                         fstring t;
993                         slprintf(t, sizeof(t) - 1, "name[%d] ", i);
994
995                         if(!smb_io_unistr2(t, &trn->uni_name[i], trn->name[i].hdr_name.buffer, ps, depth))
996                                 return False;
997                         if(!prs_align(ps))
998                                 return False;
999                 }
1000         }
1001
1002         return True;
1003 }
1004
1005 /*******************************************************************
1006  Reads or writes a structure.
1007 ********************************************************************/
1008
1009 BOOL lsa_io_r_lookup_sids(char *desc, LSA_R_LOOKUP_SIDS *r_s, 
1010                           prs_struct *ps, int depth)
1011 {
1012         prs_debug(ps, depth, desc, "lsa_io_r_lookup_sids");
1013         depth++;
1014
1015         if(!prs_align(ps))
1016                 return False;
1017         
1018         if(!prs_uint32("ptr_dom_ref", ps, depth, &r_s->ptr_dom_ref))
1019                 return False;
1020
1021         if (r_s->ptr_dom_ref != 0)
1022                 if(!lsa_io_dom_r_ref ("dom_ref", r_s->dom_ref, ps, depth)) /* domain reference info */
1023                         return False;
1024
1025         if(!lsa_io_trans_names("names  ", r_s->names, ps, depth)) /* translated names */
1026                 return False;
1027
1028         if(!prs_align(ps))
1029                 return False;
1030
1031         if(!prs_uint32("mapped_count", ps, depth, &r_s->mapped_count))
1032                 return False;
1033
1034         if(!prs_ntstatus("status      ", ps, depth, &r_s->status))
1035                 return False;
1036
1037         return True;
1038 }
1039
1040 /*******************************************************************
1041 makes a structure.
1042 ********************************************************************/
1043
1044 void init_q_lookup_names(TALLOC_CTX *mem_ctx, LSA_Q_LOOKUP_NAMES *q_l, 
1045                          POLICY_HND *hnd, int num_names, char **names)
1046 {
1047         int i;
1048
1049         DEBUG(5, ("init_q_lookup_names\n"));
1050
1051         ZERO_STRUCTP(q_l);
1052
1053         q_l->pol = *hnd;
1054         q_l->num_entries = num_names;
1055         q_l->num_entries2 = num_names;
1056         q_l->lookup_level = 1;
1057
1058         if ((q_l->uni_name = (UNISTR2 *)talloc_zero(
1059                 mem_ctx, num_names * sizeof(UNISTR2))) == NULL) {
1060                 DEBUG(3, ("init_q_lookup_names(): out of memory\n"));
1061                 return;
1062         }
1063
1064         if ((q_l->hdr_name = (UNIHDR *)talloc_zero(
1065                 mem_ctx, num_names * sizeof(UNIHDR))) == NULL) {
1066                 DEBUG(3, ("init_q_lookup_names(): out of memory\n"));
1067                 return;
1068         }
1069
1070         for (i = 0; i < num_names; i++) {
1071                 char* name = names[i];
1072                 int len = strlen(name);
1073
1074                 init_uni_hdr(&q_l->hdr_name[i], len);
1075                 init_unistr2(&q_l->uni_name[i], name, len);
1076         }
1077 }
1078
1079 /*******************************************************************
1080 reads or writes a structure.
1081 ********************************************************************/
1082
1083 BOOL lsa_io_q_lookup_names(char *desc, LSA_Q_LOOKUP_NAMES *q_r, 
1084                            prs_struct *ps, int depth)
1085 {
1086         int i;
1087
1088         prs_debug(ps, depth, desc, "lsa_io_q_lookup_names");
1089         depth++;
1090
1091         if(!prs_align(ps))
1092                 return False;
1093
1094         if(!smb_io_pol_hnd("", &q_r->pol, ps, depth)) /* policy handle */
1095                 return False;
1096
1097         if(!prs_align(ps))
1098                 return False;
1099         if(!prs_uint32("num_entries    ", ps, depth, &q_r->num_entries))
1100                 return False;
1101         if(!prs_uint32("num_entries2   ", ps, depth, &q_r->num_entries2))
1102                 return False;
1103
1104         if (UNMARSHALLING(ps)) {
1105                 if (q_r->num_entries) {
1106                         if ((q_r->hdr_name = (UNIHDR *)prs_alloc_mem(ps,
1107                                         q_r->num_entries * sizeof(UNIHDR))) == NULL)
1108                                 return False;
1109                         if ((q_r->uni_name = (UNISTR2 *)prs_alloc_mem(ps,
1110                                         q_r->num_entries * sizeof(UNISTR2))) == NULL)
1111                                 return False;
1112                 }
1113         }
1114
1115         for (i = 0; i < q_r->num_entries; i++) {
1116                 if(!prs_align(ps))
1117                         return False;
1118                 if(!smb_io_unihdr("hdr_name", &q_r->hdr_name[i], ps, depth)) /* pointer names */
1119                         return False;
1120         }
1121
1122         for (i = 0; i < q_r->num_entries; i++) {
1123                 if(!prs_align(ps))
1124                         return False;
1125                 if(!smb_io_unistr2("dom_name", &q_r->uni_name[i], q_r->hdr_name[i].buffer, ps, depth)) /* names to be looked up */
1126                         return False;
1127         }
1128
1129         if(!prs_align(ps))
1130                 return False;
1131         if(!prs_uint32("num_trans_entries ", ps, depth, &q_r->num_trans_entries))
1132                 return False;
1133         if(!prs_uint32("ptr_trans_sids ", ps, depth, &q_r->ptr_trans_sids))
1134                 return False;
1135         if(!prs_uint32("lookup_level   ", ps, depth, &q_r->lookup_level))
1136                 return False;
1137         if(!prs_uint32("mapped_count   ", ps, depth, &q_r->mapped_count))
1138                 return False;
1139
1140         return True;
1141 }
1142
1143 /*******************************************************************
1144 reads or writes a structure.
1145 ********************************************************************/
1146
1147 BOOL lsa_io_r_lookup_names(char *desc, LSA_R_LOOKUP_NAMES *r_r, 
1148                            prs_struct *ps, int depth)
1149 {
1150         int i;
1151
1152         prs_debug(ps, depth, desc, "lsa_io_r_lookup_names");
1153         depth++;
1154
1155         if(!prs_align(ps))
1156                 return False;
1157
1158         if(!prs_uint32("ptr_dom_ref", ps, depth, &r_r->ptr_dom_ref))
1159                 return False;
1160
1161         if (r_r->ptr_dom_ref != 0)
1162                 if(!lsa_io_dom_r_ref("", r_r->dom_ref, ps, depth))
1163                         return False;
1164
1165         if(!prs_uint32("num_entries", ps, depth, &r_r->num_entries))
1166                 return False;
1167         if(!prs_uint32("ptr_entries", ps, depth, &r_r->ptr_entries))
1168                 return False;
1169
1170         if (r_r->ptr_entries != 0) {
1171                 if(!prs_uint32("num_entries2", ps, depth, &r_r->num_entries2))
1172                         return False;
1173
1174                 if (r_r->num_entries2 != r_r->num_entries) {
1175                         /* RPC fault */
1176                         return False;
1177                 }
1178
1179                 if (UNMARSHALLING(ps)) {
1180                         if ((r_r->dom_rid = (DOM_RID2 *)prs_alloc_mem(ps, r_r->num_entries2 * sizeof(DOM_RID2)))
1181                             == NULL) {
1182                                 DEBUG(3, ("lsa_io_r_lookup_names(): out of memory\n"));
1183                                 return False;
1184                         }
1185                 }
1186
1187                 for (i = 0; i < r_r->num_entries2; i++)
1188                         if(!smb_io_dom_rid2("", &r_r->dom_rid[i], ps, depth)) /* domain RIDs being looked up */
1189                                 return False;
1190         }
1191
1192         if(!prs_uint32("mapped_count", ps, depth, &r_r->mapped_count))
1193                 return False;
1194
1195         if(!prs_ntstatus("status      ", ps, depth, &r_r->status))
1196                 return False;
1197
1198         return True;
1199 }
1200
1201
1202 /*******************************************************************
1203  Inits an LSA_Q_CLOSE structure.
1204 ********************************************************************/
1205
1206 void init_lsa_q_close(LSA_Q_CLOSE *q_c, POLICY_HND *hnd)
1207 {
1208         DEBUG(5, ("init_lsa_q_close\n"));
1209
1210         memcpy(&q_c->pol, hnd, sizeof(q_c->pol));
1211 }
1212
1213 /*******************************************************************
1214  Reads or writes an LSA_Q_CLOSE structure.
1215 ********************************************************************/
1216
1217 BOOL lsa_io_q_close(char *desc, LSA_Q_CLOSE *q_c, prs_struct *ps, int depth)
1218 {
1219         prs_debug(ps, depth, desc, "lsa_io_q_close");
1220         depth++;
1221
1222         if(!smb_io_pol_hnd("", &q_c->pol, ps, depth))
1223                 return False;
1224
1225         return True;
1226 }
1227
1228 /*******************************************************************
1229  Reads or writes an LSA_R_CLOSE structure.
1230 ********************************************************************/
1231
1232 BOOL lsa_io_r_close(char *desc,  LSA_R_CLOSE *r_c, prs_struct *ps, int depth)
1233 {
1234         prs_debug(ps, depth, desc, "lsa_io_r_close");
1235         depth++;
1236
1237         if(!smb_io_pol_hnd("", &r_c->pol, ps, depth))
1238                 return False;
1239
1240         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1241                 return False;
1242
1243         return True;
1244 }
1245
1246 /*******************************************************************
1247  Reads or writes an LSA_Q_OPEN_SECRET structure.
1248 ********************************************************************/
1249
1250 BOOL lsa_io_q_open_secret(char *desc, LSA_Q_OPEN_SECRET *q_c, prs_struct *ps, int depth)
1251 {
1252         prs_debug(ps, depth, desc, "lsa_io_q_open_secret");
1253         depth++;
1254
1255         /* Don't bother to read or write at present... */
1256         return True;
1257 }
1258
1259 /*******************************************************************
1260  Reads or writes an LSA_R_OPEN_SECRET structure.
1261 ********************************************************************/
1262
1263 BOOL lsa_io_r_open_secret(char *desc, LSA_R_OPEN_SECRET *r_c, prs_struct *ps, int depth)
1264 {
1265         prs_debug(ps, depth, desc, "lsa_io_r_open_secret");
1266         depth++;
1267
1268         if(!prs_align(ps))
1269                 return False;
1270    
1271         if(!prs_uint32("dummy1", ps, depth, &r_c->dummy1))
1272                 return False;
1273         if(!prs_uint32("dummy2", ps, depth, &r_c->dummy2))
1274                 return False;
1275         if(!prs_uint32("dummy3", ps, depth, &r_c->dummy3))
1276                 return False;
1277         if(!prs_uint32("dummy4", ps, depth, &r_c->dummy4))
1278                 return False;
1279         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1280                 return False;
1281
1282         return True;
1283 }
1284
1285 /*******************************************************************
1286 reads or writes a structure.
1287 ********************************************************************/
1288 BOOL lsa_io_q_enum_privs(char *desc, LSA_Q_ENUM_PRIVS *q_q, prs_struct *ps, int depth)
1289 {
1290         if (q_q == NULL)
1291                 return False;
1292
1293         prs_debug(ps, depth, desc, "lsa_io_q_enum_privs");
1294         depth++;
1295
1296         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
1297                 return False;
1298
1299         if(!prs_uint32("enum_context   ", ps, depth, &q_q->enum_context))
1300                 return False;
1301         if(!prs_uint32("pref_max_length", ps, depth, &q_q->pref_max_length))
1302                 return False;
1303
1304         return True;
1305 }
1306
1307 /*******************************************************************
1308 reads or writes a structure.
1309 ********************************************************************/
1310 static BOOL lsa_io_priv_entries(char *desc, LSA_PRIV_ENTRY *entries, uint32 count, prs_struct *ps, int depth)
1311 {
1312         uint32 i;
1313
1314         if (entries == NULL)
1315                 return False;
1316
1317         prs_debug(ps, depth, desc, "lsa_io_priv_entries");
1318         depth++;
1319
1320         if(!prs_align(ps))
1321                 return False;
1322
1323         for (i = 0; i < count; i++) {
1324                 if (!smb_io_unihdr("", &entries[i].hdr_name, ps, depth))
1325                         return False;
1326                 if(!prs_uint32("luid_low ", ps, depth, &entries[i].luid_low))
1327                         return False;
1328                 if(!prs_uint32("luid_high", ps, depth, &entries[i].luid_high))
1329                         return False;
1330         }
1331
1332         for (i = 0; i < count; i++)
1333                 if (!smb_io_unistr2("", &entries[i].name, entries[i].hdr_name.buffer, ps, depth))
1334                         return False;
1335
1336         return True;
1337 }
1338
1339 /*******************************************************************
1340  Inits an LSA_R_ENUM_PRIVS structure.
1341 ********************************************************************/
1342
1343 void init_lsa_r_enum_privs(LSA_R_ENUM_PRIVS *r_u, uint32 enum_context,
1344                           uint32 count, LSA_PRIV_ENTRY *entries)
1345 {
1346         DEBUG(5, ("init_lsa_r_enum_privs\n"));
1347
1348         r_u->enum_context=enum_context;
1349         r_u->count=count;
1350         
1351         if (entries!=NULL) {
1352                 r_u->ptr=1;
1353                 r_u->count1=count;
1354                 r_u->privs=entries;
1355         } else {
1356                 r_u->ptr=0;
1357                 r_u->count1=0;
1358                 r_u->privs=NULL;
1359         }               
1360 }
1361
1362 /*******************************************************************
1363 reads or writes a structure.
1364 ********************************************************************/
1365 BOOL lsa_io_r_enum_privs(char *desc, LSA_R_ENUM_PRIVS *r_q, prs_struct *ps, int depth)
1366 {
1367         if (r_q == NULL)
1368                 return False;
1369
1370         prs_debug(ps, depth, desc, "lsa_io_r_enum_privs");
1371         depth++;
1372
1373         if(!prs_align(ps))
1374                 return False;
1375
1376         if(!prs_uint32("enum_context", ps, depth, &r_q->enum_context))
1377                 return False;
1378         if(!prs_uint32("count", ps, depth, &r_q->count))
1379                 return False;
1380         if(!prs_uint32("ptr", ps, depth, &r_q->ptr))
1381                 return False;
1382
1383         if (r_q->ptr) {
1384                 if(!prs_uint32("count1", ps, depth, &r_q->count1))
1385                         return False;
1386
1387                 if (!lsa_io_priv_entries("", r_q->privs, r_q->count1, ps, depth))
1388                         return False;
1389         }
1390
1391         if(!prs_align(ps))
1392                 return False;
1393
1394         if(!prs_ntstatus("status", ps, depth, &r_q->status))
1395                 return False;
1396
1397         return True;
1398 }
1399
1400 /*******************************************************************
1401 reads or writes a structure.
1402 ********************************************************************/
1403 BOOL lsa_io_q_priv_get_dispname(char *desc, LSA_Q_PRIV_GET_DISPNAME *q_q, prs_struct *ps, int depth)
1404 {
1405         if (q_q == NULL)
1406                 return False;
1407
1408         prs_debug(ps, depth, desc, "lsa_io_q_priv_get_dispname");
1409         depth++;
1410
1411         if(!prs_align(ps))
1412                 return False;
1413
1414         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
1415                 return False;
1416
1417         if (!smb_io_unihdr("hdr_name", &q_q->hdr_name, ps, depth))
1418                 return False;
1419
1420         if (!smb_io_unistr2("name", &q_q->name, q_q->hdr_name.buffer, ps, depth))
1421                 return False;
1422
1423         if(!prs_uint16("lang_id    ", ps, depth, &q_q->lang_id))
1424                 return False;
1425         if(!prs_uint16("lang_id_sys", ps, depth, &q_q->lang_id_sys))
1426                 return False;
1427
1428         return True;
1429 }
1430
1431 /*******************************************************************
1432 reads or writes a structure.
1433 ********************************************************************/
1434 BOOL lsa_io_r_priv_get_dispname(char *desc, LSA_R_PRIV_GET_DISPNAME *r_q, prs_struct *ps, int depth)
1435 {
1436         if (r_q == NULL)
1437                 return False;
1438
1439         prs_debug(ps, depth, desc, "lsa_io_r_priv_get_dispname");
1440         depth++;
1441
1442         if (!prs_align(ps))
1443                 return False;
1444
1445         if (!prs_uint32("ptr_info", ps, depth, &r_q->ptr_info))
1446                 return False;
1447
1448         if (r_q->ptr_info){
1449                 if (!smb_io_unihdr("hdr_name", &r_q->hdr_desc, ps, depth))
1450                         return False;
1451
1452                 if (!smb_io_unistr2("desc", &r_q->desc, r_q->hdr_desc.buffer, ps, depth))
1453                         return False;
1454         }
1455 /*
1456         if(!prs_align(ps))
1457                 return False;
1458 */
1459         if(!prs_uint16("lang_id", ps, depth, &r_q->lang_id))
1460                 return False;
1461
1462         if(!prs_align(ps))
1463                 return False;
1464         if(!prs_ntstatus("status", ps, depth, &r_q->status))
1465                 return False;
1466
1467         return True;
1468 }
1469
1470 /*******************************************************************
1471 reads or writes a structure.
1472 ********************************************************************/
1473 BOOL lsa_io_q_enum_accounts(char *desc, LSA_Q_ENUM_ACCOUNTS *q_q, prs_struct *ps, int depth)
1474 {
1475         if (q_q == NULL)
1476                 return False;
1477
1478         prs_debug(ps, depth, desc, "lsa_io_q_enum_accounts");
1479         depth++;
1480
1481         if (!smb_io_pol_hnd("", &q_q->pol, ps, depth))
1482                 return False;
1483
1484         if(!prs_uint32("enum_context   ", ps, depth, &q_q->enum_context))
1485                 return False;
1486         if(!prs_uint32("pref_max_length", ps, depth, &q_q->pref_max_length))
1487                 return False;
1488
1489         return True;
1490 }
1491
1492 /*******************************************************************
1493  Inits an LSA_R_ENUM_PRIVS structure.
1494 ********************************************************************/
1495
1496 void init_lsa_r_enum_accounts(LSA_R_ENUM_ACCOUNTS *r_u, uint32 enum_context)
1497 {
1498         DEBUG(5, ("init_lsa_r_enum_accounts\n"));
1499
1500         r_u->enum_context=enum_context;
1501         if (r_u->enum_context!=0) {
1502                 r_u->sids.num_entries=enum_context;
1503                 r_u->sids.ptr_sid_enum=1;
1504                 r_u->sids.num_entries2=enum_context;
1505         } else {
1506                 r_u->sids.num_entries=0;
1507                 r_u->sids.ptr_sid_enum=0;
1508                 r_u->sids.num_entries2=0;
1509         }
1510 }
1511
1512 /*******************************************************************
1513 reads or writes a structure.
1514 ********************************************************************/
1515 BOOL lsa_io_r_enum_accounts(char *desc, LSA_R_ENUM_ACCOUNTS *r_q, prs_struct *ps, int depth)
1516 {
1517         if (r_q == NULL)
1518                 return False;
1519
1520         prs_debug(ps, depth, desc, "lsa_io_r_enum_accounts");
1521         depth++;
1522
1523         if (!prs_align(ps))
1524                 return False;
1525
1526         if(!prs_uint32("enum_context", ps, depth, &r_q->enum_context))
1527                 return False;
1528
1529         if (!lsa_io_sid_enum("sids", &r_q->sids, ps, depth))
1530                 return False;
1531
1532         if (!prs_align(ps))
1533                 return False;
1534
1535         if(!prs_ntstatus("status", ps, depth, &r_q->status))
1536                 return False;
1537
1538         return True;
1539 }
1540
1541
1542 /*******************************************************************
1543  Reads or writes an LSA_Q_UNK_GET_CONNUSER structure.
1544 ********************************************************************/
1545
1546 BOOL lsa_io_q_unk_get_connuser(char *desc, LSA_Q_UNK_GET_CONNUSER *q_c, prs_struct *ps, int depth)
1547 {
1548         prs_debug(ps, depth, desc, "lsa_io_q_unk_get_connuser");
1549         depth++;
1550
1551         if(!prs_align(ps))
1552                 return False;
1553    
1554         if(!prs_uint32("ptr_srvname", ps, depth, &q_c->ptr_srvname))
1555                 return False;
1556
1557         if(!smb_io_unistr2("uni2_srvname", &q_c->uni2_srvname, q_c->ptr_srvname, ps, depth)) /* server name to be looked up */
1558                 return False;
1559
1560         if(!prs_uint32("unk1", ps, depth, &q_c->unk1))
1561                 return False;
1562         if(!prs_uint32("unk2", ps, depth, &q_c->unk2))
1563                 return False;
1564         if(!prs_uint32("unk3", ps, depth, &q_c->unk3))
1565                 return False;
1566
1567         /* Don't bother to read or write at present... */
1568         return True;
1569 }
1570
1571 /*******************************************************************
1572  Reads or writes an LSA_R_UNK_GET_CONNUSER structure.
1573 ********************************************************************/
1574
1575 BOOL lsa_io_r_unk_get_connuser(char *desc, LSA_R_UNK_GET_CONNUSER *r_c, prs_struct *ps, int depth)
1576 {
1577         prs_debug(ps, depth, desc, "lsa_io_r_unk_get_connuser");
1578         depth++;
1579
1580         if(!prs_align(ps))
1581                 return False;
1582    
1583         if(!prs_uint32("ptr_user_name", ps, depth, &r_c->ptr_user_name))
1584                 return False;
1585         if(!smb_io_unihdr("hdr_user_name", &r_c->hdr_user_name, ps, depth))
1586                 return False;
1587         if(!smb_io_unistr2("uni2_user_name", &r_c->uni2_user_name, r_c->ptr_user_name, ps, depth))
1588                 return False;
1589
1590         if (!prs_align(ps))
1591           return False;
1592         
1593         if(!prs_uint32("unk1", ps, depth, &r_c->unk1))
1594                 return False;
1595
1596         if(!prs_uint32("ptr_dom_name", ps, depth, &r_c->ptr_dom_name))
1597                 return False;
1598         if(!smb_io_unihdr("hdr_dom_name", &r_c->hdr_dom_name, ps, depth))
1599                 return False;
1600         if(!smb_io_unistr2("uni2_dom_name", &r_c->uni2_dom_name, r_c->ptr_dom_name, ps, depth))
1601                 return False;
1602
1603         if (!prs_align(ps))
1604           return False;
1605         
1606         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1607                 return False;
1608
1609         return True;
1610 }
1611
1612 /*******************************************************************
1613  Reads or writes an LSA_Q_OPENACCOUNT structure.
1614 ********************************************************************/
1615
1616 BOOL lsa_io_q_open_account(char *desc, LSA_Q_OPENACCOUNT *r_c, prs_struct *ps, int depth)
1617 {
1618         prs_debug(ps, depth, desc, "lsa_io_q_open_account");
1619         depth++;
1620
1621         if(!prs_align(ps))
1622                 return False;
1623  
1624         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1625                 return False;
1626
1627         if(!smb_io_dom_sid2("", &r_c->sid, ps, depth)) /* domain SID */
1628                 return False;
1629
1630         if(!prs_uint32("access", ps, depth, &r_c->access))
1631                 return False;
1632   
1633         return True;
1634 }
1635
1636 /*******************************************************************
1637  Reads or writes an LSA_R_OPENACCOUNT structure.
1638 ********************************************************************/
1639
1640 BOOL lsa_io_r_open_account(char *desc, LSA_R_OPENACCOUNT  *r_c, prs_struct *ps, int depth)
1641 {
1642         prs_debug(ps, depth, desc, "lsa_io_r_open_account");
1643         depth++;
1644
1645         if(!prs_align(ps))
1646                 return False;
1647  
1648         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1649                 return False;
1650
1651         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1652                 return False;
1653
1654         return True;
1655 }
1656
1657
1658 /*******************************************************************
1659  Reads or writes an LSA_Q_ENUMPRIVSACCOUNT structure.
1660 ********************************************************************/
1661
1662 BOOL lsa_io_q_enum_privsaccount(char *desc, LSA_Q_ENUMPRIVSACCOUNT *r_c, prs_struct *ps, int depth)
1663 {
1664         prs_debug(ps, depth, desc, "lsa_io_q_enum_privsaccount");
1665         depth++;
1666
1667         if(!prs_align(ps))
1668                 return False;
1669  
1670         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1671                 return False;
1672
1673         return True;
1674 }
1675
1676 /*******************************************************************
1677  Reads or writes an LUID structure.
1678 ********************************************************************/
1679
1680 BOOL lsa_io_luid(char *desc, LUID *r_c, prs_struct *ps, int depth)
1681 {
1682         prs_debug(ps, depth, desc, "lsa_io_luid");
1683         depth++;
1684
1685         if(!prs_align(ps))
1686                 return False;
1687  
1688         if(!prs_uint32("low", ps, depth, &r_c->low))
1689                 return False;
1690
1691         if(!prs_uint32("high", ps, depth, &r_c->high))
1692                 return False;
1693
1694         return True;
1695 }
1696
1697 /*******************************************************************
1698  Reads or writes an LUID_ATTR structure.
1699 ********************************************************************/
1700
1701 BOOL lsa_io_luid_attr(char *desc, LUID_ATTR *r_c, prs_struct *ps, int depth)
1702 {
1703         prs_debug(ps, depth, desc, "lsa_io_luid_attr");
1704         depth++;
1705
1706         if(!prs_align(ps))
1707                 return False;
1708  
1709         if (!lsa_io_luid(desc, &r_c->luid, ps, depth))
1710                 return False;
1711
1712         if(!prs_uint32("attr", ps, depth, &r_c->attr))
1713                 return False;
1714
1715         return True;
1716 }
1717
1718 /*******************************************************************
1719  Reads or writes an PRIVILEGE_SET structure.
1720 ********************************************************************/
1721
1722 BOOL lsa_io_privilege_set(char *desc, PRIVILEGE_SET *r_c, prs_struct *ps, int depth)
1723 {
1724         uint32 i;
1725
1726         prs_debug(ps, depth, desc, "lsa_io_privilege_set");
1727         depth++;
1728
1729         if(!prs_align(ps))
1730                 return False;
1731  
1732         if(!prs_uint32("count", ps, depth, &r_c->count))
1733                 return False;
1734         if(!prs_uint32("control", ps, depth, &r_c->control))
1735                 return False;
1736
1737         for (i=0; i<r_c->count; i++) {
1738                 if (!lsa_io_luid_attr(desc, &r_c->set[i], ps, depth))
1739                         return False;
1740         }
1741         
1742         return True;
1743 }
1744
1745 void init_lsa_r_enum_privsaccount(LSA_R_ENUMPRIVSACCOUNT *r_u, LUID_ATTR *set, uint32 count, uint32 control)
1746 {
1747         r_u->ptr=1;
1748         r_u->count=count;
1749         r_u->set.set=set;
1750         r_u->set.count=count;
1751         r_u->set.control=control;
1752 }
1753
1754 /*******************************************************************
1755  Reads or writes an LSA_R_ENUMPRIVSACCOUNT structure.
1756 ********************************************************************/
1757
1758 BOOL lsa_io_r_enum_privsaccount(char *desc, LSA_R_ENUMPRIVSACCOUNT *r_c, prs_struct *ps, int depth)
1759 {
1760         prs_debug(ps, depth, desc, "lsa_io_r_enum_privsaccount");
1761         depth++;
1762
1763         if(!prs_align(ps))
1764                 return False;
1765  
1766         if(!prs_uint32("ptr", ps, depth, &r_c->ptr))
1767                 return False;
1768
1769         if (r_c->ptr!=0) {
1770                 if(!prs_uint32("count", ps, depth, &r_c->count))
1771                         return False;
1772
1773                 /* malloc memory if unmarshalling here */
1774                 
1775                 if(!lsa_io_privilege_set(desc, &r_c->set, ps, depth))
1776                         return False;
1777         }
1778
1779         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1780                 return False;
1781
1782         return True;
1783 }
1784
1785
1786
1787 /*******************************************************************
1788  Reads or writes an  LSA_Q_GETSYSTEMACCOUNTstructure.
1789 ********************************************************************/
1790
1791 BOOL lsa_io_q_getsystemaccount(char *desc, LSA_Q_GETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1792 {
1793         prs_debug(ps, depth, desc, "lsa_io_q_getsystemaccount");
1794         depth++;
1795
1796         if(!prs_align(ps))
1797                 return False;
1798  
1799         if(!smb_io_pol_hnd("pol", &r_c->pol, ps, depth))
1800                 return False;
1801
1802         return True;
1803 }
1804
1805 /*******************************************************************
1806  Reads or writes an  LSA_R_GETSYSTEMACCOUNTstructure.
1807 ********************************************************************/
1808
1809 BOOL lsa_io_r_getsystemaccount(char *desc, LSA_R_GETSYSTEMACCOUNT  *r_c, prs_struct *ps, int depth)
1810 {
1811         prs_debug(ps, depth, desc, "lsa_io_r_getsystemaccount");
1812         depth++;
1813
1814         if(!prs_align(ps))
1815                 return False;
1816  
1817         if(!prs_uint32("access", ps, depth, &r_c->access))
1818                 return False;
1819
1820         if(!prs_ntstatus("status", ps, depth, &r_c->status))
1821                 return False;
1822
1823         return True;
1824 }
1825
1826
1827
1828
1829