Coverage Report

Created: 2025-07-23 07:04

/src/samba/librpc/ndr/ndr_spoolss_buf.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
   Unix SMB/CIFS implementation.
3
4
   routines for marshalling/unmarshalling spoolss subcontext buffer structures
5
6
   Copyright (C) Andrew Tridgell 2003
7
   Copyright (C) Tim Potter 2003
8
   Copyright (C) Guenther Deschner 2009
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 3 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, see <http://www.gnu.org/licenses/>.
22
*/
23
24
25
#include "includes.h"
26
#include "librpc/gen_ndr/ndr_spoolss.h"
27
#include "librpc/gen_ndr/ndr_security.h"
28
29
58
#define NDR_SPOOLSS_PUSH_ENUM_IN(fn) do { \
30
58
  if (!r->in.buffer && r->in.offered != 0) {\
31
0
    return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
32
0
      "SPOOLSS Buffer: r->in.offered[%u] but there's no buffer",\
33
0
      (unsigned)r->in.offered);\
34
58
  } else if (r->in.buffer && r->in.buffer->length != r->in.offered) {\
35
0
    return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
36
0
      "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\
37
0
      (unsigned)r->in.offered, (unsigned)r->in.buffer->length);\
38
0
  }\
39
58
  _r.in.buffer  = r->in.buffer;\
40
58
  _r.in.offered = r->in.offered;\
41
58
  NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
42
58
} while(0)
43
44
45
#define NDR_SPOOLSS_PUSH_ENUM_IN_LEVEL(fn) do { \
45
45
  _r.in.level     = r->in.level;\
46
45
  NDR_SPOOLSS_PUSH_ENUM_IN(fn);\
47
45
} while(0)
48
49
274
#define NDR_SPOOLSS_PUSH_ENUM_OUT_LEVEL(fn) do { \
50
274
  DATA_BLOB _data_blob_info = data_blob_null;\
51
274
  struct ndr_push *_ndr_info = NULL;\
52
274
  _r.in.level = r->in.level;\
53
274
  _r.in.buffer  = r->in.buffer;\
54
274
  _r.in.offered = r->in.offered;\
55
274
  _r.out.info = NULL;\
56
274
  _r.out.needed = r->out.needed;\
57
274
  _r.out.count  = r->out.count;\
58
274
  _r.out.result = r->out.result;\
59
274
  if (r->out.info && *r->out.info && !r->in.buffer) {\
60
242
    return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
61
242
      "SPOOLSS Buffer: *r->out.info but there's no r->in.buffer");\
62
242
  }\
63
274
  if (r->in.buffer) {\
64
0
    _ndr_info = ndr_push_init_ctx(ndr);\
65
0
    NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
66
0
    _ndr_info->flags= ndr->flags;\
67
0
    if (r->out.info) {\
68
0
      struct ndr_push *_subndr_info;\
69
0
      struct __##fn __r;\
70
0
      __r.in.level  = r->in.level;\
71
0
      __r.in.count  = *r->out.count;\
72
0
      __r.out.info  = *r->out.info;\
73
0
      NDR_CHECK(ndr_push_subcontext_start(_ndr_info, &_subndr_info, 0, r->in.offered));\
74
0
      NDR_CHECK(ndr_push___##fn(_subndr_info, flags, &__r)); \
75
0
      NDR_CHECK(ndr_push_subcontext_end(_ndr_info, _subndr_info, 0, r->in.offered));\
76
0
    }\
77
0
    if (r->in.offered > _ndr_info->offset) {\
78
0
      uint32_t _padding_len = r->in.offered - _ndr_info->offset;\
79
0
      NDR_CHECK(ndr_push_zero(_ndr_info, _padding_len));\
80
0
    } else if (r->in.offered < _ndr_info->offset) {\
81
0
      return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
82
0
        "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of out buffer[%u]!",\
83
0
        (unsigned)r->in.offered, (unsigned)_ndr_info->offset);\
84
0
    }\
85
0
    _data_blob_info = ndr_push_blob(_ndr_info);\
86
0
    _r.out.info = &_data_blob_info;\
87
0
  }\
88
32
  NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
89
32
} while(0)
90
91
12
#define NDR_SPOOLSS_PUSH_ENUM_OUT(fn) do { \
92
12
  DATA_BLOB _data_blob_info = data_blob_null;\
93
12
  struct ndr_push *_ndr_info = NULL;\
94
12
  _r.in.buffer  = r->in.buffer;\
95
12
  _r.in.offered = r->in.offered;\
96
12
  _r.out.info = NULL;\
97
12
  _r.out.needed = r->out.needed;\
98
12
  _r.out.count  = r->out.count;\
99
12
  _r.out.result = r->out.result;\
100
12
  if (r->out.info && *r->out.info && !r->in.buffer) {\
101
11
    return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
102
11
      "SPOOLSS Buffer: *r->out.info but there's no r->in.buffer");\
103
11
  }\
104
12
  if (r->in.buffer) {\
105
0
    _ndr_info = ndr_push_init_ctx(ndr);\
106
0
    NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
107
0
    _ndr_info->flags= ndr->flags;\
108
0
    if (r->out.info) {\
109
0
      struct ndr_push *_subndr_info;\
110
0
      struct __##fn __r;\
111
0
      __r.in.count  = *r->out.count;\
112
0
      __r.out.info  = *r->out.info;\
113
0
      NDR_CHECK(ndr_push_subcontext_start(_ndr_info, &_subndr_info, 0, r->in.offered));\
114
0
      NDR_CHECK(ndr_push___##fn(_subndr_info, flags, &__r)); \
115
0
      NDR_CHECK(ndr_push_subcontext_end(_ndr_info, _subndr_info, 0, r->in.offered));\
116
0
    }\
117
0
    if (r->in.offered > _ndr_info->offset) {\
118
0
      uint32_t _padding_len = r->in.offered - _ndr_info->offset;\
119
0
      NDR_CHECK(ndr_push_zero(_ndr_info, _padding_len));\
120
0
    } else if (r->in.offered < _ndr_info->offset) {\
121
0
      return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
122
0
        "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of out buffer[%u]!",\
123
0
        (unsigned)r->in.offered, (unsigned)_ndr_info->offset);\
124
0
    }\
125
0
    _data_blob_info = ndr_push_blob(_ndr_info);\
126
0
    _r.out.info = &_data_blob_info;\
127
0
  }\
128
1
  NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
129
1
} while(0)
130
131
319
#define NDR_SPOOLSS_PUSH_ENUM_LEVEL(fn,in,out) do { \
132
319
  struct _##fn _r;\
133
319
  if (flags & NDR_IN) {\
134
45
    in;\
135
45
    NDR_SPOOLSS_PUSH_ENUM_IN_LEVEL(fn);\
136
45
  }\
137
319
  if (flags & NDR_OUT) {\
138
274
    out;\
139
274
    NDR_SPOOLSS_PUSH_ENUM_OUT_LEVEL(fn);\
140
274
  }\
141
319
} while(0)
142
143
25
#define NDR_SPOOLSS_PUSH_ENUM(fn,in,out) do { \
144
25
  struct _##fn _r;\
145
25
  if (flags & NDR_IN) {\
146
13
    in;\
147
13
    NDR_SPOOLSS_PUSH_ENUM_IN(fn);\
148
13
  }\
149
25
  if (flags & NDR_OUT) {\
150
12
    out;\
151
12
    NDR_SPOOLSS_PUSH_ENUM_OUT(fn);\
152
12
  }\
153
25
} while(0)
154
155
611
#define NDR_SPOOLSS_PULL_ENUM_IN_COMMON(fn) do { \
156
611
  ZERO_STRUCT(r->out);\
157
611
  r->in.buffer  = _r.in.buffer;\
158
611
  r->in.offered = _r.in.offered;\
159
611
  r->out.needed = _r.out.needed;\
160
611
  r->out.count  = _r.out.count;\
161
611
  if (!r->in.buffer && r->in.offered != 0) {\
162
304
    return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
163
304
      "SPOOLSS Buffer: r->in.offered[%u] but there's no buffer",\
164
304
      (unsigned)r->in.offered);\
165
307
  } else if (r->in.buffer && r->in.buffer->length != r->in.offered) {\
166
249
    return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
167
249
      "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\
168
249
      (unsigned)r->in.offered, (unsigned)r->in.buffer->length);\
169
249
  }\
170
611
  NDR_PULL_ALLOC(ndr, r->out.info);\
171
58
  ZERO_STRUCTP(r->out.info);\
172
58
} while(0)
173
174
264
#define NDR_SPOOLSS_PULL_ENUM_IN(fn) do { \
175
264
  NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
176
264
  NDR_SPOOLSS_PULL_ENUM_IN_COMMON(fn); \
177
85
} while(0)
178
179
1.47k
#define NDR_SPOOLSS_PULL_ENUM_IN_LEVEL(fn) do { \
180
1.47k
  NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
181
1.47k
  r->in.level = _r.in.level;\
