2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-2000,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
6 * Copyright (C) Jean François Micouleau 1998-2000,
7 * Copyright (C) Gerald Carter 2000-2002,
8 * Copyright (C) Tim Potter 2001-2002.
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.
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.
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/>.
27 #define DBGC_CLASS DBGC_RPC_PARSE
30 /*******************************************************************
31 This should be moved in a more generic lib.
32 ********************************************************************/
34 bool spoolss_io_system_time(const char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
36 if(!prs_uint16("year", ps, depth, &systime->year))
38 if(!prs_uint16("month", ps, depth, &systime->month))
40 if(!prs_uint16("dayofweek", ps, depth, &systime->dayofweek))
42 if(!prs_uint16("day", ps, depth, &systime->day))
44 if(!prs_uint16("hour", ps, depth, &systime->hour))
46 if(!prs_uint16("minute", ps, depth, &systime->minute))
48 if(!prs_uint16("second", ps, depth, &systime->second))
50 if(!prs_uint16("milliseconds", ps, depth, &systime->milliseconds))
56 /*******************************************************************
57 ********************************************************************/
59 bool make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
61 systime->year=unixtime->tm_year+1900;
62 systime->month=unixtime->tm_mon+1;
63 systime->dayofweek=unixtime->tm_wday;
64 systime->day=unixtime->tm_mday;
65 systime->hour=unixtime->tm_hour;
66 systime->minute=unixtime->tm_min;
67 systime->second=unixtime->tm_sec;
68 systime->milliseconds=0;
73 /*******************************************************************
74 * read or write a DEVICEMODE struct.
75 * on reading allocate memory for the private member
76 ********************************************************************/
78 #define DM_NUM_OPTIONAL_FIELDS 8
80 bool spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
82 int available_space; /* size of the device mode left to parse */
83 /* only important on unmarshalling */
85 uint16 *unistr_buffer;
88 struct optional_fields {
91 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
92 { "icmmethod", NULL },
93 { "icmintent", NULL },
94 { "mediatype", NULL },
95 { "dithertype", NULL },
96 { "reserved1", NULL },
97 { "reserved2", NULL },
98 { "panningwidth", NULL },
99 { "panningheight", NULL }
102 /* assign at run time to keep non-gcc compilers happy */
104 opt_fields[0].field = &devmode->icmmethod;
105 opt_fields[1].field = &devmode->icmintent;
106 opt_fields[2].field = &devmode->mediatype;
107 opt_fields[3].field = &devmode->dithertype;
108 opt_fields[4].field = &devmode->reserved1;
109 opt_fields[5].field = &devmode->reserved2;
110 opt_fields[6].field = &devmode->panningwidth;
111 opt_fields[7].field = &devmode->panningheight;
114 prs_debug(ps, depth, desc, "spoolss_io_devmode");
117 if (UNMARSHALLING(ps)) {
118 devmode->devicename.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
119 if (devmode->devicename.buffer == NULL)
121 unistr_buffer = devmode->devicename.buffer;
124 /* devicename is a static sized string but the buffer we set is not */
125 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
126 memset( unistr_buffer, 0x0, MAXDEVICENAME );
127 for ( j=0; devmode->devicename.buffer[j]; j++ )
128 unistr_buffer[j] = devmode->devicename.buffer[j];
131 if (!prs_uint16uni(True,"devicename", ps, depth, unistr_buffer, MAXDEVICENAME))
134 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
137 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
139 if (!prs_uint16("size", ps, depth, &devmode->size))
141 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
143 if (!prs_uint32("fields", ps, depth, &devmode->fields))
145 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
147 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
149 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
151 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
153 if (!prs_uint16("scale", ps, depth, &devmode->scale))
155 if (!prs_uint16("copies", ps, depth, &devmode->copies))
157 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
159 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
161 if (!prs_uint16("color", ps, depth, &devmode->color))
163 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
165 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
167 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
169 if (!prs_uint16("collate", ps, depth, &devmode->collate))
172 if (UNMARSHALLING(ps)) {
173 devmode->formname.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
174 if (devmode->formname.buffer == NULL)
176 unistr_buffer = devmode->formname.buffer;
179 /* devicename is a static sized string but the buffer we set is not */
180 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
181 memset( unistr_buffer, 0x0, MAXDEVICENAME );
182 for ( j=0; devmode->formname.buffer[j]; j++ )
183 unistr_buffer[j] = devmode->formname.buffer[j];
186 if (!prs_uint16uni(True, "formname", ps, depth, unistr_buffer, MAXDEVICENAME))
188 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
190 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
192 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
194 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
196 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
198 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
201 * every device mode I've ever seen on the wire at least has up
202 * to the displayfrequency field. --jerry (05-09-2002)
205 /* add uint32's + uint16's + two UNICODE strings */
207 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
209 /* Sanity check - we only have uint32's left tp parse */
211 if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {
212 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
213 available_space, devmode->size));
214 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
219 * Conditional parsing. Assume that the DeviceMode has been
220 * zero'd by the caller.
223 while ((available_space > 0) && (i < DM_NUM_OPTIONAL_FIELDS))
225 DEBUG(11, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));
226 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
228 available_space -= sizeof(uint32);
232 /* Sanity Check - we should no available space at this point unless
233 MS changes the device mode structure */
235 if (available_space) {
236 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
237 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
238 available_space, devmode->size));
239 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
244 if (devmode->driverextra!=0) {
245 if (UNMARSHALLING(ps)) {
246 devmode->dev_private=PRS_ALLOC_MEM(ps, uint8, devmode->driverextra);
247 if(devmode->dev_private == NULL)
249 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for dev_private\n",devmode->driverextra));
252 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of dev_private\n",devmode->driverextra));
253 if (!prs_uint8s(False, "dev_private", ps, depth,
254 devmode->dev_private, devmode->driverextra))
261 /*******************************************************************
263 ********************************************************************/
265 bool make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
266 const POLICY_HND *handle,
267 const char *valuename, uint32 size)
269 if (q_u == NULL) return False;
271 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
273 q_u->handle = *handle;
274 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
280 /*******************************************************************
282 * called from spoolss_q_getprinterdata (srv_spoolss.c)
283 ********************************************************************/
285 bool spoolss_io_q_getprinterdata(const char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
290 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
295 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
299 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
303 if (!prs_uint32("size", ps, depth, &q_u->size))
309 /*******************************************************************
311 * called from spoolss_r_getprinterdata (srv_spoolss.c)
312 ********************************************************************/
314 bool spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
319 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
324 if (!prs_uint32("type", ps, depth, &r_u->type))
326 if (!prs_uint32("size", ps, depth, &r_u->size))
329 if (UNMARSHALLING(ps) && r_u->size) {
330 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
335 if (!prs_uint8s( False, "data", ps, depth, r_u->data, r_u->size ))
341 if (!prs_uint32("needed", ps, depth, &r_u->needed))
343 if (!prs_werror("status", ps, depth, &r_u->status))
349 /*******************************************************************
350 * return the length of a uint16 (obvious, but the code is clean)
351 ********************************************************************/
353 static uint32 size_of_uint16(uint16 *value)
355 return (sizeof(*value));
358 /*******************************************************************
359 * return the length of a uint32 (obvious, but the code is clean)
360 ********************************************************************/
362 static uint32 size_of_uint32(uint32 *value)
364 return (sizeof(*value));
367 /*******************************************************************
368 * return the length of a NTTIME (obvious, but the code is clean)
369 ********************************************************************/
371 static uint32 size_of_nttime(NTTIME *value)
373 return (sizeof(*value));
376 /*******************************************************************
377 * return the length of a uint32 (obvious, but the code is clean)
378 ********************************************************************/
380 static uint32 size_of_device_mode(DEVICEMODE *devmode)
385 return (4+devmode->size+devmode->driverextra);
388 /*******************************************************************
389 * return the length of a uint32 (obvious, but the code is clean)
390 ********************************************************************/
392 static uint32 size_of_systemtime(SYSTEMTIME *systime)
397 return (sizeof(SYSTEMTIME) +4);
400 /*******************************************************************
401 Parse a DEVMODE structure and its relative pointer.
402 ********************************************************************/
404 static bool smb_io_reldevmode(const char *desc, RPC_BUFFER *buffer, int depth, DEVICEMODE **devmode)
406 prs_struct *ps=&buffer->prs;
408 prs_debug(ps, depth, desc, "smb_io_reldevmode");
411 if (MARSHALLING(ps)) {
412 uint32 struct_offset = prs_offset(ps);
413 uint32 relative_offset;
415 if (*devmode == NULL) {
417 if (!prs_uint32("offset", ps, depth, &relative_offset))
419 DEBUG(8, ("boing, the devmode was NULL\n"));
424 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
426 /* mz: we have to align the device mode for VISTA */
427 if (buffer->string_at_end % 4) {
428 buffer->string_at_end += 4 - (buffer->string_at_end % 4);
431 if(!prs_set_offset(ps, buffer->string_at_end))
434 /* write the DEVMODE */
435 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
438 if(!prs_set_offset(ps, struct_offset))
441 relative_offset=buffer->string_at_end - buffer->struct_start;
442 /* write its offset */
443 if (!prs_uint32("offset", ps, depth, &relative_offset))
449 /* read the offset */
450 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
452 if (buffer->string_at_end == 0) {
457 old_offset = prs_offset(ps);
458 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
461 /* read the string */
462 if((*devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1)) == NULL)
464 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
467 if(!prs_set_offset(ps, old_offset))
473 /*******************************************************************
474 Parse a PRINTER_INFO_0 structure.
475 ********************************************************************/
477 bool smb_io_printer_info_0(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
479 prs_struct *ps=&buffer->prs;
481 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
484 buffer->struct_start=prs_offset(ps);
486 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
488 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
491 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
493 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
495 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
498 if(!prs_uint16("year", ps, depth, &info->year))
500 if(!prs_uint16("month", ps, depth, &info->month))
502 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
504 if(!prs_uint16("day", ps, depth, &info->day))
506 if(!prs_uint16("hour", ps, depth, &info->hour))
508 if(!prs_uint16("minute", ps, depth, &info->minute))
510 if(!prs_uint16("second", ps, depth, &info->second))
512 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
515 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
517 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
520 if(!prs_uint16("major_version", ps, depth, &info->major_version))
522 if(!prs_uint16("build_version", ps, depth, &info->build_version))
524 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
526 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
528 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
530 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
532 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
534 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
536 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
538 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
540 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
542 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
544 if(!prs_uint32("change_id", ps, depth, &info->change_id))
546 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
548 if(!prs_uint32("status" , ps, depth, &info->status))
550 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
552 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
554 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
556 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
558 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
560 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
562 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
564 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
566 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
568 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
574 /*******************************************************************
575 Parse a PRINTER_INFO_1 structure.
576 ********************************************************************/
578 bool smb_io_printer_info_1(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
580 prs_struct *ps=&buffer->prs;
582 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
585 buffer->struct_start=prs_offset(ps);
587 if (!prs_uint32("flags", ps, depth, &info->flags))
589 if (!smb_io_relstr("description", buffer, depth, &info->description))
591 if (!smb_io_relstr("name", buffer, depth, &info->name))
593 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
599 /*******************************************************************
600 Parse a PRINTER_INFO_2 structure.
601 ********************************************************************/
603 bool smb_io_printer_info_2(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
605 prs_struct *ps=&buffer->prs;
606 uint32 dm_offset, sd_offset, current_offset;
607 uint32 dummy_value = 0, has_secdesc = 0;
609 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
612 buffer->struct_start=prs_offset(ps);
614 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
616 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
618 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
620 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
622 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
624 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
626 if (!smb_io_relstr("location", buffer, depth, &info->location))
629 /* save current offset and wind forwared by a uint32 */
630 dm_offset = prs_offset(ps);
631 if (!prs_uint32("devmode", ps, depth, &dummy_value))
634 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
636 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
638 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
640 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
643 /* save current offset for the sec_desc */
644 sd_offset = prs_offset(ps);
645 if (!prs_uint32("sec_desc", ps, depth, &has_secdesc))
649 /* save current location so we can pick back up here */
650 current_offset = prs_offset(ps);
652 /* parse the devmode */
653 if (!prs_set_offset(ps, dm_offset))
655 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
658 /* parse the sec_desc */
660 if (!prs_set_offset(ps, sd_offset))
662 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
666 /* pick up where we left off */
667 if (!prs_set_offset(ps, current_offset))
670 if (!prs_uint32("attributes", ps, depth, &info->attributes))
672 if (!prs_uint32("priority", ps, depth, &info->priority))
674 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
676 if (!prs_uint32("starttime", ps, depth, &info->starttime))
678 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
680 if (!prs_uint32("status", ps, depth, &info->status))
682 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
684 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
690 /*******************************************************************
691 Parse a PRINTER_INFO_3 structure.
692 ********************************************************************/
694 bool smb_io_printer_info_3(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
697 prs_struct *ps=&buffer->prs;
699 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
702 buffer->struct_start=prs_offset(ps);
704 if (MARSHALLING(ps)) {
705 /* Ensure the SD is 8 byte aligned in the buffer. */
706 uint32 start = prs_offset(ps); /* Remember the start position. */
709 /* Write a dummy value. */
710 if (!prs_uint32("offset", ps, depth, &off_val))
714 if (!prs_align_uint64(ps))
717 /* Remember where we must seek back to write the SD. */
718 offset = prs_offset(ps);
720 /* Calculate the real offset for the SD. */
722 off_val = offset - start;
724 /* Seek back to where we store the SD offset & store. */
725 prs_set_offset(ps, start);
726 if (!prs_uint32("offset", ps, depth, &off_val))
729 /* Return to after the 8 byte align. */
730 prs_set_offset(ps, offset);
733 if (!prs_uint32("offset", ps, depth, &offset))
735 /* Seek within the buffer. */
736 if (!prs_set_offset(ps, offset))
739 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
745 /*******************************************************************
746 Parse a PRINTER_INFO_4 structure.
747 ********************************************************************/
749 bool smb_io_printer_info_4(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
751 prs_struct *ps=&buffer->prs;
753 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
756 buffer->struct_start=prs_offset(ps);
758 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
760 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
762 if (!prs_uint32("attributes", ps, depth, &info->attributes))
767 /*******************************************************************
768 Parse a PRINTER_INFO_5 structure.
769 ********************************************************************/
771 bool smb_io_printer_info_5(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
773 prs_struct *ps=&buffer->prs;
775 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
778 buffer->struct_start=prs_offset(ps);
780 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
782 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
784 if (!prs_uint32("attributes", ps, depth, &info->attributes))
786 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
788 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
793 /*******************************************************************
794 Parse a PRINTER_INFO_6 structure.
795 ********************************************************************/
797 bool smb_io_printer_info_6(const char *desc, RPC_BUFFER *buffer,
798 PRINTER_INFO_6 *info, int depth)
800 prs_struct *ps=&buffer->prs;
802 prs_debug(ps, depth, desc, "smb_io_printer_info_6");
805 if (!prs_uint32("status", ps, depth, &info->status))
811 /*******************************************************************
812 Parse a PRINTER_INFO_7 structure.
813 ********************************************************************/
815 bool smb_io_printer_info_7(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_7 *info, int depth)
817 prs_struct *ps=&buffer->prs;
819 prs_debug(ps, depth, desc, "smb_io_printer_info_7");
822 buffer->struct_start=prs_offset(ps);
824 if (!smb_io_relstr("guid", buffer, depth, &info->guid))
826 if (!prs_uint32("action", ps, depth, &info->action))
831 /*******************************************************************
832 Parse a DRIVER_INFO_1 structure.
833 ********************************************************************/
835 bool smb_io_printer_driver_info_1(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
837 prs_struct *ps=&buffer->prs;
839 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
842 buffer->struct_start=prs_offset(ps);
844 if (!smb_io_relstr("name", buffer, depth, &info->name))
850 /*******************************************************************
851 Parse a DRIVER_INFO_2 structure.
852 ********************************************************************/
854 bool smb_io_printer_driver_info_2(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
856 prs_struct *ps=&buffer->prs;
858 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
861 buffer->struct_start=prs_offset(ps);
863 if (!prs_uint32("version", ps, depth, &info->version))
865 if (!smb_io_relstr("name", buffer, depth, &info->name))
867 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
869 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
871 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
873 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
879 /*******************************************************************
880 Parse a DRIVER_INFO_3 structure.
881 ********************************************************************/
883 bool smb_io_printer_driver_info_3(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
885 prs_struct *ps=&buffer->prs;
887 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
890 buffer->struct_start=prs_offset(ps);
892 if (!prs_uint32("version", ps, depth, &info->version))
894 if (!smb_io_relstr("name", buffer, depth, &info->name))
896 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
898 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
900 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
902 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
904 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
907 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
910 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
912 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
918 /*******************************************************************
919 Parse a DRIVER_INFO_6 structure.
920 ********************************************************************/
922 bool smb_io_printer_driver_info_6(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
924 prs_struct *ps=&buffer->prs;
926 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
929 buffer->struct_start=prs_offset(ps);
931 if (!prs_uint32("version", ps, depth, &info->version))
933 if (!smb_io_relstr("name", buffer, depth, &info->name))
935 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
937 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
939 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
941 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
943 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
946 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
949 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
951 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
954 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
957 if (!prs_uint64("date", ps, depth, &info->driver_date))
960 if (!prs_uint32("padding", ps, depth, &info->padding))
963 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
966 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
969 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
971 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
973 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
975 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
981 /*******************************************************************
982 Parse a JOB_INFO_1 structure.
983 ********************************************************************/
985 bool smb_io_job_info_1(const char *desc, RPC_BUFFER *buffer, JOB_INFO_1 *info, int depth)
987 prs_struct *ps=&buffer->prs;
989 prs_debug(ps, depth, desc, "smb_io_job_info_1");
992 buffer->struct_start=prs_offset(ps);
994 if (!prs_uint32("jobid", ps, depth, &info->jobid))
996 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
998 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
1000 if (!smb_io_relstr("username", buffer, depth, &info->username))
1002 if (!smb_io_relstr("document", buffer, depth, &info->document))
1004 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
1006 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
1008 if (!prs_uint32("status", ps, depth, &info->status))
1010 if (!prs_uint32("priority", ps, depth, &info->priority))
1012 if (!prs_uint32("position", ps, depth, &info->position))
1014 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
1016 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
1018 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
1024 /*******************************************************************
1025 Parse a JOB_INFO_2 structure.
1026 ********************************************************************/
1028 bool smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, int depth)
1031 prs_struct *ps=&buffer->prs;
1033 prs_debug(ps, depth, desc, "smb_io_job_info_2");
1036 buffer->struct_start=prs_offset(ps);
1038 if (!prs_uint32("jobid",ps, depth, &info->jobid))
1040 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1042 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
1044 if (!smb_io_relstr("username", buffer, depth, &info->username))
1046 if (!smb_io_relstr("document", buffer, depth, &info->document))
1048 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
1050 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
1053 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1055 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
1057 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
1059 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1061 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
1064 /* SEC_DESC sec_desc;*/
1065 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
1068 if (!prs_uint32("status",ps, depth, &info->status))
1070 if (!prs_uint32("priority",ps, depth, &info->priority))
1072 if (!prs_uint32("position",ps, depth, &info->position))
1074 if (!prs_uint32("starttime",ps, depth, &info->starttime))
1076 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
1078 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
1080 if (!prs_uint32("size",ps, depth, &info->size))
1082 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
1084 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
1086 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
1092 /*******************************************************************
1093 return the size required by a struct in the stream
1094 ********************************************************************/
1096 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
1100 size+=size_of_relative_string( &info->printername );
1101 size+=size_of_relative_string( &info->servername );
1103 size+=size_of_uint32( &info->cjobs);
1104 size+=size_of_uint32( &info->total_jobs);
1105 size+=size_of_uint32( &info->total_bytes);
1107 size+=size_of_uint16( &info->year);
1108 size+=size_of_uint16( &info->month);
1109 size+=size_of_uint16( &info->dayofweek);
1110 size+=size_of_uint16( &info->day);
1111 size+=size_of_uint16( &info->hour);
1112 size+=size_of_uint16( &info->minute);
1113 size+=size_of_uint16( &info->second);
1114 size+=size_of_uint16( &info->milliseconds);
1116 size+=size_of_uint32( &info->global_counter);
1117 size+=size_of_uint32( &info->total_pages);
1119 size+=size_of_uint16( &info->major_version);
1120 size+=size_of_uint16( &info->build_version);
1122 size+=size_of_uint32( &info->unknown7);
1123 size+=size_of_uint32( &info->unknown8);
1124 size+=size_of_uint32( &info->unknown9);
1125 size+=size_of_uint32( &info->session_counter);
1126 size+=size_of_uint32( &info->unknown11);
1127 size+=size_of_uint32( &info->printer_errors);
1128 size+=size_of_uint32( &info->unknown13);
1129 size+=size_of_uint32( &info->unknown14);
1130 size+=size_of_uint32( &info->unknown15);
1131 size+=size_of_uint32( &info->unknown16);
1132 size+=size_of_uint32( &info->change_id);
1133 size+=size_of_uint32( &info->unknown18);
1134 size+=size_of_uint32( &info->status);
1135 size+=size_of_uint32( &info->unknown20);
1136 size+=size_of_uint32( &info->c_setprinter);
1138 size+=size_of_uint16( &info->unknown22);
1139 size+=size_of_uint16( &info->unknown23);
1140 size+=size_of_uint16( &info->unknown24);
1141 size+=size_of_uint16( &info->unknown25);
1142 size+=size_of_uint16( &info->unknown26);
1143 size+=size_of_uint16( &info->unknown27);
1144 size+=size_of_uint16( &info->unknown28);
1145 size+=size_of_uint16( &info->unknown29);
1150 /*******************************************************************
1151 return the size required by a struct in the stream
1152 ********************************************************************/
1154 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
1158 size+=size_of_uint32( &info->flags );
1159 size+=size_of_relative_string( &info->description );
1160 size+=size_of_relative_string( &info->name );
1161 size+=size_of_relative_string( &info->comment );
1166 /*******************************************************************
1167 return the size required by a struct in the stream
1168 ********************************************************************/
1170 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
1176 size += ndr_size_security_descriptor( info->secdesc, NULL, 0 );
1178 size+=size_of_device_mode( info->devmode );
1180 size+=size_of_relative_string( &info->servername );
1181 size+=size_of_relative_string( &info->printername );
1182 size+=size_of_relative_string( &info->sharename );
1183 size+=size_of_relative_string( &info->portname );
1184 size+=size_of_relative_string( &info->drivername );
1185 size+=size_of_relative_string( &info->comment );
1186 size+=size_of_relative_string( &info->location );
1188 size+=size_of_relative_string( &info->sepfile );
1189 size+=size_of_relative_string( &info->printprocessor );
1190 size+=size_of_relative_string( &info->datatype );
1191 size+=size_of_relative_string( &info->parameters );
1193 size+=size_of_uint32( &info->attributes );
1194 size+=size_of_uint32( &info->priority );
1195 size+=size_of_uint32( &info->defaultpriority );
1196 size+=size_of_uint32( &info->starttime );
1197 size+=size_of_uint32( &info->untiltime );
1198 size+=size_of_uint32( &info->status );
1199 size+=size_of_uint32( &info->cjobs );
1200 size+=size_of_uint32( &info->averageppm );
1203 * add any adjustments for alignment. This is
1204 * not optimal since we could be calling this
1205 * function from a loop (e.g. enumprinters), but
1206 * it is easier to maintain the calculation here and
1207 * not place the burden on the caller to remember. --jerry
1209 if ((size % 4) != 0)
1210 size += 4 - (size % 4);
1215 /*******************************************************************
1216 return the size required by a struct in the stream
1217 ********************************************************************/
1219 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
1223 size+=size_of_relative_string( &info->printername );
1224 size+=size_of_relative_string( &info->servername );
1226 size+=size_of_uint32( &info->attributes );
1230 /*******************************************************************
1231 return the size required by a struct in the stream
1232 ********************************************************************/
1234 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
1238 size+=size_of_relative_string( &info->printername );
1239 size+=size_of_relative_string( &info->portname );
1241 size+=size_of_uint32( &info->attributes );
1242 size+=size_of_uint32( &info->device_not_selected_timeout );
1243 size+=size_of_uint32( &info->transmission_retry_timeout );
1247 /*******************************************************************
1248 return the size required by a struct in the stream
1249 ********************************************************************/
1251 uint32 spoolss_size_printer_info_6(PRINTER_INFO_6 *info)
1253 return sizeof(uint32);
1256 /*******************************************************************
1257 return the size required by a struct in the stream
1258 ********************************************************************/
1260 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
1262 /* The 8 is for the self relative pointer - 8 byte aligned.. */
1263 return 8 + (uint32)ndr_size_security_descriptor( info->secdesc, NULL, 0 );
1266 /*******************************************************************
1267 return the size required by a struct in the stream
1268 ********************************************************************/
1270 uint32 spoolss_size_printer_info_7(PRINTER_INFO_7 *info)
1274 size+=size_of_relative_string( &info->guid );
1275 size+=size_of_uint32( &info->action );
1279 /*******************************************************************
1280 return the size required by a struct in the stream
1281 ********************************************************************/
1283 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
1286 size+=size_of_relative_string( &info->name );
1291 /*******************************************************************
1292 return the size required by a struct in the stream
1293 ********************************************************************/
1295 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
1298 size+=size_of_uint32( &info->version );
1299 size+=size_of_relative_string( &info->name );
1300 size+=size_of_relative_string( &info->architecture );
1301 size+=size_of_relative_string( &info->driverpath );
1302 size+=size_of_relative_string( &info->datafile );
1303 size+=size_of_relative_string( &info->configfile );
1308 /*******************************************************************
1309 return the size required by a string array.
1310 ********************************************************************/
1312 uint32 spoolss_size_string_array(uint16 *string)
1317 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
1319 i=i+2; /* to count all chars including the leading zero */
1320 i=2*i; /* because we need the value in bytes */
1321 i=i+4; /* the offset pointer size */
1326 /*******************************************************************
1327 return the size required by a struct in the stream
1328 ********************************************************************/
1330 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
1334 size+=size_of_uint32( &info->version );
1335 size+=size_of_relative_string( &info->name );
1336 size+=size_of_relative_string( &info->architecture );
1337 size+=size_of_relative_string( &info->driverpath );
1338 size+=size_of_relative_string( &info->datafile );
1339 size+=size_of_relative_string( &info->configfile );
1340 size+=size_of_relative_string( &info->helpfile );
1341 size+=size_of_relative_string( &info->monitorname );
1342 size+=size_of_relative_string( &info->defaultdatatype );
1344 size+=spoolss_size_string_array(info->dependentfiles);
1349 /*******************************************************************
1350 return the size required by a struct in the stream
1351 ********************************************************************/
1353 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
1357 size+=size_of_uint32( &info->version );
1358 size+=size_of_relative_string( &info->name );
1359 size+=size_of_relative_string( &info->architecture );
1360 size+=size_of_relative_string( &info->driverpath );
1361 size+=size_of_relative_string( &info->datafile );
1362 size+=size_of_relative_string( &info->configfile );
1363 size+=size_of_relative_string( &info->helpfile );
1365 size+=spoolss_size_string_array(info->dependentfiles);
1367 size+=size_of_relative_string( &info->monitorname );
1368 size+=size_of_relative_string( &info->defaultdatatype );
1370 size+=spoolss_size_string_array(info->previousdrivernames);
1372 size+=size_of_nttime(&info->driver_date);
1373 size+=size_of_uint32( &info->padding );
1374 size+=size_of_uint32( &info->driver_version_low );
1375 size+=size_of_uint32( &info->driver_version_high );
1376 size+=size_of_relative_string( &info->mfgname );
1377 size+=size_of_relative_string( &info->oem_url );
1378 size+=size_of_relative_string( &info->hardware_id );
1379 size+=size_of_relative_string( &info->provider );
1384 /*******************************************************************
1385 return the size required by a struct in the stream
1386 ********************************************************************/
1388 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
1391 size+=size_of_uint32( &info->jobid );
1392 size+=size_of_relative_string( &info->printername );
1393 size+=size_of_relative_string( &info->machinename );
1394 size+=size_of_relative_string( &info->username );
1395 size+=size_of_relative_string( &info->document );
1396 size+=size_of_relative_string( &info->datatype );
1397 size+=size_of_relative_string( &info->text_status );
1398 size+=size_of_uint32( &info->status );
1399 size+=size_of_uint32( &info->priority );
1400 size+=size_of_uint32( &info->position );
1401 size+=size_of_uint32( &info->totalpages );
1402 size+=size_of_uint32( &info->pagesprinted );
1403 size+=size_of_systemtime( &info->submitted );
1408 /*******************************************************************
1409 return the size required by a struct in the stream
1410 ********************************************************************/
1412 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
1416 size+=4; /* size of sec desc ptr */
1418 size+=size_of_uint32( &info->jobid );
1419 size+=size_of_relative_string( &info->printername );
1420 size+=size_of_relative_string( &info->machinename );
1421 size+=size_of_relative_string( &info->username );
1422 size+=size_of_relative_string( &info->document );
1423 size+=size_of_relative_string( &info->notifyname );
1424 size+=size_of_relative_string( &info->datatype );
1425 size+=size_of_relative_string( &info->printprocessor );
1426 size+=size_of_relative_string( &info->parameters );
1427 size+=size_of_relative_string( &info->drivername );
1428 size+=size_of_device_mode( info->devmode );
1429 size+=size_of_relative_string( &info->text_status );
1430 /* SEC_DESC sec_desc;*/
1431 size+=size_of_uint32( &info->status );
1432 size+=size_of_uint32( &info->priority );
1433 size+=size_of_uint32( &info->position );
1434 size+=size_of_uint32( &info->starttime );
1435 size+=size_of_uint32( &info->untiltime );
1436 size+=size_of_uint32( &info->totalpages );
1437 size+=size_of_uint32( &info->size );
1438 size+=size_of_systemtime( &info->submitted );
1439 size+=size_of_uint32( &info->timeelapsed );
1440 size+=size_of_uint32( &info->pagesprinted );
1445 /*******************************************************************
1446 return the size required by a struct in the stream
1447 ********************************************************************/
1448 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
1455 /* uint32(offset) + uint32(length) + length) */
1456 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
1457 size += (size_of_uint32(&p->data_len)*2) + p->data_len + (p->data_len%2) ;
1459 size += size_of_uint32(&p->type);
1464 /*******************************************************************
1466 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
1467 ********************************************************************/
1469 bool spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
1471 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
1477 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1479 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
1481 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
1486 if(!prs_uint32("level", ps, depth, &q_u->level))
1489 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
1495 if(!prs_uint32("offered", ps, depth, &q_u->offered))
1498 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
1500 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
1506 /*******************************************************************
1508 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
1509 ********************************************************************/
1511 bool spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
1513 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
1519 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
1524 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1526 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
1528 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
1530 if (!prs_werror("status", ps, depth, &r_u->status))
1536 /*******************************************************************
1538 ********************************************************************/
1540 bool make_spoolss_q_enumprinters(
1541 SPOOL_Q_ENUMPRINTERS *q_u,
1551 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
1552 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
1556 q_u->offered=offered;
1561 /*******************************************************************
1563 * called from spoolss_enumprinters (srv_spoolss.c)
1564 ********************************************************************/
1566 bool spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
1568 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
1574 if (!prs_uint32("flags", ps, depth, &q_u->flags))
1576 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
1579 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
1584 if (!prs_uint32("level", ps, depth, &q_u->level))
1587 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
1592 if (!prs_uint32("offered", ps, depth, &q_u->offered))
1598 /*******************************************************************
1599 Parse a SPOOL_R_ENUMPRINTERS structure.
1600 ********************************************************************/
1602 bool spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
1604 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
1610 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
1616 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1619 if (!prs_uint32("returned", ps, depth, &r_u->returned))
1622 if (!prs_werror("status", ps, depth, &r_u->status))
1628 /*******************************************************************
1629 * write a structure.
1630 * called from spoolss_r_enum_printers (srv_spoolss.c)
1632 ********************************************************************/
1634 bool spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
1636 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
1642 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
1648 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1651 if (!prs_werror("status", ps, depth, &r_u->status))
1657 /*******************************************************************
1659 * called from spoolss_getprinter (srv_spoolss.c)
1660 ********************************************************************/
1662 bool spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
1664 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
1670 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1672 if (!prs_uint32("level", ps, depth, &q_u->level))
1675 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
1680 if (!prs_uint32("offered", ps, depth, &q_u->offered))
1686 /*******************************************************************
1687 ********************************************************************/
1689 bool spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
1691 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
1697 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
1703 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1706 if (!prs_uint32("returned", ps, depth, &r_u->returned))
1709 if (!prs_werror("status", ps, depth, &r_u->status))
1715 /*******************************************************************
1716 ********************************************************************/
1718 bool make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
1729 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1730 q_u->firstjob = firstjob;
1731 q_u->numofjobs = numofjobs;
1733 q_u->buffer= buffer;
1734 q_u->offered = offered;
1738 /*******************************************************************
1739 ********************************************************************/
1741 bool spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
1743 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
1749 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
1752 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
1754 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
1756 if (!prs_uint32("level", ps, depth, &q_u->level))
1759 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
1765 if (!prs_uint32("offered", ps, depth, &q_u->offered))
1771 /*******************************************************************
1772 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
1773 ********************************************************************/
1775 bool spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
1777 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
1783 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
1789 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1792 if (!prs_uint32("returned", ps, depth, &r_u->returned))
1795 if (!prs_werror("status", ps, depth, &r_u->status))
1801 /*******************************************************************
1803 ********************************************************************/
1805 bool make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
1807 const char *environment,
1809 RPC_BUFFER *buffer, uint32 offered)
1811 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
1812 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
1816 q_u->offered=offered;
1821 /*******************************************************************
1822 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
1823 ********************************************************************/
1825 bool spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
1828 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
1834 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
1836 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
1841 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
1843 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
1848 if (!prs_uint32("level", ps, depth, &q_u->level))
1851 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
1857 if (!prs_uint32("offered", ps, depth, &q_u->offered))
1863 /*******************************************************************
1864 make a BUFFER5 struct from a uint16*
1865 ******************************************************************/
1867 bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
1870 buf5->buf_len = len;
1873 if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
1874 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
1878 buf5->buffer = NULL;
1887 /*******************************************************************
1888 ********************************************************************/
1890 bool spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
1892 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
1897 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
1900 if (UNMARSHALLING(ps) && r_u->valuesize) {
1901 r_u->value = PRS_ALLOC_MEM(ps, uint16, r_u->valuesize);
1903 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
1908 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
1914 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
1917 if(!prs_uint32("type", ps, depth, &r_u->type))
1920 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
1923 if (UNMARSHALLING(ps) && r_u->datasize) {
1924 r_u->data = PRS_ALLOC_MEM(ps, uint8, r_u->datasize);
1926 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
1931 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
1936 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
1938 if(!prs_werror("status", ps, depth, &r_u->status))
1944 /*******************************************************************
1945 ********************************************************************/
1947 bool spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
1949 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
1954 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1956 if(!prs_uint32("index", ps, depth, &q_u->index))
1958 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
1960 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
1966 /*******************************************************************
1967 ********************************************************************/
1969 bool make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
1970 const POLICY_HND *hnd,
1971 uint32 idx, uint32 valuelen, uint32 datalen)
1973 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1975 q_u->valuesize=valuelen;
1976 q_u->datasize=datalen;
1981 /*******************************************************************
1982 ********************************************************************/
1984 bool make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
1985 const POLICY_HND *hnd, const char *key,
1988 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1989 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
1995 /*******************************************************************
1996 ********************************************************************/
1997 bool make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
1998 char* value, uint32 data_type, char* data, uint32 data_size)
2000 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2001 q_u->type = data_type;
2002 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
2004 q_u->max_len = q_u->real_len = data_size;
2005 q_u->data = (unsigned char *)data;
2010 /*******************************************************************
2011 ********************************************************************/
2013 bool spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
2015 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
2020 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2022 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
2028 if(!prs_uint32("type", ps, depth, &q_u->type))
2031 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
2041 if (UNMARSHALLING(ps))
2042 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
2043 if(q_u->data == NULL)
2045 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
2053 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
2059 /*******************************************************************
2060 ********************************************************************/
2062 bool spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
2064 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
2069 if(!prs_werror("status", ps, depth, &r_u->status))
2075 /*******************************************************************
2076 Parse a SPOOL_R_GETJOB structure.
2077 ********************************************************************/
2079 bool spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
2081 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
2087 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2093 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2096 if (!prs_werror("status", ps, depth, &r_u->status))
2102 /*******************************************************************
2103 Parse a SPOOL_Q_GETJOB structure.
2104 ********************************************************************/
2106 bool spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
2108 prs_debug(ps, depth, desc, "");
2114 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
2116 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
2118 if(!prs_uint32("level", ps, depth, &q_u->level))
2121 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2127 if(!prs_uint32("offered", ps, depth, &q_u->offered))
2133 void free_devmode(DEVICEMODE *devmode)
2135 if (devmode!=NULL) {
2136 SAFE_FREE(devmode->dev_private);
2141 void free_printer_info_1(PRINTER_INFO_1 *printer)
2146 void free_printer_info_2(PRINTER_INFO_2 *printer)
2148 if (printer!=NULL) {
2149 free_devmode(printer->devmode);
2150 printer->devmode = NULL;
2155 void free_printer_info_3(PRINTER_INFO_3 *printer)
2160 void free_printer_info_4(PRINTER_INFO_4 *printer)
2165 void free_printer_info_5(PRINTER_INFO_5 *printer)
2170 void free_printer_info_6(PRINTER_INFO_6 *printer)
2175 void free_printer_info_7(PRINTER_INFO_7 *printer)
2180 void free_job_info_2(JOB_INFO_2 *job)
2183 free_devmode(job->devmode);
2186 /*******************************************************************
2188 ********************************************************************/
2189 bool make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u,
2190 POLICY_HND *hnd, const char *key,
2193 DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
2195 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2196 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
2202 /*******************************************************************
2204 ********************************************************************/
2206 bool spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
2208 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
2213 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2216 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
2222 if(!prs_uint32("size", ps, depth, &q_u->size))
2228 /*******************************************************************
2229 * write a structure.
2230 ********************************************************************/
2232 bool spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
2234 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
2240 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
2246 if(!prs_uint32("needed", ps, depth, &r_u->needed))
2249 if(!prs_werror("status", ps, depth, &r_u->status))
2255 /*******************************************************************
2257 ********************************************************************/
2259 bool spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
2261 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
2266 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2269 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
2275 if(!prs_uint32("size", ps, depth, &q_u->size))
2281 /*******************************************************************
2282 ********************************************************************/
2284 static bool spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
2285 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
2288 uint32 valuename_offset,
2291 const uint32 basic_unit = 20; /* size of static portion of enum_values */
2293 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
2297 * offset data begins at 20 bytes per structure * size_of_array.
2298 * Don't forget the uint32 at the beginning
2301 current_offset = basic_unit * ctr->size_of_array;
2303 /* first loop to write basic enum_value information */
2305 if (UNMARSHALLING(ps) && ctr->size_of_array) {
2306 ctr->values = PRS_ALLOC_MEM(ps, PRINTER_ENUM_VALUES, ctr->size_of_array);
2311 for (i=0; i<ctr->size_of_array; i++) {
2312 uint32 base_offset, return_offset;
2314 base_offset = prs_offset(ps);
2316 valuename_offset = current_offset;
2317 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
2320 /* Read or write the value. */
2322 return_offset = prs_offset(ps);
2324 if (!prs_set_offset(ps, base_offset + valuename_offset)) {
2328 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
2332 if (!prs_set_offset(ps, return_offset))
2335 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
2338 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
2341 data_offset = ctr->values[i].value_len + valuename_offset;
2343 if (!prs_uint32("data_offset", ps, depth, &data_offset))
2346 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
2349 /* Read or write the data. */
2351 return_offset = prs_offset(ps);
2353 if (!prs_set_offset(ps, base_offset + data_offset)) {
2357 if ( ctr->values[i].data_len ) {
2358 if ( UNMARSHALLING(ps) ) {
2359 ctr->values[i].data = PRS_ALLOC_MEM(ps, uint8, ctr->values[i].data_len);
2360 if (!ctr->values[i].data)
2363 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
2367 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
2368 /* account for 2 byte alignment */
2369 current_offset += (current_offset % 2);
2371 /* Remember how far we got. */
2372 data_offset = prs_offset(ps);
2375 if (!prs_set_offset(ps, return_offset))
2380 /* Go to the last data offset we got to. */
2382 if (!prs_set_offset(ps, data_offset))
2385 /* And ensure we're 2 byte aligned. */
2387 if ( !prs_align_uint16(ps) )
2393 /*******************************************************************
2394 * write a structure.
2395 ********************************************************************/
2397 bool spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
2399 uint32 data_offset, end_offset;
2400 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
2406 if (!prs_uint32("size", ps, depth, &r_u->ctr.size))
2409 data_offset = prs_offset(ps);
2411 if (!prs_set_offset(ps, data_offset + r_u->ctr.size))
2417 if(!prs_uint32("needed", ps, depth, &r_u->needed))
2420 if(!prs_uint32("returned", ps, depth, &r_u->returned))
2423 if(!prs_werror("status", ps, depth, &r_u->status))
2426 r_u->ctr.size_of_array = r_u->returned;
2428 end_offset = prs_offset(ps);
2430 if (!prs_set_offset(ps, data_offset))
2434 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
2437 if (!prs_set_offset(ps, end_offset))