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 PORT_INFO_1 structure.
833 ********************************************************************/
835 bool smb_io_port_info_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
837 prs_struct *ps=&buffer->prs;
839 prs_debug(ps, depth, desc, "smb_io_port_info_1");
842 buffer->struct_start=prs_offset(ps);
844 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
850 /*******************************************************************
851 Parse a PORT_INFO_2 structure.
852 ********************************************************************/
854 bool smb_io_port_info_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
856 prs_struct *ps=&buffer->prs;
858 prs_debug(ps, depth, desc, "smb_io_port_info_2");
861 buffer->struct_start=prs_offset(ps);
863 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
865 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
867 if (!smb_io_relstr("description", buffer, depth, &info->description))
869 if (!prs_uint32("port_type", ps, depth, &info->port_type))
871 if (!prs_uint32("reserved", ps, depth, &info->reserved))
877 /*******************************************************************
878 Parse a DRIVER_INFO_1 structure.
879 ********************************************************************/
881 bool smb_io_printer_driver_info_1(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
883 prs_struct *ps=&buffer->prs;
885 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
888 buffer->struct_start=prs_offset(ps);
890 if (!smb_io_relstr("name", buffer, depth, &info->name))
896 /*******************************************************************
897 Parse a DRIVER_INFO_2 structure.
898 ********************************************************************/
900 bool smb_io_printer_driver_info_2(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
902 prs_struct *ps=&buffer->prs;
904 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
907 buffer->struct_start=prs_offset(ps);
909 if (!prs_uint32("version", ps, depth, &info->version))
911 if (!smb_io_relstr("name", buffer, depth, &info->name))
913 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
915 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
917 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
919 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
925 /*******************************************************************
926 Parse a DRIVER_INFO_3 structure.
927 ********************************************************************/
929 bool smb_io_printer_driver_info_3(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
931 prs_struct *ps=&buffer->prs;
933 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
936 buffer->struct_start=prs_offset(ps);
938 if (!prs_uint32("version", ps, depth, &info->version))
940 if (!smb_io_relstr("name", buffer, depth, &info->name))
942 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
944 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
946 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
948 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
950 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
953 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
956 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
958 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
964 /*******************************************************************
965 Parse a DRIVER_INFO_6 structure.
966 ********************************************************************/
968 bool smb_io_printer_driver_info_6(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
970 prs_struct *ps=&buffer->prs;
972 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
975 buffer->struct_start=prs_offset(ps);
977 if (!prs_uint32("version", ps, depth, &info->version))
979 if (!smb_io_relstr("name", buffer, depth, &info->name))
981 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
983 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
985 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
987 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
989 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
992 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
995 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
997 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
1000 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
1003 if (!prs_uint64("date", ps, depth, &info->driver_date))
1006 if (!prs_uint32("padding", ps, depth, &info->padding))
1009 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
1012 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
1015 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
1017 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
1019 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
1021 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
1027 /*******************************************************************
1028 Parse a JOB_INFO_1 structure.
1029 ********************************************************************/
1031 bool smb_io_job_info_1(const char *desc, RPC_BUFFER *buffer, JOB_INFO_1 *info, int depth)
1033 prs_struct *ps=&buffer->prs;
1035 prs_debug(ps, depth, desc, "smb_io_job_info_1");
1038 buffer->struct_start=prs_offset(ps);
1040 if (!prs_uint32("jobid", ps, depth, &info->jobid))
1042 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1044 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
1046 if (!smb_io_relstr("username", buffer, depth, &info->username))
1048 if (!smb_io_relstr("document", buffer, depth, &info->document))
1050 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
1052 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
1054 if (!prs_uint32("status", ps, depth, &info->status))
1056 if (!prs_uint32("priority", ps, depth, &info->priority))
1058 if (!prs_uint32("position", ps, depth, &info->position))
1060 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
1062 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
1064 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
1070 /*******************************************************************
1071 Parse a JOB_INFO_2 structure.
1072 ********************************************************************/
1074 bool smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, int depth)
1077 prs_struct *ps=&buffer->prs;
1079 prs_debug(ps, depth, desc, "smb_io_job_info_2");
1082 buffer->struct_start=prs_offset(ps);
1084 if (!prs_uint32("jobid",ps, depth, &info->jobid))
1086 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1088 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
1090 if (!smb_io_relstr("username", buffer, depth, &info->username))
1092 if (!smb_io_relstr("document", buffer, depth, &info->document))
1094 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
1096 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
1099 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1101 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
1103 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
1105 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1107 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
1110 /* SEC_DESC sec_desc;*/
1111 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
1114 if (!prs_uint32("status",ps, depth, &info->status))
1116 if (!prs_uint32("priority",ps, depth, &info->priority))
1118 if (!prs_uint32("position",ps, depth, &info->position))
1120 if (!prs_uint32("starttime",ps, depth, &info->starttime))
1122 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
1124 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
1126 if (!prs_uint32("size",ps, depth, &info->size))
1128 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
1130 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
1132 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
1138 /*******************************************************************
1139 ********************************************************************/
1141 bool smb_io_form_1(const char *desc, RPC_BUFFER *buffer, FORM_1 *info, int depth)
1143 prs_struct *ps=&buffer->prs;
1145 prs_debug(ps, depth, desc, "smb_io_form_1");
1148 buffer->struct_start=prs_offset(ps);
1150 if (!prs_uint32("flag", ps, depth, &info->flag))
1153 if (!smb_io_relstr("name", buffer, depth, &info->name))
1156 if (!prs_uint32("width", ps, depth, &info->width))
1158 if (!prs_uint32("length", ps, depth, &info->length))
1160 if (!prs_uint32("left", ps, depth, &info->left))
1162 if (!prs_uint32("top", ps, depth, &info->top))
1164 if (!prs_uint32("right", ps, depth, &info->right))
1166 if (!prs_uint32("bottom", ps, depth, &info->bottom))
1172 /*******************************************************************
1173 Parse a PORT_INFO_1 structure.
1174 ********************************************************************/
1176 bool smb_io_port_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
1178 prs_struct *ps=&buffer->prs;
1180 prs_debug(ps, depth, desc, "smb_io_port_1");
1183 buffer->struct_start=prs_offset(ps);
1185 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
1191 /*******************************************************************
1192 Parse a PORT_INFO_2 structure.
1193 ********************************************************************/
1195 bool smb_io_port_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
1197 prs_struct *ps=&buffer->prs;
1199 prs_debug(ps, depth, desc, "smb_io_port_2");
1202 buffer->struct_start=prs_offset(ps);
1204 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
1206 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
1208 if(!smb_io_relstr("description", buffer, depth, &info->description))
1210 if(!prs_uint32("port_type", ps, depth, &info->port_type))
1212 if(!prs_uint32("reserved", ps, depth, &info->reserved))
1218 /*******************************************************************
1219 ********************************************************************/
1221 bool smb_io_printprocessor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
1223 prs_struct *ps=&buffer->prs;
1225 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
1228 buffer->struct_start=prs_offset(ps);
1230 if (smb_io_relstr("name", buffer, depth, &info->name))
1236 /*******************************************************************
1237 ********************************************************************/
1239 bool smb_io_printprocdatatype_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
1241 prs_struct *ps=&buffer->prs;
1243 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
1246 buffer->struct_start=prs_offset(ps);
1248 if (smb_io_relstr("name", buffer, depth, &info->name))
1254 /*******************************************************************
1255 ********************************************************************/
1257 bool smb_io_printmonitor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
1259 prs_struct *ps=&buffer->prs;
1261 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
1264 buffer->struct_start=prs_offset(ps);
1266 if (!smb_io_relstr("name", buffer, depth, &info->name))
1272 /*******************************************************************
1273 ********************************************************************/
1275 bool smb_io_printmonitor_info_2(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
1277 prs_struct *ps=&buffer->prs;
1279 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
1282 buffer->struct_start=prs_offset(ps);
1284 if (!smb_io_relstr("name", buffer, depth, &info->name))
1286 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
1288 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
1294 /*******************************************************************
1295 return the size required by a struct in the stream
1296 ********************************************************************/
1298 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
1302 size+=size_of_relative_string( &info->printername );
1303 size+=size_of_relative_string( &info->servername );
1305 size+=size_of_uint32( &info->cjobs);
1306 size+=size_of_uint32( &info->total_jobs);
1307 size+=size_of_uint32( &info->total_bytes);
1309 size+=size_of_uint16( &info->year);
1310 size+=size_of_uint16( &info->month);
1311 size+=size_of_uint16( &info->dayofweek);
1312 size+=size_of_uint16( &info->day);
1313 size+=size_of_uint16( &info->hour);
1314 size+=size_of_uint16( &info->minute);
1315 size+=size_of_uint16( &info->second);
1316 size+=size_of_uint16( &info->milliseconds);
1318 size+=size_of_uint32( &info->global_counter);
1319 size+=size_of_uint32( &info->total_pages);
1321 size+=size_of_uint16( &info->major_version);
1322 size+=size_of_uint16( &info->build_version);
1324 size+=size_of_uint32( &info->unknown7);
1325 size+=size_of_uint32( &info->unknown8);
1326 size+=size_of_uint32( &info->unknown9);
1327 size+=size_of_uint32( &info->session_counter);
1328 size+=size_of_uint32( &info->unknown11);
1329 size+=size_of_uint32( &info->printer_errors);
1330 size+=size_of_uint32( &info->unknown13);
1331 size+=size_of_uint32( &info->unknown14);
1332 size+=size_of_uint32( &info->unknown15);
1333 size+=size_of_uint32( &info->unknown16);
1334 size+=size_of_uint32( &info->change_id);
1335 size+=size_of_uint32( &info->unknown18);
1336 size+=size_of_uint32( &info->status);
1337 size+=size_of_uint32( &info->unknown20);
1338 size+=size_of_uint32( &info->c_setprinter);
1340 size+=size_of_uint16( &info->unknown22);
1341 size+=size_of_uint16( &info->unknown23);
1342 size+=size_of_uint16( &info->unknown24);
1343 size+=size_of_uint16( &info->unknown25);
1344 size+=size_of_uint16( &info->unknown26);
1345 size+=size_of_uint16( &info->unknown27);
1346 size+=size_of_uint16( &info->unknown28);
1347 size+=size_of_uint16( &info->unknown29);
1352 /*******************************************************************
1353 return the size required by a struct in the stream
1354 ********************************************************************/
1356 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
1360 size+=size_of_uint32( &info->flags );
1361 size+=size_of_relative_string( &info->description );
1362 size+=size_of_relative_string( &info->name );
1363 size+=size_of_relative_string( &info->comment );
1368 /*******************************************************************
1369 return the size required by a struct in the stream
1370 ********************************************************************/
1372 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
1378 size += ndr_size_security_descriptor( info->secdesc, NULL, 0 );
1380 size+=size_of_device_mode( info->devmode );
1382 size+=size_of_relative_string( &info->servername );
1383 size+=size_of_relative_string( &info->printername );
1384 size+=size_of_relative_string( &info->sharename );
1385 size+=size_of_relative_string( &info->portname );
1386 size+=size_of_relative_string( &info->drivername );
1387 size+=size_of_relative_string( &info->comment );
1388 size+=size_of_relative_string( &info->location );
1390 size+=size_of_relative_string( &info->sepfile );
1391 size+=size_of_relative_string( &info->printprocessor );
1392 size+=size_of_relative_string( &info->datatype );
1393 size+=size_of_relative_string( &info->parameters );
1395 size+=size_of_uint32( &info->attributes );
1396 size+=size_of_uint32( &info->priority );
1397 size+=size_of_uint32( &info->defaultpriority );
1398 size+=size_of_uint32( &info->starttime );
1399 size+=size_of_uint32( &info->untiltime );
1400 size+=size_of_uint32( &info->status );
1401 size+=size_of_uint32( &info->cjobs );
1402 size+=size_of_uint32( &info->averageppm );
1405 * add any adjustments for alignment. This is
1406 * not optimal since we could be calling this
1407 * function from a loop (e.g. enumprinters), but
1408 * it is easier to maintain the calculation here and
1409 * not place the burden on the caller to remember. --jerry
1411 if ((size % 4) != 0)
1412 size += 4 - (size % 4);
1417 /*******************************************************************
1418 return the size required by a struct in the stream
1419 ********************************************************************/
1421 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
1425 size+=size_of_relative_string( &info->printername );
1426 size+=size_of_relative_string( &info->servername );
1428 size+=size_of_uint32( &info->attributes );
1432 /*******************************************************************
1433 return the size required by a struct in the stream
1434 ********************************************************************/
1436 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
1440 size+=size_of_relative_string( &info->printername );
1441 size+=size_of_relative_string( &info->portname );
1443 size+=size_of_uint32( &info->attributes );
1444 size+=size_of_uint32( &info->device_not_selected_timeout );
1445 size+=size_of_uint32( &info->transmission_retry_timeout );
1449 /*******************************************************************
1450 return the size required by a struct in the stream
1451 ********************************************************************/
1453 uint32 spoolss_size_printer_info_6(PRINTER_INFO_6 *info)
1455 return sizeof(uint32);
1458 /*******************************************************************
1459 return the size required by a struct in the stream
1460 ********************************************************************/
1462 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
1464 /* The 8 is for the self relative pointer - 8 byte aligned.. */
1465 return 8 + (uint32)ndr_size_security_descriptor( info->secdesc, NULL, 0 );
1468 /*******************************************************************
1469 return the size required by a struct in the stream
1470 ********************************************************************/
1472 uint32 spoolss_size_printer_info_7(PRINTER_INFO_7 *info)
1476 size+=size_of_relative_string( &info->guid );
1477 size+=size_of_uint32( &info->action );
1481 /*******************************************************************
1482 return the size required by a struct in the stream
1483 ********************************************************************/
1485 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
1488 size+=size_of_relative_string( &info->name );
1493 /*******************************************************************
1494 return the size required by a struct in the stream
1495 ********************************************************************/
1497 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
1500 size+=size_of_uint32( &info->version );
1501 size+=size_of_relative_string( &info->name );
1502 size+=size_of_relative_string( &info->architecture );
1503 size+=size_of_relative_string( &info->driverpath );
1504 size+=size_of_relative_string( &info->datafile );
1505 size+=size_of_relative_string( &info->configfile );
1510 /*******************************************************************
1511 return the size required by a string array.
1512 ********************************************************************/
1514 uint32 spoolss_size_string_array(uint16 *string)
1519 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
1521 i=i+2; /* to count all chars including the leading zero */
1522 i=2*i; /* because we need the value in bytes */
1523 i=i+4; /* the offset pointer size */
1528 /*******************************************************************
1529 return the size required by a struct in the stream
1530 ********************************************************************/
1532 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
1536 size+=size_of_uint32( &info->version );
1537 size+=size_of_relative_string( &info->name );
1538 size+=size_of_relative_string( &info->architecture );
1539 size+=size_of_relative_string( &info->driverpath );
1540 size+=size_of_relative_string( &info->datafile );
1541 size+=size_of_relative_string( &info->configfile );
1542 size+=size_of_relative_string( &info->helpfile );
1543 size+=size_of_relative_string( &info->monitorname );
1544 size+=size_of_relative_string( &info->defaultdatatype );
1546 size+=spoolss_size_string_array(info->dependentfiles);
1551 /*******************************************************************
1552 return the size required by a struct in the stream
1553 ********************************************************************/
1555 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
1559 size+=size_of_uint32( &info->version );
1560 size+=size_of_relative_string( &info->name );
1561 size+=size_of_relative_string( &info->architecture );
1562 size+=size_of_relative_string( &info->driverpath );
1563 size+=size_of_relative_string( &info->datafile );
1564 size+=size_of_relative_string( &info->configfile );
1565 size+=size_of_relative_string( &info->helpfile );
1567 size+=spoolss_size_string_array(info->dependentfiles);
1569 size+=size_of_relative_string( &info->monitorname );
1570 size+=size_of_relative_string( &info->defaultdatatype );
1572 size+=spoolss_size_string_array(info->previousdrivernames);
1574 size+=size_of_nttime(&info->driver_date);
1575 size+=size_of_uint32( &info->padding );
1576 size+=size_of_uint32( &info->driver_version_low );
1577 size+=size_of_uint32( &info->driver_version_high );
1578 size+=size_of_relative_string( &info->mfgname );
1579 size+=size_of_relative_string( &info->oem_url );
1580 size+=size_of_relative_string( &info->hardware_id );
1581 size+=size_of_relative_string( &info->provider );
1586 /*******************************************************************
1587 return the size required by a struct in the stream
1588 ********************************************************************/
1590 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
1593 size+=size_of_uint32( &info->jobid );
1594 size+=size_of_relative_string( &info->printername );
1595 size+=size_of_relative_string( &info->machinename );
1596 size+=size_of_relative_string( &info->username );
1597 size+=size_of_relative_string( &info->document );
1598 size+=size_of_relative_string( &info->datatype );
1599 size+=size_of_relative_string( &info->text_status );
1600 size+=size_of_uint32( &info->status );
1601 size+=size_of_uint32( &info->priority );
1602 size+=size_of_uint32( &info->position );
1603 size+=size_of_uint32( &info->totalpages );
1604 size+=size_of_uint32( &info->pagesprinted );
1605 size+=size_of_systemtime( &info->submitted );
1610 /*******************************************************************
1611 return the size required by a struct in the stream
1612 ********************************************************************/
1614 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
1618 size+=4; /* size of sec desc ptr */
1620 size+=size_of_uint32( &info->jobid );
1621 size+=size_of_relative_string( &info->printername );
1622 size+=size_of_relative_string( &info->machinename );
1623 size+=size_of_relative_string( &info->username );
1624 size+=size_of_relative_string( &info->document );
1625 size+=size_of_relative_string( &info->notifyname );
1626 size+=size_of_relative_string( &info->datatype );
1627 size+=size_of_relative_string( &info->printprocessor );
1628 size+=size_of_relative_string( &info->parameters );
1629 size+=size_of_relative_string( &info->drivername );
1630 size+=size_of_device_mode( info->devmode );
1631 size+=size_of_relative_string( &info->text_status );
1632 /* SEC_DESC sec_desc;*/
1633 size+=size_of_uint32( &info->status );
1634 size+=size_of_uint32( &info->priority );
1635 size+=size_of_uint32( &info->position );
1636 size+=size_of_uint32( &info->starttime );
1637 size+=size_of_uint32( &info->untiltime );
1638 size+=size_of_uint32( &info->totalpages );
1639 size+=size_of_uint32( &info->size );
1640 size+=size_of_systemtime( &info->submitted );
1641 size+=size_of_uint32( &info->timeelapsed );
1642 size+=size_of_uint32( &info->pagesprinted );
1647 /*******************************************************************
1648 return the size required by a struct in the stream
1649 ********************************************************************/
1651 uint32 spoolss_size_form_1(FORM_1 *info)
1655 size+=size_of_uint32( &info->flag );
1656 size+=size_of_relative_string( &info->name );
1657 size+=size_of_uint32( &info->width );
1658 size+=size_of_uint32( &info->length );
1659 size+=size_of_uint32( &info->left );
1660 size+=size_of_uint32( &info->top );
1661 size+=size_of_uint32( &info->right );
1662 size+=size_of_uint32( &info->bottom );
1667 /*******************************************************************
1668 return the size required by a struct in the stream
1669 ********************************************************************/
1671 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
1675 size+=size_of_relative_string( &info->port_name );
1680 /*******************************************************************
1681 return the size required by a struct in the stream
1682 ********************************************************************/
1684 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
1688 size+=size_of_relative_string( &info->port_name );
1689 size+=size_of_relative_string( &info->monitor_name );
1690 size+=size_of_relative_string( &info->description );
1692 size+=size_of_uint32( &info->port_type );
1693 size+=size_of_uint32( &info->reserved );
1698 /*******************************************************************
1699 return the size required by a struct in the stream
1700 ********************************************************************/
1702 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
1705 size+=size_of_relative_string( &info->name );
1710 /*******************************************************************
1711 return the size required by a struct in the stream
1712 ********************************************************************/
1714 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
1717 size+=size_of_relative_string( &info->name );
1722 /*******************************************************************
1723 return the size required by a struct in the stream
1724 ********************************************************************/
1725 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
1732 /* uint32(offset) + uint32(length) + length) */
1733 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
1734 size += (size_of_uint32(&p->data_len)*2) + p->data_len + (p->data_len%2) ;
1736 size += size_of_uint32(&p->type);
1741 /*******************************************************************
1742 return the size required by a struct in the stream
1743 ********************************************************************/
1745 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
1748 size+=size_of_relative_string( &info->name );
1753 /*******************************************************************
1754 return the size required by a struct in the stream
1755 ********************************************************************/
1757 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
1760 size+=size_of_relative_string( &info->name);
1761 size+=size_of_relative_string( &info->environment);
1762 size+=size_of_relative_string( &info->dll_name);
1767 /*******************************************************************
1769 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
1770 ********************************************************************/
1772 bool spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
1774 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
1780 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1782 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
1784 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
1789 if(!prs_uint32("level", ps, depth, &q_u->level))
1792 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
1798 if(!prs_uint32("offered", ps, depth, &q_u->offered))
1801 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
1803 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
1809 /*******************************************************************
1811 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
1812 ********************************************************************/
1814 bool spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
1816 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
1822 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
1827 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1829 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
1831 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
1833 if (!prs_werror("status", ps, depth, &r_u->status))
1839 /*******************************************************************
1841 ********************************************************************/
1843 bool make_spoolss_q_enumprinters(
1844 SPOOL_Q_ENUMPRINTERS *q_u,
1854 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
1855 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
1859 q_u->offered=offered;
1864 /*******************************************************************
1866 ********************************************************************/
1868 bool make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
1869 fstring servername, uint32 level,
1870 RPC_BUFFER *buffer, uint32 offered)
1872 q_u->name_ptr = (servername != NULL) ? 1 : 0;
1873 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
1877 q_u->offered=offered;
1882 /*******************************************************************
1884 * called from spoolss_enumprinters (srv_spoolss.c)
1885 ********************************************************************/
1887 bool spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
1889 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
1895 if (!prs_uint32("flags", ps, depth, &q_u->flags))
1897 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
1900 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
1905 if (!prs_uint32("level", ps, depth, &q_u->level))
1908 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
1913 if (!prs_uint32("offered", ps, depth, &q_u->offered))
1919 /*******************************************************************
1920 Parse a SPOOL_R_ENUMPRINTERS structure.
1921 ********************************************************************/
1923 bool spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
1925 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
1931 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
1937 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1940 if (!prs_uint32("returned", ps, depth, &r_u->returned))
1943 if (!prs_werror("status", ps, depth, &r_u->status))
1949 /*******************************************************************
1950 * write a structure.
1951 * called from spoolss_r_enum_printers (srv_spoolss.c)
1953 ********************************************************************/
1955 bool spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
1957 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
1963 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
1969 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1972 if (!prs_werror("status", ps, depth, &r_u->status))
1978 /*******************************************************************
1980 * called from spoolss_getprinter (srv_spoolss.c)
1981 ********************************************************************/
1983 bool spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
1985 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
1991 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1993 if (!prs_uint32("level", ps, depth, &q_u->level))
1996 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2001 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2007 /*******************************************************************
2008 ********************************************************************/
2010 bool spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
2012 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
2018 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2024 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2027 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2030 if (!prs_werror("status", ps, depth, &r_u->status))
2036 /*******************************************************************
2037 ********************************************************************/
2039 bool make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
2050 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2051 q_u->firstjob = firstjob;
2052 q_u->numofjobs = numofjobs;
2054 q_u->buffer= buffer;
2055 q_u->offered = offered;
2059 /*******************************************************************
2060 ********************************************************************/
2062 bool spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
2064 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
2070 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
2073 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
2075 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
2077 if (!prs_uint32("level", ps, depth, &q_u->level))
2080 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2086 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2092 /*******************************************************************
2093 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
2094 ********************************************************************/
2096 bool spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
2098 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
2104 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2110 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2113 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2116 if (!prs_werror("status", ps, depth, &r_u->status))
2122 /*******************************************************************
2124 ********************************************************************/
2126 bool make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
2128 const char *environment,
2130 RPC_BUFFER *buffer, uint32 offered)
2132 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
2133 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
2137 q_u->offered=offered;
2142 /*******************************************************************
2143 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
2144 ********************************************************************/
2146 bool spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
2149 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
2155 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
2157 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
2162 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
2164 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
2169 if (!prs_uint32("level", ps, depth, &q_u->level))
2172 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2178 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2184 /*******************************************************************
2185 ********************************************************************/
2187 bool spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
2190 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
2195 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
2197 if (!prs_uint32("level", ps, depth, &q_u->level))
2200 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2205 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2211 /*******************************************************************
2212 ********************************************************************/
2214 bool spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
2216 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
2222 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2228 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
2231 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
2234 if (!prs_werror("status", ps, depth, &r_u->status))
2240 /*******************************************************************
2241 Parse a SPOOL_R_ENUMPORTS structure.
2242 ********************************************************************/
2244 bool spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
2246 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
2252 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2258 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2261 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2264 if (!prs_werror("status", ps, depth, &r_u->status))
2270 /*******************************************************************
2271 ********************************************************************/
2273 bool spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
2275 prs_debug(ps, depth, desc, "");
2281 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
2283 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
2288 if (!prs_uint32("level", ps, depth, &q_u->level))
2291 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2296 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2302 /*******************************************************************
2303 make a BUFFER5 struct from a uint16*
2304 ******************************************************************/
2306 bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
2309 buf5->buf_len = len;
2312 if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
2313 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
2317 buf5->buffer = NULL;
2326 /*******************************************************************
2327 ********************************************************************/
2329 bool spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
2331 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
2337 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2343 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2346 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2349 if (!prs_werror("status", ps, depth, &r_u->status))
2355 /*******************************************************************
2356 ********************************************************************/
2358 bool spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
2360 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
2366 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
2368 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
2374 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
2376 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
2382 if (!prs_uint32("level", ps, depth, &q_u->level))
2385 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2391 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2397 /*******************************************************************
2398 ********************************************************************/
2400 bool spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
2402 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
2408 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2414 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2417 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2420 if (!prs_werror("status", ps, depth, &r_u->status))
2426 /*******************************************************************
2427 ********************************************************************/
2429 bool spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
2431 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
2437 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
2439 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
2445 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
2447 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
2453 if (!prs_uint32("level", ps, depth, &q_u->level))
2456 if(!prs_rpcbuffer_p("buffer", ps, depth, &q_u->buffer))
2462 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2468 /*******************************************************************
2469 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
2470 ********************************************************************/
2472 bool spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
2474 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
2480 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
2482 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
2488 if (!prs_uint32("level", ps, depth, &q_u->level))
2491 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2497 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2503 /*******************************************************************
2504 ********************************************************************/
2506 bool spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
2508 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
2514 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2520 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2523 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2526 if (!prs_werror("status", ps, depth, &r_u->status))
2532 /*******************************************************************
2533 ********************************************************************/
2535 bool spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
2537 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
2542 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
2545 if (UNMARSHALLING(ps) && r_u->valuesize) {
2546 r_u->value = PRS_ALLOC_MEM(ps, uint16, r_u->valuesize);
2548 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
2553 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
2559 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
2562 if(!prs_uint32("type", ps, depth, &r_u->type))
2565 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
2568 if (UNMARSHALLING(ps) && r_u->datasize) {
2569 r_u->data = PRS_ALLOC_MEM(ps, uint8, r_u->datasize);
2571 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
2576 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
2581 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
2583 if(!prs_werror("status", ps, depth, &r_u->status))
2589 /*******************************************************************
2590 ********************************************************************/
2592 bool spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
2594 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
2599 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
2601 if(!prs_uint32("index", ps, depth, &q_u->index))
2603 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
2605 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
2611 /*******************************************************************
2612 ********************************************************************/
2614 bool make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
2615 const POLICY_HND *hnd,
2616 uint32 idx, uint32 valuelen, uint32 datalen)
2618 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2620 q_u->valuesize=valuelen;
2621 q_u->datasize=datalen;
2626 /*******************************************************************
2627 ********************************************************************/
2629 bool make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
2630 const POLICY_HND *hnd, const char *key,
2633 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2634 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
2640 /*******************************************************************
2641 ********************************************************************/
2642 bool make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
2643 char* value, uint32 data_type, char* data, uint32 data_size)
2645 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2646 q_u->type = data_type;
2647 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
2649 q_u->max_len = q_u->real_len = data_size;
2650 q_u->data = (unsigned char *)data;
2655 /*******************************************************************
2656 ********************************************************************/
2658 bool spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
2660 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
2665 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2667 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
2673 if(!prs_uint32("type", ps, depth, &q_u->type))
2676 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
2686 if (UNMARSHALLING(ps))
2687 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
2688 if(q_u->data == NULL)
2690 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
2698 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
2704 /*******************************************************************
2705 ********************************************************************/
2707 bool spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
2709 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
2714 if(!prs_werror("status", ps, depth, &r_u->status))
2720 /*******************************************************************
2721 Parse a SPOOL_R_GETJOB structure.
2722 ********************************************************************/
2724 bool spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
2726 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
2732 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2738 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2741 if (!prs_werror("status", ps, depth, &r_u->status))
2747 /*******************************************************************
2748 Parse a SPOOL_Q_GETJOB structure.
2749 ********************************************************************/
2751 bool spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
2753 prs_debug(ps, depth, desc, "");
2759 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
2761 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
2763 if(!prs_uint32("level", ps, depth, &q_u->level))
2766 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2772 if(!prs_uint32("offered", ps, depth, &q_u->offered))
2778 void free_devmode(DEVICEMODE *devmode)
2780 if (devmode!=NULL) {
2781 SAFE_FREE(devmode->dev_private);
2786 void free_printer_info_1(PRINTER_INFO_1 *printer)
2791 void free_printer_info_2(PRINTER_INFO_2 *printer)
2793 if (printer!=NULL) {
2794 free_devmode(printer->devmode);
2795 printer->devmode = NULL;
2800 void free_printer_info_3(PRINTER_INFO_3 *printer)
2805 void free_printer_info_4(PRINTER_INFO_4 *printer)
2810 void free_printer_info_5(PRINTER_INFO_5 *printer)
2815 void free_printer_info_6(PRINTER_INFO_6 *printer)
2820 void free_printer_info_7(PRINTER_INFO_7 *printer)
2825 void free_job_info_2(JOB_INFO_2 *job)
2828 free_devmode(job->devmode);
2831 /*******************************************************************
2833 ********************************************************************/
2834 bool make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u,
2835 POLICY_HND *hnd, const char *key,
2838 DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
2840 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2841 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
2847 /*******************************************************************
2849 ********************************************************************/
2851 bool spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
2853 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
2858 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2861 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
2867 if(!prs_uint32("size", ps, depth, &q_u->size))
2873 /*******************************************************************
2874 * write a structure.
2875 ********************************************************************/
2877 bool spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
2879 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
2885 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
2891 if(!prs_uint32("needed", ps, depth, &r_u->needed))
2894 if(!prs_werror("status", ps, depth, &r_u->status))
2900 /*******************************************************************
2902 ********************************************************************/
2904 bool spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
2906 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
2911 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2914 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
2920 if(!prs_uint32("size", ps, depth, &q_u->size))
2926 /*******************************************************************
2927 ********************************************************************/
2929 static bool spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
2930 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
2933 uint32 valuename_offset,
2936 const uint32 basic_unit = 20; /* size of static portion of enum_values */
2938 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
2942 * offset data begins at 20 bytes per structure * size_of_array.
2943 * Don't forget the uint32 at the beginning
2946 current_offset = basic_unit * ctr->size_of_array;
2948 /* first loop to write basic enum_value information */
2950 if (UNMARSHALLING(ps) && ctr->size_of_array) {
2951 ctr->values = PRS_ALLOC_MEM(ps, PRINTER_ENUM_VALUES, ctr->size_of_array);
2956 for (i=0; i<ctr->size_of_array; i++) {
2957 uint32 base_offset, return_offset;
2959 base_offset = prs_offset(ps);
2961 valuename_offset = current_offset;
2962 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
2965 /* Read or write the value. */
2967 return_offset = prs_offset(ps);
2969 if (!prs_set_offset(ps, base_offset + valuename_offset)) {
2973 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
2977 if (!prs_set_offset(ps, return_offset))
2980 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
2983 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
2986 data_offset = ctr->values[i].value_len + valuename_offset;
2988 if (!prs_uint32("data_offset", ps, depth, &data_offset))
2991 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
2994 /* Read or write the data. */
2996 return_offset = prs_offset(ps);
2998 if (!prs_set_offset(ps, base_offset + data_offset)) {
3002 if ( ctr->values[i].data_len ) {
3003 if ( UNMARSHALLING(ps) ) {
3004 ctr->values[i].data = PRS_ALLOC_MEM(ps, uint8, ctr->values[i].data_len);
3005 if (!ctr->values[i].data)
3008 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
3012 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
3013 /* account for 2 byte alignment */
3014 current_offset += (current_offset % 2);
3016 /* Remember how far we got. */
3017 data_offset = prs_offset(ps);
3020 if (!prs_set_offset(ps, return_offset))
3025 /* Go to the last data offset we got to. */
3027 if (!prs_set_offset(ps, data_offset))
3030 /* And ensure we're 2 byte aligned. */
3032 if ( !prs_align_uint16(ps) )
3038 /*******************************************************************
3039 * write a structure.
3040 ********************************************************************/
3042 bool spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
3044 uint32 data_offset, end_offset;
3045 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
3051 if (!prs_uint32("size", ps, depth, &r_u->ctr.size))
3054 data_offset = prs_offset(ps);
3056 if (!prs_set_offset(ps, data_offset + r_u->ctr.size))
3062 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3065 if(!prs_uint32("returned", ps, depth, &r_u->returned))
3068 if(!prs_werror("status", ps, depth, &r_u->status))
3071 r_u->ctr.size_of_array = r_u->returned;
3073 end_offset = prs_offset(ps);
3075 if (!prs_set_offset(ps, data_offset))
3079 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
3082 if (!prs_set_offset(ps, end_offset))
3087 /*******************************************************************
3089 ********************************************************************/
3091 bool make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
3092 uint32 level, RPC_BUFFER *buffer,
3095 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
3098 q_u->offered=offered;
3103 /*******************************************************************
3105 ********************************************************************/
3107 bool make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
3108 uint32 jobid, uint32 level, RPC_BUFFER *buffer,
3111 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
3114 q_u->buffer = buffer;
3115 q_u->offered = offered;