182
526
  NDR_SPOOLSS_PULL_ENUM_IN_COMMON(fn); \
183
526
} while(0)
184
185
655
#define NDR_SPOOLSS_PULL_ENUM_OUT_LEVEL(fn) do { \
186
655
  _r.in.level = r->in.level;\
187
655
  _r.in.buffer  = r->in.buffer;\
188
655
  _r.in.offered = r->in.offered;\
189
655
  _r.out.needed = r->out.needed;\
190
655
  _r.out.count  = r->out.count;\
191
655
  NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
192
655
  if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {\
193
301
    NDR_PULL_ALLOC(ndr, r->out.info);\
194
301
  }\
195
301
  *r->out.info = NULL;\
196
301
  r->out.needed = _r.out.needed;\
197
301
  r->out.count  = _r.out.count;\
198
301
  r->out.result = _r.out.result;\
199
301
  if (_r.out.info) {\
200
269
    struct ndr_pull *_ndr_info;\
201
269
    NDR_PULL_ALLOC(ndr, *r->out.info);\
202
269
    _ndr_info = ndr_pull_init_blob(_r.out.info, *r->out.info);\
203
269
    NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
204
269
    _ndr_info->flags= ndr->flags;\
205
269
    if (r->in.offered != _ndr_info->data_size) {\
206
17
      return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
207
17
        "SPOOLSS Buffer: offered[%u] doesn't match length of buffer[%u]",\
208
17
        (unsigned)r->in.offered, (unsigned)_ndr_info->data_size);\
209
17
    }\
210
269
    if (*r->out.needed <= _ndr_info->data_size) {\
211
98
      struct __##fn __r;\
212
98
      __r.in.level  = r->in.level;\
213
98
      __r.in.count  = *r->out.count;\
214
98
      __r.out.info  = NULL;\
215
98
      NDR_CHECK(ndr_pull___##fn(_ndr_info, flags, &__r));\
216
98
      *r->out.info  = __r.out.info;\
217
88
    }\
218
252
  }\
219
301
} while(0)
220
221
56
#define NDR_SPOOLSS_PULL_ENUM_OUT(fn) do { \
222
56
  _r.in.buffer  = r->in.buffer;\
223
56
  _r.in.offered = r->in.offered;\
224
56
  _r.out.needed = r->out.needed;\
225
56
  _r.out.count  = r->out.count;\
226
56
  NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
227
56
  if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {\
228
16
    NDR_PULL_ALLOC(ndr, r->out.info);\
229
16
  }\
230
16
  *r->out.info = NULL;\
231
16
  r->out.needed = _r.out.needed;\
232
16
  r->out.count  = _r.out.count;\
233
16
  r->out.result = _r.out.result;\
234
16
  if (_r.out.info) {\
235
15
    struct ndr_pull *_ndr_info;\
236
15
    NDR_PULL_ALLOC(ndr, *r->out.info);\
237
15
    _ndr_info = ndr_pull_init_blob(_r.out.info, *r->out.info);\
238
15
    NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
239
15
    _ndr_info->flags= ndr->flags;\
240
15
    if (r->in.offered != _ndr_info->data_size) {\
241
1
      return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
242
1
        "SPOOLSS Buffer: offered[%u] doesn't match length of buffer[%u]",\
243
1
        (unsigned)r->in.offered, (unsigned)_ndr_info->data_size);\
244
1
    }\
245
15
    if (*r->out.needed <= _ndr_info->data_size) {\
246
4
      struct __##fn __r;\
247
4
      __r.in.count  = *r->out.count;\
248
4
      __r.out.info  = NULL;\
249
4
      NDR_CHECK(ndr_pull___##fn(_ndr_info, flags, &__r));\
250
4
      *r->out.info  = __r.out.info;\
251
1
    }\
252
14
  }\
253
16
} while(0)
254
255
2.13k
#define NDR_SPOOLSS_PULL_ENUM_LEVEL(fn,in,out) do { \
256
2.13k
  struct _##fn _r;\
257
2.13k
  if (flags & NDR_IN) {\
258
1.47k
    out;\
259
1.47k
    NDR_SPOOLSS_PULL_ENUM_IN_LEVEL(fn);\
260
1.47k
    in;\
261
45
  }\
262
2.13k
  if (flags & NDR_OUT) {\
263
655
    out;\
264
655
    NDR_SPOOLSS_PULL_ENUM_OUT_LEVEL(fn);\
265
655
  }\
266
700
} while(0)
267
268
320
#define NDR_SPOOLSS_PULL_ENUM(fn,in,out) do { \
269
320
  struct _##fn _r;\
270
320
  if (flags & NDR_IN) {\
271
264
    out;\
272
264
    NDR_SPOOLSS_PULL_ENUM_IN(fn);\
273
264
    in;\
274
13
  }\
275
320
  if (flags & NDR_OUT) {\
276
56
    out;\
277
56
    NDR_SPOOLSS_PULL_ENUM_OUT(fn);\
278
56
  }\
279
69
} while(0)
280
281
0
#define _NDR_CHECK_UINT32(call) do {\
282
0
  enum ndr_err_code _ndr_err; \
283
0
        _ndr_err = call; \
284
0
  if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \
285
0
    return 0; \
286
0
  }\
287
0
} while (0)
288
289
/* TODO: set _ndr_info->flags correct */
290
0
#define NDR_SPOOLSS_SIZE_ENUM_LEVEL(fn) do { \
291
0
  struct __##fn __r;\
292
0
  DATA_BLOB _data_blob_info;\
293
0
  struct ndr_push *_ndr_info = ndr_push_init_ctx(mem_ctx);\
294
0
  if (!_ndr_info) return 0;\
295
0
  _ndr_info->flags|=LIBNDR_FLAG_NO_NDR_SIZE;\
296
0
  __r.in.level  = level;\
297
0
  __r.in.count  = count;\
298
0
  __r.out.info  = info;\
299
0
  _NDR_CHECK_UINT32(ndr_push___##fn(_ndr_info, NDR_OUT, &__r)); \
300
0
  _data_blob_info = ndr_push_blob(_ndr_info);\
301
0
  return _data_blob_info.length;\
302
0
} while(0)
303
304
/* TODO: set _ndr_info->flags correct */
305
0
#define NDR_SPOOLSS_SIZE_ENUM(fn) do { \
306
0
  struct __##fn __r;\
307
0
  DATA_BLOB _data_blob_info;\
308
0
  struct ndr_push *_ndr_info = ndr_push_init_ctx(mem_ctx);\
309
0
  if (!_ndr_info) return 0;\
310
0
  _ndr_info->flags|=LIBNDR_FLAG_NO_NDR_SIZE;\
311
0
  __r.in.count  = count;\
312
0
  __r.out.info  = info;\
313
0
  _NDR_CHECK_UINT32(ndr_push___##fn(_ndr_info, NDR_OUT, &__r)); \
314
0
  _data_blob_info = ndr_push_blob(_ndr_info);\
315
0
  return _data_blob_info.length;\
316
0
} while(0)
317
318
319
/*
320
  spoolss_EnumPrinters
321
*/
322
enum ndr_err_code ndr_push_spoolss_EnumPrinters(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumPrinters *r)
323
53
{
324
53
  NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPrinters,{
325
53
    _r.in.flags = r->in.flags;
326
53
    _r.in.server  = r->in.server;
327
53
  },{
328
53
    _r.in.flags = r->in.flags;
329
53
    _r.in.server  = r->in.server;
330
53
  });
331
32
  return NDR_ERR_SUCCESS;
332
53
}
333
334
enum ndr_err_code ndr_pull_spoolss_EnumPrinters(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumPrinters *r)
335
228
{
336
228
  NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPrinters,{
337
228
    r->in.flags = _r.in.flags;
338
228
    r->in.server  = _r.in.server;
339
228
  },{
340
228
    _r.in.flags = r->in.flags;
341
228
    _r.in.server  = r->in.server;
342
228
  });
343
53
  return NDR_ERR_SUCCESS;
344
228
}
345
346
uint32_t ndr_size_spoolss_EnumPrinters_info(TALLOC_CTX *mem_ctx, uint32_t level, uint32_t count, union spoolss_PrinterInfo *info)
347
0
{
348
0
  NDR_SPOOLSS_SIZE_ENUM_LEVEL(spoolss_EnumPrinters);
349
0
}
350
351
/*
352
  spoolss_EnumJobs
353
*/
354
enum ndr_err_code ndr_push_spoolss_EnumJobs(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumJobs *r)
355
41
{
356
41
  NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumJobs,{
357
41
    _r.in.handle  = r->in.handle;
358
41
    _r.in.firstjob  = r->in.firstjob;
359
41
    _r.in.numjobs = r->in.numjobs;
360
41
  },{
361
41
    _r.in.handle  = r->in.handle;
362
41
    _r.in.firstjob  = r->in.firstjob;
363
41
    _r.in.numjobs = r->in.numjobs;
364
41
  });
365
8
  return NDR_ERR_SUCCESS;
