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 2 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, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #define DBGC_CLASS DBGC_RPC_PARSE
31 /*******************************************************************
32 This should be moved in a more generic lib.
33 ********************************************************************/
35 BOOL spoolss_io_system_time(const char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
37 if(!prs_uint16("year", ps, depth, &systime->year))
39 if(!prs_uint16("month", ps, depth, &systime->month))
41 if(!prs_uint16("dayofweek", ps, depth, &systime->dayofweek))
43 if(!prs_uint16("day", ps, depth, &systime->day))
45 if(!prs_uint16("hour", ps, depth, &systime->hour))
47 if(!prs_uint16("minute", ps, depth, &systime->minute))
49 if(!prs_uint16("second", ps, depth, &systime->second))
51 if(!prs_uint16("milliseconds", ps, depth, &systime->milliseconds))
57 /*******************************************************************
58 ********************************************************************/
60 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
62 systime->year=unixtime->tm_year+1900;
63 systime->month=unixtime->tm_mon+1;
64 systime->dayofweek=unixtime->tm_wday;
65 systime->day=unixtime->tm_mday;
66 systime->hour=unixtime->tm_hour;
67 systime->minute=unixtime->tm_min;
68 systime->second=unixtime->tm_sec;
69 systime->milliseconds=0;
74 /*******************************************************************
75 reads or writes an DOC_INFO structure.
76 ********************************************************************/
78 static BOOL smb_io_doc_info_1(const char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
80 if (info_1 == NULL) return False;
82 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
88 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
90 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
92 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
95 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
97 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
99 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
105 /*******************************************************************
106 reads or writes an DOC_INFO structure.
107 ********************************************************************/
109 static BOOL smb_io_doc_info(const char *desc, DOC_INFO *info, prs_struct *ps, int depth)
111 uint32 useless_ptr=0;
113 if (info == NULL) return False;
115 prs_debug(ps, depth, desc, "smb_io_doc_info");
121 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
124 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
127 switch (info->switch_value)
130 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
135 this is just a placeholder
137 MSDN July 1998 says doc_info_2 is only on
138 Windows 95, and as Win95 doesn't do RPC to print
139 this case is nearly impossible
141 Maybe one day with Windows for dishwasher 2037 ...
144 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
147 DEBUG(0,("Something is obviously wrong somewhere !\n"));
154 /*******************************************************************
155 reads or writes an DOC_INFO_CONTAINER structure.
156 ********************************************************************/
158 static BOOL smb_io_doc_info_container(const char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
160 if (cont == NULL) return False;
162 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
168 if(!prs_uint32("level", ps, depth, &cont->level))
171 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
177 /*******************************************************************
178 reads or writes an NOTIFY OPTION TYPE structure.
179 ********************************************************************/
181 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
182 structure. The _TYPE structure is really the deferred referrants (i.e
183 the notify fields array) of the _TYPE structure. -tpot */
185 static BOOL smb_io_notify_option_type(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
187 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
193 if(!prs_uint16("type", ps, depth, &type->type))
195 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
197 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
199 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
201 if(!prs_uint32("count", ps, depth, &type->count))
203 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
209 /*******************************************************************
210 reads or writes an NOTIFY OPTION TYPE DATA.
211 ********************************************************************/
213 static BOOL smb_io_notify_option_type_data(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
217 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
220 /* if there are no fields just return */
221 if (type->fields_ptr==0)
227 if(!prs_uint32("count2", ps, depth, &type->count2))
230 if (type->count2 != type->count)
231 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
233 /* parse the option type data */
234 for(i=0;i<type->count2;i++)
235 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
240 /*******************************************************************
241 reads or writes an NOTIFY OPTION structure.
242 ********************************************************************/
244 static BOOL smb_io_notify_option_type_ctr(const char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
248 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
251 if(!prs_uint32("count", ps, depth, &ctr->count))
255 if (UNMARSHALLING(ps))
256 if((ctr->type=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION_TYPE,ctr->count)) == NULL)
259 /* the option type struct */
260 for(i=0;i<ctr->count;i++)
261 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
264 /* the type associated with the option type struct */
265 for(i=0;i<ctr->count;i++)
266 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
272 /*******************************************************************
273 reads or writes an NOTIFY OPTION structure.
274 ********************************************************************/
276 static BOOL smb_io_notify_option(const char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
278 prs_debug(ps, depth, desc, "smb_io_notify_option");
281 if(!prs_uint32("version", ps, depth, &option->version))
283 if(!prs_uint32("flags", ps, depth, &option->flags))
285 if(!prs_uint32("count", ps, depth, &option->count))
287 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
290 /* marshalling or unmarshalling, that would work */
291 if (option->option_type_ptr!=0) {
292 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
296 option->ctr.type=NULL;
303 /*******************************************************************
304 reads or writes an NOTIFY INFO DATA structure.
305 ********************************************************************/
307 static BOOL smb_io_notify_info_data(const char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
309 uint32 useless_ptr=0x0FF0ADDE;
311 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
316 if(!prs_uint16("type", ps, depth, &data->type))
318 if(!prs_uint16("field", ps, depth, &data->field))
321 if(!prs_uint32("how many words", ps, depth, &data->size))
323 if(!prs_uint32("id", ps, depth, &data->id))
325 if(!prs_uint32("how many words", ps, depth, &data->size))
328 switch (data->enc_type) {
330 /* One and two value data has two uint32 values */
332 case NOTIFY_ONE_VALUE:
333 case NOTIFY_TWO_VALUE:
335 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
337 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
341 /* Pointers and strings have a string length and a
342 pointer. For a string the length is expressed as
343 the number of uint16 characters plus a trailing
348 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length ))
350 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
357 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
360 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
366 if( !prs_uint32( "sd size", ps, depth, &data->notify_data.sd.size ) )
368 if( !prs_uint32( "pointer", ps, depth, &useless_ptr ) )
374 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data\n",
382 /*******************************************************************
383 reads or writes an NOTIFY INFO DATA structure.
384 ********************************************************************/
386 BOOL smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *data,
387 prs_struct *ps, int depth)
389 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
395 switch(data->enc_type) {
397 /* No data for values */
399 case NOTIFY_ONE_VALUE:
400 case NOTIFY_TWO_VALUE:
404 /* Strings start with a length in uint16s */
409 data->notify_data.data.length /= 2;
411 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
414 if (UNMARSHALLING(ps)) {
415 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
416 data->notify_data.data.length);
418 if (!data->notify_data.data.string)
422 if (!prs_uint16uni(True, "string", ps, depth, data->notify_data.data.string,
423 data->notify_data.data.length))
427 data->notify_data.data.length *= 2;
433 if (UNMARSHALLING(ps)) {
434 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
435 data->notify_data.data.length);
437 if (!data->notify_data.data.string)
441 if(!prs_uint8s(True,"buffer",ps,depth,(uint8*)data->notify_data.data.string,data->notify_data.data.length))
447 if( !prs_uint32("secdesc size ", ps, depth, &data->notify_data.sd.size ) )
449 if ( !sec_io_desc( "sec_desc", &data->notify_data.sd.desc, ps, depth ) )
454 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data_strings\n",
460 if (isvalue==False) {
462 /* length of string in unicode include \0 */
463 x=data->notify_data.data.length+1;
465 if (data->field != 16)
466 if(!prs_uint32("string length", ps, depth, &x ))
469 if (MARSHALLING(ps)) {
470 /* These are already in little endian format. Don't byte swap. */
473 /* No memory allocated for this string
474 therefore following the data.string
475 pointer is a bad idea. Use a pointer to
476 the uint32 length union member to
477 provide a source for a unicode NULL */
479 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
483 if (data->field == 16)
486 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
491 /* Tallocate memory for string */
493 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16, x * 2);
494 if (!data->notify_data.data.string)
497 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
505 /* Win2k does not seem to put this parse align here */
513 /*******************************************************************
514 reads or writes an NOTIFY INFO structure.
515 ********************************************************************/
517 static BOOL smb_io_notify_info(const char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
521 prs_debug(ps, depth, desc, "smb_io_notify_info");
527 if(!prs_uint32("count", ps, depth, &info->count))
529 if(!prs_uint32("version", ps, depth, &info->version))
531 if(!prs_uint32("flags", ps, depth, &info->flags))
533 if(!prs_uint32("count", ps, depth, &info->count))
536 for (i=0;i<info->count;i++) {
537 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
541 /* now do the strings at the end of the stream */
542 for (i=0;i<info->count;i++) {
543 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
550 /*******************************************************************
551 ********************************************************************/
553 BOOL spool_io_user_level_1( const char *desc, prs_struct *ps, int depth, SPOOL_USER_1 *q_u )
555 prs_debug(ps, depth, desc, "");
561 if (!prs_uint32("size", ps, depth, &q_u->size))
564 if (!prs_io_unistr2_p("", ps, depth, &q_u->client_name))
566 if (!prs_io_unistr2_p("", ps, depth, &q_u->user_name))
569 if (!prs_uint32("build", ps, depth, &q_u->build))
571 if (!prs_uint32("major", ps, depth, &q_u->major))
573 if (!prs_uint32("minor", ps, depth, &q_u->minor))
575 if (!prs_uint32("processor", ps, depth, &q_u->processor))
578 if (!prs_io_unistr2("", ps, depth, q_u->client_name))
583 if (!prs_io_unistr2("", ps, depth, q_u->user_name))
589 /*******************************************************************
590 ********************************************************************/
592 static BOOL spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
597 prs_debug(ps, depth, desc, "spool_io_user_level");
603 if (!prs_uint32("level", ps, depth, &q_u->level))
606 switch ( q_u->level )
609 if ( !prs_pointer( "" , ps, depth, (void*)&q_u->user.user1,
610 sizeof(SPOOL_USER_1), (PRS_POINTER_CAST)spool_io_user_level_1 ))
622 /*******************************************************************
623 * read or write a DEVICEMODE struct.
624 * on reading allocate memory for the private member
625 ********************************************************************/
627 #define DM_NUM_OPTIONAL_FIELDS 8
629 BOOL spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
631 int available_space; /* size of the device mode left to parse */
632 /* only important on unmarshalling */
634 uint16 *unistr_buffer;
637 struct optional_fields {
640 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
641 { "icmmethod", NULL },
642 { "icmintent", NULL },
643 { "mediatype", NULL },
644 { "dithertype", NULL },
645 { "reserved1", NULL },
646 { "reserved2", NULL },
647 { "panningwidth", NULL },
648 { "panningheight", NULL }
651 /* assign at run time to keep non-gcc compilers happy */
653 opt_fields[0].field = &devmode->icmmethod;
654 opt_fields[1].field = &devmode->icmintent;
655 opt_fields[2].field = &devmode->mediatype;
656 opt_fields[3].field = &devmode->dithertype;
657 opt_fields[4].field = &devmode->reserved1;
658 opt_fields[5].field = &devmode->reserved2;
659 opt_fields[6].field = &devmode->panningwidth;
660 opt_fields[7].field = &devmode->panningheight;
663 prs_debug(ps, depth, desc, "spoolss_io_devmode");
666 if (UNMARSHALLING(ps)) {
667 devmode->devicename.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
668 if (devmode->devicename.buffer == NULL)
670 unistr_buffer = devmode->devicename.buffer;
673 /* devicename is a static sized string but the buffer we set is not */
674 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
675 memset( unistr_buffer, 0x0, MAXDEVICENAME );
676 for ( j=0; devmode->devicename.buffer[j]; j++ )
677 unistr_buffer[j] = devmode->devicename.buffer[j];
680 if (!prs_uint16uni(True,"devicename", ps, depth, unistr_buffer, MAXDEVICENAME))
683 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
686 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
688 if (!prs_uint16("size", ps, depth, &devmode->size))
690 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
692 if (!prs_uint32("fields", ps, depth, &devmode->fields))
694 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
696 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
698 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
700 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
702 if (!prs_uint16("scale", ps, depth, &devmode->scale))
704 if (!prs_uint16("copies", ps, depth, &devmode->copies))
706 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
708 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
710 if (!prs_uint16("color", ps, depth, &devmode->color))
712 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
714 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
716 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
718 if (!prs_uint16("collate", ps, depth, &devmode->collate))
721 if (UNMARSHALLING(ps)) {
722 devmode->formname.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
723 if (devmode->formname.buffer == NULL)
725 unistr_buffer = devmode->formname.buffer;
728 /* devicename is a static sized string but the buffer we set is not */
729 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
730 memset( unistr_buffer, 0x0, MAXDEVICENAME );
731 for ( j=0; devmode->formname.buffer[j]; j++ )
732 unistr_buffer[j] = devmode->formname.buffer[j];
735 if (!prs_uint16uni(True, "formname", ps, depth, unistr_buffer, MAXDEVICENAME))
737 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
739 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
741 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
743 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
745 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
747 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
750 * every device mode I've ever seen on the wire at least has up
751 * to the displayfrequency field. --jerry (05-09-2002)
754 /* add uint32's + uint16's + two UNICODE strings */
756 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
758 /* Sanity check - we only have uint32's left tp parse */
760 if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {
761 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
762 available_space, devmode->size));
763 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
768 * Conditional parsing. Assume that the DeviceMode has been
769 * zero'd by the caller.
772 while ((available_space > 0) && (i < DM_NUM_OPTIONAL_FIELDS))
774 DEBUG(11, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));
775 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
777 available_space -= sizeof(uint32);
781 /* Sanity Check - we should no available space at this point unless
782 MS changes the device mode structure */
784 if (available_space) {
785 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
786 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
787 available_space, devmode->size));
788 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
793 if (devmode->driverextra!=0) {
794 if (UNMARSHALLING(ps)) {
795 devmode->dev_private=PRS_ALLOC_MEM(ps, uint8, devmode->driverextra);
796 if(devmode->dev_private == NULL)
798 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for dev_private\n",devmode->driverextra));
801 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of dev_private\n",devmode->driverextra));
802 if (!prs_uint8s(False, "dev_private", ps, depth,
803 devmode->dev_private, devmode->driverextra))
810 /*******************************************************************
811 Read or write a DEVICEMODE container
812 ********************************************************************/
814 static BOOL spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
819 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
825 if (!prs_uint32("size", ps, depth, &dm_c->size))
828 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
831 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
832 if (UNMARSHALLING(ps))
833 /* if while reading there is no DEVMODE ... */
838 /* so we have a DEVICEMODE to follow */
839 if (UNMARSHALLING(ps)) {
840 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
841 dm_c->devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1);
842 if(dm_c->devmode == NULL)
846 /* this is bad code, shouldn't be there */
847 if (!prs_uint32("size", ps, depth, &dm_c->size))
850 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
856 /*******************************************************************
857 ********************************************************************/
859 static BOOL spoolss_io_printer_default(const char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
864 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
867 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
870 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
876 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
882 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
888 /*******************************************************************
890 ********************************************************************/
892 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
893 const fstring printername,
894 const fstring datatype,
895 uint32 access_required,
896 const fstring clientname,
897 const fstring user_name)
899 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
901 q_u->printername = TALLOC_P( get_talloc_ctx(), UNISTR2 );
902 if (!q_u->printername) {
905 init_unistr2(q_u->printername, printername, UNI_STR_TERMINATE);
907 q_u->printer_default.datatype_ptr = 0;
909 q_u->printer_default.devmode_cont.size=0;
910 q_u->printer_default.devmode_cont.devmode_ptr=0;
911 q_u->printer_default.devmode_cont.devmode=NULL;
912 q_u->printer_default.access_required=access_required;
914 q_u->user_switch = 1;
916 q_u->user_ctr.level = 1;
917 q_u->user_ctr.user.user1 = TALLOC_P( get_talloc_ctx(), SPOOL_USER_1 );
918 if (!q_u->user_ctr.user.user1) {
921 q_u->user_ctr.user.user1->size = strlen(clientname) + strlen(user_name) + 10;
922 q_u->user_ctr.user.user1->build = 1381;
923 q_u->user_ctr.user.user1->major = 2;
924 q_u->user_ctr.user.user1->minor = 0;
925 q_u->user_ctr.user.user1->processor = 0;
927 q_u->user_ctr.user.user1->client_name = TALLOC_P( get_talloc_ctx(), UNISTR2 );
928 if (!q_u->user_ctr.user.user1->client_name) {
931 q_u->user_ctr.user.user1->user_name = TALLOC_P( get_talloc_ctx(), UNISTR2 );
932 if (!q_u->user_ctr.user.user1->user_name) {
936 init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
937 init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
942 /*******************************************************************
944 ********************************************************************/
946 BOOL make_spoolss_q_addprinterex( TALLOC_CTX *mem_ctx, SPOOL_Q_ADDPRINTEREX *q_u,
947 const char *srv_name, const char* clientname, const char* user_name,
948 uint32 level, PRINTER_INFO_CTR *ctr)
950 DEBUG(5,("make_spoolss_q_addprinterex\n"));
952 if (!ctr || !ctr->printers_2)
957 q_u->server_name = TALLOC_P( mem_ctx, UNISTR2 );
958 if (!q_u->server_name) {
961 init_unistr2(q_u->server_name, srv_name, UNI_FLAGS_NONE);
965 q_u->info.level = level;
966 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
969 /* init q_u->info.info2 from *info */
970 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) {
971 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
981 q_u->user_ctr.level = 1;
982 q_u->user_ctr.user.user1 = TALLOC_P( get_talloc_ctx(), SPOOL_USER_1 );
983 if (!q_u->user_ctr.user.user1) {
986 q_u->user_ctr.user.user1->build = 1381;
987 q_u->user_ctr.user.user1->major = 2;
988 q_u->user_ctr.user.user1->minor = 0;
989 q_u->user_ctr.user.user1->processor = 0;
991 q_u->user_ctr.user.user1->client_name = TALLOC_P( mem_ctx, UNISTR2 );
992 if (!q_u->user_ctr.user.user1->client_name) {
995 q_u->user_ctr.user.user1->user_name = TALLOC_P( mem_ctx, UNISTR2 );
996 if (!q_u->user_ctr.user.user1->user_name) {
999 init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
1000 init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
1002 q_u->user_ctr.user.user1->size = q_u->user_ctr.user.user1->user_name->uni_str_len +
1003 q_u->user_ctr.user.user1->client_name->uni_str_len + 2;
1008 /*******************************************************************
1009 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
1010 *******************************************************************/
1012 BOOL make_spoolss_printer_info_2(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
1013 PRINTER_INFO_2 *info)
1016 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
1018 /* allocate the necessary memory */
1019 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2))) {
1020 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
1024 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
1025 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
1026 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
1027 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
1028 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
1029 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
1030 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
1031 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
1032 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
1033 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
1034 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
1035 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
1036 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
1037 inf->attributes = info->attributes;
1038 inf->priority = info->priority;
1039 inf->default_priority = info->defaultpriority;
1040 inf->starttime = info->starttime;
1041 inf->untiltime = info->untiltime;
1042 inf->cjobs = info->cjobs;
1043 inf->averageppm = info->averageppm;
1044 init_unistr2_from_unistr(&inf->servername, &info->servername);
1045 init_unistr2_from_unistr(&inf->printername, &info->printername);
1046 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
1047 init_unistr2_from_unistr(&inf->portname, &info->portname);
1048 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
1049 init_unistr2_from_unistr(&inf->comment, &info->comment);
1050 init_unistr2_from_unistr(&inf->location, &info->location);
1051 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
1052 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
1053 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
1054 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
1055 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
1062 /*******************************************************************
1063 create a SPOOL_PRINTER_INFO_3 struct from a PRINTER_INFO_3 struct
1064 *******************************************************************/
1066 BOOL make_spoolss_printer_info_3(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3 **spool_info3,
1067 PRINTER_INFO_3 *info)
1070 SPOOL_PRINTER_INFO_LEVEL_3 *inf;
1072 /* allocate the necessary memory */
1073 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3))) {
1074 DEBUG(0,("make_spoolss_printer_info_3: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_3 sruct!\n"));
1078 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
1085 /*******************************************************************
1086 create a SPOOL_PRINTER_INFO_7 struct from a PRINTER_INFO_7 struct
1087 *******************************************************************/
1089 BOOL make_spoolss_printer_info_7(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7 **spool_info7,
1090 PRINTER_INFO_7 *info)
1093 SPOOL_PRINTER_INFO_LEVEL_7 *inf;
1095 /* allocate the necessary memory */
1096 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7))) {
1097 DEBUG(0,("make_spoolss_printer_info_7: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_7 struct!\n"));
1101 inf->guid_ptr = (info->guid.buffer!=NULL)?1:0;
1102 inf->action = info->action;
1103 init_unistr2_from_unistr(&inf->guid, &info->guid);
1111 /*******************************************************************
1113 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1114 ********************************************************************/
1116 BOOL spoolss_io_q_open_printer(const char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
1121 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
1127 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
1129 if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
1135 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1141 /*******************************************************************
1142 * write a structure.
1143 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1144 * called from spoolss_open_printer_ex (cli_spoolss.c)
1145 ********************************************************************/
1147 BOOL spoolss_io_r_open_printer(const char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
1149 if (r_u == NULL) return False;
1151 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
1157 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1160 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1167 /*******************************************************************
1169 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1170 ********************************************************************/
1172 BOOL spoolss_io_q_open_printer_ex(const char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
1177 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
1183 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
1185 if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
1191 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1194 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
1196 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
1202 /*******************************************************************
1203 * write a structure.
1204 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1205 * called from spoolss_open_printer_ex (cli_spoolss.c)
1206 ********************************************************************/
1208 BOOL spoolss_io_r_open_printer_ex(const char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
1210 if (r_u == NULL) return False;
1212 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
1218 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1221 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1227 /*******************************************************************
1229 ********************************************************************/
1230 BOOL make_spoolss_q_deleteprinterdriverex( TALLOC_CTX *mem_ctx,
1231 SPOOL_Q_DELETEPRINTERDRIVEREX *q_u,
1237 DEBUG(5,("make_spoolss_q_deleteprinterdriverex\n"));
1239 q_u->server_ptr = (server!=NULL)?1:0;
1240 q_u->delete_flags = DPD_DELETE_UNUSED_FILES;
1242 /* these must be NULL terminated or else NT4 will
1243 complain about invalid parameters --jerry */
1244 init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
1245 init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
1246 init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
1249 q_u->delete_flags |= DPD_DELETE_SPECIFIC_VERSION;
1250 q_u->version = version;
1257 /*******************************************************************
1259 ********************************************************************/
1260 BOOL make_spoolss_q_deleteprinterdriver(
1261 TALLOC_CTX *mem_ctx,
1262 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
1268 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
1270 q_u->server_ptr = (server!=NULL)?1:0;
1272 /* these must be NULL terminated or else NT4 will
1273 complain about invalid parameters --jerry */
1274 init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
1275 init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
1276 init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
1281 /*******************************************************************
1283 ********************************************************************/
1285 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
1286 const POLICY_HND *handle,
1287 const char *valuename, uint32 size)
1289 if (q_u == NULL) return False;
1291 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
1293 q_u->handle = *handle;
1294 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
1300 /*******************************************************************
1302 ********************************************************************/
1304 BOOL make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u,
1305 const POLICY_HND *handle,
1306 const char *keyname,
1307 const char *valuename, uint32 size)
1309 if (q_u == NULL) return False;
1311 DEBUG(5,("make_spoolss_q_getprinterdataex\n"));
1313 q_u->handle = *handle;
1314 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
1315 init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
1321 /*******************************************************************
1323 * called from spoolss_q_getprinterdata (srv_spoolss.c)
1324 ********************************************************************/
1326 BOOL spoolss_io_q_getprinterdata(const char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
1331 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
1336 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1340 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1344 if (!prs_uint32("size", ps, depth, &q_u->size))
1350 /*******************************************************************
1352 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1353 ********************************************************************/
1355 BOOL spoolss_io_q_deleteprinterdata(const char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1360 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1365 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1369 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1375 /*******************************************************************
1376 * write a structure.
1377 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1378 ********************************************************************/
1380 BOOL spoolss_io_r_deleteprinterdata(const char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1382 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1384 if(!prs_werror("status", ps, depth, &r_u->status))
1390 /*******************************************************************
1392 * called from spoolss_q_deleteprinterdataex (srv_spoolss.c)
1393 ********************************************************************/
1395 BOOL spoolss_io_q_deleteprinterdataex(const char *desc, SPOOL_Q_DELETEPRINTERDATAEX *q_u, prs_struct *ps, int depth)
1400 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdataex");
1405 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1408 if (!smb_io_unistr2("keyname ", &q_u->keyname, True, ps, depth))
1410 if (!smb_io_unistr2("valuename", &q_u->valuename, True, ps, depth))
1416 /*******************************************************************
1417 * write a structure.
1418 * called from spoolss_r_deleteprinterdataex (srv_spoolss.c)
1419 ********************************************************************/
1421 BOOL spoolss_io_r_deleteprinterdataex(const char *desc, SPOOL_R_DELETEPRINTERDATAEX *r_u, prs_struct *ps, int depth)
1423 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdataex");
1426 if(!prs_werror("status", ps, depth, &r_u->status))
1432 /*******************************************************************
1433 * write a structure.
1434 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1435 ********************************************************************/
1437 BOOL spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1442 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1447 if (!prs_uint32("type", ps, depth, &r_u->type))
1449 if (!prs_uint32("size", ps, depth, &r_u->size))
1452 if (UNMARSHALLING(ps) && r_u->size) {
1453 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
1458 if (!prs_uint8s( False, "data", ps, depth, r_u->data, r_u->size ))
1464 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1466 if (!prs_werror("status", ps, depth, &r_u->status))
1472 /*******************************************************************
1474 ********************************************************************/
1476 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1478 if (q_u == NULL) return False;
1480 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1482 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1487 /*******************************************************************
1489 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1490 * called from spoolss_abortprinter (cli_spoolss.c)
1491 ********************************************************************/
1493 BOOL spoolss_io_q_abortprinter(const char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1495 if (q_u == NULL) return False;
1497 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1503 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1509 /*******************************************************************
1510 * write a structure.
1511 * called from spoolss_r_abortprinter (srv_spoolss.c)
1512 ********************************************************************/
1514 BOOL spoolss_io_r_abortprinter(const char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1516 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1518 if(!prs_werror("status", ps, depth, &r_u->status))
1524 /*******************************************************************
1526 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1527 * called from spoolss_deleteprinter (cli_spoolss.c)
1528 ********************************************************************/
1530 BOOL spoolss_io_q_deleteprinter(const char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1532 if (q_u == NULL) return False;
1534 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1540 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1546 /*******************************************************************
1547 * write a structure.
1548 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1549 * called from spoolss_deleteprinter (cli_spoolss.c)
1550 ********************************************************************/
1552 BOOL spoolss_io_r_deleteprinter(const char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1554 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1560 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1562 if (!prs_werror("status", ps, depth, &r_u->status))
1569 /*******************************************************************
1571 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1572 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1573 ********************************************************************/
1575 BOOL spoolss_io_q_deleteprinterdriver(const char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1577 if (q_u == NULL) return False;
1579 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1585 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1587 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1589 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1591 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1599 /*******************************************************************
1600 * write a structure.
1601 ********************************************************************/
1602 BOOL spoolss_io_r_deleteprinterdriver(const char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1604 if (r_u == NULL) return False;
1606 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1612 if (!prs_werror("status", ps, depth, &r_u->status))
1619 /*******************************************************************
1621 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1622 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1623 ********************************************************************/
1625 BOOL spoolss_io_q_deleteprinterdriverex(const char *desc, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
1627 if (q_u == NULL) return False;
1629 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriverex");
1635 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1637 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1639 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1641 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1647 if(!prs_uint32("delete_flags ", ps, depth, &q_u->delete_flags))
1649 if(!prs_uint32("version ", ps, depth, &q_u->version))
1657 /*******************************************************************
1658 * write a structure.
1659 ********************************************************************/
1660 BOOL spoolss_io_r_deleteprinterdriverex(const char *desc, SPOOL_R_DELETEPRINTERDRIVEREX *r_u, prs_struct *ps, int depth)
1662 if (r_u == NULL) return False;
1664 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriverex");
1670 if (!prs_werror("status", ps, depth, &r_u->status))
1678 /*******************************************************************
1680 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1681 * called from spoolss_closeprinter (cli_spoolss.c)
1682 ********************************************************************/
1684 BOOL spoolss_io_q_closeprinter(const char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1686 if (q_u == NULL) return False;
1688 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1694 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1700 /*******************************************************************
1701 * write a structure.
1702 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1703 * called from spoolss_closeprinter (cli_spoolss.c)
1704 ********************************************************************/
1706 BOOL spoolss_io_r_closeprinter(const char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1708 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1714 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1716 if (!prs_werror("status", ps, depth, &r_u->status))
1722 /*******************************************************************
1724 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1725 ********************************************************************/
1727 BOOL spoolss_io_q_startdocprinter(const char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1729 if (q_u == NULL) return False;
1731 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1737 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1740 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1746 /*******************************************************************
1747 * write a structure.
1748 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1749 ********************************************************************/
1751 BOOL spoolss_io_r_startdocprinter(const char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1753 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1755 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1757 if(!prs_werror("status", ps, depth, &r_u->status))
1763 /*******************************************************************
1765 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1766 ********************************************************************/
1768 BOOL spoolss_io_q_enddocprinter(const char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1770 if (q_u == NULL) return False;
1772 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1778 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1784 /*******************************************************************
1785 * write a structure.
1786 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1787 ********************************************************************/
1789 BOOL spoolss_io_r_enddocprinter(const char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1791 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1793 if(!prs_werror("status", ps, depth, &r_u->status))
1799 /*******************************************************************
1801 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1802 ********************************************************************/
1804 BOOL spoolss_io_q_startpageprinter(const char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1806 if (q_u == NULL) return False;
1808 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1814 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1820 /*******************************************************************
1821 * write a structure.
1822 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1823 ********************************************************************/
1825 BOOL spoolss_io_r_startpageprinter(const char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1827 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1829 if(!prs_werror("status", ps, depth, &r_u->status))
1835 /*******************************************************************
1837 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1838 ********************************************************************/
1840 BOOL spoolss_io_q_endpageprinter(const char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1842 if (q_u == NULL) return False;
1844 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1850 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1856 /*******************************************************************
1857 * write a structure.
1858 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1859 ********************************************************************/
1861 BOOL spoolss_io_r_endpageprinter(const char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1863 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1865 if(!prs_werror("status", ps, depth, &r_u->status))
1871 /*******************************************************************
1873 * called from spoolss_q_writeprinter (srv_spoolss.c)
1874 ********************************************************************/
1876 BOOL spoolss_io_q_writeprinter(const char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1878 if (q_u == NULL) return False;
1880 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1886 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1888 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1891 if (q_u->buffer_size!=0)
1893 if (UNMARSHALLING(ps))
1894 q_u->buffer=PRS_ALLOC_MEM(ps, uint8, q_u->buffer_size);
1895 if(q_u->buffer == NULL)
1897 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1902 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1908 /*******************************************************************
1909 * write a structure.
1910 * called from spoolss_r_writeprinter (srv_spoolss.c)
1911 ********************************************************************/
1913 BOOL spoolss_io_r_writeprinter(const char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1915 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1917 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1919 if(!prs_werror("status", ps, depth, &r_u->status))
1925 /*******************************************************************
1927 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1928 ********************************************************************/
1930 BOOL spoolss_io_q_rffpcnex(const char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1932 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1938 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1940 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1942 if(!prs_uint32("options", ps, depth, &q_u->options))
1944 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1946 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1952 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1955 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1958 if (q_u->option_ptr!=0) {
1960 if (UNMARSHALLING(ps))
1961 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
1964 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1971 /*******************************************************************
1972 * write a structure.
1973 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1974 ********************************************************************/
1976 BOOL spoolss_io_r_rffpcnex(const char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1978 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1981 if(!prs_werror("status", ps, depth, &r_u->status))
1987 /*******************************************************************
1989 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1990 ********************************************************************/
1992 BOOL spoolss_io_q_rfnpcnex(const char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1994 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
2000 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
2003 if(!prs_uint32("change", ps, depth, &q_u->change))
2006 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
2009 if (q_u->option_ptr!=0) {
2011 if (UNMARSHALLING(ps))
2012 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
2015 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
2022 /*******************************************************************
2023 * write a structure.
2024 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
2025 ********************************************************************/
2027 BOOL spoolss_io_r_rfnpcnex(const char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
2029 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
2035 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
2038 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
2043 if(!prs_werror("status", ps, depth, &r_u->status))
2049 /*******************************************************************
2050 * return the length of a uint16 (obvious, but the code is clean)
2051 ********************************************************************/
2053 static uint32 size_of_uint16(uint16 *value)
2055 return (sizeof(*value));
2058 /*******************************************************************
2059 * return the length of a uint32 (obvious, but the code is clean)
2060 ********************************************************************/
2062 static uint32 size_of_uint32(uint32 *value)
2064 return (sizeof(*value));
2067 /*******************************************************************
2068 * return the length of a NTTIME (obvious, but the code is clean)
2069 ********************************************************************/
2071 static uint32 size_of_nttime(NTTIME *value)
2073 return (sizeof(*value));
2076 /*******************************************************************
2077 * return the length of a uint32 (obvious, but the code is clean)
2078 ********************************************************************/
2080 static uint32 size_of_device_mode(DEVICEMODE *devmode)
2085 return (4+devmode->size+devmode->driverextra);
2088 /*******************************************************************
2089 * return the length of a uint32 (obvious, but the code is clean)
2090 ********************************************************************/
2092 static uint32 size_of_systemtime(SYSTEMTIME *systime)
2097 return (sizeof(SYSTEMTIME) +4);
2100 /*******************************************************************
2101 Parse a DEVMODE structure and its relative pointer.
2102 ********************************************************************/
2104 static BOOL smb_io_reldevmode(const char *desc, RPC_BUFFER *buffer, int depth, DEVICEMODE **devmode)
2106 prs_struct *ps=&buffer->prs;
2108 prs_debug(ps, depth, desc, "smb_io_reldevmode");
2111 if (MARSHALLING(ps)) {
2112 uint32 struct_offset = prs_offset(ps);
2113 uint32 relative_offset;
2115 if (*devmode == NULL) {
2117 if (!prs_uint32("offset", ps, depth, &relative_offset))
2119 DEBUG(8, ("boing, the devmode was NULL\n"));
2124 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
2126 if(!prs_set_offset(ps, buffer->string_at_end))
2129 /* write the DEVMODE */
2130 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2133 if(!prs_set_offset(ps, struct_offset))
2136 relative_offset=buffer->string_at_end - buffer->struct_start;
2137 /* write its offset */
2138 if (!prs_uint32("offset", ps, depth, &relative_offset))
2144 /* read the offset */
2145 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2147 if (buffer->string_at_end == 0) {
2152 old_offset = prs_offset(ps);
2153 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2156 /* read the string */
2157 if((*devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1)) == NULL)
2159 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2162 if(!prs_set_offset(ps, old_offset))
2168 /*******************************************************************
2169 Parse a PRINTER_INFO_0 structure.
2170 ********************************************************************/
2172 BOOL smb_io_printer_info_0(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2174 prs_struct *ps=&buffer->prs;
2176 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2179 buffer->struct_start=prs_offset(ps);
2181 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2183 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2186 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2188 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2190 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2193 if(!prs_uint16("year", ps, depth, &info->year))
2195 if(!prs_uint16("month", ps, depth, &info->month))
2197 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2199 if(!prs_uint16("day", ps, depth, &info->day))
2201 if(!prs_uint16("hour", ps, depth, &info->hour))
2203 if(!prs_uint16("minute", ps, depth, &info->minute))
2205 if(!prs_uint16("second", ps, depth, &info->second))
2207 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2210 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2212 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2215 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2217 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2219 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2221 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2223 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2225 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2227 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2229 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2231 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2233 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2235 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2237 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2239 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2241 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2243 if(!prs_uint32("status" , ps, depth, &info->status))
2245 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2247 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2249 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2251 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2253 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2255 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2257 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2259 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2261 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2263 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2269 /*******************************************************************
2270 Parse a PRINTER_INFO_1 structure.
2271 ********************************************************************/
2273 BOOL smb_io_printer_info_1(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2275 prs_struct *ps=&buffer->prs;
2277 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2280 buffer->struct_start=prs_offset(ps);
2282 if (!prs_uint32("flags", ps, depth, &info->flags))
2284 if (!smb_io_relstr("description", buffer, depth, &info->description))
2286 if (!smb_io_relstr("name", buffer, depth, &info->name))
2288 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2294 /*******************************************************************
2295 Parse a PRINTER_INFO_2 structure.
2296 ********************************************************************/
2298 BOOL smb_io_printer_info_2(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2300 prs_struct *ps=&buffer->prs;
2301 uint32 dm_offset, sd_offset, current_offset;
2302 uint32 dummy_value = 0, has_secdesc = 0;
2304 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2307 buffer->struct_start=prs_offset(ps);
2309 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2311 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2313 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2315 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2317 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2319 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2321 if (!smb_io_relstr("location", buffer, depth, &info->location))
2324 /* save current offset and wind forwared by a uint32 */
2325 dm_offset = prs_offset(ps);
2326 if (!prs_uint32("devmode", ps, depth, &dummy_value))
2329 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2331 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2333 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2335 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2338 /* save current offset for the sec_desc */
2339 sd_offset = prs_offset(ps);
2340 if (!prs_uint32("sec_desc", ps, depth, &has_secdesc))
2344 /* save current location so we can pick back up here */
2345 current_offset = prs_offset(ps);
2347 /* parse the devmode */
2348 if (!prs_set_offset(ps, dm_offset))
2350 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2353 /* parse the sec_desc */
2354 if (info->secdesc) {
2355 if (!prs_set_offset(ps, sd_offset))
2357 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2361 /* pick up where we left off */
2362 if (!prs_set_offset(ps, current_offset))
2365 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2367 if (!prs_uint32("priority", ps, depth, &info->priority))
2369 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2371 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2373 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2375 if (!prs_uint32("status", ps, depth, &info->status))
2377 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2379 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2385 /*******************************************************************
2386 Parse a PRINTER_INFO_3 structure.
2387 ********************************************************************/
2389 BOOL smb_io_printer_info_3(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2392 prs_struct *ps=&buffer->prs;
2394 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2397 buffer->struct_start=prs_offset(ps);
2399 if (MARSHALLING(ps)) {
2400 /* Ensure the SD is 8 byte aligned in the buffer. */
2401 uint start = prs_offset(ps); /* Remember the start position. */
2404 /* Write a dummy value. */
2405 if (!prs_uint32("offset", ps, depth, &off_val))
2409 if (!prs_align_uint64(ps))
2412 /* Remember where we must seek back to write the SD. */
2413 offset = prs_offset(ps);
2415 /* Calculate the real offset for the SD. */
2417 off_val = offset - start;
2419 /* Seek back to where we store the SD offset & store. */
2420 prs_set_offset(ps, start);
2421 if (!prs_uint32("offset", ps, depth, &off_val))
2424 /* Return to after the 8 byte align. */
2425 prs_set_offset(ps, offset);
2428 if (!prs_uint32("offset", ps, depth, &offset))
2430 /* Seek within the buffer. */
2431 if (!prs_set_offset(ps, offset))
2434 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2440 /*******************************************************************
2441 Parse a PRINTER_INFO_4 structure.
2442 ********************************************************************/
2444 BOOL smb_io_printer_info_4(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
2446 prs_struct *ps=&buffer->prs;
2448 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
2451 buffer->struct_start=prs_offset(ps);
2453 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2455 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2457 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2462 /*******************************************************************
2463 Parse a PRINTER_INFO_5 structure.
2464 ********************************************************************/
2466 BOOL smb_io_printer_info_5(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
2468 prs_struct *ps=&buffer->prs;
2470 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
2473 buffer->struct_start=prs_offset(ps);
2475 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2477 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2479 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2481 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
2483 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
2488 /*******************************************************************
2489 Parse a PRINTER_INFO_6 structure.
2490 ********************************************************************/
2492 BOOL smb_io_printer_info_6(const char *desc, RPC_BUFFER *buffer,
2493 PRINTER_INFO_6 *info, int depth)
2495 prs_struct *ps=&buffer->prs;
2497 prs_debug(ps, depth, desc, "smb_io_printer_info_6");
2500 if (!prs_uint32("status", ps, depth, &info->status))
2506 /*******************************************************************
2507 Parse a PRINTER_INFO_7 structure.
2508 ********************************************************************/
2510 BOOL smb_io_printer_info_7(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_7 *info, int depth)
2512 prs_struct *ps=&buffer->prs;
2514 prs_debug(ps, depth, desc, "smb_io_printer_info_7");
2517 buffer->struct_start=prs_offset(ps);
2519 if (!smb_io_relstr("guid", buffer, depth, &info->guid))
2521 if (!prs_uint32("action", ps, depth, &info->action))
2526 /*******************************************************************
2527 Parse a PORT_INFO_1 structure.
2528 ********************************************************************/
2530 BOOL smb_io_port_info_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2532 prs_struct *ps=&buffer->prs;
2534 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2537 buffer->struct_start=prs_offset(ps);
2539 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2545 /*******************************************************************
2546 Parse a PORT_INFO_2 structure.
2547 ********************************************************************/
2549 BOOL smb_io_port_info_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2551 prs_struct *ps=&buffer->prs;
2553 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2556 buffer->struct_start=prs_offset(ps);
2558 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2560 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2562 if (!smb_io_relstr("description", buffer, depth, &info->description))
2564 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2566 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2572 /*******************************************************************
2573 Parse a DRIVER_INFO_1 structure.
2574 ********************************************************************/
2576 BOOL smb_io_printer_driver_info_1(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2578 prs_struct *ps=&buffer->prs;
2580 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2583 buffer->struct_start=prs_offset(ps);
2585 if (!smb_io_relstr("name", buffer, depth, &info->name))
2591 /*******************************************************************
2592 Parse a DRIVER_INFO_2 structure.
2593 ********************************************************************/
2595 BOOL smb_io_printer_driver_info_2(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2597 prs_struct *ps=&buffer->prs;
2599 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2602 buffer->struct_start=prs_offset(ps);
2604 if (!prs_uint32("version", ps, depth, &info->version))
2606 if (!smb_io_relstr("name", buffer, depth, &info->name))
2608 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2610 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2612 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2614 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2620 /*******************************************************************
2621 Parse a DRIVER_INFO_3 structure.
2622 ********************************************************************/
2624 BOOL smb_io_printer_driver_info_3(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2626 prs_struct *ps=&buffer->prs;
2628 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2631 buffer->struct_start=prs_offset(ps);
2633 if (!prs_uint32("version", ps, depth, &info->version))
2635 if (!smb_io_relstr("name", buffer, depth, &info->name))
2637 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2639 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2641 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2643 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2645 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2648 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2651 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2653 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2659 /*******************************************************************
2660 Parse a DRIVER_INFO_6 structure.
2661 ********************************************************************/
2663 BOOL smb_io_printer_driver_info_6(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2665 prs_struct *ps=&buffer->prs;
2667 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2670 buffer->struct_start=prs_offset(ps);
2672 if (!prs_uint32("version", ps, depth, &info->version))
2674 if (!smb_io_relstr("name", buffer, depth, &info->name))
2676 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2678 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2680 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2682 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2684 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2687 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2690 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2692 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2695 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2698 if (!prs_uint64("date", ps, depth, &info->driver_date))
2701 if (!prs_uint32("padding", ps, depth, &info->padding))
2704 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2707 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2710 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2712 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2714 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2716 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2722 /*******************************************************************
2723 Parse a JOB_INFO_1 structure.
2724 ********************************************************************/
2726 BOOL smb_io_job_info_1(const char *desc, RPC_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2728 prs_struct *ps=&buffer->prs;
2730 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2733 buffer->struct_start=prs_offset(ps);
2735 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2737 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2739 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2741 if (!smb_io_relstr("username", buffer, depth, &info->username))
2743 if (!smb_io_relstr("document", buffer, depth, &info->document))
2745 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2747 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2749 if (!prs_uint32("status", ps, depth, &info->status))
2751 if (!prs_uint32("priority", ps, depth, &info->priority))
2753 if (!prs_uint32("position", ps, depth, &info->position))
2755 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2757 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2759 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2765 /*******************************************************************
2766 Parse a JOB_INFO_2 structure.
2767 ********************************************************************/
2769 BOOL smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2772 prs_struct *ps=&buffer->prs;
2774 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2777 buffer->struct_start=prs_offset(ps);
2779 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2781 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2783 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2785 if (!smb_io_relstr("username", buffer, depth, &info->username))
2787 if (!smb_io_relstr("document", buffer, depth, &info->document))
2789 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2791 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2794 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2796 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2798 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2800 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2802 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2805 /* SEC_DESC sec_desc;*/
2806 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2809 if (!prs_uint32("status",ps, depth, &info->status))
2811 if (!prs_uint32("priority",ps, depth, &info->priority))
2813 if (!prs_uint32("position",ps, depth, &info->position))
2815 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2817 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2819 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2821 if (!prs_uint32("size",ps, depth, &info->size))
2823 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2825 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2827 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2833 /*******************************************************************
2834 ********************************************************************/
2836 BOOL smb_io_form_1(const char *desc, RPC_BUFFER *buffer, FORM_1 *info, int depth)
2838 prs_struct *ps=&buffer->prs;
2840 prs_debug(ps, depth, desc, "smb_io_form_1");
2843 buffer->struct_start=prs_offset(ps);
2845 if (!prs_uint32("flag", ps, depth, &info->flag))
2848 if (!smb_io_relstr("name", buffer, depth, &info->name))
2851 if (!prs_uint32("width", ps, depth, &info->width))
2853 if (!prs_uint32("length", ps, depth, &info->length))
2855 if (!prs_uint32("left", ps, depth, &info->left))
2857 if (!prs_uint32("top", ps, depth, &info->top))
2859 if (!prs_uint32("right", ps, depth, &info->right))
2861 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2869 /*******************************************************************
2870 Parse a DRIVER_DIRECTORY_1 structure.
2871 ********************************************************************/
2873 BOOL smb_io_driverdir_1(const char *desc, RPC_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2875 prs_struct *ps=&buffer->prs;
2877 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
2880 buffer->struct_start=prs_offset(ps);
2882 if (!smb_io_unistr(desc, &info->name, ps, depth))
2888 /*******************************************************************
2889 Parse a PORT_INFO_1 structure.
2890 ********************************************************************/
2892 BOOL smb_io_port_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2894 prs_struct *ps=&buffer->prs;
2896 prs_debug(ps, depth, desc, "smb_io_port_1");
2899 buffer->struct_start=prs_offset(ps);
2901 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2907 /*******************************************************************
2908 Parse a PORT_INFO_2 structure.
2909 ********************************************************************/
2911 BOOL smb_io_port_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2913 prs_struct *ps=&buffer->prs;
2915 prs_debug(ps, depth, desc, "smb_io_port_2");
2918 buffer->struct_start=prs_offset(ps);
2920 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2922 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2924 if(!smb_io_relstr("description", buffer, depth, &info->description))
2926 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2928 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2934 /*******************************************************************
2935 ********************************************************************/
2937 BOOL smb_io_printprocessor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2939 prs_struct *ps=&buffer->prs;
2941 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2944 buffer->struct_start=prs_offset(ps);
2946 if (smb_io_relstr("name", buffer, depth, &info->name))
2952 /*******************************************************************
2953 ********************************************************************/
2955 BOOL smb_io_printprocdatatype_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2957 prs_struct *ps=&buffer->prs;
2959 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2962 buffer->struct_start=prs_offset(ps);
2964 if (smb_io_relstr("name", buffer, depth, &info->name))
2970 /*******************************************************************
2971 ********************************************************************/
2973 BOOL smb_io_printmonitor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2975 prs_struct *ps=&buffer->prs;
2977 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2980 buffer->struct_start=prs_offset(ps);
2982 if (!smb_io_relstr("name", buffer, depth, &info->name))
2988 /*******************************************************************
2989 ********************************************************************/
2991 BOOL smb_io_printmonitor_info_2(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2993 prs_struct *ps=&buffer->prs;
2995 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2998 buffer->struct_start=prs_offset(ps);
3000 if (!smb_io_relstr("name", buffer, depth, &info->name))
3002 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
3004 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
3010 /*******************************************************************
3011 return the size required by a struct in the stream
3012 ********************************************************************/
3014 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
3018 size+=size_of_relative_string( &info->printername );
3019 size+=size_of_relative_string( &info->servername );
3021 size+=size_of_uint32( &info->cjobs);
3022 size+=size_of_uint32( &info->total_jobs);
3023 size+=size_of_uint32( &info->total_bytes);
3025 size+=size_of_uint16( &info->year);
3026 size+=size_of_uint16( &info->month);
3027 size+=size_of_uint16( &info->dayofweek);
3028 size+=size_of_uint16( &info->day);
3029 size+=size_of_uint16( &info->hour);
3030 size+=size_of_uint16( &info->minute);
3031 size+=size_of_uint16( &info->second);
3032 size+=size_of_uint16( &info->milliseconds);
3034 size+=size_of_uint32( &info->global_counter);
3035 size+=size_of_uint32( &info->total_pages);
3037 size+=size_of_uint16( &info->major_version);
3038 size+=size_of_uint16( &info->build_version);
3040 size+=size_of_uint32( &info->unknown7);
3041 size+=size_of_uint32( &info->unknown8);
3042 size+=size_of_uint32( &info->unknown9);
3043 size+=size_of_uint32( &info->session_counter);
3044 size+=size_of_uint32( &info->unknown11);
3045 size+=size_of_uint32( &info->printer_errors);
3046 size+=size_of_uint32( &info->unknown13);
3047 size+=size_of_uint32( &info->unknown14);
3048 size+=size_of_uint32( &info->unknown15);
3049 size+=size_of_uint32( &info->unknown16);
3050 size+=size_of_uint32( &info->change_id);
3051 size+=size_of_uint32( &info->unknown18);
3052 size+=size_of_uint32( &info->status);
3053 size+=size_of_uint32( &info->unknown20);
3054 size+=size_of_uint32( &info->c_setprinter);
3056 size+=size_of_uint16( &info->unknown22);
3057 size+=size_of_uint16( &info->unknown23);
3058 size+=size_of_uint16( &info->unknown24);
3059 size+=size_of_uint16( &info->unknown25);
3060 size+=size_of_uint16( &info->unknown26);
3061 size+=size_of_uint16( &info->unknown27);
3062 size+=size_of_uint16( &info->unknown28);
3063 size+=size_of_uint16( &info->unknown29);
3068 /*******************************************************************
3069 return the size required by a struct in the stream
3070 ********************************************************************/
3072 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
3076 size+=size_of_uint32( &info->flags );
3077 size+=size_of_relative_string( &info->description );
3078 size+=size_of_relative_string( &info->name );
3079 size+=size_of_relative_string( &info->comment );
3084 /*******************************************************************
3085 return the size required by a struct in the stream
3086 ********************************************************************/
3088 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
3094 size += sec_desc_size( info->secdesc );
3096 size+=size_of_device_mode( info->devmode );
3098 size+=size_of_relative_string( &info->servername );
3099 size+=size_of_relative_string( &info->printername );
3100 size+=size_of_relative_string( &info->sharename );
3101 size+=size_of_relative_string( &info->portname );
3102 size+=size_of_relative_string( &info->drivername );
3103 size+=size_of_relative_string( &info->comment );
3104 size+=size_of_relative_string( &info->location );
3106 size+=size_of_relative_string( &info->sepfile );
3107 size+=size_of_relative_string( &info->printprocessor );
3108 size+=size_of_relative_string( &info->datatype );
3109 size+=size_of_relative_string( &info->parameters );
3111 size+=size_of_uint32( &info->attributes );
3112 size+=size_of_uint32( &info->priority );
3113 size+=size_of_uint32( &info->defaultpriority );
3114 size+=size_of_uint32( &info->starttime );
3115 size+=size_of_uint32( &info->untiltime );
3116 size+=size_of_uint32( &info->status );
3117 size+=size_of_uint32( &info->cjobs );
3118 size+=size_of_uint32( &info->averageppm );
3121 * add any adjustments for alignment. This is
3122 * not optimal since we could be calling this
3123 * function from a loop (e.g. enumprinters), but
3124 * it is easier to maintain the calculation here and
3125 * not place the burden on the caller to remember. --jerry
3127 if ((size % 4) != 0)
3128 size += 4 - (size % 4);
3133 /*******************************************************************
3134 return the size required by a struct in the stream
3135 ********************************************************************/
3137 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
3141 size+=size_of_relative_string( &info->printername );
3142 size+=size_of_relative_string( &info->servername );
3144 size+=size_of_uint32( &info->attributes );
3148 /*******************************************************************
3149 return the size required by a struct in the stream
3150 ********************************************************************/
3152 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
3156 size+=size_of_relative_string( &info->printername );
3157 size+=size_of_relative_string( &info->portname );
3159 size+=size_of_uint32( &info->attributes );
3160 size+=size_of_uint32( &info->device_not_selected_timeout );
3161 size+=size_of_uint32( &info->transmission_retry_timeout );
3165 /*******************************************************************
3166 return the size required by a struct in the stream
3167 ********************************************************************/
3169 uint32 spoolss_size_printer_info_6(PRINTER_INFO_6 *info)
3171 return sizeof(uint32);
3174 /*******************************************************************
3175 return the size required by a struct in the stream
3176 ********************************************************************/
3178 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
3180 /* The 8 is for the self relative pointer - 8 byte aligned.. */
3181 return 8 + (uint32)sec_desc_size( info->secdesc );
3184 /*******************************************************************
3185 return the size required by a struct in the stream
3186 ********************************************************************/
3188 uint32 spoolss_size_printer_info_7(PRINTER_INFO_7 *info)
3192 size+=size_of_relative_string( &info->guid );
3193 size+=size_of_uint32( &info->action );
3197 /*******************************************************************
3198 return the size required by a struct in the stream
3199 ********************************************************************/
3201 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
3204 size+=size_of_relative_string( &info->name );
3209 /*******************************************************************
3210 return the size required by a struct in the stream
3211 ********************************************************************/
3213 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
3216 size+=size_of_uint32( &info->version );
3217 size+=size_of_relative_string( &info->name );
3218 size+=size_of_relative_string( &info->architecture );
3219 size+=size_of_relative_string( &info->driverpath );
3220 size+=size_of_relative_string( &info->datafile );
3221 size+=size_of_relative_string( &info->configfile );
3226 /*******************************************************************
3227 return the size required by a string array.
3228 ********************************************************************/
3230 uint32 spoolss_size_string_array(uint16 *string)
3235 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
3237 i=i+2; /* to count all chars including the leading zero */
3238 i=2*i; /* because we need the value in bytes */
3239 i=i+4; /* the offset pointer size */
3244 /*******************************************************************
3245 return the size required by a struct in the stream
3246 ********************************************************************/
3248 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3252 size+=size_of_uint32( &info->version );
3253 size+=size_of_relative_string( &info->name );
3254 size+=size_of_relative_string( &info->architecture );
3255 size+=size_of_relative_string( &info->driverpath );
3256 size+=size_of_relative_string( &info->datafile );
3257 size+=size_of_relative_string( &info->configfile );
3258 size+=size_of_relative_string( &info->helpfile );
3259 size+=size_of_relative_string( &info->monitorname );
3260 size+=size_of_relative_string( &info->defaultdatatype );
3262 size+=spoolss_size_string_array(info->dependentfiles);
3267 /*******************************************************************
3268 return the size required by a struct in the stream
3269 ********************************************************************/
3271 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3275 size+=size_of_uint32( &info->version );
3276 size+=size_of_relative_string( &info->name );
3277 size+=size_of_relative_string( &info->architecture );
3278 size+=size_of_relative_string( &info->driverpath );
3279 size+=size_of_relative_string( &info->datafile );
3280 size+=size_of_relative_string( &info->configfile );
3281 size+=size_of_relative_string( &info->helpfile );
3283 size+=spoolss_size_string_array(info->dependentfiles);
3285 size+=size_of_relative_string( &info->monitorname );
3286 size+=size_of_relative_string( &info->defaultdatatype );
3288 size+=spoolss_size_string_array(info->previousdrivernames);
3290 size+=size_of_nttime(&info->driver_date);
3291 size+=size_of_uint32( &info->padding );
3292 size+=size_of_uint32( &info->driver_version_low );
3293 size+=size_of_uint32( &info->driver_version_high );
3294 size+=size_of_relative_string( &info->mfgname );
3295 size+=size_of_relative_string( &info->oem_url );
3296 size+=size_of_relative_string( &info->hardware_id );
3297 size+=size_of_relative_string( &info->provider );
3302 /*******************************************************************
3303 return the size required by a struct in the stream
3304 ********************************************************************/
3306 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3309 size+=size_of_uint32( &info->jobid );
3310 size+=size_of_relative_string( &info->printername );
3311 size+=size_of_relative_string( &info->machinename );
3312 size+=size_of_relative_string( &info->username );
3313 size+=size_of_relative_string( &info->document );
3314 size+=size_of_relative_string( &info->datatype );
3315 size+=size_of_relative_string( &info->text_status );
3316 size+=size_of_uint32( &info->status );
3317 size+=size_of_uint32( &info->priority );
3318 size+=size_of_uint32( &info->position );
3319 size+=size_of_uint32( &info->totalpages );
3320 size+=size_of_uint32( &info->pagesprinted );
3321 size+=size_of_systemtime( &info->submitted );
3326 /*******************************************************************
3327 return the size required by a struct in the stream
3328 ********************************************************************/
3330 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3334 size+=4; /* size of sec desc ptr */
3336 size+=size_of_uint32( &info->jobid );
3337 size+=size_of_relative_string( &info->printername );
3338 size+=size_of_relative_string( &info->machinename );
3339 size+=size_of_relative_string( &info->username );
3340 size+=size_of_relative_string( &info->document );
3341 size+=size_of_relative_string( &info->notifyname );
3342 size+=size_of_relative_string( &info->datatype );
3343 size+=size_of_relative_string( &info->printprocessor );
3344 size+=size_of_relative_string( &info->parameters );
3345 size+=size_of_relative_string( &info->drivername );
3346 size+=size_of_device_mode( info->devmode );
3347 size+=size_of_relative_string( &info->text_status );
3348 /* SEC_DESC sec_desc;*/
3349 size+=size_of_uint32( &info->status );
3350 size+=size_of_uint32( &info->priority );
3351 size+=size_of_uint32( &info->position );
3352 size+=size_of_uint32( &info->starttime );
3353 size+=size_of_uint32( &info->untiltime );
3354 size+=size_of_uint32( &info->totalpages );
3355 size+=size_of_uint32( &info->size );
3356 size+=size_of_systemtime( &info->submitted );
3357 size+=size_of_uint32( &info->timeelapsed );
3358 size+=size_of_uint32( &info->pagesprinted );
3363 /*******************************************************************
3364 return the size required by a struct in the stream
3365 ********************************************************************/
3367 uint32 spoolss_size_form_1(FORM_1 *info)
3371 size+=size_of_uint32( &info->flag );
3372 size+=size_of_relative_string( &info->name );
3373 size+=size_of_uint32( &info->width );
3374 size+=size_of_uint32( &info->length );
3375 size+=size_of_uint32( &info->left );
3376 size+=size_of_uint32( &info->top );
3377 size+=size_of_uint32( &info->right );
3378 size+=size_of_uint32( &info->bottom );
3383 /*******************************************************************
3384 return the size required by a struct in the stream
3385 ********************************************************************/
3387 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3391 size+=size_of_relative_string( &info->port_name );
3396 /*******************************************************************
3397 return the size required by a struct in the stream
3398 ********************************************************************/
3400 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3404 size=str_len_uni(&info->name); /* the string length */
3405 size=size+1; /* add the leading zero */
3406 size=size*2; /* convert in char */
3411 /*******************************************************************
3412 return the size required by a struct in the stream
3413 ********************************************************************/
3415 uint32 spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1 *info)
3419 size=str_len_uni(&info->name); /* the string length */
3420 size=size+1; /* add the leading zero */
3421 size=size*2; /* convert in char */
3426 /*******************************************************************
3427 return the size required by a struct in the stream
3428 ********************************************************************/
3430 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3434 size+=size_of_relative_string( &info->port_name );
3435 size+=size_of_relative_string( &info->monitor_name );
3436 size+=size_of_relative_string( &info->description );
3438 size+=size_of_uint32( &info->port_type );
3439 size+=size_of_uint32( &info->reserved );
3444 /*******************************************************************
3445 return the size required by a struct in the stream
3446 ********************************************************************/
3448 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3451 size+=size_of_relative_string( &info->name );
3456 /*******************************************************************
3457 return the size required by a struct in the stream
3458 ********************************************************************/
3460 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3463 size+=size_of_relative_string( &info->name );
3468 /*******************************************************************
3469 return the size required by a struct in the stream
3470 ********************************************************************/
3471 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
3478 /* uint32(offset) + uint32(length) + length) */
3479 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
3480 size += (size_of_uint32(&p->data_len)*2) + p->data_len + (p->data_len%2) ;
3482 size += size_of_uint32(&p->type);
3487 /*******************************************************************
3488 return the size required by a struct in the stream
3489 ********************************************************************/
3491 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3494 size+=size_of_relative_string( &info->name );
3499 /*******************************************************************
3500 return the size required by a struct in the stream
3501 ********************************************************************/
3503 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3506 size+=size_of_relative_string( &info->name);
3507 size+=size_of_relative_string( &info->environment);
3508 size+=size_of_relative_string( &info->dll_name);
3513 /*******************************************************************
3515 ********************************************************************/
3517 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3518 const POLICY_HND *hnd,
3519 const fstring architecture,
3520 uint32 level, uint32 clientmajor, uint32 clientminor,
3521 RPC_BUFFER *buffer, uint32 offered)
3526 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3528 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3531 q_u->clientmajorversion=clientmajor;
3532 q_u->clientminorversion=clientminor;
3535 q_u->offered=offered;
3540 /*******************************************************************
3542 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3543 ********************************************************************/
3545 BOOL spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3547 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3553 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3555 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3557 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3562 if(!prs_uint32("level", ps, depth, &q_u->level))
3565 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3571 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3574 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3576 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3582 /*******************************************************************
3584 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3585 ********************************************************************/
3587 BOOL spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3589 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3595 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3600 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3602 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3604 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3606 if (!prs_werror("status", ps, depth, &r_u->status))
3612 /*******************************************************************
3614 ********************************************************************/
3616 BOOL make_spoolss_q_enumprinters(
3617 SPOOL_Q_ENUMPRINTERS *q_u,
3627 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3628 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3632 q_u->offered=offered;
3637 /*******************************************************************
3639 ********************************************************************/
3641 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3642 fstring servername, uint32 level,
3643 RPC_BUFFER *buffer, uint32 offered)
3645 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3646 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3650 q_u->offered=offered;
3655 /*******************************************************************
3657 * called from spoolss_enumprinters (srv_spoolss.c)
3658 ********************************************************************/
3660 BOOL spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3662 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3668 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3670 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3673 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3678 if (!prs_uint32("level", ps, depth, &q_u->level))
3681 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3686 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3692 /*******************************************************************
3693 Parse a SPOOL_R_ENUMPRINTERS structure.
3694 ********************************************************************/
3696 BOOL spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3698 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3704 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3710 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3713 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3716 if (!prs_werror("status", ps, depth, &r_u->status))
3722 /*******************************************************************
3723 * write a structure.
3724 * called from spoolss_r_enum_printers (srv_spoolss.c)
3726 ********************************************************************/
3728 BOOL spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3730 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3736 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3742 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3745 if (!prs_werror("status", ps, depth, &r_u->status))
3751 /*******************************************************************
3753 * called from spoolss_getprinter (srv_spoolss.c)
3754 ********************************************************************/
3756 BOOL spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3758 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3764 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3766 if (!prs_uint32("level", ps, depth, &q_u->level))
3769 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3774 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3780 /*******************************************************************
3782 ********************************************************************/
3784 BOOL make_spoolss_q_getprinter(
3785 TALLOC_CTX *mem_ctx,
3786 SPOOL_Q_GETPRINTER *q_u,
3787 const POLICY_HND *hnd,
3797 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3801 q_u->offered=offered;
3806 /*******************************************************************
3808 ********************************************************************/
3809 BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
3810 const POLICY_HND *hnd, uint32 level, PRINTER_INFO_CTR *info,
3814 DEVICEMODE *devmode;
3819 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3822 q_u->info.level = level;
3823 q_u->info.info_ptr = 1; /* Info is != NULL, see above */
3826 /* There's no such thing as a setprinter level 1 */
3829 secdesc = info->printers_2->secdesc;
3830 devmode = info->printers_2->devmode;
3832 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
3833 #if 1 /* JERRY TEST */
3834 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
3835 if (!q_u->secdesc_ctr)
3837 q_u->secdesc_ctr->sd = secdesc;
3838 q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3840 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
3841 q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
3842 q_u->devmode_ctr.devmode = devmode;
3844 q_u->secdesc_ctr = NULL;
3846 q_u->devmode_ctr.devmode_ptr = 0;
3847 q_u->devmode_ctr.size = 0;
3848 q_u->devmode_ctr.devmode = NULL;
3852 secdesc = info->printers_3->secdesc;
3854 make_spoolss_printer_info_3 (mem_ctx, &q_u->info.info_3, info->printers_3);
3856 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
3857 if (!q_u->secdesc_ctr)
3859 q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3860 q_u->secdesc_ctr->sd = secdesc;
3864 make_spoolss_printer_info_7 (mem_ctx, &q_u->info.info_7, info->printers_7);
3868 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
3873 q_u->command = command;
3879 /*******************************************************************
3880 ********************************************************************/
3882 BOOL spoolss_io_r_setprinter(const char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3884 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3890 if(!prs_werror("status", ps, depth, &r_u->status))
3896 /*******************************************************************
3897 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3898 ********************************************************************/
3900 BOOL spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3902 uint32 ptr_sec_desc = 0;
3904 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3910 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3912 if(!prs_uint32("level", ps, depth, &q_u->level))
3915 /* check for supported levels and structures we know about */
3917 switch ( q_u->level ) {
3922 /* supported levels */
3925 DEBUG(0,("spoolss_io_q_setprinter: unsupported printer info level [%d]\n",
3931 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3934 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3944 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3949 /* FIXME ! Our parsing here is wrong I think,
3950 * but for a level3 it makes no sense for
3951 * ptr_sec_desc to be NULL. JRA. Based on
3952 * a Vista sniff from Martin Zielinski <mz@seh.de>.
3954 if (UNMARSHALLING(ps)) {
3957 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3964 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3969 /* Parse a NULL security descriptor. This should really
3970 happen inside the sec_io_desc_buf() function. */
3972 prs_debug(ps, depth, "", "sec_io_desc_buf");
3973 if (!prs_uint32("size", ps, depth + 1, &dummy))
3975 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
3979 if(!prs_uint32("command", ps, depth, &q_u->command))
3985 /*******************************************************************
3986 ********************************************************************/
3988 BOOL spoolss_io_r_fcpn(const char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3990 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3996 if(!prs_werror("status", ps, depth, &r_u->status))
4002 /*******************************************************************
4003 ********************************************************************/
4005 BOOL spoolss_io_q_fcpn(const char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
4008 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
4014 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4021 /*******************************************************************
4022 ********************************************************************/
4024 BOOL spoolss_io_r_addjob(const char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
4026 prs_debug(ps, depth, desc, "");
4032 if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4038 if(!prs_uint32("needed", ps, depth, &r_u->needed))
4041 if(!prs_werror("status", ps, depth, &r_u->status))
4047 /*******************************************************************
4048 ********************************************************************/
4050 BOOL spoolss_io_q_addjob(const char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
4052 prs_debug(ps, depth, desc, "");
4058 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
4060 if(!prs_uint32("level", ps, depth, &q_u->level))
4063 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4069 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4075 /*******************************************************************
4076 ********************************************************************/
4078 BOOL spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
4080 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
4086 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4092 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4095 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4098 if (!prs_werror("status", ps, depth, &r_u->status))
4104 /*******************************************************************
4105 ********************************************************************/
4107 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
4118 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4119 q_u->firstjob = firstjob;
4120 q_u->numofjobs = numofjobs;
4122 q_u->buffer= buffer;
4123 q_u->offered = offered;
4127 /*******************************************************************
4128 ********************************************************************/
4130 BOOL spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
4132 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
4138 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
4141 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
4143 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
4145 if (!prs_uint32("level", ps, depth, &q_u->level))
4148 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4154 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4160 /*******************************************************************
4161 ********************************************************************/
4163 BOOL spoolss_io_r_schedulejob(const char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
4165 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
4171 if(!prs_werror("status", ps, depth, &r_u->status))
4177 /*******************************************************************
4178 ********************************************************************/
4180 BOOL spoolss_io_q_schedulejob(const char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
4182 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
4188 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4190 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4196 /*******************************************************************
4197 ********************************************************************/
4199 BOOL spoolss_io_r_setjob(const char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
4201 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
4207 if(!prs_werror("status", ps, depth, &r_u->status))
4213 /*******************************************************************
4214 ********************************************************************/
4216 BOOL spoolss_io_q_setjob(const char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
4218 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
4224 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4226 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4229 * level is usually 0. If (level!=0) then I'm in trouble !
4230 * I will try to generate setjob command with level!=0, one day.
4232 if(!prs_uint32("level", ps, depth, &q_u->level))
4234 if(!prs_uint32("command", ps, depth, &q_u->command))
4240 /*******************************************************************
4241 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
4242 ********************************************************************/
4244 BOOL spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
4246 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
4252 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4258 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4261 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4264 if (!prs_werror("status", ps, depth, &r_u->status))
4270 /*******************************************************************
4272 ********************************************************************/
4274 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
4276 const char *environment,
4278 RPC_BUFFER *buffer, uint32 offered)
4280 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
4281 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
4285 q_u->offered=offered;
4290 /*******************************************************************
4291 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4292 ********************************************************************/
4294 BOOL spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
4297 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
4303 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4305 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
4310 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4312 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4317 if (!prs_uint32("level", ps, depth, &q_u->level))
4320 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4326 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4332 /*******************************************************************
4333 ********************************************************************/
4335 BOOL spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4338 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4343 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4345 if (!prs_uint32("level", ps, depth, &q_u->level))
4348 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4353 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4359 /*******************************************************************
4360 ********************************************************************/
4362 BOOL spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4364 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4370 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4376 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4379 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4382 if (!prs_werror("status", ps, depth, &r_u->status))
4388 /*******************************************************************
4389 ********************************************************************/
4391 BOOL spoolss_io_q_getform(const char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4394 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4399 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4401 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4407 if (!prs_uint32("level", ps, depth, &q_u->level))
4410 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4415 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4421 /*******************************************************************
4422 ********************************************************************/
4424 BOOL spoolss_io_r_getform(const char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4426 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4432 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4438 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4441 if (!prs_werror("status", ps, depth, &r_u->status))
4447 /*******************************************************************
4448 Parse a SPOOL_R_ENUMPORTS structure.
4449 ********************************************************************/
4451 BOOL spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4453 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4459 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4465 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4468 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4471 if (!prs_werror("status", ps, depth, &r_u->status))
4477 /*******************************************************************
4478 ********************************************************************/
4480 BOOL spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4482 prs_debug(ps, depth, desc, "");
4488 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4490 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4495 if (!prs_uint32("level", ps, depth, &q_u->level))
4498 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4503 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4509 /*******************************************************************
4510 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4511 ********************************************************************/
4513 BOOL spool_io_printer_info_level_1(const char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4515 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4521 if(!prs_uint32("flags", ps, depth, &il->flags))
4523 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4525 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4527 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4530 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4532 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4534 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4540 /*******************************************************************
4541 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4542 ********************************************************************/
4544 BOOL spool_io_printer_info_level_3(const char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4546 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4552 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4558 /*******************************************************************
4559 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4560 ********************************************************************/
4562 BOOL spool_io_printer_info_level_2(const char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4564 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4570 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4572 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4574 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4576 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4579 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4581 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4583 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4585 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4587 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4589 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4591 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4593 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4595 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4598 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4600 if(!prs_uint32("priority", ps, depth, &il->priority))
4602 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4604 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4606 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4608 if(!prs_uint32("status", ps, depth, &il->status))
4610 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4612 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4615 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4617 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4619 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4621 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4623 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4625 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4627 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4629 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4631 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4633 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4635 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4641 BOOL spool_io_printer_info_level_7(const char *desc, SPOOL_PRINTER_INFO_LEVEL_7 *il, prs_struct *ps, int depth)
4643 prs_debug(ps, depth, desc, "spool_io_printer_info_level_7");
4649 if(!prs_uint32("guid_ptr", ps, depth, &il->guid_ptr))
4651 if(!prs_uint32("action", ps, depth, &il->action))
4654 if(!smb_io_unistr2("servername", &il->guid, il->guid_ptr, ps, depth))
4659 /*******************************************************************
4660 ********************************************************************/
4662 BOOL spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4664 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4669 if(!prs_uint32("level", ps, depth, &il->level))
4671 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4674 /* if no struct inside just return */
4675 if (il->info_ptr==0) {
4676 if (UNMARSHALLING(ps)) {
4683 switch (il->level) {
4685 * level 0 is used by setprinter when managing the queue
4686 * (hold, stop, start a queue)
4690 /* DOCUMENT ME!!! What is level 1 used for? */
4693 if (UNMARSHALLING(ps)) {
4694 if ((il->info_1=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_1,1)) == NULL)
4697 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4702 * level 2 is used by addprinter
4703 * and by setprinter when updating printer's info
4706 if (UNMARSHALLING(ps)) {
4707 if ((il->info_2=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_2,1)) == NULL)
4710 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4713 /* DOCUMENT ME!!! What is level 3 used for? */
4716 if (UNMARSHALLING(ps)) {
4717 if ((il->info_3=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_3,1)) == NULL)
4720 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4725 if (UNMARSHALLING(ps))
4726 if ((il->info_7=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_7,1)) == NULL)
4728 if (!spool_io_printer_info_level_7("", il->info_7, ps, depth))
4736 /*******************************************************************
4737 ********************************************************************/
4739 BOOL spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4741 uint32 ptr_sec_desc = 0;
4743 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4749 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->server_name))
4751 if (!prs_io_unistr2("servername", ps, depth, q_u->server_name))
4757 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4760 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4763 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4769 switch (q_u->level) {
4771 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4774 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4778 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4783 /* Parse a NULL security descriptor. This should really
4784 happen inside the sec_io_desc_buf() function. */
4786 prs_debug(ps, depth, "", "sec_io_desc_buf");
4787 if (!prs_uint32("size", ps, depth + 1, &dummy))
4789 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
4793 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4795 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4801 /*******************************************************************
4802 ********************************************************************/
4804 BOOL spoolss_io_r_addprinterex(const char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4805 prs_struct *ps, int depth)
4807 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4810 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4813 if(!prs_werror("status", ps, depth, &r_u->status))
4819 /*******************************************************************
4820 ********************************************************************/
4822 BOOL spool_io_printer_driver_info_level_3(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4823 prs_struct *ps, int depth)
4825 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4827 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4831 if (UNMARSHALLING(ps)) {
4832 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_3,1);
4844 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4846 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4848 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4850 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4852 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4854 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4856 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4858 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4860 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4862 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4864 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4870 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4872 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4874 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4876 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4878 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4880 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4882 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4884 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4890 if (il->dependentfiles_ptr)
4891 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4896 /*******************************************************************
4897 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4898 ********************************************************************/
4900 BOOL spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4901 prs_struct *ps, int depth)
4903 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4905 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4909 if (UNMARSHALLING(ps)) {
4910 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_6,1);
4923 * I know this seems weird, but I have no other explanation.
4924 * This is observed behavior on both NT4 and 2K servers.
4928 if (!prs_align_uint64(ps))
4931 /* parse the main elements the packet */
4933 if(!prs_uint32("cversion ", ps, depth, &il->version))
4935 if(!prs_uint32("name ", ps, depth, &il->name_ptr))
4937 if(!prs_uint32("environment ", ps, depth, &il->environment_ptr))
4939 if(!prs_uint32("driverpath ", ps, depth, &il->driverpath_ptr))
4941 if(!prs_uint32("datafile ", ps, depth, &il->datafile_ptr))
4943 if(!prs_uint32("configfile ", ps, depth, &il->configfile_ptr))
4945 if(!prs_uint32("helpfile ", ps, depth, &il->helpfile_ptr))
4947 if(!prs_uint32("monitorname ", ps, depth, &il->monitorname_ptr))
4949 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4951 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_len))
4953 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_ptr))
4955 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_len))
4957 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_ptr))
4959 if(!smb_io_time("driverdate ", &il->driverdate, ps, depth))
4961 if(!prs_uint32("dummy4 ", ps, depth, &il->dummy4))
4963 if(!prs_uint64("driverversion ", ps, depth, &il->driverversion))
4965 if(!prs_uint32("mfgname ", ps, depth, &il->mfgname_ptr))
4967 if(!prs_uint32("oemurl ", ps, depth, &il->oemurl_ptr))
4969 if(!prs_uint32("hardwareid ", ps, depth, &il->hardwareid_ptr))
4971 if(!prs_uint32("provider ", ps, depth, &il->provider_ptr))
4974 /* parse the structures in the packet */
4976 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4981 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4986 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4991 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4996 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
5001 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
5006 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
5011 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
5015 if (il->dependentfiles_ptr) {
5016 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
5021 if (il->previousnames_ptr) {
5022 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
5027 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
5031 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
5035 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
5039 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
5045 /*******************************************************************
5046 convert a buffer of UNICODE strings null terminated
5047 the buffer is terminated by a NULL
5049 convert to an dos codepage array (null terminated)
5051 dynamically allocate memory
5053 ********************************************************************/
5055 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
5064 src = (char *)buf5->buffer;
5065 *ar = SMB_MALLOC_ARRAY(fstring, 1);
5070 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
5071 rpcstr_pull(f, src, sizeof(f)-1, -1, STR_TERMINATE);
5072 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
5073 *ar = SMB_REALLOC_ARRAY(*ar, fstring, n+2);
5077 fstrcpy((*ar)[n], f);
5081 fstrcpy((*ar)[n], "");
5086 /*******************************************************************
5087 read a UNICODE array with null terminated strings
5088 and null terminated array
5089 and size of array at beginning
5090 ********************************************************************/
5092 BOOL smb_io_unibuffer(const char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
5094 if (buffer==NULL) return False;
5097 buffer->uni_str_len=buffer->uni_max_len;
5099 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
5102 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
5108 /*******************************************************************
5109 ********************************************************************/
5111 BOOL spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
5113 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
5118 if(!prs_uint32("level", ps, depth, &il->level))
5120 if(!prs_uint32("ptr", ps, depth, &il->ptr))
5126 switch (il->level) {
5128 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
5132 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
5142 /*******************************************************************
5143 init a SPOOL_Q_ADDPRINTERDRIVER struct
5144 ******************************************************************/
5146 BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
5147 SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
5148 uint32 level, PRINTER_DRIVER_CTR *info)
5150 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
5152 if (!srv_name || !info) {
5156 q_u->server_name_ptr = 1; /* srv_name is != NULL, see above */
5157 init_unistr2(&q_u->server_name, srv_name, UNI_STR_TERMINATE);
5161 q_u->info.level = level;
5162 q_u->info.ptr = 1; /* Info is != NULL, see above */
5165 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
5167 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
5171 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
5178 BOOL make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
5179 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
5180 DRIVER_INFO_3 *info3)
5183 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
5185 if (!(inf=TALLOC_ZERO_P(mem_ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)))
5188 inf->cversion = info3->version;
5189 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
5190 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
5191 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
5192 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
5193 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
5194 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
5195 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
5196 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
5198 init_unistr2_from_unistr(&inf->name, &info3->name);
5199 init_unistr2_from_unistr(&inf->environment, &info3->architecture);
5200 init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
5201 init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
5202 init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
5203 init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
5204 init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
5205 init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
5207 if (info3->dependentfiles) {
5209 BOOL null_char = False;
5210 uint16 *ptr = info3->dependentfiles;
5215 /* the null_char BOOL is used to help locate
5216 two '\0's back to back */
5233 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
5234 inf->dependentfilessize = (info3->dependentfiles != NULL) ? len : 0;
5235 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles)) {
5240 *spool_drv_info = inf;
5245 /*******************************************************************
5246 make a BUFFER5 struct from a uint16*
5247 ******************************************************************/
5249 BOOL make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
5252 buf5->buf_len = len;
5254 if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
5255 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
5265 /*******************************************************************
5266 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5267 ********************************************************************/
5269 BOOL spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5271 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
5277 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5279 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5284 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5287 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5293 /*******************************************************************
5294 ********************************************************************/
5296 BOOL spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5298 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
5301 if(!prs_werror("status", ps, depth, &q_u->status))
5307 /*******************************************************************
5308 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5309 ********************************************************************/
5311 BOOL spoolss_io_q_addprinterdriverex(const char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5313 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriverex");
5319 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5321 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5326 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5329 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5334 if(!prs_uint32("copy flags", ps, depth, &q_u->copy_flags))
5340 /*******************************************************************
5341 ********************************************************************/
5343 BOOL spoolss_io_r_addprinterdriverex(const char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5345 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriverex");
5348 if(!prs_werror("status", ps, depth, &q_u->status))
5354 /*******************************************************************
5355 ********************************************************************/
5357 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
5358 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
5360 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
5362 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5366 *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_3);
5374 d->cversion=uni->cversion;
5376 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5377 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5378 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5379 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5380 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5381 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5382 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5383 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5385 DEBUGADD(8,( "version: %d\n", d->cversion));
5386 DEBUGADD(8,( "name: %s\n", d->name));
5387 DEBUGADD(8,( "environment: %s\n", d->environment));
5388 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5389 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5390 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5391 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5392 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5393 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5395 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5402 /*******************************************************************
5403 ********************************************************************/
5404 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5405 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5407 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5409 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5413 *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_6);
5421 d->version=uni->version;
5423 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5424 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5425 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5426 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5427 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5428 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5429 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5430 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5432 DEBUGADD(8,( "version: %d\n", d->version));
5433 DEBUGADD(8,( "name: %s\n", d->name));
5434 DEBUGADD(8,( "environment: %s\n", d->environment));
5435 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5436 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5437 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5438 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5439 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5440 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5442 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5444 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5454 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5455 NT_PRINTER_INFO_LEVEL_2 *d)
5457 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5459 d->attributes=uni->attributes;
5460 d->priority=uni->priority;
5461 d->default_priority=uni->default_priority;
5462 d->starttime=uni->starttime;
5463 d->untiltime=uni->untiltime;
5464 d->status=uni->status;
5465 d->cjobs=uni->cjobs;
5467 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
5468 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
5469 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
5470 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
5471 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
5472 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
5473 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
5474 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
5475 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
5476 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
5477 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
5482 /*******************************************************************
5484 ********************************************************************/
5486 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5487 fstring servername, fstring env_name, uint32 level,
5488 RPC_BUFFER *buffer, uint32 offered)
5490 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5491 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5495 q_u->offered=offered;
5500 /*******************************************************************
5501 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5502 ********************************************************************/
5504 BOOL spoolss_io_q_getprinterdriverdir(const char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5506 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5511 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5513 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5519 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5521 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5527 if(!prs_uint32("level", ps, depth, &q_u->level))
5530 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5536 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5542 /*******************************************************************
5543 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5544 ********************************************************************/
5546 BOOL spoolss_io_r_getprinterdriverdir(const char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5548 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5554 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5560 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5563 if (!prs_werror("status", ps, depth, &r_u->status))
5569 /*******************************************************************
5570 ********************************************************************/
5572 BOOL spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5574 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5580 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5586 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5589 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5592 if (!prs_werror("status", ps, depth, &r_u->status))
5598 /*******************************************************************
5599 ********************************************************************/
5601 BOOL spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5603 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5609 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5611 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5617 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5619 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5625 if (!prs_uint32("level", ps, depth, &q_u->level))
5628 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5634 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5640 /*******************************************************************
5641 ********************************************************************/
5643 BOOL spoolss_io_q_addprintprocessor(const char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5645 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5651 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5653 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5658 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5663 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5668 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5674 /*******************************************************************
5675 ********************************************************************/
5677 BOOL spoolss_io_r_addprintprocessor(const char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5679 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5685 if (!prs_werror("status", ps, depth, &r_u->status))
5691 /*******************************************************************
5692 ********************************************************************/
5694 BOOL spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5696 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5702 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5708 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5711 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5714 if (!prs_werror("status", ps, depth, &r_u->status))
5720 /*******************************************************************
5721 ********************************************************************/
5723 BOOL spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5725 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5731 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5733 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5739 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5741 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5747 if (!prs_uint32("level", ps, depth, &q_u->level))
5750 if(!prs_rpcbuffer_p("buffer", ps, depth, &q_u->buffer))
5756 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5762 /*******************************************************************
5763 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5764 ********************************************************************/
5766 BOOL spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5768 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5774 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5776 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5782 if (!prs_uint32("level", ps, depth, &q_u->level))
5785 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5791 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5797 /*******************************************************************
5798 ********************************************************************/
5800 BOOL spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5802 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5808 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5814 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5817 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5820 if (!prs_werror("status", ps, depth, &r_u->status))
5826 /*******************************************************************
5827 ********************************************************************/
5829 BOOL spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5831 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5836 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5839 if (UNMARSHALLING(ps) && r_u->valuesize) {
5840 r_u->value = PRS_ALLOC_MEM(ps, uint16, r_u->valuesize);
5842 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
5847 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5853 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5856 if(!prs_uint32("type", ps, depth, &r_u->type))
5859 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5862 if (UNMARSHALLING(ps) && r_u->datasize) {
5863 r_u->data = PRS_ALLOC_MEM(ps, uint8, r_u->datasize);
5865 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
5870 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5875 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5877 if(!prs_werror("status", ps, depth, &r_u->status))
5883 /*******************************************************************
5884 ********************************************************************/
5886 BOOL spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5888 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5893 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5895 if(!prs_uint32("index", ps, depth, &q_u->index))
5897 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5899 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5905 /*******************************************************************
5906 ********************************************************************/
5908 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5909 const POLICY_HND *hnd,
5910 uint32 idx, uint32 valuelen, uint32 datalen)
5912 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5914 q_u->valuesize=valuelen;
5915 q_u->datasize=datalen;
5920 /*******************************************************************
5921 ********************************************************************/
5923 BOOL make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
5924 const POLICY_HND *hnd, const char *key,
5927 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5928 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
5934 /*******************************************************************
5935 ********************************************************************/
5936 BOOL make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
5937 char* value, uint32 data_type, char* data, uint32 data_size)
5939 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5940 q_u->type = data_type;
5941 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
5943 q_u->max_len = q_u->real_len = data_size;
5944 q_u->data = (unsigned char *)data;
5949 /*******************************************************************
5950 ********************************************************************/
5951 BOOL make_spoolss_q_setprinterdataex(SPOOL_Q_SETPRINTERDATAEX *q_u, const POLICY_HND *hnd,
5952 char *key, char* value, uint32 data_type, char* data,
5955 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5956 q_u->type = data_type;
5957 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
5958 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
5960 q_u->max_len = q_u->real_len = data_size;
5961 q_u->data = (unsigned char *)data;
5966 /*******************************************************************
5967 ********************************************************************/
5969 BOOL spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5971 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5976 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5978 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5984 if(!prs_uint32("type", ps, depth, &q_u->type))
5987 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5997 if (UNMARSHALLING(ps))
5998 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
5999 if(q_u->data == NULL)
6001 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6009 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6015 /*******************************************************************
6016 ********************************************************************/
6018 BOOL spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
6020 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
6025 if(!prs_werror("status", ps, depth, &r_u->status))
6031 /*******************************************************************
6032 ********************************************************************/
6033 BOOL spoolss_io_q_resetprinter(const char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
6035 prs_debug(ps, depth, desc, "spoolss_io_q_resetprinter");
6040 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6043 if (!prs_uint32("datatype_ptr", ps, depth, &q_u->datatype_ptr))
6046 if (q_u->datatype_ptr) {
6047 if (!smb_io_unistr2("datatype", &q_u->datatype, q_u->datatype_ptr?True:False, ps, depth))
6051 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
6058 /*******************************************************************
6059 ********************************************************************/
6060 BOOL spoolss_io_r_resetprinter(const char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
6062 prs_debug(ps, depth, desc, "spoolss_io_r_resetprinter");
6067 if(!prs_werror("status", ps, depth, &r_u->status))
6073 /*******************************************************************
6074 ********************************************************************/
6076 static BOOL spoolss_io_addform(const char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
6078 prs_debug(ps, depth, desc, "spoolss_io_addform");
6085 if(!prs_uint32("flags", ps, depth, &f->flags))
6087 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
6089 if(!prs_uint32("size_x", ps, depth, &f->size_x))
6091 if(!prs_uint32("size_y", ps, depth, &f->size_y))
6093 if(!prs_uint32("left", ps, depth, &f->left))
6095 if(!prs_uint32("top", ps, depth, &f->top))
6097 if(!prs_uint32("right", ps, depth, &f->right))
6099 if(!prs_uint32("bottom", ps, depth, &f->bottom))
6102 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
6109 /*******************************************************************
6110 ********************************************************************/
6112 BOOL spoolss_io_q_deleteform(const char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
6114 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
6119 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6121 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
6127 /*******************************************************************
6128 ********************************************************************/
6130 BOOL spoolss_io_r_deleteform(const char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
6132 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
6137 if(!prs_werror("status", ps, depth, &r_u->status))
6143 /*******************************************************************
6144 ********************************************************************/
6146 BOOL spoolss_io_q_addform(const char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
6148 uint32 useless_ptr=1;
6149 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
6154 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6156 if(!prs_uint32("level", ps, depth, &q_u->level))
6158 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6163 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6165 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6172 /*******************************************************************
6173 ********************************************************************/
6175 BOOL spoolss_io_r_addform(const char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
6177 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
6182 if(!prs_werror("status", ps, depth, &r_u->status))
6188 /*******************************************************************
6189 ********************************************************************/
6191 BOOL spoolss_io_q_setform(const char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
6193 uint32 useless_ptr=1;
6194 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
6199 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6201 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
6207 if(!prs_uint32("level", ps, depth, &q_u->level))
6209 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6214 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6216 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6223 /*******************************************************************
6224 ********************************************************************/
6226 BOOL spoolss_io_r_setform(const char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
6228 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
6233 if(!prs_werror("status", ps, depth, &r_u->status))
6239 /*******************************************************************
6240 Parse a SPOOL_R_GETJOB structure.
6241 ********************************************************************/
6243 BOOL spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
6245 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
6251 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
6257 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6260 if (!prs_werror("status", ps, depth, &r_u->status))
6266 /*******************************************************************
6267 Parse a SPOOL_Q_GETJOB structure.
6268 ********************************************************************/
6270 BOOL spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
6272 prs_debug(ps, depth, desc, "");
6278 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6280 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
6282 if(!prs_uint32("level", ps, depth, &q_u->level))
6285 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
6291 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6297 void free_devmode(DEVICEMODE *devmode)
6299 if (devmode!=NULL) {
6300 SAFE_FREE(devmode->dev_private);
6305 void free_printer_info_1(PRINTER_INFO_1 *printer)
6310 void free_printer_info_2(PRINTER_INFO_2 *printer)
6312 if (printer!=NULL) {
6313 free_devmode(printer->devmode);
6314 printer->devmode = NULL;
6319 void free_printer_info_3(PRINTER_INFO_3 *printer)
6324 void free_printer_info_4(PRINTER_INFO_4 *printer)
6329 void free_printer_info_5(PRINTER_INFO_5 *printer)
6334 void free_printer_info_6(PRINTER_INFO_6 *printer)
6339 void free_printer_info_7(PRINTER_INFO_7 *printer)
6344 void free_job_info_2(JOB_INFO_2 *job)
6347 free_devmode(job->devmode);
6350 /*******************************************************************
6352 ********************************************************************/
6354 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
6355 const fstring string, uint32 printer, uint32 type)
6360 init_unistr2(&q_u->string, string, UNI_STR_TERMINATE);
6362 q_u->printer=printer;
6371 /*******************************************************************
6372 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
6373 ********************************************************************/
6375 BOOL spoolss_io_q_replyopenprinter(const char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
6377 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
6383 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
6389 if(!prs_uint32("printer", ps, depth, &q_u->printer))
6391 if(!prs_uint32("type", ps, depth, &q_u->type))
6394 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6396 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6402 /*******************************************************************
6403 Parse a SPOOL_R_REPLYOPENPRINTER structure.
6404 ********************************************************************/
6406 BOOL spoolss_io_r_replyopenprinter(const char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
6408 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
6414 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6417 if (!prs_werror("status", ps, depth, &r_u->status))
6423 /*******************************************************************
6425 ********************************************************************/
6426 BOOL make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd,
6427 uint32 condition, uint32 change_id)
6430 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6432 q_u->condition = condition;
6433 q_u->change_id = change_id;
6436 q_u->unknown1 = 0x1;
6437 memset(q_u->unknown2, 0x0, 5);
6438 q_u->unknown2[0] = 0x1;
6443 /*******************************************************************
6444 Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
6445 ********************************************************************/
6446 BOOL spoolss_io_q_routerreplyprinter (const char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
6449 prs_debug(ps, depth, desc, "spoolss_io_q_routerreplyprinter");
6455 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6458 if (!prs_uint32("condition", ps, depth, &q_u->condition))
6461 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6464 if (!prs_uint32("change_id", ps, depth, &q_u->change_id))
6467 if (!prs_uint8s(False, "dev_private", ps, depth, q_u->unknown2, 5))
6473 /*******************************************************************
6474 Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
6475 ********************************************************************/
6476 BOOL spoolss_io_r_routerreplyprinter (const char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
6478 prs_debug(ps, depth, desc, "spoolss_io_r_routerreplyprinter");
6484 if (!prs_werror("status", ps, depth, &r_u->status))
6490 /*******************************************************************
6492 ********************************************************************/
6494 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
6499 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6504 /*******************************************************************
6505 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6506 ********************************************************************/
6508 BOOL spoolss_io_q_replycloseprinter(const char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
6510 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
6516 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6522 /*******************************************************************
6523 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6524 ********************************************************************/
6526 BOOL spoolss_io_r_replycloseprinter(const char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6528 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6534 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6537 if (!prs_werror("status", ps, depth, &r_u->status))
6543 #if 0 /* JERRY - not currently used but could be :-) */
6545 /*******************************************************************
6546 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
6547 ******************************************************************/
6548 static BOOL copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
6549 SPOOL_NOTIFY_INFO_DATA *src, int n)
6553 memcpy(dst, src, sizeof(SPOOL_NOTIFY_INFO_DATA)*n);
6555 for (i=0; i<n; i++) {
6559 if (src->size != POINTER)
6561 len = src->notify_data.data.length;
6562 s = SMB_MALLOC_ARRAY(uint16, len);
6564 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
6568 memcpy(s, src->notify_data.data.string, len*2);
6569 dst->notify_data.data.string = s;
6575 /*******************************************************************
6576 Deep copy a SPOOL_NOTIFY_INFO structure
6577 ******************************************************************/
6578 static BOOL copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
6581 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
6585 dst->version = src->version;
6586 dst->flags = src->flags;
6587 dst->count = src->count;
6591 dst->data = SMB_MALLOC_ARRAY(SPOOL_NOTIFY_INFO_DATA, dst->count);
6593 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
6596 if (dst->data == NULL) {
6597 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
6602 return (copy_spool_notify_info_data(dst->data, src->data, src->count));
6609 /*******************************************************************
6611 ********************************************************************/
6613 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6614 uint32 change_low, uint32 change_high,
6615 SPOOL_NOTIFY_INFO *info)
6620 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6622 q_u->change_low=change_low;
6623 q_u->change_high=change_high;
6628 q_u->info_ptr=0x0FF0ADDE;
6630 q_u->info.version=2;
6633 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
6635 q_u->info.version = info->version;
6636 q_u->info.flags = info->flags;
6637 q_u->info.count = info->count;
6638 /* pointer field - be careful! */
6639 q_u->info.data = info->data;
6642 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6649 /*******************************************************************
6650 Parse a SPOOL_Q_REPLY_RRPCN structure.
6651 ********************************************************************/
6653 BOOL spoolss_io_q_reply_rrpcn(const char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6655 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6661 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6664 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6667 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6670 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6673 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6676 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6679 if(q_u->info_ptr!=0)
6680 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6686 /*******************************************************************
6687 Parse a SPOOL_R_REPLY_RRPCN structure.
6688 ********************************************************************/
6690 BOOL spoolss_io_r_reply_rrpcn(const char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6692 prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
6698 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6701 if (!prs_werror("status", ps, depth, &r_u->status))
6707 /*******************************************************************
6709 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6710 ********************************************************************/
6712 BOOL spoolss_io_q_getprinterdataex(const char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6717 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
6722 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6726 if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
6730 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
6734 if (!prs_uint32("size", ps, depth, &q_u->size))
6740 /*******************************************************************
6741 * write a structure.
6742 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6743 ********************************************************************/
6745 BOOL spoolss_io_r_getprinterdataex(const char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6750 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
6755 if (!prs_uint32("type", ps, depth, &r_u->type))
6757 if (!prs_uint32("size", ps, depth, &r_u->size))
6760 if (UNMARSHALLING(ps) && r_u->size) {
6761 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
6766 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
6772 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6774 if (!prs_werror("status", ps, depth, &r_u->status))
6780 /*******************************************************************
6782 ********************************************************************/
6784 BOOL spoolss_io_q_setprinterdataex(const char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6786 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
6791 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6793 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6799 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6805 if(!prs_uint32("type", ps, depth, &q_u->type))
6808 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6818 if (UNMARSHALLING(ps))
6819 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
6820 if(q_u->data == NULL)
6822 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6830 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6836 /*******************************************************************
6837 * write a structure.
6838 ********************************************************************/
6840 BOOL spoolss_io_r_setprinterdataex(const char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6842 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
6847 if(!prs_werror("status", ps, depth, &r_u->status))
6853 /*******************************************************************
6855 ********************************************************************/
6856 BOOL make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u,
6857 POLICY_HND *hnd, const char *key,
6860 DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
6862 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6863 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
6869 /*******************************************************************
6871 ********************************************************************/
6873 BOOL spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
6875 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
6880 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6883 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6889 if(!prs_uint32("size", ps, depth, &q_u->size))
6895 /*******************************************************************
6896 * write a structure.
6897 ********************************************************************/
6899 BOOL spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
6901 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
6907 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
6913 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6916 if(!prs_werror("status", ps, depth, &r_u->status))
6922 /*******************************************************************
6924 ********************************************************************/
6926 BOOL make_spoolss_q_deleteprinterkey(SPOOL_Q_DELETEPRINTERKEY *q_u,
6927 POLICY_HND *hnd, char *keyname)
6929 DEBUG(5,("make_spoolss_q_deleteprinterkey\n"));
6931 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6932 init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
6937 /*******************************************************************
6939 ********************************************************************/
6941 BOOL spoolss_io_q_deleteprinterkey(const char *desc, SPOOL_Q_DELETEPRINTERKEY *q_u, prs_struct *ps, int depth)
6943 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterkey");
6948 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6951 if(!smb_io_unistr2("", &q_u->keyname, True, ps, depth))
6957 /*******************************************************************
6958 * write a structure.
6959 ********************************************************************/
6961 BOOL spoolss_io_r_deleteprinterkey(const char *desc, SPOOL_R_DELETEPRINTERKEY *r_u, prs_struct *ps, int depth)
6963 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterkey");
6969 if(!prs_werror("status", ps, depth, &r_u->status))
6976 /*******************************************************************
6978 ********************************************************************/
6980 BOOL spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6982 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
6987 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6990 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6996 if(!prs_uint32("size", ps, depth, &q_u->size))
7002 /*******************************************************************
7003 ********************************************************************/
7005 static BOOL spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
7006 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
7009 uint32 valuename_offset,
7012 const uint32 basic_unit = 20; /* size of static portion of enum_values */
7014 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
7018 * offset data begins at 20 bytes per structure * size_of_array.
7019 * Don't forget the uint32 at the beginning
7022 current_offset = basic_unit * ctr->size_of_array;
7024 /* first loop to write basic enum_value information */
7026 if (UNMARSHALLING(ps)) {
7027 ctr->values = PRS_ALLOC_MEM(ps, PRINTER_ENUM_VALUES, ctr->size_of_array);
7032 for (i=0; i<ctr->size_of_array; i++) {
7033 valuename_offset = current_offset;
7034 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
7037 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
7040 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
7043 data_offset = ctr->values[i].value_len + valuename_offset;
7045 if (!prs_uint32("data_offset", ps, depth, &data_offset))
7048 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
7051 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
7052 /* account for 2 byte alignment */
7053 current_offset += (current_offset % 2);
7057 * loop #2 for writing the dynamically size objects; pay
7058 * attention to 2-byte alignment here....
7061 for (i=0; i<ctr->size_of_array; i++) {
7063 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
7066 if ( ctr->values[i].data_len ) {
7067 if ( UNMARSHALLING(ps) ) {
7068 ctr->values[i].data = PRS_ALLOC_MEM(ps, uint8, ctr->values[i].data_len);
7069 if (!ctr->values[i].data)
7072 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
7076 if ( !prs_align_uint16(ps) )
7083 /*******************************************************************
7084 * write a structure.
7085 ********************************************************************/
7087 BOOL spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
7089 uint32 data_offset, end_offset;
7090 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
7096 if (!prs_uint32("size", ps, depth, &r_u->ctr.size))
7099 data_offset = prs_offset(ps);
7101 if (!prs_set_offset(ps, data_offset + r_u->ctr.size))
7107 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7110 if(!prs_uint32("returned", ps, depth, &r_u->returned))
7113 if(!prs_werror("status", ps, depth, &r_u->status))
7116 r_u->ctr.size_of_array = r_u->returned;
7118 end_offset = prs_offset(ps);
7120 if (!prs_set_offset(ps, data_offset))
7124 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
7127 if (!prs_set_offset(ps, end_offset))
7132 /*******************************************************************
7133 * write a structure.
7134 ********************************************************************/
7137 uint32 GetPrintProcessorDirectory(
7139 [in] unistr2 *environment,
7141 [in,out] RPC_BUFFER buffer,
7142 [in] uint32 offered,
7143 [out] uint32 needed,
7144 [out] uint32 returned
7149 BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, RPC_BUFFER *buffer, uint32 offered)
7151 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
7153 init_unistr2(&q_u->name, name, UNI_STR_TERMINATE);
7154 init_unistr2(&q_u->environment, environment, UNI_STR_TERMINATE);
7158 q_u->buffer = buffer;
7159 q_u->offered = offered;
7164 BOOL spoolss_io_q_getprintprocessordirectory(const char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
7168 prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
7174 if (!prs_uint32("ptr", ps, depth, &ptr))
7178 if(!smb_io_unistr2("name", &q_u->name, True, ps, depth))
7185 if (!prs_uint32("ptr", ps, depth, &ptr))
7189 if(!smb_io_unistr2("environment", &q_u->environment, True,
7197 if(!prs_uint32("level", ps, depth, &q_u->level))
7200 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
7206 if(!prs_uint32("offered", ps, depth, &q_u->offered))
7212 /*******************************************************************
7213 * write a structure.
7214 ********************************************************************/
7216 BOOL spoolss_io_r_getprintprocessordirectory(const char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
7218 prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
7224 if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
7230 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7233 if(!prs_werror("status", ps, depth, &r_u->status))
7239 BOOL smb_io_printprocessordirectory_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
7241 prs_struct *ps=&buffer->prs;
7243 prs_debug(ps, depth, desc, "smb_io_printprocessordirectory_1");
7246 buffer->struct_start=prs_offset(ps);
7248 if (!smb_io_unistr(desc, &info->name, ps, depth))
7254 /*******************************************************************
7256 ********************************************************************/
7258 BOOL make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle,
7259 int level, FORM *form)
7261 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7263 q_u->level2 = level;
7264 memcpy(&q_u->form, form, sizeof(FORM));
7269 /*******************************************************************
7271 ********************************************************************/
7273 BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
7274 int level, const char *form_name, FORM *form)
7276 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7278 q_u->level2 = level;
7279 memcpy(&q_u->form, form, sizeof(FORM));
7280 init_unistr2(&q_u->name, form_name, UNI_STR_TERMINATE);
7285 /*******************************************************************
7287 ********************************************************************/
7289 BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle,
7292 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7293 init_unistr2(&q_u->name, form, UNI_STR_TERMINATE);
7297 /*******************************************************************
7299 ********************************************************************/
7301 BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
7302 const char *formname, uint32 level,
7303 RPC_BUFFER *buffer, uint32 offered)
7305 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7307 init_unistr2(&q_u->formname, formname, UNI_STR_TERMINATE);
7309 q_u->offered=offered;
7314 /*******************************************************************
7316 ********************************************************************/
7318 BOOL make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
7319 uint32 level, RPC_BUFFER *buffer,
7322 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7325 q_u->offered=offered;
7330 /*******************************************************************
7332 ********************************************************************/
7334 BOOL make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle,
7335 uint32 jobid, uint32 level, uint32 command)
7337 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7341 /* Hmm - the SPOOL_Q_SETJOB structure has a JOB_INFO ctr in it but
7342 the server side code has it marked as unused. */
7344 q_u->command = command;
7349 /*******************************************************************
7351 ********************************************************************/
7353 BOOL make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
7354 uint32 jobid, uint32 level, RPC_BUFFER *buffer,
7357 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7360 q_u->buffer = buffer;
7361 q_u->offered = offered;
7366 /*******************************************************************
7368 ********************************************************************/
7370 BOOL make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u,
7373 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7378 /*******************************************************************
7380 ********************************************************************/
7382 BOOL make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u,
7385 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7390 /*******************************************************************
7392 ********************************************************************/
7394 BOOL make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
7395 POLICY_HND *handle, uint32 level,
7396 char *docname, char *outputfile,
7399 DOC_INFO_CONTAINER *ctr = &q_u->doc_info_container;
7401 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7407 ctr->docinfo.switch_value = level;
7409 ctr->docinfo.doc_info_1.p_docname = docname ? 1 : 0;
7410 ctr->docinfo.doc_info_1.p_outputfile = outputfile ? 1 : 0;
7411 ctr->docinfo.doc_info_1.p_datatype = datatype ? 1 : 0;
7413 init_unistr2(&ctr->docinfo.doc_info_1.docname, docname, UNI_STR_TERMINATE);
7414 init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile, UNI_STR_TERMINATE);
7415 init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype, UNI_STR_TERMINATE);
7419 /* DOC_INFO_2 is only used by Windows 9x and since it
7420 doesn't do printing over RPC we don't have to worry
7423 DEBUG(3, ("unsupported info level %d\n", level));
7430 /*******************************************************************
7432 ********************************************************************/
7434 BOOL make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u,
7437 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7442 /*******************************************************************
7444 ********************************************************************/
7446 BOOL make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u,
7447 POLICY_HND *handle, uint32 data_size,
7450 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7451 q_u->buffer_size = q_u->buffer_size2 = data_size;
7452 q_u->buffer = (unsigned char *)data;
7456 /*******************************************************************
7458 ********************************************************************/
7460 BOOL make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u,
7461 POLICY_HND *handle, char *valuename)
7463 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7464 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
7469 /*******************************************************************
7471 ********************************************************************/
7473 BOOL make_spoolss_q_deleteprinterdataex(SPOOL_Q_DELETEPRINTERDATAEX *q_u,
7474 POLICY_HND *handle, char *key,
7477 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7478 init_unistr2(&q_u->valuename, value, UNI_STR_TERMINATE);
7479 init_unistr2(&q_u->keyname, key, UNI_STR_TERMINATE);
7484 /*******************************************************************
7486 ********************************************************************/
7488 BOOL make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
7489 uint32 flags, uint32 options, const char *localmachine,
7490 uint32 printerlocal, SPOOL_NOTIFY_OPTION *option)
7492 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7495 q_u->options = options;
7497 q_u->localmachine_ptr = 1;
7499 init_unistr2(&q_u->localmachine, localmachine, UNI_STR_TERMINATE);
7501 q_u->printerlocal = printerlocal;
7504 q_u->option_ptr = 1;
7506 q_u->option = option;
7512 /*******************************************************************
7513 ********************************************************************/
7515 BOOL spoolss_io_q_xcvdataport(const char *desc, SPOOL_Q_XCVDATAPORT *q_u, prs_struct *ps, int depth)
7517 prs_debug(ps, depth, desc, "spoolss_io_q_xcvdataport");
7523 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
7526 if(!smb_io_unistr2("", &q_u->dataname, True, ps, depth))
7532 if(!prs_rpcbuffer("", ps, depth, &q_u->indata))
7538 if (!prs_uint32("indata_len", ps, depth, &q_u->indata_len))
7540 if (!prs_uint32("offered", ps, depth, &q_u->offered))
7542 if (!prs_uint32("unknown", ps, depth, &q_u->unknown))
7548 /*******************************************************************
7549 ********************************************************************/
7551 BOOL spoolss_io_r_xcvdataport(const char *desc, SPOOL_R_XCVDATAPORT *r_u, prs_struct *ps, int depth)
7553 prs_debug(ps, depth, desc, "spoolss_io_r_xcvdataport");
7558 if(!prs_rpcbuffer("", ps, depth, &r_u->outdata))
7564 if (!prs_uint32("needed", ps, depth, &r_u->needed))
7566 if (!prs_uint32("unknown", ps, depth, &r_u->unknown))
7569 if(!prs_werror("status", ps, depth, &r_u->status))
7575 /*******************************************************************
7576 ********************************************************************/
7578 BOOL make_monitorui_buf( RPC_BUFFER *buf, const char *dllname )
7585 init_unistr( &string, dllname );
7587 if ( !prs_unistr( "ui_dll", &buf->prs, 0, &string ) )
7593 /*******************************************************************
7594 ********************************************************************/
7596 #define PORT_DATA_1_PAD 540
7598 static BOOL smb_io_port_data_1( const char *desc, RPC_BUFFER *buf, int depth, SPOOL_PORT_DATA_1 *p1 )
7600 prs_struct *ps = &buf->prs;
7601 uint8 padding[PORT_DATA_1_PAD];
7603 prs_debug(ps, depth, desc, "smb_io_port_data_1");
7609 if( !prs_uint16s(True, "portname", ps, depth, p1->portname, MAX_PORTNAME))
7612 if (!prs_uint32("version", ps, depth, &p1->version))
7614 if (!prs_uint32("protocol", ps, depth, &p1->protocol))
7616 if (!prs_uint32("size", ps, depth, &p1->size))
7618 if (!prs_uint32("reserved", ps, depth, &p1->reserved))
7621 if( !prs_uint16s(True, "hostaddress", ps, depth, p1->hostaddress, MAX_NETWORK_NAME))
7623 if( !prs_uint16s(True, "snmpcommunity", ps, depth, p1->snmpcommunity, MAX_SNMP_COMM_NAME))
7626 if (!prs_uint32("dblspool", ps, depth, &p1->dblspool))
7629 if( !prs_uint16s(True, "queue", ps, depth, p1->queue, MAX_QUEUE_NAME))
7631 if( !prs_uint16s(True, "ipaddress", ps, depth, p1->ipaddress, MAX_IPADDR_STRING))
7634 if( !prs_uint8s(False, "", ps, depth, padding, PORT_DATA_1_PAD))
7637 if (!prs_uint32("port", ps, depth, &p1->port))
7639 if (!prs_uint32("snmpenabled", ps, depth, &p1->snmpenabled))
7641 if (!prs_uint32("snmpdevindex", ps, depth, &p1->snmpdevindex))
7647 /*******************************************************************
7648 ********************************************************************/
7650 BOOL convert_port_data_1( NT_PORT_DATA_1 *port1, RPC_BUFFER *buf )
7652 SPOOL_PORT_DATA_1 spdata_1;
7654 ZERO_STRUCT( spdata_1 );
7656 if ( !smb_io_port_data_1( "port_data_1", buf, 0, &spdata_1 ) )
7659 rpcstr_pull(port1->name, spdata_1.portname, sizeof(port1->name), -1, 0);
7660 rpcstr_pull(port1->queue, spdata_1.queue, sizeof(port1->queue), -1, 0);
7661 rpcstr_pull(port1->hostaddr, spdata_1.hostaddress, sizeof(port1->hostaddr), -1, 0);
7663 port1->port = spdata_1.port;
7665 switch ( spdata_1.protocol ) {
7667 port1->protocol = PORT_PROTOCOL_DIRECT;
7670 port1->protocol = PORT_PROTOCOL_LPR;
7673 DEBUG(3,("convert_port_data_1: unknown protocol [%d]!\n",
7674 spdata_1.protocol));