2 Unix SMB/CIFS implementation.
4 routines for marshalling/unmarshalling spoolss subcontext buffer structures
6 Copyright (C) Andrew Tridgell 2003
7 Copyright (C) Tim Potter 2003
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 3 of the License, or
12 (at your option) any later version.
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.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "librpc/gen_ndr/ndr_spoolss.h"
26 #if (_SAMBA_BUILD_ >= 4)
27 #include "param/param.h"
30 #define NDR_SPOOLSS_PUSH_ENUM_IN(fn) do { \
31 if (!r->in.buffer && r->in.offered != 0) {\
32 return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
33 "SPOOLSS Buffer: r->in.offered[%u] but there's no buffer",\
34 (unsigned)r->in.offered);\
35 } else if (r->in.buffer && r->in.buffer->length != r->in.offered) {\
36 return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
37 "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\
38 (unsigned)r->in.offered, (unsigned)r->in.buffer->length);\
40 _r.in.level = r->in.level;\
41 _r.in.buffer = r->in.buffer;\
42 _r.in.offered = r->in.offered;\
43 NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
46 #define NDR_SPOOLSS_PUSH_ENUM_OUT(fn) do { \
47 struct ndr_push *_ndr_info;\
48 _r.in.level = r->in.level;\
49 _r.in.buffer = r->in.buffer;\
50 _r.in.offered = r->in.offered;\
52 _r.out.needed = r->out.needed;\
53 _r.out.count = r->out.count;\
54 _r.out.result = r->out.result;\
55 if (r->out.info && !r->in.buffer) {\
56 return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
57 "SPOOLSS Buffer: r->out.info but there's no r->in.buffer");\
60 DATA_BLOB _data_blob_info;\
61 _ndr_info = ndr_push_init_ctx(ndr, ndr->iconv_convenience);\
62 NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
63 _ndr_info->flags= ndr->flags;\
66 __r.in.level = r->in.level;\
67 __r.in.count = *r->out.count;\
68 __r.out.info = r->out.info;\
69 NDR_CHECK(ndr_push___##fn(_ndr_info, flags, &__r)); \
71 if (r->in.offered > _ndr_info->offset) {\
72 uint32_t _padding_len = r->in.offered - _ndr_info->offset;\
73 NDR_CHECK(ndr_push_zero(_ndr_info, _padding_len));\
74 } else if (r->in.offered < _ndr_info->offset) {\
75 return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
76 "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of out buffer[%u]!",\
77 (unsigned)r->in.offered, (unsigned)_ndr_info->offset);\
79 _data_blob_info = ndr_push_blob(_ndr_info);\
80 _r.out.info = &_data_blob_info;\
82 NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
85 #define NDR_SPOOLSS_PUSH_ENUM(fn,in,out) do { \
87 if (flags & NDR_IN) {\
89 NDR_SPOOLSS_PUSH_ENUM_IN(fn);\
91 if (flags & NDR_OUT) {\
93 NDR_SPOOLSS_PUSH_ENUM_OUT(fn);\
97 #define NDR_SPOOLSS_PULL_ENUM_IN(fn) do { \
99 NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
100 r->in.level = _r.in.level;\
101 r->in.buffer = _r.in.buffer;\
102 r->in.offered = _r.in.offered;\
103 r->out.needed = _r.out.needed;\
104 r->out.count = _r.out.count;\
105 if (!r->in.buffer && r->in.offered != 0) {\
106 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
107 "SPOOLSS Buffer: r->in.offered[%u] but there's no buffer",\
108 (unsigned)r->in.offered);\
109 } else if (r->in.buffer && r->in.buffer->length != r->in.offered) {\
110 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
111 "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\
112 (unsigned)r->in.offered, (unsigned)r->in.buffer->length);\
116 #define NDR_SPOOLSS_PULL_ENUM_OUT(fn) do { \
117 _r.in.level = r->in.level;\
118 _r.in.buffer = r->in.buffer;\
119 _r.in.offered = r->in.offered;\
120 _r.out.needed = r->out.needed;\
121 _r.out.count = r->out.count;\
122 NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
124 r->out.needed = _r.out.needed;\
125 r->out.count = _r.out.count;\
126 r->out.result = _r.out.result;\
128 struct ndr_pull *_ndr_info = ndr_pull_init_blob(_r.out.info, ndr, ndr->iconv_convenience);\
129 NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
130 _ndr_info->flags= ndr->flags;\
131 if (r->in.offered != _ndr_info->data_size) {\
132 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
133 "SPOOLSS Buffer: offered[%u] doesn't match length of buffer[%u]",\
134 (unsigned)r->in.offered, (unsigned)_ndr_info->data_size);\
136 if (*r->out.needed <= _ndr_info->data_size) {\
138 __r.in.level = r->in.level;\
139 __r.in.count = *r->out.count;\
140 __r.out.info = NULL;\
141 NDR_CHECK(ndr_pull___##fn(_ndr_info, flags, &__r));\
142 r->out.info = __r.out.info;\
147 #define NDR_SPOOLSS_PULL_ENUM(fn,in,out) do { \
149 if (flags & NDR_IN) {\
151 NDR_SPOOLSS_PULL_ENUM_IN(fn);\
154 if (flags & NDR_OUT) {\
156 NDR_SPOOLSS_PULL_ENUM_OUT(fn);\
160 #define _NDR_CHECK_UINT32(call) do {\
161 enum ndr_err_code _ndr_err; \
163 if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \
168 /* TODO: set _ndr_info->flags correct */
169 #define NDR_SPOOLSS_SIZE_ENUM(fn) do { \
171 DATA_BLOB _data_blob_info;\
172 struct ndr_push *_ndr_info = ndr_push_init_ctx(mem_ctx, iconv_convenience);\
173 if (!_ndr_info) return 0;\
174 _ndr_info->flags|=0;\
175 __r.in.level = level;\
176 __r.in.count = count;\
177 __r.out.info = info;\
178 _NDR_CHECK_UINT32(ndr_push___##fn(_ndr_info, NDR_OUT, &__r)); \
179 _data_blob_info = ndr_push_blob(_ndr_info);\
180 return _data_blob_info.length;\
186 enum ndr_err_code ndr_push_spoolss_EnumPrinters(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinters *r)
188 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrinters,{
189 _r.in.flags = r->in.flags;
190 _r.in.server = r->in.server;
192 _r.in.flags = r->in.flags;
193 _r.in.server = r->in.server;
195 return NDR_ERR_SUCCESS;
198 enum ndr_err_code ndr_pull_spoolss_EnumPrinters(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinters *r)
200 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrinters,{
201 r->in.flags = _r.in.flags;
202 r->in.server = _r.in.server;
204 _r.in.flags = r->in.flags;
205 _r.in.server = r->in.server;
207 return NDR_ERR_SUCCESS;
210 uint32_t ndr_size_spoolss_EnumPrinters_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_PrinterInfo *info)
212 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrinters);
218 enum ndr_err_code ndr_push_spoolss_EnumJobs(struct ndr_push *ndr, int flags, const struct spoolss_EnumJobs *r)
220 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumJobs,{
221 _r.in.handle = r->in.handle;
222 _r.in.firstjob = r->in.firstjob;
223 _r.in.numjobs = r->in.numjobs;
225 _r.in.handle = r->in.handle;
226 _r.in.firstjob = r->in.firstjob;
227 _r.in.numjobs = r->in.numjobs;
229 return NDR_ERR_SUCCESS;
232 enum ndr_err_code ndr_pull_spoolss_EnumJobs(struct ndr_pull *ndr, int flags, struct spoolss_EnumJobs *r)
234 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumJobs,{
235 r->in.handle = _r.in.handle;
236 r->in.firstjob = _r.in.firstjob;
237 r->in.numjobs = _r.in.numjobs;
239 _r.in.handle = r->in.handle;
240 _r.in.firstjob = r->in.firstjob;
241 _r.in.numjobs = r->in.numjobs;
243 return NDR_ERR_SUCCESS;
246 uint32_t ndr_size_spoolss_EnumJobss_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_JobInfo *info)
248 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumJobs);
252 spoolss_EnumPrinterDrivers
254 enum ndr_err_code ndr_push_spoolss_EnumPrinterDrivers(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinterDrivers *r)
256 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrinterDrivers,{
257 _r.in.server = r->in.server;
258 _r.in.environment = r->in.environment;
260 _r.in.server = r->in.server;
261 _r.in.environment = r->in.environment;
263 return NDR_ERR_SUCCESS;
266 enum ndr_err_code ndr_pull_spoolss_EnumPrinterDrivers(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinterDrivers *r)
268 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrinterDrivers,{
269 r->in.server = _r.in.server;
270 r->in.environment = _r.in.environment;
272 _r.in.server = r->in.server;
273 _r.in.environment = r->in.environment;
275 return NDR_ERR_SUCCESS;
278 uint32_t ndr_size_spoolss_EnumPrinterDrivers_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_DriverInfo *info)
280 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrinterDrivers);
286 enum ndr_err_code ndr_push_spoolss_EnumForms(struct ndr_push *ndr, int flags, const struct spoolss_EnumForms *r)
288 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumForms,{
289 _r.in.handle = r->in.handle;
291 _r.in.handle = r->in.handle;
293 return NDR_ERR_SUCCESS;
296 enum ndr_err_code ndr_pull_spoolss_EnumForms(struct ndr_pull *ndr, int flags, struct spoolss_EnumForms *r)
298 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumForms,{
299 r->in.handle = _r.in.handle;
301 _r.in.handle = r->in.handle;
303 return NDR_ERR_SUCCESS;
306 uint32_t ndr_size_spoolss_EnumForms_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_FormInfo *info)
308 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumForms);
314 enum ndr_err_code ndr_push_spoolss_EnumPorts(struct ndr_push *ndr, int flags, const struct spoolss_EnumPorts *r)
316 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPorts,{
317 _r.in.servername= r->in.servername;
319 _r.in.servername= r->in.servername;
321 return NDR_ERR_SUCCESS;
324 enum ndr_err_code ndr_pull_spoolss_EnumPorts(struct ndr_pull *ndr, int flags, struct spoolss_EnumPorts *r)
326 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPorts,{
327 r->in.servername= _r.in.servername;
329 _r.in.servername= r->in.servername;
331 return NDR_ERR_SUCCESS;
334 uint32_t ndr_size_spoolss_EnumPorts_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_PortInfo *info)
336 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPorts);
342 enum ndr_err_code ndr_push_spoolss_EnumMonitors(struct ndr_push *ndr, int flags, const struct spoolss_EnumMonitors *r)
344 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumMonitors,{
345 _r.in.servername= r->in.servername;
347 _r.in.servername= r->in.servername;
349 return NDR_ERR_SUCCESS;
352 enum ndr_err_code ndr_pull_spoolss_EnumMonitors(struct ndr_pull *ndr, int flags, struct spoolss_EnumMonitors *r)
354 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumMonitors,{
355 r->in.servername= _r.in.servername;
357 _r.in.servername= r->in.servername;
359 return NDR_ERR_SUCCESS;
362 uint32_t ndr_size_spoolss_EnumMonitors_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_MonitorInfo *info)
364 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumMonitors);
368 spoolss_EnumPrintProcessors
370 enum ndr_err_code ndr_push_spoolss_EnumPrintProcessors(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrintProcessors *r)
372 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrintProcessors,{
373 _r.in.servername = r->in.servername;
374 _r.in.environment = r->in.environment;
376 _r.in.servername = r->in.servername;
377 _r.in.environment = r->in.environment;
379 return NDR_ERR_SUCCESS;
382 enum ndr_err_code ndr_pull_spoolss_EnumPrintProcessors(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrintProcessors *r)
384 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrintProcessors,{
385 r->in.servername = _r.in.servername;
386 r->in.environment = _r.in.environment;
388 _r.in.servername = r->in.servername;
389 _r.in.environment = r->in.environment;
391 return NDR_ERR_SUCCESS;
394 uint32_t ndr_size_spoolss_EnumPrinterProcessors_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience,
395 uint32_t level, uint32_t count, union spoolss_PrintProcessorInfo *info)
397 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrintProcessors);
401 spoolss_GetPrinterData
403 enum ndr_err_code ndr_push_spoolss_GetPrinterData(struct ndr_push *ndr, int flags, const struct spoolss_GetPrinterData *r)
405 struct _spoolss_GetPrinterData _r;
406 if (flags & NDR_IN) {
407 _r.in.handle = r->in.handle;
408 _r.in.value_name= r->in.value_name;
409 _r.in.offered = r->in.offered;
410 NDR_CHECK(ndr_push__spoolss_GetPrinterData(ndr, flags, &_r));
412 if (flags & NDR_OUT) {
413 struct ndr_push *_ndr_info;
414 _r.in.handle = r->in.handle;
415 _r.in.value_name= r->in.value_name;
416 _r.in.offered = r->in.offered;
417 _r.out.type = r->out.type;
418 _r.out.data = data_blob(NULL, 0);
419 _r.out.needed = r->out.needed;
420 _r.out.result = r->out.result;
422 struct __spoolss_GetPrinterData __r;
423 _ndr_info = ndr_push_init_ctx(ndr, ndr->iconv_convenience);
424 NDR_ERR_HAVE_NO_MEMORY(_ndr_info);
425 _ndr_info->flags= ndr->flags;
426 __r.in.type = *r->out.type;
427 __r.out.data = r->out.data;
428 NDR_CHECK(ndr_push___spoolss_GetPrinterData(_ndr_info, flags, &__r));
429 if (r->in.offered > _ndr_info->offset) {
430 uint32_t _padding_len = r->in.offered - _ndr_info->offset;
431 NDR_CHECK(ndr_push_zero(_ndr_info, _padding_len));
433 _r.out.data = ndr_push_blob(_ndr_info);
435 NDR_CHECK(ndr_push__spoolss_GetPrinterData(ndr, flags, &_r));
437 return NDR_ERR_SUCCESS;
440 enum ndr_err_code ndr_pull_spoolss_GetPrinterData(struct ndr_pull *ndr, int flags, struct spoolss_GetPrinterData *r)
442 struct _spoolss_GetPrinterData _r;
443 if (flags & NDR_IN) {
446 _r.in.handle = r->in.handle;
447 _r.in.value_name= r->in.value_name;
448 _r.in.offered = r->in.offered;
449 _r.out.type = r->out.type;
450 _r.out.data = data_blob(NULL,0),
451 _r.out.needed = r->out.needed;
452 NDR_CHECK(ndr_pull__spoolss_GetPrinterData(ndr, flags, &_r));
453 r->in.handle = _r.in.handle;
454 r->in.value_name= _r.in.value_name;
455 r->in.offered = _r.in.offered;
456 r->out.needed = _r.out.needed;
458 if (flags & NDR_OUT) {
459 _r.in.handle = r->in.handle;
460 _r.in.value_name= r->in.value_name;
461 _r.in.offered = r->in.offered;
462 _r.out.type = r->out.type;
463 _r.out.data = data_blob(NULL,0),
464 _r.out.needed = r->out.needed;
465 _r.out.result = r->out.result;
466 NDR_CHECK(ndr_pull__spoolss_GetPrinterData(ndr, flags, &_r));
467 r->out.type = _r.out.type;
468 ZERO_STRUCT(r->out.data);
469 r->out.needed = _r.out.needed;
470 r->out.result = _r.out.result;
471 if (_r.out.data.length != r->in.offered) {
472 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,
473 "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of out buffer[%u]",
474 (unsigned)r->in.offered, (unsigned)_r.out.data.length);
476 if (_r.out.data.length > 0 && *r->out.needed <= _r.out.data.length) {
477 struct __spoolss_GetPrinterData __r;
478 struct ndr_pull *_ndr_data = ndr_pull_init_blob(&_r.out.data, ndr, ndr->iconv_convenience);
479 NDR_ERR_HAVE_NO_MEMORY(_ndr_data);
480 _ndr_data->flags= ndr->flags;
481 __r.in.type = *r->out.type;
482 __r.out.data = r->out.data;
483 NDR_CHECK(ndr_pull___spoolss_GetPrinterData(_ndr_data, flags, &__r));
484 r->out.data = __r.out.data;
486 *r->out.type = SPOOLSS_PRINTER_DATA_TYPE_NULL;
489 return NDR_ERR_SUCCESS;
493 spoolss_SetPrinterData
495 enum ndr_err_code ndr_push_spoolss_SetPrinterData(struct ndr_push *ndr, int flags, const struct spoolss_SetPrinterData *r)
497 struct _spoolss_SetPrinterData _r;
498 if (flags & NDR_IN) {
499 struct ndr_push *_ndr_data;
500 struct __spoolss_SetPrinterData __r;
501 DATA_BLOB _data_blob_data;
503 _ndr_data = ndr_push_init_ctx(ndr, ndr->iconv_convenience);
504 NDR_ERR_HAVE_NO_MEMORY(_ndr_data);
505 _ndr_data->flags= ndr->flags;
507 __r.in.type = r->in.type;
508 __r.out.data = r->in.data;
509 NDR_CHECK(ndr_push___spoolss_SetPrinterData(_ndr_data, NDR_OUT, &__r));
510 _data_blob_data = ndr_push_blob(_ndr_data);
512 _r.in.handle = r->in.handle;
513 _r.in.value_name= r->in.value_name;
514 _r.in.type = r->in.type;
515 _r.in.data = _data_blob_data;
516 _r.in._offered = _data_blob_data.length;
517 _r.out.result = r->out.result;
518 NDR_CHECK(ndr_push__spoolss_SetPrinterData(ndr, flags, &_r));
520 if (flags & NDR_OUT) {
521 _r.in.handle = r->in.handle;
522 _r.in.value_name= r->in.value_name;
523 _r.in.type = r->in.type;
524 _r.in.data = data_blob(NULL,0),
525 _r.in._offered = r->in._offered;
526 _r.out.result = r->out.result;
527 NDR_CHECK(ndr_push__spoolss_SetPrinterData(ndr, flags, &_r));
529 return NDR_ERR_SUCCESS;
532 uint32_t _ndr_size_spoolss_DeviceMode(struct spoolss_DeviceMode *devmode, struct smb_iconv_convenience *ic, uint32_t flags)
534 if (!devmode) return 0;
535 return ndr_size_spoolss_DeviceMode(devmode,ic,flags);
538 _PUBLIC_ size_t ndr_size_spoolss_StringArray(const struct spoolss_StringArray *r, struct smb_iconv_convenience *ic, int flags)
544 return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_StringArray, ic);
547 /* hand marshall as pidl cannot (yet) generate a relative pointer to a fixed array of
550 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo101(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo101 *r)
552 uint32_t cntr_file_info_1;
553 if (ndr_flags & NDR_SCALARS) {
554 NDR_CHECK(ndr_push_align(ndr, 8));
555 NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
557 uint32_t _flags_save_string = ndr->flags;
558 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
559 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
560 ndr->flags = _flags_save_string;
563 uint32_t _flags_save_string = ndr->flags;
564 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
565 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->architecture));
566 ndr->flags = _flags_save_string;
568 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->file_info));
569 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->file_count));
571 uint32_t _flags_save_string = ndr->flags;
572 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
573 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->monitor_name));
574 ndr->flags = _flags_save_string;
577 uint32_t _flags_save_string = ndr->flags;
578 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
579 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->default_datatype));
580 ndr->flags = _flags_save_string;
583 uint32_t _flags_save_string_array = ndr->flags;
584 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
585 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->previous_names));
586 ndr->flags = _flags_save_string_array;
588 NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->driver_date));
589 NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, r->driver_version));
591 uint32_t _flags_save_string = ndr->flags;
592 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
593 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->manufacturer_name));
594 ndr->flags = _flags_save_string;
597 uint32_t _flags_save_string = ndr->flags;
598 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
599 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->manufacturer_url));
600 ndr->flags = _flags_save_string;
603 uint32_t _flags_save_string = ndr->flags;
604 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
605 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->hardware_id));
606 ndr->flags = _flags_save_string;
609 uint32_t _flags_save_string = ndr->flags;
610 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
611 NDR_CHECK(ndr_push_relative_ptr1(ndr, r->provider));
612 ndr->flags = _flags_save_string;
615 if (ndr_flags & NDR_BUFFERS) {
617 uint32_t _flags_save_string = ndr->flags;
618 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
619 if (r->driver_name) {
620 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->driver_name));
621 NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
623 ndr->flags = _flags_save_string;
626 uint32_t _flags_save_string = ndr->flags;
627 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
628 if (r->architecture) {
629 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->architecture));
630 NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
632 ndr->flags = _flags_save_string;
635 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->file_info));
637 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->file_count));
639 for (cntr_file_info_1 = 0; cntr_file_info_1 < r->file_count; cntr_file_info_1++) {
640 NDR_CHECK(ndr_push_spoolss_DriverFileInfo(ndr, NDR_SCALARS, &r->file_info[cntr_file_info_1]));
642 for (cntr_file_info_1 = 0; cntr_file_info_1 < r->file_count; cntr_file_info_1++) {
643 NDR_CHECK(ndr_push_spoolss_DriverFileInfo(ndr, NDR_BUFFERS, &r->file_info[cntr_file_info_1]));
647 uint32_t _flags_save_string = ndr->flags;
648 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
649 if (r->monitor_name) {
650 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->monitor_name));
651 NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
653 ndr->flags = _flags_save_string;
656 uint32_t _flags_save_string = ndr->flags;
657 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
658 if (r->default_datatype) {
659 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->default_datatype));
660 NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->default_datatype));
662 ndr->flags = _flags_save_string;
665 uint32_t _flags_save_string_array = ndr->flags;
666 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
667 if (r->previous_names) {
668 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->previous_names));
669 NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->previous_names));
671 ndr->flags = _flags_save_string_array;
674 uint32_t _flags_save_string = ndr->flags;
675 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
676 if (r->manufacturer_name) {
677 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->manufacturer_name));
678 NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_name));
680 ndr->flags = _flags_save_string;
683 uint32_t _flags_save_string = ndr->flags;
684 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
685 if (r->manufacturer_url) {
686 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->manufacturer_url));
687 NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_url));
689 ndr->flags = _flags_save_string;
692 uint32_t _flags_save_string = ndr->flags;
693 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
694 if (r->hardware_id) {
695 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->hardware_id));
696 NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->hardware_id));
698 ndr->flags = _flags_save_string;
701 uint32_t _flags_save_string = ndr->flags;
702 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
704 NDR_CHECK(ndr_push_relative_ptr2(ndr, r->provider));
705 NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->provider));
707 ndr->flags = _flags_save_string;
710 return NDR_ERR_SUCCESS;
713 _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo101(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo101 *r)
715 uint32_t _ptr_driver_name;
716 TALLOC_CTX *_mem_save_driver_name_0;
717 uint32_t _ptr_architecture;
718 TALLOC_CTX *_mem_save_architecture_0;
719 uint32_t _ptr_file_info;
720 uint32_t cntr_file_info_1;
721 TALLOC_CTX *_mem_save_file_info_0;
722 TALLOC_CTX *_mem_save_file_info_1;
723 uint32_t _ptr_monitor_name;
724 TALLOC_CTX *_mem_save_monitor_name_0;
725 uint32_t _ptr_default_datatype;
726 TALLOC_CTX *_mem_save_default_datatype_0;
727 uint32_t _ptr_previous_names;
728 TALLOC_CTX *_mem_save_previous_names_0;
729 uint32_t _ptr_manufacturer_name;
730 TALLOC_CTX *_mem_save_manufacturer_name_0;
731 uint32_t _ptr_manufacturer_url;
732 TALLOC_CTX *_mem_save_manufacturer_url_0;
733 uint32_t _ptr_hardware_id;
734 TALLOC_CTX *_mem_save_hardware_id_0;
735 uint32_t _ptr_provider;
736 TALLOC_CTX *_mem_save_provider_0;
737 if (ndr_flags & NDR_SCALARS) {
738 NDR_CHECK(ndr_pull_align(ndr, 8));
739 NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
741 uint32_t _flags_save_string = ndr->flags;
742 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
743 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
744 if (_ptr_driver_name) {
745 NDR_PULL_ALLOC(ndr, r->driver_name);
746 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
748 r->driver_name = NULL;
750 ndr->flags = _flags_save_string;
753 uint32_t _flags_save_string = ndr->flags;
754 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
755 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
756 if (_ptr_architecture) {
757 NDR_PULL_ALLOC(ndr, r->architecture);
758 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->architecture, _ptr_architecture));
760 r->architecture = NULL;
762 ndr->flags = _flags_save_string;
764 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_file_info));
765 if (_ptr_file_info) {
766 NDR_PULL_ALLOC(ndr, r->file_info);
767 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->file_info, _ptr_file_info));
771 NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->file_count));
773 uint32_t _flags_save_string = ndr->flags;
774 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
775 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
776 if (_ptr_monitor_name) {
777 NDR_PULL_ALLOC(ndr, r->monitor_name);
778 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->monitor_name, _ptr_monitor_name));
780 r->monitor_name = NULL;
782 ndr->flags = _flags_save_string;
785 uint32_t _flags_save_string = ndr->flags;
786 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
787 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
788 if (_ptr_default_datatype) {
789 NDR_PULL_ALLOC(ndr, r->default_datatype);
790 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->default_datatype, _ptr_default_datatype));
792 r->default_datatype = NULL;
794 ndr->flags = _flags_save_string;
797 uint32_t _flags_save_string_array = ndr->flags;
798 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
799 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
800 if (_ptr_previous_names) {
801 NDR_PULL_ALLOC(ndr, r->previous_names);
802 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->previous_names, _ptr_previous_names));
804 r->previous_names = NULL;
806 ndr->flags = _flags_save_string_array;
808 NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->driver_date));
809 NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &r->driver_version));
811 uint32_t _flags_save_string = ndr->flags;
812 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
813 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_name));
814 if (_ptr_manufacturer_name) {
815 NDR_PULL_ALLOC(ndr, r->manufacturer_name);
816 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->manufacturer_name, _ptr_manufacturer_name));
818 r->manufacturer_name = NULL;
820 ndr->flags = _flags_save_string;
823 uint32_t _flags_save_string = ndr->flags;
824 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
825 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_url));
826 if (_ptr_manufacturer_url) {
827 NDR_PULL_ALLOC(ndr, r->manufacturer_url);
828 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->manufacturer_url, _ptr_manufacturer_url));
830 r->manufacturer_url = NULL;
832 ndr->flags = _flags_save_string;
835 uint32_t _flags_save_string = ndr->flags;
836 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
837 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_hardware_id));
838 if (_ptr_hardware_id) {
839 NDR_PULL_ALLOC(ndr, r->hardware_id);
840 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->hardware_id, _ptr_hardware_id));
842 r->hardware_id = NULL;
844 ndr->flags = _flags_save_string;
847 uint32_t _flags_save_string = ndr->flags;
848 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
849 NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_provider));
851 NDR_PULL_ALLOC(ndr, r->provider);
852 NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->provider, _ptr_provider));
856 ndr->flags = _flags_save_string;
859 if (ndr_flags & NDR_BUFFERS) {
861 uint32_t _flags_save_string = ndr->flags;
862 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
863 if (r->driver_name) {
864 uint32_t _relative_save_offset;
865 _relative_save_offset = ndr->offset;
866 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
867 _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
868 NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
869 NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
870 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
871 ndr->offset = _relative_save_offset;
873 ndr->flags = _flags_save_string;
876 uint32_t _flags_save_string = ndr->flags;
877 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
878 if (r->architecture) {
879 uint32_t _relative_save_offset;
880 _relative_save_offset = ndr->offset;
881 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->architecture));
882 _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
883 NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
884 NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
885 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
886 ndr->offset = _relative_save_offset;
888 ndr->flags = _flags_save_string;
891 uint32_t _relative_save_offset;
892 _relative_save_offset = ndr->offset;
893 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->file_info));
894 _mem_save_file_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
895 NDR_PULL_SET_MEM_CTX(ndr, r->file_info, 0);
897 NDR_CHECK(ndr_pull_array_size(ndr, &r->file_info));
899 NDR_CHECK(ndr_token_store(ndr, &ndr->array_size_list, &r->file_info, r->file_count));
901 NDR_PULL_ALLOC_N(ndr, r->file_info, ndr_get_array_size(ndr, &r->file_info));
902 _mem_save_file_info_1 = NDR_PULL_GET_MEM_CTX(ndr);
903 NDR_PULL_SET_MEM_CTX(ndr, r->file_info, 0);
904 for (cntr_file_info_1 = 0; cntr_file_info_1 < r->file_count; cntr_file_info_1++) {
905 NDR_CHECK(ndr_pull_spoolss_DriverFileInfo(ndr, NDR_SCALARS, &r->file_info[cntr_file_info_1]));
907 for (cntr_file_info_1 = 0; cntr_file_info_1 < r->file_count; cntr_file_info_1++) {
908 NDR_CHECK(ndr_pull_spoolss_DriverFileInfo(ndr, NDR_BUFFERS, &r->file_info[cntr_file_info_1]));
910 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_file_info_1, 0);
911 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_file_info_0, 0);
912 ndr->offset = _relative_save_offset;
915 uint32_t _flags_save_string = ndr->flags;
916 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
917 if (r->monitor_name) {
918 uint32_t _relative_save_offset;
919 _relative_save_offset = ndr->offset;
920 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->monitor_name));
921 _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
922 NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
923 NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
924 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
925 ndr->offset = _relative_save_offset;
927 ndr->flags = _flags_save_string;
930 uint32_t _flags_save_string = ndr->flags;
931 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
932 if (r->default_datatype) {
933 uint32_t _relative_save_offset;
934 _relative_save_offset = ndr->offset;
935 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->default_datatype));
936 _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
937 NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
938 NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
939 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
940 ndr->offset = _relative_save_offset;
942 ndr->flags = _flags_save_string;
945 uint32_t _flags_save_string_array = ndr->flags;
946 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
947 if (r->previous_names) {
948 uint32_t _relative_save_offset;
949 _relative_save_offset = ndr->offset;
950 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->previous_names));
951 _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
952 NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
953 NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->previous_names));
954 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
955 ndr->offset = _relative_save_offset;
957 ndr->flags = _flags_save_string_array;
960 uint32_t _flags_save_string = ndr->flags;
961 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
962 if (r->manufacturer_name) {
963 uint32_t _relative_save_offset;
964 _relative_save_offset = ndr->offset;
965 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->manufacturer_name));
966 _mem_save_manufacturer_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
967 NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_name, 0);
968 NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_name));
969 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_name_0, 0);
970 ndr->offset = _relative_save_offset;
972 ndr->flags = _flags_save_string;
975 uint32_t _flags_save_string = ndr->flags;
976 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
977 if (r->manufacturer_url) {
978 uint32_t _relative_save_offset;
979 _relative_save_offset = ndr->offset;
980 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->manufacturer_url));
981 _mem_save_manufacturer_url_0 = NDR_PULL_GET_MEM_CTX(ndr);
982 NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_url, 0);
983 NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_url));
984 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_url_0, 0);
985 ndr->offset = _relative_save_offset;
987 ndr->flags = _flags_save_string;
990 uint32_t _flags_save_string = ndr->flags;
991 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
992 if (r->hardware_id) {
993 uint32_t _relative_save_offset;
994 _relative_save_offset = ndr->offset;
995 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->hardware_id));
996 _mem_save_hardware_id_0 = NDR_PULL_GET_MEM_CTX(ndr);
997 NDR_PULL_SET_MEM_CTX(ndr, r->hardware_id, 0);
998 NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->hardware_id));
999 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_hardware_id_0, 0);
1000 ndr->offset = _relative_save_offset;
1002 ndr->flags = _flags_save_string;
1005 uint32_t _flags_save_string = ndr->flags;
1006 ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
1008 uint32_t _relative_save_offset;
1009 _relative_save_offset = ndr->offset;
1010 NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->provider));
1011 _mem_save_provider_0 = NDR_PULL_GET_MEM_CTX(ndr);
1012 NDR_PULL_SET_MEM_CTX(ndr, r->provider, 0);
1013 NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->provider));
1014 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_provider_0, 0);
1015 ndr->offset = _relative_save_offset;
1017 ndr->flags = _flags_save_string;
1020 NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->file_info, r->file_count));
1023 return NDR_ERR_SUCCESS;