366
41
}
367
368
enum ndr_err_code ndr_pull_spoolss_EnumJobs(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumJobs *r)
369
219
{
370
219
  NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumJobs,{
371
219
    r->in.handle  = _r.in.handle;
372
219
    r->in.firstjob  = _r.in.firstjob;
373
219
    r->in.numjobs = _r.in.numjobs;
374
219
  },{
375
219
    _r.in.handle  = r->in.handle;
376
219
    _r.in.firstjob  = r->in.firstjob;
377
219
    _r.in.numjobs = r->in.numjobs;
378
219
  });
379
41
  return NDR_ERR_SUCCESS;
380
219
}
381
382
uint32_t ndr_size_spoolss_EnumJobs_info(TALLOC_CTX *mem_ctx, uint32_t level, uint32_t count, union spoolss_JobInfo *info)
383
0
{
384
0
  NDR_SPOOLSS_SIZE_ENUM_LEVEL(spoolss_EnumJobs);
385
0
}
386
387
/*
388
  spoolss_EnumPrinterDrivers
389
*/
390
enum ndr_err_code ndr_push_spoolss_EnumPrinterDrivers(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumPrinterDrivers *r)
391
55
{
392
55
  NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPrinterDrivers,{
393
55
    _r.in.server    = r->in.server;
394
55
    _r.in.environment = r->in.environment;
395
55
  },{
396
55
    _r.in.server    = r->in.server;
397
55
    _r.in.environment = r->in.environment;
398
55
  });
399
6
  return NDR_ERR_SUCCESS;
400
55
}
401
402
enum ndr_err_code ndr_pull_spoolss_EnumPrinterDrivers(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumPrinterDrivers *r)
403
353
{
404
353
  NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPrinterDrivers,{
405
353
    r->in.server    = _r.in.server;
406
353
    r->in.environment = _r.in.environment;
407
353
  },{
408
353
    _r.in.server    = r->in.server;
409
353
    _r.in.environment = r->in.environment;
410
353
  });
411
55
  return NDR_ERR_SUCCESS;
412
353
}
413
414
uint32_t ndr_size_spoolss_EnumPrinterDrivers_info(TALLOC_CTX *mem_ctx, uint32_t level, uint32_t count, union spoolss_DriverInfo *info)
415
0
{
416
0
  NDR_SPOOLSS_SIZE_ENUM_LEVEL(spoolss_EnumPrinterDrivers);
417
0
}
418
419
/*
420
  spoolss_EnumForms
421
*/
422
enum ndr_err_code ndr_push_spoolss_EnumForms(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumForms *r)
423
40
{
424
40
  NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumForms,{
425
40
    _r.in.handle  = r->in.handle;
426
40
  },{
427
40
    _r.in.handle  = r->in.handle;
428
40
  });
429
3
  return NDR_ERR_SUCCESS;
430
40
}
431
432
enum ndr_err_code ndr_pull_spoolss_EnumForms(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumForms *r)
433
165
{
434
165
  NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumForms,{
435
165
    r->in.handle  = _r.in.handle;
436
165
  },{
437
165
    _r.in.handle  = r->in.handle;
438
165
  });
439
40
  return NDR_ERR_SUCCESS;
440
165
}
441
442
uint32_t ndr_size_spoolss_EnumForms_info(TALLOC_CTX *mem_ctx, uint32_t level, uint32_t count, union spoolss_FormInfo *info)
443
0
{
444
0
  NDR_SPOOLSS_SIZE_ENUM_LEVEL(spoolss_EnumForms);
445
0
}
446
447
/*
448
  spoolss_EnumPorts
449
*/
450
enum ndr_err_code ndr_push_spoolss_EnumPorts(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumPorts *r)
451
35
{
452
35
  NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPorts,{
453
35
    _r.in.servername= r->in.servername;
454
35
  },{
455
35
    _r.in.servername= r->in.servername;
456
35
  });
457
10
  return NDR_ERR_SUCCESS;
458
35
}
459
460
enum ndr_err_code ndr_pull_spoolss_EnumPorts(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumPorts *r)
461
280
{
462
280
  NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPorts,{
463
280
    r->in.servername= _r.in.servername;
464
280
  },{
465
280
    _r.in.servername= r->in.servername;
466
280
  });
467
35
  return NDR_ERR_SUCCESS;
468
280
}
469
470
uint32_t ndr_size_spoolss_EnumPorts_info(TALLOC_CTX *mem_ctx, uint32_t level, uint32_t count, union spoolss_PortInfo *info)
471
0
{
472
0
  NDR_SPOOLSS_SIZE_ENUM_LEVEL(spoolss_EnumPorts);
473
0
}
474
475
/*
476
  spoolss_EnumMonitors
477
*/
478
enum ndr_err_code ndr_push_spoolss_EnumMonitors(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumMonitors *r)
479
42
{
480
42
  NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumMonitors,{
481
42
    _r.in.servername= r->in.servername;
482
42
  },{
483
42
    _r.in.servername= r->in.servername;
484
42
  });
485
6
  return NDR_ERR_SUCCESS;
486
42
}
487
488
enum ndr_err_code ndr_pull_spoolss_EnumMonitors(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumMonitors *r)
489
242
{
490
242
  NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumMonitors,{
491
242
    r->in.servername= _r.in.servername;
492
242
  },{
493
242
    _r.in.servername= r->in.servername;
494
242
  });
495
42
  return NDR_ERR_SUCCESS;
496
242
}
497
498
uint32_t ndr_size_spoolss_EnumMonitors_info(TALLOC_CTX *mem_ctx, uint32_t level, uint32_t count, union spoolss_MonitorInfo *info)
499
0
{
500
0
  NDR_SPOOLSS_SIZE_ENUM_LEVEL(spoolss_EnumMonitors);
501
0
}
502
503
/*
504
  spoolss_EnumPrintProcessors
505
*/
506
enum ndr_err_code ndr_push_spoolss_EnumPrintProcessors(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumPrintProcessors *r)
507
35
{
508
35
  NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPrintProcessors,{
509
35
    _r.in.servername  = r->in.servername;
510
35
    _r.in.environment = r->in.environment;
511
35
  },{
512
35
    _r.in.servername  = r->in.servername;
513
35
    _r.in.environment = r->in.environment;
514
35
  });
515
7
  return NDR_ERR_SUCCESS;
516
35
}
517
518
enum ndr_err_code ndr_pull_spoolss_EnumPrintProcessors(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumPrintProcessors *r)
519
328
{
520
328
  NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPrintProcessors,{
521
328
    r->in.servername  = _r.in.servername;
522
328
    r->in.environment = _r.in.environment;
523
328
  },{
524
328
    _r.in.servername  = r->in.servername;
525
328
    _r.in.environment = r->in.environment;
526
328
  });
527
35
  return NDR_ERR_SUCCESS;
528
328
}
529
530
uint32_t ndr_size_spoolss_EnumPrintProcessors_info(TALLOC_CTX *mem_ctx,
531
               uint32_t level, uint32_t count, union spoolss_PrintProcessorInfo *info)
532
0
{
533
0
  NDR_SPOOLSS_SIZE_ENUM_LEVEL(spoolss_EnumPrintProcessors);
534
0
}
535
536
/*
537
  spoolss_EnumPrintProcessors
538
*/
539
enum ndr_err_code ndr_push_spoolss_EnumPrintProcessorDataTypes(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumPrintProcessorDataTypes *r)
540
18
{
541
18
  NDR_SPOOLSS_PUSH_ENUM_LEVEL(spoolss_EnumPrintProcessorDataTypes,{
542
18
    _r.in.servername    = r->in.servername;
543
18
    _r.in.print_processor_name  = r->in.print_processor_name;
544
18
  },{
545
18
    _r.in.servername    = r->in.servername;
546
18
    _r.in.print_processor_name  = r->in.print_processor_name;
547
18
  });
548
5
  return NDR_ERR_SUCCESS;
549
18
}
550
551
enum ndr_err_code ndr_pull_spoolss_EnumPrintProcessorDataTypes(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumPrintProcessorDataTypes *r)
552
318
{
553
318
  NDR_SPOOLSS_PULL_ENUM_LEVEL(spoolss_EnumPrintProcessorDataTypes,{
554
318
    r->in.servername    = _r.in.servername;
555
318
    r->in.print_processor_name  = _r.in.print_processor_name;
556
318
  },{
557
318
    _r.in.servername    = r->in.servername;
558
318
    _r.in.print_processor_name  = r->in.print_processor_name;
559
318
  });
560
18
  return NDR_ERR_SUCCESS;
561
318
}
562
563
uint32_t ndr_size_spoolss_EnumPrintProcessorDataTypes_info(TALLOC_CTX *mem_ctx,
564
                  uint32_t level, uint32_t count, union spoolss_PrintProcDataTypesInfo *info)
565
0
{
566
0
  NDR_SPOOLSS_SIZE_ENUM_LEVEL(spoolss_EnumPrintProcessorDataTypes);
567
0
}
568
569
/*
570
  spoolss_EnumPerMachineConnections
571
*/
572
enum ndr_err_code ndr_push_spoolss_EnumPerMachineConnections(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumPerMachineConnections *r)
573
25
{
574
25
  NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPerMachineConnections,{
575
25
    _r.in.server  = r->in.server;
576
25
  },{
577
25
    _r.in.server  = r->in.server;
578
25
  });
579
14
  return NDR_ERR_SUCCESS;
580
25
}
581
582
enum ndr_err_code ndr_pull_spoolss_EnumPerMachineConnections(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumPerMachineConnections *r)
583
320
{
584
320
  NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPerMachineConnections,{
585
320
    r->in.server  = _r.in.server;
586
320
  },{
587
320
    _r.in.server  = r->in.server;
588
320
  });
589
25
  return NDR_ERR_SUCCESS;
590
320
}
591
592
uint32_t ndr_size_spoolss_EnumPerMachineConnections_info(TALLOC_CTX *mem_ctx, uint32_t count, struct spoolss_PrinterInfo4 *info)
593
0
{
594
0
  NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPerMachineConnections);
595
0
}
596
597
/*
598
  spoolss_EnumPrinterDataEx
599
*/
600
601
enum ndr_err_code ndr_push_spoolss_EnumPrinterDataEx(struct ndr_push *ndr, ndr_flags_type flags, const struct spoolss_EnumPrinterDataEx *r)
602
7
{
603
7
  struct _spoolss_EnumPrinterDataEx _r;
604
7
  if (flags & NDR_IN) {
605
1
    _r.in.handle  = r->in.handle;
606
1
    _r.in.key_name  = r->in.key_name;
607
1
    _r.in.offered = r->in.offered;
608
1
    NDR_CHECK(ndr_push__spoolss_EnumPrinterDataEx(ndr, flags, &_r));
609
1
  }
610
7
  if (flags & NDR_OUT) {
611
6
    struct ndr_push *_ndr_info;
612
6
    _r.in.handle  = r->in.handle;
613
6
    _r.in.key_name  = r->in.key_name;
614
6
    _r.in.offered = r->in.offered;
615
6
    _r.out.count  = r->out.count;
616
6
    _r.out.needed = r->out.needed;
617
6
    _r.out.result = r->out.result;
618
6
    _r.out.info   = data_blob(NULL, 0);
619
6
    if (r->in.offered >= *r->out.needed) {
620
1
      struct ndr_push *_subndr_info;
621
1
      struct __spoolss_EnumPrinterDataEx __r;
622
1
      _ndr_info = ndr_push_init_ctx(ndr);
623
1
      NDR_ERR_HAVE_NO_MEMORY(_ndr_info);
624
1
      _ndr_info->flags= ndr->flags;
625
1
      __r.in.count  = *r->out.count;
626
1
      __r.out.info  = *r->out.info;
627
1
      NDR_CHECK(ndr_push_subcontext_start(_ndr_info, &_subndr_info, 0, r->in.offered));
628
1
      NDR_CHECK(ndr_push___spoolss_EnumPrinterDataEx(_subndr_info, flags, &__r));
629
1
      NDR_CHECK(ndr_push_subcontext_end(_ndr_info, _subndr_info, 0, r->in.offered));
630
1
      if (r->in.offered > _ndr_info->offset) {
631
0
        uint32_t _padding_len = r->in.offered - _ndr_info->offset;
632
0
        NDR_CHECK(ndr_push_zero(_ndr_info, _padding_len));
633
0
      }
634
1
      _r.out.info = ndr_push_blob(_ndr_info);
635
1
    }
636
6
    NDR_CHECK(ndr_push__spoolss_EnumPrinterDataEx(ndr, flags, &_r));
637
6
  }
638
7
  return NDR_ERR_SUCCESS;
639
7
}
640
641
enum ndr_err_code ndr_pull_spoolss_EnumPrinterDataEx(struct ndr_pull *ndr, ndr_flags_type flags, struct spoolss_EnumPrinterDataEx *r)
642
69
{
643
69
  struct _spoolss_EnumPrinterDataEx _r;
644
69
  if (flags & NDR_IN) {
645
9
    _r.in.handle  = r->in.handle;
646
9
    _r.in.key_name  = r->in.key_name;
647
9
    ZERO_STRUCT(r->out);
648
9
    NDR_CHECK(ndr_pull__spoolss_EnumPrinterDataEx(ndr, flags, &_r));
649
1
    r->in.handle  = _r.in.handle;
650
1
    r->in.key_name  = _r.in.key_name;
651
1
    r->in.offered = _r.in.offered;
652
1
    r->out.needed = _r.out.needed;
653
1
    r->out.count  = _r.out.count;
654
1
    NDR_PULL_ALLOC(ndr, r->out.info);
655
1
    ZERO_STRUCTP(r->out.info);
656
1
  }
657
61
  if (flags & NDR_OUT) {
658
60
    _r.in.handle  = r->in.handle;
659
60
    _r.in.key_name  = r->in.key_name;
660
60
    _r.in.offered = r->in.offered;
661
60
    _r.out.count  = r->out.count;
662
60
    _r.out.needed = r->out.needed;
663
60
    NDR_CHECK(ndr_pull__spoolss_EnumPrinterDataEx(ndr, flags, &_r));
664
10
    if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
665
10
      NDR_PULL_ALLOC(ndr, r->out.info);
666
10
    }
667
10
    *r->out.info  = NULL;
668
10
    r->out.needed = _r.out.needed;
669
10
    r->out.count  = _r.out.count;
670
10
    r->out.result = _r.out.result;
671
10
    if (_r.out.info.length) {
672
4
      struct ndr_pull *_ndr_info;
673
4
      NDR_PULL_ALLOC(ndr, *r->out.info);
674
4
      _ndr_info = ndr_pull_init_blob(&_r.out.info, *r->out.info);
675
4
      NDR_ERR_HAVE_NO_MEMORY(_ndr_info);
676
4
      _ndr_info->flags= ndr->flags;
677
4
      if (r->in.offered != _ndr_info->data_size) {
678
4
        return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,
679
4
          "SPOOLSS Buffer: offered[%u] doesn't match length of buffer[%u]",
680
4
          (unsigned)r->in.offered, (unsigned)_ndr_info->data_size);
681
4
      }
682
0
      if (*r->out.needed <= _ndr_info->data_size) {
683
0
        struct __spoolss_EnumPrinterDataEx __r;
684
0
        __r.in.count  = *r->out.count;
685
0
        __r.out.info  = NULL;
686
0
        NDR_CHECK(ndr_pull___spoolss_EnumPrinterDataEx(_ndr_info, flags, &__r));
687
0
        *r->out.info  = __r.out.info;
688
0
      }
689
0
    }
690
10
  }
691
7
  return NDR_ERR_SUCCESS;
692
61
}
693
694
uint32_t ndr_size_spoolss_EnumPrinterDataEx_info(TALLOC_CTX *mem_ctx,
695
             uint32_t count, struct spoolss_PrinterEnumValues *info)
696
0
{
697
0
  NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrinterDataEx);
698
0
}
699
700
uint32_t _ndr_size_spoolss_DeviceMode(struct spoolss_DeviceMode *devmode, libndr_flags flags)
701
1.59k
{
702
1.59k
  if (!devmode) return 0;
703
555
  return ndr_size_spoolss_DeviceMode(devmode, flags);
704
1.59k
}
705
706
_PUBLIC_ size_t ndr_size_spoolss_StringArray(const struct spoolss_StringArray *r, libndr_flags flags)
707
2.86k
{
708
2.86k
  if (!r) {
709
1.12k
    return 4;
710
1.12k
  }
711
712
1.73k
  return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_StringArray);
713
2.86k
}
714
715
/* hand marshall as pidl cannot (yet) generate a relative pointer to a fixed array of
716
 * structs */
717
718
_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo101(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct spoolss_DriverInfo101 *r)
719
217
{
720
217
  uint32_t cntr_file_info_1;
721
217
  if (ndr_flags & NDR_SCALARS) {
722
217
    NDR_CHECK(ndr_push_align(ndr, 8));
723
217
    NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
724
217
    {
725
217
      libndr_flags _flags_save_string = ndr->flags;
726
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
727
217
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
728
217
      ndr->flags = _flags_save_string;
729
217
    }
730
0
    {
731
217
      libndr_flags _flags_save_string = ndr->flags;
732
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
733
217
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->architecture));
734
217
      ndr->flags = _flags_save_string;
735
217
    }
736
217
    NDR_CHECK(ndr_push_relative_ptr1(ndr, r->file_info));
737
217
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->file_count));
738
217
    {
739
217
      libndr_flags _flags_save_string = ndr->flags;
740
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
741
217
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->monitor_name));
742
217
      ndr->flags = _flags_save_string;
743
217
    }
744
0
    {
745
217
      libndr_flags _flags_save_string = ndr->flags;
746
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
747
217
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->default_datatype));
748
217
      ndr->flags = _flags_save_string;
749
217
    }
750
0
    {
751
217
      libndr_flags _flags_save_string_array = ndr->flags;
752
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
753
217
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->previous_names));
754
217
      ndr->flags = _flags_save_string_array;
755
217
    }
756
217
    NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->driver_date));
757
217
    NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, r->driver_version));
758
217
    {
759
217
      libndr_flags _flags_save_string = ndr->flags;
760
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
761
217
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->manufacturer_name));
762
217
      ndr->flags = _flags_save_string;
763
217
    }
764
0
    {
765
217
      libndr_flags _flags_save_string = ndr->flags;
766
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
767
217
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->manufacturer_url));
768
217
      ndr->flags = _flags_save_string;
769
217
    }
770
0
    {
771
217
      libndr_flags _flags_save_string = ndr->flags;
772
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
773
217
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->hardware_id));
774
217
      ndr->flags = _flags_save_string;
775
217
    }
776
0
    {
777
217
      libndr_flags _flags_save_string = ndr->flags;
778
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
779
217
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->provider));
780
217
      ndr->flags = _flags_save_string;
781
217
    }
782
217
    NDR_CHECK(ndr_push_trailer_align(ndr, 8));
783
217
  }
784
217
  if (ndr_flags & NDR_BUFFERS) {
785
217
    {
786
217
      libndr_flags _flags_save_string = ndr->flags;
787
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
788
217
      if (r->driver_name) {
789
72
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->driver_name));
790
72
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
791
72
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
792
72
      }
793
217
      ndr->flags = _flags_save_string;
794
217
    }
795
0
    {
796
217
      libndr_flags _flags_save_string = ndr->flags;
797
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
798
217
      if (r->architecture) {
799
96
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->architecture));
800
96
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
801
96
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->architecture));
802
96
      }
803
217
      ndr->flags = _flags_save_string;
804
217
    }
805
217
    if (r->file_info) {
806
122
      NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->file_info));
807
#if 0
808
      NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->file_count));
809
#endif
810
4.17k
      for (cntr_file_info_1 = 0; cntr_file_info_1 < r->file_count; cntr_file_info_1++) {
811
4.05k
        NDR_CHECK(ndr_push_spoolss_DriverFileInfo(ndr, NDR_SCALARS, &r->file_info[cntr_file_info_1]));
812
4.05k
      }
813
4.17k
      for (cntr_file_info_1 = 0; cntr_file_info_1 < r->file_count; cntr_file_info_1++) {
814
4.05k
        NDR_CHECK(ndr_push_spoolss_DriverFileInfo(ndr, NDR_BUFFERS, &r->file_info[cntr_file_info_1]));
815
4.05k
      }
816
122
      NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->file_info));
817
122
    }
818
217
    {
819
217
      libndr_flags _flags_save_string = ndr->flags;
820
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
821
217
      if (r->monitor_name) {
822
74
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->monitor_name));
823
74
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
824
74
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->monitor_name));
825
74
      }
826
217
      ndr->flags = _flags_save_string;
827
217
    }
828
0
    {
829
217
      libndr_flags _flags_save_string = ndr->flags;
830
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
831
217
      if (r->default_datatype) {
832
66
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->default_datatype));
833
66
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->default_datatype));
834
66
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->default_datatype));
835
66
      }
836
217
      ndr->flags = _flags_save_string;
837
217
    }
838
0
    {
839
217
      libndr_flags _flags_save_string_array = ndr->flags;
840
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
841
217
      if (r->previous_names) {
842
69
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->previous_names));
843
69
        NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->previous_names));
844
69
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->previous_names));
845
69
      }
846
217
      ndr->flags = _flags_save_string_array;
847
217
    }
848
0
    {
849
217
      libndr_flags _flags_save_string = ndr->flags;
850
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
851
217
      if (r->manufacturer_name) {
852
61
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->manufacturer_name));
853
61
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_name));
854
61
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->manufacturer_name));
855
61
      }
856
217
      ndr->flags = _flags_save_string;
857
217
    }
858
0
    {
859
217
      libndr_flags _flags_save_string = ndr->flags;
860
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
861
217
      if (r->manufacturer_url) {
862
64
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->manufacturer_url));
863
64
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_url));
864
64
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->manufacturer_url));
865
64
      }
866
217
      ndr->flags = _flags_save_string;
867
217
    }
868
0
    {
869
217
      libndr_flags _flags_save_string = ndr->flags;
870
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
871
217
      if (r->hardware_id) {
872
70
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->hardware_id));
873
70
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->hardware_id));
874
70
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->hardware_id));
875
70
      }
876
217
      ndr->flags = _flags_save_string;
877
217
    }
878
0
    {
879
217
      libndr_flags _flags_save_string = ndr->flags;
880
217
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
881
217
      if (r->provider) {
882
72
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->provider));
883
72
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->provider));
884
72
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->provider));
885
72
      }
886
217
      ndr->flags = _flags_save_string;
887
217
    }
888
217
  }
889
217
  return NDR_ERR_SUCCESS;
890
217
}
891
892
_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo101(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct spoolss_DriverInfo101 *r)
893
540
{
894
540
  uint32_t _ptr_driver_name;
895
540
  TALLOC_CTX *_mem_save_driver_name_0;
896
540
  uint32_t _ptr_architecture;
897
540
  TALLOC_CTX *_mem_save_architecture_0;
898
540
  uint32_t _ptr_file_info;
899
540
  uint32_t cntr_file_info_1;
900
540
  TALLOC_CTX *_mem_save_file_info_0;
901
540
  TALLOC_CTX *_mem_save_file_info_1;
902
540
  uint32_t _ptr_monitor_name;
903
540
  TALLOC_CTX *_mem_save_monitor_name_0;
904
540
  uint32_t _ptr_default_datatype;
905
540
  TALLOC_CTX *_mem_save_default_datatype_0;
906
540
  uint32_t _ptr_previous_names;
907
540
  TALLOC_CTX *_mem_save_previous_names_0;
908
540
  uint32_t _ptr_manufacturer_name;
909
540
  TALLOC_CTX *_mem_save_manufacturer_name_0;
910
540
  uint32_t _ptr_manufacturer_url;
911
540
  TALLOC_CTX *_mem_save_manufacturer_url_0;
912
540
  uint32_t _ptr_hardware_id;
913
540
  TALLOC_CTX *_mem_save_hardware_id_0;
914
540
  uint32_t _ptr_provider;
915
540
  TALLOC_CTX *_mem_save_provider_0;
916
540
  if (ndr_flags & NDR_SCALARS) {
917
540
    NDR_CHECK(ndr_pull_align(ndr, 8));
918
540
    NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
919
539
    {
920
539
      libndr_flags _flags_save_string = ndr->flags;
921
539
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
922
539
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
923
538
      if (_ptr_driver_name) {
924
170
        NDR_PULL_ALLOC(ndr, r->driver_name);
925
170
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
926
368
      } else {
927
368
        r->driver_name = NULL;
928
368
      }
929
498
      ndr->flags = _flags_save_string;
930
498
    }
931
0
    {
932
498
      libndr_flags _flags_save_string = ndr->flags;
933
498
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
934
498
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
935
496
      if (_ptr_architecture) {
936
190
        NDR_PULL_ALLOC(ndr, r->architecture);
937
190
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->architecture, _ptr_architecture));
938
306
      } else {
939
306
        r->architecture = NULL;
940
306
      }
941
457
      ndr->flags = _flags_save_string;
942
457
    }
943
457
    NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_file_info));
944
455
    if (_ptr_file_info) {
945
246
      NDR_PULL_ALLOC(ndr, r->file_info);
946
246
      NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->file_info, _ptr_file_info));
947
246
    } else {
948
209
      r->file_info = NULL;
949
209
    }
950
416
    NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->file_count));
951
412
    {
952
412
      libndr_flags _flags_save_string = ndr->flags;
953
412
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
954
412
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
955
411
      if (_ptr_monitor_name) {
956
125
        NDR_PULL_ALLOC(ndr, r->monitor_name);
957
125
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->monitor_name, _ptr_monitor_name));
958
286
      } else {
959
286
        r->monitor_name = NULL;
960
286
      }
961
391
      ndr->flags = _flags_save_string;
962
391
    }
963
0
    {
964
391
      libndr_flags _flags_save_string = ndr->flags;
965
391
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
966
391
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
967
389
      if (_ptr_default_datatype) {
968
97
        NDR_PULL_ALLOC(ndr, r->default_datatype);
969
97
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->default_datatype, _ptr_default_datatype));
970
292
      } else {
971
292
        r->default_datatype = NULL;
972
292
      }
973
388
      ndr->flags = _flags_save_string;
974
388
    }
975
0
    {
976
388
      libndr_flags _flags_save_string_array = ndr->flags;
977
388
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
978
388
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
979
386
      if (_ptr_previous_names) {
980
142
        NDR_PULL_ALLOC(ndr, r->previous_names);
981
142
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->previous_names, _ptr_previous_names));
982
244
      } else {
983
244
        r->previous_names = NULL;
984
244
      }
985
343
      ndr->flags = _flags_save_string_array;
986
343
    }
987
343
    NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->driver_date));
988
341
    NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &r->driver_version));
989
340
    {
990
340
      libndr_flags _flags_save_string = ndr->flags;
991
340
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
992
340
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_name));
993
339
      if (_ptr_manufacturer_name) {
994
89
        NDR_PULL_ALLOC(ndr, r->manufacturer_name);
995
89
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->manufacturer_name, _ptr_manufacturer_name));
996
250
      } else {
997
250
        r->manufacturer_name = NULL;
998
250
      }
999
335
      ndr->flags = _flags_save_string;
1000
335
    }
1001
0
    {
1002
335
      libndr_flags _flags_save_string = ndr->flags;
1003
335
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1004
335
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_url));
1005
333
      if (_ptr_manufacturer_url) {
1006
89
        NDR_PULL_ALLOC(ndr, r->manufacturer_url);
1007
89
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->manufacturer_url, _ptr_manufacturer_url));
1008
244
      } else {
1009
244
        r->manufacturer_url = NULL;
1010
244
      }
1011
331
      ndr->flags = _flags_save_string;
1012
331
    }
1013
0
    {
1014
331
      libndr_flags _flags_save_string = ndr->flags;
1015
331
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1016
331
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_hardware_id));
1017
329
      if (_ptr_hardware_id) {
1018
93
        NDR_PULL_ALLOC(ndr, r->hardware_id);
1019
93
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->hardware_id, _ptr_hardware_id));
1020
236
      } else {
1021
236
        r->hardware_id = NULL;
1022
236
      }
1023
328
      ndr->flags = _flags_save_string;
1024
328
    }
1025
0
    {
1026
328
      libndr_flags _flags_save_string = ndr->flags;
1027
328
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1028
328
      NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_provider));
1029
327
      if (_ptr_provider) {
1030
133
        NDR_PULL_ALLOC(ndr, r->provider);
1031
133
        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->provider, _ptr_provider));
1032
194
      } else {
1033
194
        r->provider = NULL;
1034
194
      }
1035
286
      ndr->flags = _flags_save_string;
1036
286
    }
1037
286
    NDR_CHECK(ndr_pull_trailer_align(ndr, 8));
1038
286
  }
1039
286
  if (ndr_flags & NDR_BUFFERS) {
1040
286
    {
1041
286
      libndr_flags _flags_save_string = ndr->flags;
1042
286
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1043
286
      if (r->driver_name) {
1044
93
        uint32_t _relative_save_offset;
1045
93
        _relative_save_offset = ndr->offset;
1046
93
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
1047
93
        _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
1048
93
        NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
1049
93
        NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
1050
92
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
1051
92
        if (ndr->offset > ndr->relative_highest_offset) {
1052
92
          ndr->relative_highest_offset = ndr->offset;
1053
92
        }
1054
92
        ndr->offset = _relative_save_offset;
1055
92
      }
1056
285
      ndr->flags = _flags_save_string;
1057
285
    }
1058
0
    {
1059
285
      libndr_flags _flags_save_string = ndr->flags;
1060
285
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1061
285
      if (r->architecture) {
1062
127
        uint32_t _relative_save_offset;
1063
127
        _relative_save_offset = ndr->offset;
1064
127
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->architecture));
1065
127
        _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
1066
127
        NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
1067
127
        NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
1068
126
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
1069
126
        if (ndr->offset > ndr->relative_highest_offset) {
1070
95
          ndr->relative_highest_offset = ndr->offset;
1071
95
        }
1072
126
        ndr->offset = _relative_save_offset;
1073
126
      }
1074
284
      ndr->flags = _flags_save_string;
1075
284
    }
1076
284
    if (r->file_info) {
1077
183
      uint32_t _relative_save_offset;
1078
183
      _relative_save_offset = ndr->offset;
1079
183
      NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->file_info));
1080
183
      _mem_save_file_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
1081
183
      NDR_PULL_SET_MEM_CTX(ndr, r->file_info, 0);
1082
#if 0
1083
      NDR_CHECK(ndr_pull_array_size(ndr, &r->file_info));
1084
#else
1085
183
      NDR_CHECK(ndr_token_store(ndr, &ndr->array_size_list, &r->file_info, r->file_count));
1086
183
#endif
1087
183
      NDR_PULL_ALLOC_N(ndr, r->file_info, r->file_count);
1088
182
      _mem_save_file_info_1 = NDR_PULL_GET_MEM_CTX(ndr);
1089
182
      NDR_PULL_SET_MEM_CTX(ndr, r->file_info, 0);
1090
5.53k
      for (cntr_file_info_1 = 0; cntr_file_info_1 < r->file_count; cntr_file_info_1++) {
1091
5.40k
        NDR_CHECK(ndr_pull_spoolss_DriverFileInfo(ndr, NDR_SCALARS, &r->file_info[cntr_file_info_1]));
1092
5.40k
      }
1093
4.38k
      for (cntr_file_info_1 = 0; cntr_file_info_1 < r->file_count; cntr_file_info_1++) {
1094
4.25k
        NDR_CHECK(ndr_pull_spoolss_DriverFileInfo(ndr, NDR_BUFFERS, &r->file_info[cntr_file_info_1]));
1095
4.25k
      }
1096
127
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_file_info_1, 0);
1097
127
      NDR_PULL_SET_MEM_CTX(ndr, _mem_save_file_info_0, 0);
1098
127
      if (ndr->offset > ndr->relative_highest_offset) {
1099
78
        ndr->relative_highest_offset = ndr->offset;
1100
78
      }
1101
127
      ndr->offset = _relative_save_offset;
1102
127
    }
1103
228
    {
1104
228
      libndr_flags _flags_save_string = ndr->flags;
1105
228
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1106
228
      if (r->monitor_name) {
1107
80
        uint32_t _relative_save_offset;
1108
80
        _relative_save_offset = ndr->offset;
1109
80
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->monitor_name));
1110
80
        _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
1111
80
        NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
1112
80
        NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
1113
78
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
1114
78
        if (ndr->offset > ndr->relative_highest_offset) {
1115
20
          ndr->relative_highest_offset = ndr->offset;
1116
20
        }
1117
78
        ndr->offset = _relative_save_offset;
1118
78
      }
1119
226
      ndr->flags = _flags_save_string;
1120
226
    }
1121
0
    {
1122
226
      libndr_flags _flags_save_string = ndr->flags;
1123
226
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1124
226
      if (r->default_datatype) {
1125
70
        uint32_t _relative_save_offset;
1126
70
        _relative_save_offset = ndr->offset;
1127
70
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->default_datatype));
1128
70
        _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
1129
70
        NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
1130
70
        NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
1131
69
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
1132
69
        if (ndr->offset > ndr->relative_highest_offset) {
1133
9
          ndr->relative_highest_offset = ndr->offset;
1134
9
        }
1135
69
        ndr->offset = _relative_save_offset;
1136
69
      }
1137
225
      ndr->flags = _flags_save_string;
1138
225
    }
1139
0
    {
1140
225
      libndr_flags _flags_save_string_array = ndr->flags;
1141
225
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1142
225
      if (r->previous_names) {
1143
73
        uint32_t _relative_save_offset;
1144
73
        _relative_save_offset = ndr->offset;
1145
73
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->previous_names));
1146
73
        _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
1147
73
        NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
1148
73
        NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->previous_names));
1149
69
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
1150
69
        if (ndr->offset > ndr->relative_highest_offset) {
1151
43
          ndr->relative_highest_offset = ndr->offset;
1152
43
        }
1153
69
        ndr->offset = _relative_save_offset;
1154
69
      }
1155
221
      ndr->flags = _flags_save_string_array;
1156
221
    }
1157
0
    {
1158
221
      libndr_flags _flags_save_string = ndr->flags;
1159
221
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1160
221
      if (r->manufacturer_name) {
1161
63
        uint32_t _relative_save_offset;
1162
63
        _relative_save_offset = ndr->offset;
1163
63
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->manufacturer_name));
1164
63
        _mem_save_manufacturer_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
1165
63
        NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_name, 0);
1166
63
        NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_name));
1167
62
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_name_0, 0);
1168
62
        if (ndr->offset > ndr->relative_highest_offset) {
1169
6
          ndr->relative_highest_offset = ndr->offset;
1170
6
        }
1171
62
        ndr->offset = _relative_save_offset;
1172
62
      }
1173
220
      ndr->flags = _flags_save_string;
1174
220
    }
1175
0
    {
1176
220
      libndr_flags _flags_save_string = ndr->flags;
1177
220
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1178
220
      if (r->manufacturer_url) {
1179
65
        uint32_t _relative_save_offset;
1180
65
        _relative_save_offset = ndr->offset;
1181
65
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->manufacturer_url));
1182
65
        _mem_save_manufacturer_url_0 = NDR_PULL_GET_MEM_CTX(ndr);
1183
65
        NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_url, 0);
1184
65
        NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_url));
1185
64
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_url_0, 0);
1186
64
        if (ndr->offset > ndr->relative_highest_offset) {
1187
7
          ndr->relative_highest_offset = ndr->offset;
1188
7
        }
1189
64
        ndr->offset = _relative_save_offset;
1190
64
      }
1191
219
      ndr->flags = _flags_save_string;
1192
219
    }
1193
0
    {
1194
219
      libndr_flags _flags_save_string = ndr->flags;
1195
219
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1196
219
      if (r->hardware_id) {
1197
71
        uint32_t _relative_save_offset;
1198
71
        _relative_save_offset = ndr->offset;
1199
71
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->hardware_id));
1200
71
        _mem_save_hardware_id_0 = NDR_PULL_GET_MEM_CTX(ndr);
1201
71
        NDR_PULL_SET_MEM_CTX(ndr, r->hardware_id, 0);
1202
71
        NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->hardware_id));
1203
70
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_hardware_id_0, 0);
1204
70
        if (ndr->offset > ndr->relative_highest_offset) {
1205
14
          ndr->relative_highest_offset = ndr->offset;
1206
14
        }
1207
70
        ndr->offset = _relative_save_offset;
1208
70
      }
1209
218
      ndr->flags = _flags_save_string;
1210
218
    }
1211
0
    {
1212
218
      libndr_flags _flags_save_string = ndr->flags;
1213
218
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1214
218
      if (r->provider) {
1215
73
        uint32_t _relative_save_offset;
1216
73
        _relative_save_offset = ndr->offset;
1217
73
        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->provider));
1218
73
        _mem_save_provider_0 = NDR_PULL_GET_MEM_CTX(ndr);
1219
73
        NDR_PULL_SET_MEM_CTX(ndr, r->provider, 0);
1220
73
        NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->provider));
1221
72
        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_provider_0, 0);
1222
72
        if (ndr->offset > ndr->relative_highest_offset) {
1223
9
          ndr->relative_highest_offset = ndr->offset;
1224
9
        }
1225
72
        ndr->offset = _relative_save_offset;
1226
72
      }
1227
217
      ndr->flags = _flags_save_string;
1228
217
    }
1229
217
    if (r->file_info) {
1230
122
      NDR_CHECK(ndr_check_steal_array_size(ndr, (void*)&r->file_info, r->file_count));
1231
122
    }
1232
217
  }
1233
217
  return NDR_ERR_SUCCESS;
1234
286
}
1235
1236
void ndr_print_spoolss_Field(struct ndr_print *ndr, const char *name, const union spoolss_Field *r)
1237
636k
{
1238
636k
  int level;
1239
636k
  level = ndr_print_steal_switch_value(ndr, r);
1240
636k
  ndr_print_union(ndr, name, level, "spoolss_Field");
1241
636k
  switch (level) {
1242
149k
    case PRINTER_NOTIFY_TYPE:
1243
149k
      ndr_print_spoolss_PrintNotifyField(ndr, "field", r->field);
1244
149k
    break;
1245
1246
481k
    case JOB_NOTIFY_TYPE:
1247
481k
      ndr_print_spoolss_JobNotifyField(ndr, "field", r->field);
1248
481k
    break;
1249
1250
4.92k
    default:
1251
4.92k
      ndr_print_uint16(ndr, "field", r->field);
1252
4.92k
    break;
1253
1254
636k
  }
1255
636k
}
1256
1257
_PUBLIC_ size_t ndr_size_spoolss_PrinterData(const union spoolss_PrinterData *r, uint32_t level, libndr_flags flags)
1258
0
{
1259
0
  if (!r) {
1260
0
    return 0;
1261
0
  }
1262
0
  return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterData);
1263
0
}
1264
1265
void ndr_print_spoolss_security_descriptor(struct ndr_print *ndr, const char *name, const struct security_descriptor *r)
1266
481
{
1267
481
  ndr_print_security_descriptor(ndr, name, r);
1268
481
}
1269
1270
enum ndr_err_code ndr_pull_spoolss_security_descriptor(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct security_descriptor *r)
1271
999
{
1272
999
  libndr_flags _flags_save_STRUCT = ndr->flags;
1273
999
  ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NO_RELATIVE_REVERSE);
1274
999
  NDR_CHECK(ndr_pull_security_descriptor(ndr, ndr_flags, r));
1275
481
  ndr->flags = _flags_save_STRUCT;
1276
481
  return NDR_ERR_SUCCESS;
1277
999
}
1278
1279
enum ndr_err_code ndr_push_spoolss_security_descriptor(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct security_descriptor *r)
1280
481
{
1281
481
  {
1282
481
    libndr_flags _flags_save_STRUCT = ndr->flags;
1283
481
    ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN|LIBNDR_FLAG_NO_RELATIVE_REVERSE);
1284
481
    if (ndr_flags & NDR_SCALARS) {
1285
481
      NDR_CHECK(ndr_push_align(ndr, 5));
1286
481
      NDR_CHECK(ndr_push_security_descriptor_revision(ndr, NDR_SCALARS, r->revision));
1287
481
      NDR_CHECK(ndr_push_security_descriptor_type(ndr, NDR_SCALARS, r->type));
1288
481
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->owner_sid));
1289
481
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->group_sid));
1290
481
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->sacl));
1291
481
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->dacl));
1292
481
      NDR_CHECK(ndr_push_trailer_align(ndr, 5));
1293
481
    }
1294
481
    if (ndr_flags & NDR_BUFFERS) {
1295
481
      if (r->sacl) {
1296
428
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->sacl));
1297
428
        NDR_CHECK(ndr_push_security_acl(ndr, NDR_SCALARS|NDR_BUFFERS, r->sacl));
1298
428
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->sacl));
1299
428
      }
1300
481
      if (r->dacl) {
1301
421
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->dacl));
1302
421
        NDR_CHECK(ndr_push_security_acl(ndr, NDR_SCALARS|NDR_BUFFERS, r->dacl));
1303
421
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->dacl));
1304
421
      }
1305
481
      if (r->owner_sid) {
1306
287
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->owner_sid));
1307
287
        NDR_CHECK(ndr_push_dom_sid(ndr, NDR_SCALARS, r->owner_sid));
1308
287
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->owner_sid));
1309
287
      }
1310
481
      if (r->group_sid) {
1311
373
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->group_sid));
1312
373
        NDR_CHECK(ndr_push_dom_sid(ndr, NDR_SCALARS, r->group_sid));
1313
373
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->group_sid));
1314
373
      }
1315
481
    }
1316
481
    ndr->flags = _flags_save_STRUCT;
1317
481
  }
1318
0
  return NDR_ERR_SUCCESS;
1319
481
}
1320
1321
_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct spoolss_PrinterInfo2 *r)
1322
112
{
1323
112
  if (ndr_flags & NDR_SCALARS) {
1324
112
    NDR_CHECK(ndr_push_align(ndr, 5));
1325
112
    {
1326
112
      libndr_flags _flags_save_string = ndr->flags;
1327
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1328
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->servername));
1329
112
      ndr->flags = _flags_save_string;
1330
112
    }
1331
0
    {
1332
112
      libndr_flags _flags_save_string = ndr->flags;
1333
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1334
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->printername));
1335
112
      ndr->flags = _flags_save_string;
1336
112
    }
1337
0
    {
1338
112
      libndr_flags _flags_save_string = ndr->flags;
1339
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1340
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->sharename));
1341
112
      ndr->flags = _flags_save_string;
1342
112
    }
1343
0
    {
1344
112
      libndr_flags _flags_save_string = ndr->flags;
1345
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1346
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->portname));
1347
112
      ndr->flags = _flags_save_string;
1348
112
    }
1349
0
    {
1350
112
      libndr_flags _flags_save_string = ndr->flags;
1351
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1352
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->drivername));
1353
112
      ndr->flags = _flags_save_string;
1354
112
    }
1355
0
    {
1356
112
      libndr_flags _flags_save_string = ndr->flags;
1357
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1358
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->comment));
1359
112
      ndr->flags = _flags_save_string;
1360
112
    }
1361
0
    {
1362
112
      libndr_flags _flags_save_string = ndr->flags;
1363
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1364
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->location));
1365
112
      ndr->flags = _flags_save_string;
1366
112
    }
1367
0
    {
1368
112
      libndr_flags _flags_save_spoolss_DeviceMode = ndr->flags;
1369
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
1370
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->devmode));
1371
112
      ndr->flags = _flags_save_spoolss_DeviceMode;
1372
112
    }
1373
0
    {
1374
112
      libndr_flags _flags_save_string = ndr->flags;
1375
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1376
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->sepfile));
1377
112
      ndr->flags = _flags_save_string;
1378
112
    }
1379
0
    {
1380
112
      libndr_flags _flags_save_string = ndr->flags;
1381
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1382
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->printprocessor));
1383
112
      ndr->flags = _flags_save_string;
1384
112
    }
1385
0
    {
1386
112
      libndr_flags _flags_save_string = ndr->flags;
1387
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1388
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->datatype));
1389
112
      ndr->flags = _flags_save_string;
1390
112
    }
1391
0
    {
1392
112
      libndr_flags _flags_save_string = ndr->flags;
1393
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1394
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->parameters));
1395
112
      ndr->flags = _flags_save_string;
1396
112
    }
1397
0
    {
1398
112
      libndr_flags _flags_save_spoolss_security_descriptor = ndr->flags;
1399
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
1400
112
      NDR_CHECK(ndr_push_relative_ptr1(ndr, r->secdesc));
1401
112
      ndr->flags = _flags_save_spoolss_security_descriptor;
1402
112
    }
1403
112
    NDR_CHECK(ndr_push_spoolss_PrinterAttributes(ndr, NDR_SCALARS, r->attributes));
1404
112
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->priority));
1405
112
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->defaultpriority));
1406
112
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->starttime));
1407
112
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->untiltime));
1408
112
    NDR_CHECK(ndr_push_spoolss_PrinterStatus(ndr, NDR_SCALARS, r->status));
1409
112
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->cjobs));
1410
112
    NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->averageppm));
1411
112
    NDR_CHECK(ndr_push_trailer_align(ndr, 5));
1412
112
  }
1413
112
  if (ndr_flags & NDR_BUFFERS) {
1414
112
    {
1415
112
      libndr_flags _flags_save_string = ndr->flags;
1416
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1417
112
      if (r->servername) {
1418
76
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->servername));
1419
76
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->servername));
1420
76
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->servername));
1421
76
      }
1422
112
      ndr->flags = _flags_save_string;
1423
112
    }
1424
0
    {
1425
112
      libndr_flags _flags_save_string = ndr->flags;
1426
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1427
112
      if (r->printername) {
1428
54
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printername));
1429
54
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printername));
1430
54
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printername));
1431
54
      }
1432
112
      ndr->flags = _flags_save_string;
1433
112
    }
1434
0
    {
1435
112
      libndr_flags _flags_save_string = ndr->flags;
1436
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1437
112
      if (r->sharename) {
1438
44
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->sharename));
1439
44
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->sharename));
1440
44
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->sharename));
1441
44
      }
1442
112
      ndr->flags = _flags_save_string;
1443
112
    }
1444
0
    {
1445
112
      libndr_flags _flags_save_string = ndr->flags;
1446
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1447
112
      if (r->portname) {
1448
45
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->portname));
1449
45
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->portname));
1450
45
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->portname));
1451
45
      }
1452
112
      ndr->flags = _flags_save_string;
1453
112
    }
1454
0
    {
1455
112
      libndr_flags _flags_save_string = ndr->flags;
1456
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1457
112
      if (r->drivername) {
1458
43
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->drivername));
1459
43
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->drivername));
1460
43
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->drivername));
1461
43
      }
1462
112
      ndr->flags = _flags_save_string;
1463
112
    }
1464
0
    {
1465
112
      libndr_flags _flags_save_string = ndr->flags;
1466
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1467
112
      if (r->comment) {
1468
35
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->comment));
1469
35
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->comment));
1470
35
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->comment));
1471
35
      }
1472
112
      ndr->flags = _flags_save_string;
1473
112
    }
1474
0
    {
1475
112
      libndr_flags _flags_save_string = ndr->flags;
1476
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1477
112
      if (r->location) {
1478
45
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->location));
1479
45
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->location));
1480
45
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->location));
1481
45
      }
1482
112
      ndr->flags = _flags_save_string;
1483
112
    }
1484
0
    {
1485
112
      libndr_flags _flags_save_string = ndr->flags;
1486
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1487
112
      if (r->sepfile) {
1488
29
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->sepfile));
1489
29
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->sepfile));
1490
29
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->sepfile));
1491
29
      }
1492
112
      ndr->flags = _flags_save_string;
1493
112
    }
1494
0
    {
1495
112
      libndr_flags _flags_save_string = ndr->flags;
1496
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1497
112
      if (r->printprocessor) {
1498
48
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printprocessor));
1499
48
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printprocessor));
1500
48
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printprocessor));
1501
48
      }
1502
112
      ndr->flags = _flags_save_string;
1503
112
    }
1504
0
    {
1505
112
      libndr_flags _flags_save_string = ndr->flags;
1506
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1507
112
      if (r->datatype) {
1508
42
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->datatype));
1509
42
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->datatype));
1510
42
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->datatype));
1511
42
      }
1512
112
      ndr->flags = _flags_save_string;
1513
112
    }
1514
0
    {
1515
112
      libndr_flags _flags_save_string = ndr->flags;
1516
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1517
112
      if (r->parameters) {
1518
37
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->parameters));
1519
37
        NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->parameters));
1520
37
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->parameters));
1521
37
      }
1522
112
      ndr->flags = _flags_save_string;
1523
112
    }
1524
0
    {
1525
112
      libndr_flags _flags_save_spoolss_DeviceMode = ndr->flags;
1526
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
1527
112
      if (r->devmode) {
1528
29
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->devmode));
1529
29
        {
1530
29
          struct ndr_push *_ndr_devmode;
1531
29
          NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_devmode, 0, -1));
1532
29
          NDR_CHECK(ndr_push_spoolss_DeviceMode(_ndr_devmode, NDR_SCALARS, r->devmode));
1533
29
          NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_devmode, 0, -1));
1534
29
        }
1535
29
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->devmode));
1536
29
      }
1537
112
      ndr->flags = _flags_save_spoolss_DeviceMode;
1538
112
    }
1539
0
    {
1540
112
      libndr_flags _flags_save_spoolss_security_descriptor = ndr->flags;
1541
112
      ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
1542
112
      if (r->secdesc) {
1543
22
        NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->secdesc));
1544
22
        {
1545
22
          struct ndr_push *_ndr_secdesc;
1546
22
          NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_secdesc, 0, -1));
1547
22
          NDR_CHECK(ndr_push_spoolss_security_descriptor(_ndr_secdesc, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
1548
22
          NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_secdesc, 0, -1));
1549
22
        }
1550
22
        NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->secdesc));
1551
22
      }
1552
112
      ndr->flags = _flags_save_spoolss_security_descriptor;
1553
112
    }
1554
112
  }
1555
112
  return NDR_ERR_SUCCESS;
1556
112
}
1557
1558
_PUBLIC_ void ndr_print_spoolss_Time(struct ndr_print *ndr, const char *name, const struct spoolss_Time *r)
1559
6.64k
{
1560
6.64k
  struct tm tm;
1561
6.64k
  time_t t;
1562
6.64k
  char *str;
1563
1564
6.64k
  tm.tm_sec = r->second;
1565
6.64k
  tm.tm_min = r->minute;
1566
6.64k
  tm.tm_hour  = r->hour;
1567
6.64k
  tm.tm_mday  = r->day;
1568
6.64k
  tm.tm_mon = r->month - 1;
1569
6.64k
  tm.tm_year  = r->year - 1900;
1570
6.64k
  tm.tm_wday  = r->day_of_week;
1571
6.64k
  tm.tm_yday  = 0;
1572
6.64k
  tm.tm_isdst = -1;
1573
1574
6.64k
  t = mktime(&tm);
1575
1576
6.64k
  str = timestring(ndr, t);
1577
1578
6.64k
  ndr_print_struct(ndr, name, "spoolss_Time");
1579
6.64k
  ndr->depth++;
1580
6.64k
  ndr_print_string(ndr, "", str);
1581
6.64k
  ndr->depth--;
1582
6.64k
  TALLOC_FREE(str);
1583
6.64k
}
1584
1585
_PUBLIC_ libndr_flags ndr_spoolss_PrinterEnumValues_align(enum winreg_Type type)
1586
614
{
1587
614
  switch(type) {
1588
44
  case REG_NONE:
1589
44
    return 0;
1590
0
  case REG_SZ:
1591
0
    return LIBNDR_FLAG_ALIGN2;
1592
7
  case REG_EXPAND_SZ:
1593
7
    return LIBNDR_FLAG_ALIGN2;
1594
0
  case REG_BINARY:
1595
0
    return 0;
1596
6
  case REG_DWORD:
1597
6
    return LIBNDR_FLAG_ALIGN4;
1598
5
  case REG_DWORD_BIG_ENDIAN:
1599
5
    return LIBNDR_FLAG_ALIGN4;
1600
0
  case REG_LINK:
1601
0
    return 0;
1602
1
  case REG_MULTI_SZ:
1603
1
    return LIBNDR_FLAG_ALIGN2;
1604
0
  case REG_RESOURCE_LIST:
1605
0
    return LIBNDR_FLAG_ALIGN2;
1606
8
  case REG_FULL_RESOURCE_DESCRIPTOR:
1607
8
    return LIBNDR_FLAG_ALIGN4;
1608
21
  case REG_RESOURCE_REQUIREMENTS_LIST:
1609
21
    return LIBNDR_FLAG_ALIGN2;
1610
20
  case REG_QWORD:
1611
20
    return LIBNDR_FLAG_ALIGN8;
1612
614
  }
1613
1614
502
  return 0;
1615
614
}