2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-2000,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
6 * Copyright (C) Jean François Micouleau 1998-2000,
7 * Copyright (C) Gerald Carter 2000-2002,
8 * Copyright (C) Tim Potter 2001-2002.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, see <http://www.gnu.org/licenses/>.
27 #define DBGC_CLASS DBGC_RPC_PARSE
30 /*******************************************************************
31 This should be moved in a more generic lib.
32 ********************************************************************/
34 bool spoolss_io_system_time(const char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
36 if(!prs_uint16("year", ps, depth, &systime->year))
38 if(!prs_uint16("month", ps, depth, &systime->month))
40 if(!prs_uint16("dayofweek", ps, depth, &systime->dayofweek))
42 if(!prs_uint16("day", ps, depth, &systime->day))
44 if(!prs_uint16("hour", ps, depth, &systime->hour))
46 if(!prs_uint16("minute", ps, depth, &systime->minute))
48 if(!prs_uint16("second", ps, depth, &systime->second))
50 if(!prs_uint16("milliseconds", ps, depth, &systime->milliseconds))
56 /*******************************************************************
57 ********************************************************************/
59 bool make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
61 systime->year=unixtime->tm_year+1900;
62 systime->month=unixtime->tm_mon+1;
63 systime->dayofweek=unixtime->tm_wday;
64 systime->day=unixtime->tm_mday;
65 systime->hour=unixtime->tm_hour;
66 systime->minute=unixtime->tm_min;
67 systime->second=unixtime->tm_sec;
68 systime->milliseconds=0;
73 /*******************************************************************
74 reads or writes an DOC_INFO structure.
75 ********************************************************************/
77 static bool smb_io_doc_info_1(const char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
79 if (info_1 == NULL) return False;
81 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
87 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
89 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
91 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
94 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
96 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
98 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
104 /*******************************************************************
105 reads or writes an DOC_INFO structure.
106 ********************************************************************/
108 static bool smb_io_doc_info(const char *desc, DOC_INFO *info, prs_struct *ps, int depth)
110 uint32 useless_ptr=0;
112 if (info == NULL) return False;
114 prs_debug(ps, depth, desc, "smb_io_doc_info");
120 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
123 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
126 switch (info->switch_value)
129 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
134 this is just a placeholder
136 MSDN July 1998 says doc_info_2 is only on
137 Windows 95, and as Win95 doesn't do RPC to print
138 this case is nearly impossible
140 Maybe one day with Windows for dishwasher 2037 ...
143 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
146 DEBUG(0,("Something is obviously wrong somewhere !\n"));
153 /*******************************************************************
154 reads or writes an DOC_INFO_CONTAINER structure.
155 ********************************************************************/
157 static bool smb_io_doc_info_container(const char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
159 if (cont == NULL) return False;
161 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
167 if(!prs_uint32("level", ps, depth, &cont->level))
170 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
176 /*******************************************************************
177 reads or writes an NOTIFY OPTION TYPE structure.
178 ********************************************************************/
180 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
181 structure. The _TYPE structure is really the deferred referrants (i.e
182 the notify fields array) of the _TYPE structure. -tpot */
184 static bool smb_io_notify_option_type(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
186 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
192 if(!prs_uint16("type", ps, depth, &type->type))
194 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
196 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
198 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
200 if(!prs_uint32("count", ps, depth, &type->count))
202 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
208 /*******************************************************************
209 reads or writes an NOTIFY OPTION TYPE DATA.
210 ********************************************************************/
212 static bool smb_io_notify_option_type_data(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
216 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
219 /* if there are no fields just return */
220 if (type->fields_ptr==0)
226 if(!prs_uint32("count2", ps, depth, &type->count2))
229 if (type->count2 != type->count)
230 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
232 if (type->count2 > MAX_NOTIFY_TYPE_FOR_NOW) {
236 /* parse the option type data */
237 for(i=0;i<type->count2;i++)
238 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
243 /*******************************************************************
244 reads or writes an NOTIFY OPTION structure.
245 ********************************************************************/
247 static bool smb_io_notify_option_type_ctr(const char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
251 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
254 if(!prs_uint32("count", ps, depth, &ctr->count))
258 if (UNMARSHALLING(ps) && ctr->count)
259 if((ctr->type=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION_TYPE,ctr->count)) == NULL)
262 /* the option type struct */
263 for(i=0;i<ctr->count;i++)
264 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
267 /* the type associated with the option type struct */
268 for(i=0;i<ctr->count;i++)
269 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
275 /*******************************************************************
276 reads or writes an NOTIFY OPTION structure.
277 ********************************************************************/
279 static bool smb_io_notify_option(const char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
281 prs_debug(ps, depth, desc, "smb_io_notify_option");
284 if(!prs_uint32("version", ps, depth, &option->version))
286 if(!prs_uint32("flags", ps, depth, &option->flags))
288 if(!prs_uint32("count", ps, depth, &option->count))
290 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
293 /* marshalling or unmarshalling, that would work */
294 if (option->option_type_ptr!=0) {
295 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
299 option->ctr.type=NULL;
306 /*******************************************************************
307 reads or writes an NOTIFY INFO DATA structure.
308 ********************************************************************/
310 static bool smb_io_notify_info_data(const char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
312 uint32 useless_ptr=0x0FF0ADDE;
314 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
319 if(!prs_uint16("type", ps, depth, &data->type))
321 if(!prs_uint16("field", ps, depth, &data->field))
324 if(!prs_uint32("how many words", ps, depth, &data->size))
326 if(!prs_uint32("id", ps, depth, &data->id))
328 if(!prs_uint32("how many words", ps, depth, &data->size))
331 switch (data->enc_type) {
333 /* One and two value data has two uint32 values */
335 case NOTIFY_ONE_VALUE:
336 case NOTIFY_TWO_VALUE:
338 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
340 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
344 /* Pointers and strings have a string length and a
345 pointer. For a string the length is expressed as
346 the number of uint16 characters plus a trailing
351 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length ))
353 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
360 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
363 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
369 if( !prs_uint32( "sd size", ps, depth, &data->notify_data.sd.size ) )
371 if( !prs_uint32( "pointer", ps, depth, &useless_ptr ) )
377 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data\n",
385 /*******************************************************************
386 reads or writes an NOTIFY INFO DATA structure.
387 ********************************************************************/
389 bool smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *data,
390 prs_struct *ps, int depth)
392 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
398 switch(data->enc_type) {
400 /* No data for values */
402 case NOTIFY_ONE_VALUE:
403 case NOTIFY_TWO_VALUE:
407 /* Strings start with a length in uint16s */
412 data->notify_data.data.length /= 2;
414 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
417 if (UNMARSHALLING(ps) && data->notify_data.data.length) {
418 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
419 data->notify_data.data.length);
421 if (!data->notify_data.data.string)
425 if (!prs_uint16uni(True, "string", ps, depth, data->notify_data.data.string,
426 data->notify_data.data.length))
430 data->notify_data.data.length *= 2;
436 if (UNMARSHALLING(ps) && data->notify_data.data.length) {
437 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
438 data->notify_data.data.length);
440 if (!data->notify_data.data.string)
444 if(!prs_uint8s(True,"buffer",ps,depth,(uint8*)data->notify_data.data.string,data->notify_data.data.length))
450 if( !prs_uint32("secdesc size ", ps, depth, &data->notify_data.sd.size ) )
452 if ( !sec_io_desc( "sec_desc", &data->notify_data.sd.desc, ps, depth ) )
457 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data_strings\n",
463 if (isvalue==False) {
465 /* length of string in unicode include \0 */
466 x=data->notify_data.data.length+1;
468 if (data->field != 16)
469 if(!prs_uint32("string length", ps, depth, &x ))
472 if (MARSHALLING(ps)) {
473 /* These are already in little endian format. Don't byte swap. */
476 /* No memory allocated for this string
477 therefore following the data.string
478 pointer is a bad idea. Use a pointer to
479 the uint32 length union member to
480 provide a source for a unicode NULL */
482 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
486 if (data->field == 16)
489 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
494 /* Tallocate memory for string */
497 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16, x * 2);
498 if (!data->notify_data.data.string)
501 data->notify_data.data.string = NULL;
504 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
512 /* Win2k does not seem to put this parse align here */
520 /*******************************************************************
521 reads or writes an NOTIFY INFO structure.
522 ********************************************************************/
524 static bool smb_io_notify_info(const char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
528 prs_debug(ps, depth, desc, "smb_io_notify_info");
534 if(!prs_uint32("count", ps, depth, &info->count))
536 if(!prs_uint32("version", ps, depth, &info->version))
538 if(!prs_uint32("flags", ps, depth, &info->flags))
540 if(!prs_uint32("count", ps, depth, &info->count))
543 for (i=0;i<info->count;i++) {
544 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
548 /* now do the strings at the end of the stream */
549 for (i=0;i<info->count;i++) {
550 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
557 /*******************************************************************
558 ********************************************************************/
560 bool spool_io_user_level_1( const char *desc, prs_struct *ps, int depth, SPOOL_USER_1 *q_u )
562 prs_debug(ps, depth, desc, "");
568 if (!prs_uint32("size", ps, depth, &q_u->size))
571 if (!prs_io_unistr2_p("", ps, depth, &q_u->client_name))
573 if (!prs_io_unistr2_p("", ps, depth, &q_u->user_name))
576 if (!prs_uint32("build", ps, depth, &q_u->build))
578 if (!prs_uint32("major", ps, depth, &q_u->major))
580 if (!prs_uint32("minor", ps, depth, &q_u->minor))
582 if (!prs_uint32("processor", ps, depth, &q_u->processor))
585 if (!prs_io_unistr2("", ps, depth, q_u->client_name))
590 if (!prs_io_unistr2("", ps, depth, q_u->user_name))
596 /*******************************************************************
597 ********************************************************************/
599 static bool spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
604 prs_debug(ps, depth, desc, "spool_io_user_level");
610 if (!prs_uint32("level", ps, depth, &q_u->level))
613 switch ( q_u->level )
616 if ( !prs_pointer( "" , ps, depth, (void*)&q_u->user.user1,
617 sizeof(SPOOL_USER_1), (PRS_POINTER_CAST)spool_io_user_level_1 ))
629 /*******************************************************************
630 * read or write a DEVICEMODE struct.
631 * on reading allocate memory for the private member
632 ********************************************************************/
634 #define DM_NUM_OPTIONAL_FIELDS 8
636 bool spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
638 int available_space; /* size of the device mode left to parse */
639 /* only important on unmarshalling */
641 uint16 *unistr_buffer;
644 struct optional_fields {
647 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
648 { "icmmethod", NULL },
649 { "icmintent", NULL },
650 { "mediatype", NULL },
651 { "dithertype", NULL },
652 { "reserved1", NULL },
653 { "reserved2", NULL },
654 { "panningwidth", NULL },
655 { "panningheight", NULL }
658 /* assign at run time to keep non-gcc compilers happy */
660 opt_fields[0].field = &devmode->icmmethod;
661 opt_fields[1].field = &devmode->icmintent;
662 opt_fields[2].field = &devmode->mediatype;
663 opt_fields[3].field = &devmode->dithertype;
664 opt_fields[4].field = &devmode->reserved1;
665 opt_fields[5].field = &devmode->reserved2;
666 opt_fields[6].field = &devmode->panningwidth;
667 opt_fields[7].field = &devmode->panningheight;
670 prs_debug(ps, depth, desc, "spoolss_io_devmode");
673 if (UNMARSHALLING(ps)) {
674 devmode->devicename.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
675 if (devmode->devicename.buffer == NULL)
677 unistr_buffer = devmode->devicename.buffer;
680 /* devicename is a static sized string but the buffer we set is not */
681 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
682 memset( unistr_buffer, 0x0, MAXDEVICENAME );
683 for ( j=0; devmode->devicename.buffer[j]; j++ )
684 unistr_buffer[j] = devmode->devicename.buffer[j];
687 if (!prs_uint16uni(True,"devicename", ps, depth, unistr_buffer, MAXDEVICENAME))
690 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
693 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
695 if (!prs_uint16("size", ps, depth, &devmode->size))
697 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
699 if (!prs_uint32("fields", ps, depth, &devmode->fields))
701 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
703 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
705 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
707 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
709 if (!prs_uint16("scale", ps, depth, &devmode->scale))
711 if (!prs_uint16("copies", ps, depth, &devmode->copies))
713 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
715 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
717 if (!prs_uint16("color", ps, depth, &devmode->color))
719 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
721 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
723 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
725 if (!prs_uint16("collate", ps, depth, &devmode->collate))
728 if (UNMARSHALLING(ps)) {
729 devmode->formname.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
730 if (devmode->formname.buffer == NULL)
732 unistr_buffer = devmode->formname.buffer;
735 /* devicename is a static sized string but the buffer we set is not */
736 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
737 memset( unistr_buffer, 0x0, MAXDEVICENAME );
738 for ( j=0; devmode->formname.buffer[j]; j++ )
739 unistr_buffer[j] = devmode->formname.buffer[j];
742 if (!prs_uint16uni(True, "formname", ps, depth, unistr_buffer, MAXDEVICENAME))
744 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
746 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
748 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
750 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
752 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
754 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
757 * every device mode I've ever seen on the wire at least has up
758 * to the displayfrequency field. --jerry (05-09-2002)
761 /* add uint32's + uint16's + two UNICODE strings */
763 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
765 /* Sanity check - we only have uint32's left tp parse */
767 if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {
768 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
769 available_space, devmode->size));
770 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
775 * Conditional parsing. Assume that the DeviceMode has been
776 * zero'd by the caller.
779 while ((available_space > 0) && (i < DM_NUM_OPTIONAL_FIELDS))
781 DEBUG(11, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));
782 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
784 available_space -= sizeof(uint32);
788 /* Sanity Check - we should no available space at this point unless
789 MS changes the device mode structure */
791 if (available_space) {
792 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
793 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
794 available_space, devmode->size));
795 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
800 if (devmode->driverextra!=0) {
801 if (UNMARSHALLING(ps)) {
802 devmode->dev_private=PRS_ALLOC_MEM(ps, uint8, devmode->driverextra);
803 if(devmode->dev_private == NULL)
805 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for dev_private\n",devmode->driverextra));
808 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of dev_private\n",devmode->driverextra));
809 if (!prs_uint8s(False, "dev_private", ps, depth,
810 devmode->dev_private, devmode->driverextra))
817 /*******************************************************************
818 Read or write a DEVICEMODE container
819 ********************************************************************/
821 static bool spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
826 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
832 if (!prs_uint32("size", ps, depth, &dm_c->size))
835 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
838 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
839 if (UNMARSHALLING(ps))
840 /* if while reading there is no DEVMODE ... */
845 /* so we have a DEVICEMODE to follow */
846 if (UNMARSHALLING(ps)) {
847 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
848 dm_c->devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1);
849 if(dm_c->devmode == NULL)
853 /* this is bad code, shouldn't be there */
854 if (!prs_uint32("size", ps, depth, &dm_c->size))
857 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
863 /*******************************************************************
864 ********************************************************************/
866 static bool spoolss_io_printer_default(const char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
871 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
874 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
877 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
883 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
889 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
895 /*******************************************************************
897 ********************************************************************/
899 bool make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
900 const fstring printername,
901 const fstring datatype,
902 uint32 access_required,
903 const fstring clientname,
904 const fstring user_name)
906 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
908 q_u->printername = TALLOC_P( talloc_tos(), UNISTR2 );
909 if (!q_u->printername) {
912 init_unistr2(q_u->printername, printername, UNI_STR_TERMINATE);
914 q_u->printer_default.datatype_ptr = 0;
916 q_u->printer_default.devmode_cont.size=0;
917 q_u->printer_default.devmode_cont.devmode_ptr=0;
918 q_u->printer_default.devmode_cont.devmode=NULL;
919 q_u->printer_default.access_required=access_required;
921 q_u->user_switch = 1;
923 q_u->user_ctr.level = 1;
924 q_u->user_ctr.user.user1 = TALLOC_P( talloc_tos(), SPOOL_USER_1 );
925 if (!q_u->user_ctr.user.user1) {
928 q_u->user_ctr.user.user1->size = strlen(clientname) + strlen(user_name) + 10;
929 q_u->user_ctr.user.user1->build = 1381;
930 q_u->user_ctr.user.user1->major = 2;
931 q_u->user_ctr.user.user1->minor = 0;
932 q_u->user_ctr.user.user1->processor = 0;
934 q_u->user_ctr.user.user1->client_name = TALLOC_P( talloc_tos(), UNISTR2 );
935 if (!q_u->user_ctr.user.user1->client_name) {
938 q_u->user_ctr.user.user1->user_name = TALLOC_P( talloc_tos(), UNISTR2 );
939 if (!q_u->user_ctr.user.user1->user_name) {
943 init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
944 init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
949 /*******************************************************************
951 ********************************************************************/
953 bool make_spoolss_q_addprinterex( TALLOC_CTX *mem_ctx, SPOOL_Q_ADDPRINTEREX *q_u,
954 const char *srv_name, const char* clientname, const char* user_name,
955 uint32 level, PRINTER_INFO_CTR *ctr)
957 DEBUG(5,("make_spoolss_q_addprinterex\n"));
959 if (!ctr || !ctr->printers_2)
964 q_u->server_name = TALLOC_P( mem_ctx, UNISTR2 );
965 if (!q_u->server_name) {
968 init_unistr2(q_u->server_name, srv_name, UNI_FLAGS_NONE);
972 q_u->info.level = level;
973 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
976 /* init q_u->info.info2 from *info */
977 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) {
978 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
988 q_u->user_ctr.level = 1;
989 q_u->user_ctr.user.user1 = TALLOC_P( talloc_tos(), SPOOL_USER_1 );
990 if (!q_u->user_ctr.user.user1) {
993 q_u->user_ctr.user.user1->build = 1381;
994 q_u->user_ctr.user.user1->major = 2;
995 q_u->user_ctr.user.user1->minor = 0;
996 q_u->user_ctr.user.user1->processor = 0;
998 q_u->user_ctr.user.user1->client_name = TALLOC_P( mem_ctx, UNISTR2 );
999 if (!q_u->user_ctr.user.user1->client_name) {
1002 q_u->user_ctr.user.user1->user_name = TALLOC_P( mem_ctx, UNISTR2 );
1003 if (!q_u->user_ctr.user.user1->user_name) {
1006 init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
1007 init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
1009 q_u->user_ctr.user.user1->size = q_u->user_ctr.user.user1->user_name->uni_str_len +
1010 q_u->user_ctr.user.user1->client_name->uni_str_len + 2;
1015 /*******************************************************************
1016 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
1017 *******************************************************************/
1019 bool make_spoolss_printer_info_2(TALLOC_CTX *ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
1020 PRINTER_INFO_2 *info)
1023 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
1025 /* allocate the necessary memory */
1026 if (!(inf=TALLOC_P(ctx, SPOOL_PRINTER_INFO_LEVEL_2))) {
1027 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
1031 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
1032 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
1033 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
1034 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
1035 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
1036 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
1037 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
1038 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
1039 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
1040 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
1041 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
1042 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
1043 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
1044 inf->attributes = info->attributes;
1045 inf->priority = info->priority;
1046 inf->default_priority = info->defaultpriority;
1047 inf->starttime = info->starttime;
1048 inf->untiltime = info->untiltime;
1049 inf->cjobs = info->cjobs;
1050 inf->averageppm = info->averageppm;
1051 init_unistr2_from_unistr(inf, &inf->servername, &info->servername);
1052 init_unistr2_from_unistr(inf, &inf->printername, &info->printername);
1053 init_unistr2_from_unistr(inf, &inf->sharename, &info->sharename);
1054 init_unistr2_from_unistr(inf, &inf->portname, &info->portname);
1055 init_unistr2_from_unistr(inf, &inf->drivername, &info->drivername);
1056 init_unistr2_from_unistr(inf, &inf->comment, &info->comment);
1057 init_unistr2_from_unistr(inf, &inf->location, &info->location);
1058 init_unistr2_from_unistr(inf, &inf->sepfile, &info->sepfile);
1059 init_unistr2_from_unistr(inf, &inf->printprocessor, &info->printprocessor);
1060 init_unistr2_from_unistr(inf, &inf->datatype, &info->datatype);
1061 init_unistr2_from_unistr(inf, &inf->parameters, &info->parameters);
1062 init_unistr2_from_unistr(inf, &inf->datatype, &info->datatype);
1069 /*******************************************************************
1070 create a SPOOL_PRINTER_INFO_3 struct from a PRINTER_INFO_3 struct
1071 *******************************************************************/
1073 bool make_spoolss_printer_info_3(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3 **spool_info3,
1074 PRINTER_INFO_3 *info)
1077 SPOOL_PRINTER_INFO_LEVEL_3 *inf;
1079 /* allocate the necessary memory */
1080 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3))) {
1081 DEBUG(0,("make_spoolss_printer_info_3: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_3 sruct!\n"));
1085 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
1092 /*******************************************************************
1093 create a SPOOL_PRINTER_INFO_7 struct from a PRINTER_INFO_7 struct
1094 *******************************************************************/
1096 bool make_spoolss_printer_info_7(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7 **spool_info7,
1097 PRINTER_INFO_7 *info)
1100 SPOOL_PRINTER_INFO_LEVEL_7 *inf;
1102 /* allocate the necessary memory */
1103 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7))) {
1104 DEBUG(0,("make_spoolss_printer_info_7: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_7 struct!\n"));
1108 inf->guid_ptr = (info->guid.buffer!=NULL)?1:0;
1109 inf->action = info->action;
1110 init_unistr2_from_unistr(inf, &inf->guid, &info->guid);
1118 /*******************************************************************
1120 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1121 ********************************************************************/
1123 bool spoolss_io_q_open_printer(const char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
1128 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
1134 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
1136 if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
1142 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1148 /*******************************************************************
1149 * write a structure.
1150 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1151 * called from spoolss_open_printer_ex (cli_spoolss.c)
1152 ********************************************************************/
1154 bool spoolss_io_r_open_printer(const char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
1156 if (r_u == NULL) return False;
1158 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
1164 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1167 if (!prs_werror("status", ps, depth, &(r_u->status)))
1174 /*******************************************************************
1176 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1177 ********************************************************************/
1179 bool spoolss_io_q_open_printer_ex(const char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
1184 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
1190 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
1192 if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
1198 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1201 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
1203 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
1209 /*******************************************************************
1210 * write a structure.
1211 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1212 * called from spoolss_open_printer_ex (cli_spoolss.c)
1213 ********************************************************************/
1215 bool spoolss_io_r_open_printer_ex(const char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
1217 if (r_u == NULL) return False;
1219 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
1225 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1228 if (!prs_werror("status", ps, depth, &(r_u->status)))
1234 /*******************************************************************
1236 ********************************************************************/
1237 bool make_spoolss_q_deleteprinterdriverex( TALLOC_CTX *mem_ctx,
1238 SPOOL_Q_DELETEPRINTERDRIVEREX *q_u,
1244 DEBUG(5,("make_spoolss_q_deleteprinterdriverex\n"));
1246 q_u->server_ptr = (server!=NULL)?1:0;
1247 q_u->delete_flags = DPD_DELETE_UNUSED_FILES;
1249 /* these must be NULL terminated or else NT4 will
1250 complain about invalid parameters --jerry */
1251 init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
1252 init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
1253 init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
1256 q_u->delete_flags |= DPD_DELETE_SPECIFIC_VERSION;
1257 q_u->version = version;
1264 /*******************************************************************
1266 ********************************************************************/
1267 bool make_spoolss_q_deleteprinterdriver(
1268 TALLOC_CTX *mem_ctx,
1269 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
1275 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
1277 q_u->server_ptr = (server!=NULL)?1:0;
1279 /* these must be NULL terminated or else NT4 will
1280 complain about invalid parameters --jerry */
1281 init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
1282 init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
1283 init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
1288 /*******************************************************************
1290 ********************************************************************/
1292 bool make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
1293 const POLICY_HND *handle,
1294 const char *valuename, uint32 size)
1296 if (q_u == NULL) return False;
1298 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
1300 q_u->handle = *handle;
1301 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
1307 /*******************************************************************
1309 ********************************************************************/
1311 bool make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u,
1312 const POLICY_HND *handle,
1313 const char *keyname,
1314 const char *valuename, uint32 size)
1316 if (q_u == NULL) return False;
1318 DEBUG(5,("make_spoolss_q_getprinterdataex\n"));
1320 q_u->handle = *handle;
1321 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
1322 init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
1328 /*******************************************************************
1330 * called from spoolss_q_getprinterdata (srv_spoolss.c)
1331 ********************************************************************/
1333 bool spoolss_io_q_getprinterdata(const char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
1338 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
1343 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1347 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1351 if (!prs_uint32("size", ps, depth, &q_u->size))
1357 /*******************************************************************
1359 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1360 ********************************************************************/
1362 bool spoolss_io_q_deleteprinterdata(const char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1367 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1372 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1376 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1382 /*******************************************************************
1383 * write a structure.
1384 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1385 ********************************************************************/
1387 bool spoolss_io_r_deleteprinterdata(const char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1389 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1391 if(!prs_werror("status", ps, depth, &r_u->status))
1397 /*******************************************************************
1399 * called from spoolss_q_deleteprinterdataex (srv_spoolss.c)
1400 ********************************************************************/
1402 bool spoolss_io_q_deleteprinterdataex(const char *desc, SPOOL_Q_DELETEPRINTERDATAEX *q_u, prs_struct *ps, int depth)
1407 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdataex");
1412 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1415 if (!smb_io_unistr2("keyname ", &q_u->keyname, True, ps, depth))
1417 if (!smb_io_unistr2("valuename", &q_u->valuename, True, ps, depth))
1423 /*******************************************************************
1424 * write a structure.
1425 * called from spoolss_r_deleteprinterdataex (srv_spoolss.c)
1426 ********************************************************************/
1428 bool spoolss_io_r_deleteprinterdataex(const char *desc, SPOOL_R_DELETEPRINTERDATAEX *r_u, prs_struct *ps, int depth)
1430 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdataex");
1433 if(!prs_werror("status", ps, depth, &r_u->status))
1439 /*******************************************************************
1440 * write a structure.
1441 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1442 ********************************************************************/
1444 bool spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1449 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1454 if (!prs_uint32("type", ps, depth, &r_u->type))
1456 if (!prs_uint32("size", ps, depth, &r_u->size))
1459 if (UNMARSHALLING(ps) && r_u->size) {
1460 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
1465 if (!prs_uint8s( False, "data", ps, depth, r_u->data, r_u->size ))
1471 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1473 if (!prs_werror("status", ps, depth, &r_u->status))
1479 /*******************************************************************
1481 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1482 * called from spoolss_abortprinter (cli_spoolss.c)
1483 ********************************************************************/
1485 bool spoolss_io_q_abortprinter(const char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1487 if (q_u == NULL) return False;
1489 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1495 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1501 /*******************************************************************
1502 * write a structure.
1503 * called from spoolss_r_abortprinter (srv_spoolss.c)
1504 ********************************************************************/
1506 bool spoolss_io_r_abortprinter(const char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1508 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1510 if(!prs_werror("status", ps, depth, &r_u->status))
1516 /*******************************************************************
1518 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1519 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1520 ********************************************************************/
1522 bool spoolss_io_q_deleteprinterdriver(const char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1524 if (q_u == NULL) return False;
1526 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1532 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1534 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1536 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1538 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1546 /*******************************************************************
1547 * write a structure.
1548 ********************************************************************/
1549 bool spoolss_io_r_deleteprinterdriver(const char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1551 if (r_u == NULL) return False;
1553 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1559 if (!prs_werror("status", ps, depth, &r_u->status))
1566 /*******************************************************************
1568 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1569 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1570 ********************************************************************/
1572 bool spoolss_io_q_deleteprinterdriverex(const char *desc, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
1574 if (q_u == NULL) return False;
1576 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriverex");
1582 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1584 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1586 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1588 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1594 if(!prs_uint32("delete_flags ", ps, depth, &q_u->delete_flags))
1596 if(!prs_uint32("version ", ps, depth, &q_u->version))
1604 /*******************************************************************
1605 * write a structure.
1606 ********************************************************************/
1607 bool spoolss_io_r_deleteprinterdriverex(const char *desc, SPOOL_R_DELETEPRINTERDRIVEREX *r_u, prs_struct *ps, int depth)
1609 if (r_u == NULL) return False;
1611 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriverex");
1617 if (!prs_werror("status", ps, depth, &r_u->status))
1624 /*******************************************************************
1626 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1627 ********************************************************************/
1629 bool spoolss_io_q_startdocprinter(const char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1631 if (q_u == NULL) return False;
1633 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1639 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1642 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1648 /*******************************************************************
1649 * write a structure.
1650 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1651 ********************************************************************/
1653 bool spoolss_io_r_startdocprinter(const char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1655 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1657 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1659 if(!prs_werror("status", ps, depth, &r_u->status))
1665 /*******************************************************************
1667 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1668 ********************************************************************/
1670 bool spoolss_io_q_enddocprinter(const char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1672 if (q_u == NULL) return False;
1674 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1680 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1686 /*******************************************************************
1687 * write a structure.
1688 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1689 ********************************************************************/
1691 bool spoolss_io_r_enddocprinter(const char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1693 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1695 if(!prs_werror("status", ps, depth, &r_u->status))
1701 /*******************************************************************
1703 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1704 ********************************************************************/
1706 bool spoolss_io_q_startpageprinter(const char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1708 if (q_u == NULL) return False;
1710 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1716 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1722 /*******************************************************************
1723 * write a structure.
1724 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1725 ********************************************************************/
1727 bool spoolss_io_r_startpageprinter(const char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1729 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1731 if(!prs_werror("status", ps, depth, &r_u->status))
1737 /*******************************************************************
1739 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1740 ********************************************************************/
1742 bool spoolss_io_q_endpageprinter(const char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1744 if (q_u == NULL) return False;
1746 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1752 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1758 /*******************************************************************
1759 * write a structure.
1760 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1761 ********************************************************************/
1763 bool spoolss_io_r_endpageprinter(const char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1765 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1767 if(!prs_werror("status", ps, depth, &r_u->status))
1773 /*******************************************************************
1775 * called from spoolss_q_writeprinter (srv_spoolss.c)
1776 ********************************************************************/
1778 bool spoolss_io_q_writeprinter(const char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1780 if (q_u == NULL) return False;
1782 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1788 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1790 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1793 if (q_u->buffer_size!=0)
1795 if (UNMARSHALLING(ps))
1796 q_u->buffer=PRS_ALLOC_MEM(ps, uint8, q_u->buffer_size);
1797 if(q_u->buffer == NULL)
1799 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1804 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1810 /*******************************************************************
1811 * write a structure.
1812 * called from spoolss_r_writeprinter (srv_spoolss.c)
1813 ********************************************************************/
1815 bool spoolss_io_r_writeprinter(const char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1817 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1819 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1821 if(!prs_werror("status", ps, depth, &r_u->status))
1827 /*******************************************************************
1829 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1830 ********************************************************************/
1832 bool spoolss_io_q_rffpcnex(const char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1834 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1840 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1842 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1844 if(!prs_uint32("options", ps, depth, &q_u->options))
1846 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1848 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1854 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1857 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1860 if (q_u->option_ptr!=0) {
1862 if (UNMARSHALLING(ps))
1863 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
1866 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1873 /*******************************************************************
1874 * write a structure.
1875 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1876 ********************************************************************/
1878 bool spoolss_io_r_rffpcnex(const char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1880 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1883 if(!prs_werror("status", ps, depth, &r_u->status))
1889 /*******************************************************************
1891 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1892 ********************************************************************/
1894 bool spoolss_io_q_rfnpcnex(const char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1896 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1902 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1905 if(!prs_uint32("change", ps, depth, &q_u->change))
1908 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1911 if (q_u->option_ptr!=0) {
1913 if (UNMARSHALLING(ps))
1914 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
1917 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1924 /*******************************************************************
1925 * write a structure.
1926 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1927 ********************************************************************/
1929 bool spoolss_io_r_rfnpcnex(const char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1931 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1937 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1940 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1945 if(!prs_werror("status", ps, depth, &r_u->status))
1951 /*******************************************************************
1952 * return the length of a uint16 (obvious, but the code is clean)
1953 ********************************************************************/
1955 static uint32 size_of_uint16(uint16 *value)
1957 return (sizeof(*value));
1960 /*******************************************************************
1961 * return the length of a uint32 (obvious, but the code is clean)
1962 ********************************************************************/
1964 static uint32 size_of_uint32(uint32 *value)
1966 return (sizeof(*value));
1969 /*******************************************************************
1970 * return the length of a NTTIME (obvious, but the code is clean)
1971 ********************************************************************/
1973 static uint32 size_of_nttime(NTTIME *value)
1975 return (sizeof(*value));
1978 /*******************************************************************
1979 * return the length of a uint32 (obvious, but the code is clean)
1980 ********************************************************************/
1982 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1987 return (4+devmode->size+devmode->driverextra);
1990 /*******************************************************************
1991 * return the length of a uint32 (obvious, but the code is clean)
1992 ********************************************************************/
1994 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1999 return (sizeof(SYSTEMTIME) +4);
2002 /*******************************************************************
2003 Parse a DEVMODE structure and its relative pointer.
2004 ********************************************************************/
2006 static bool smb_io_reldevmode(const char *desc, RPC_BUFFER *buffer, int depth, DEVICEMODE **devmode)
2008 prs_struct *ps=&buffer->prs;
2010 prs_debug(ps, depth, desc, "smb_io_reldevmode");
2013 if (MARSHALLING(ps)) {
2014 uint32 struct_offset = prs_offset(ps);
2015 uint32 relative_offset;
2017 if (*devmode == NULL) {
2019 if (!prs_uint32("offset", ps, depth, &relative_offset))
2021 DEBUG(8, ("boing, the devmode was NULL\n"));
2026 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
2028 /* mz: we have to align the device mode for VISTA */
2029 if (buffer->string_at_end % 4) {
2030 buffer->string_at_end += 4 - (buffer->string_at_end % 4);
2033 if(!prs_set_offset(ps, buffer->string_at_end))
2036 /* write the DEVMODE */
2037 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2040 if(!prs_set_offset(ps, struct_offset))
2043 relative_offset=buffer->string_at_end - buffer->struct_start;
2044 /* write its offset */
2045 if (!prs_uint32("offset", ps, depth, &relative_offset))
2051 /* read the offset */
2052 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2054 if (buffer->string_at_end == 0) {
2059 old_offset = prs_offset(ps);
2060 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2063 /* read the string */
2064 if((*devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1)) == NULL)
2066 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2069 if(!prs_set_offset(ps, old_offset))
2075 /*******************************************************************
2076 Parse a PRINTER_INFO_0 structure.
2077 ********************************************************************/
2079 bool smb_io_printer_info_0(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2081 prs_struct *ps=&buffer->prs;
2083 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2086 buffer->struct_start=prs_offset(ps);
2088 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2090 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2093 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2095 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2097 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2100 if(!prs_uint16("year", ps, depth, &info->year))
2102 if(!prs_uint16("month", ps, depth, &info->month))
2104 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2106 if(!prs_uint16("day", ps, depth, &info->day))
2108 if(!prs_uint16("hour", ps, depth, &info->hour))
2110 if(!prs_uint16("minute", ps, depth, &info->minute))
2112 if(!prs_uint16("second", ps, depth, &info->second))
2114 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2117 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2119 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2122 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2124 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2126 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2128 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2130 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2132 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2134 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2136 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2138 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2140 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2142 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2144 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2146 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2148 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2150 if(!prs_uint32("status" , ps, depth, &info->status))
2152 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2154 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2156 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2158 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2160 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2162 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2164 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2166 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2168 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2170 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2176 /*******************************************************************
2177 Parse a PRINTER_INFO_1 structure.
2178 ********************************************************************/
2180 bool smb_io_printer_info_1(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2182 prs_struct *ps=&buffer->prs;
2184 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2187 buffer->struct_start=prs_offset(ps);
2189 if (!prs_uint32("flags", ps, depth, &info->flags))
2191 if (!smb_io_relstr("description", buffer, depth, &info->description))
2193 if (!smb_io_relstr("name", buffer, depth, &info->name))
2195 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2201 /*******************************************************************
2202 Parse a PRINTER_INFO_2 structure.
2203 ********************************************************************/
2205 bool smb_io_printer_info_2(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2207 prs_struct *ps=&buffer->prs;
2208 uint32 dm_offset, sd_offset, current_offset;
2209 uint32 dummy_value = 0, has_secdesc = 0;
2211 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2214 buffer->struct_start=prs_offset(ps);
2216 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2218 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2220 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2222 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2224 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2226 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2228 if (!smb_io_relstr("location", buffer, depth, &info->location))
2231 /* save current offset and wind forwared by a uint32 */
2232 dm_offset = prs_offset(ps);
2233 if (!prs_uint32("devmode", ps, depth, &dummy_value))
2236 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2238 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2240 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2242 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2245 /* save current offset for the sec_desc */
2246 sd_offset = prs_offset(ps);
2247 if (!prs_uint32("sec_desc", ps, depth, &has_secdesc))
2251 /* save current location so we can pick back up here */
2252 current_offset = prs_offset(ps);
2254 /* parse the devmode */
2255 if (!prs_set_offset(ps, dm_offset))
2257 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2260 /* parse the sec_desc */
2261 if (info->secdesc) {
2262 if (!prs_set_offset(ps, sd_offset))
2264 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2268 /* pick up where we left off */
2269 if (!prs_set_offset(ps, current_offset))
2272 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2274 if (!prs_uint32("priority", ps, depth, &info->priority))
2276 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2278 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2280 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2282 if (!prs_uint32("status", ps, depth, &info->status))
2284 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2286 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2292 /*******************************************************************
2293 Parse a PRINTER_INFO_3 structure.
2294 ********************************************************************/
2296 bool smb_io_printer_info_3(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2299 prs_struct *ps=&buffer->prs;
2301 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2304 buffer->struct_start=prs_offset(ps);
2306 if (MARSHALLING(ps)) {
2307 /* Ensure the SD is 8 byte aligned in the buffer. */
2308 uint32 start = prs_offset(ps); /* Remember the start position. */
2311 /* Write a dummy value. */
2312 if (!prs_uint32("offset", ps, depth, &off_val))
2316 if (!prs_align_uint64(ps))
2319 /* Remember where we must seek back to write the SD. */
2320 offset = prs_offset(ps);
2322 /* Calculate the real offset for the SD. */
2324 off_val = offset - start;
2326 /* Seek back to where we store the SD offset & store. */
2327 prs_set_offset(ps, start);
2328 if (!prs_uint32("offset", ps, depth, &off_val))
2331 /* Return to after the 8 byte align. */
2332 prs_set_offset(ps, offset);
2335 if (!prs_uint32("offset", ps, depth, &offset))
2337 /* Seek within the buffer. */
2338 if (!prs_set_offset(ps, offset))
2341 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2347 /*******************************************************************
2348 Parse a PRINTER_INFO_4 structure.
2349 ********************************************************************/
2351 bool smb_io_printer_info_4(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
2353 prs_struct *ps=&buffer->prs;
2355 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
2358 buffer->struct_start=prs_offset(ps);
2360 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2362 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2364 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2369 /*******************************************************************
2370 Parse a PRINTER_INFO_5 structure.
2371 ********************************************************************/
2373 bool smb_io_printer_info_5(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
2375 prs_struct *ps=&buffer->prs;
2377 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
2380 buffer->struct_start=prs_offset(ps);
2382 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2384 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2386 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2388 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
2390 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
2395 /*******************************************************************
2396 Parse a PRINTER_INFO_6 structure.
2397 ********************************************************************/
2399 bool smb_io_printer_info_6(const char *desc, RPC_BUFFER *buffer,
2400 PRINTER_INFO_6 *info, int depth)
2402 prs_struct *ps=&buffer->prs;
2404 prs_debug(ps, depth, desc, "smb_io_printer_info_6");
2407 if (!prs_uint32("status", ps, depth, &info->status))
2413 /*******************************************************************
2414 Parse a PRINTER_INFO_7 structure.
2415 ********************************************************************/
2417 bool smb_io_printer_info_7(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_7 *info, int depth)
2419 prs_struct *ps=&buffer->prs;
2421 prs_debug(ps, depth, desc, "smb_io_printer_info_7");
2424 buffer->struct_start=prs_offset(ps);
2426 if (!smb_io_relstr("guid", buffer, depth, &info->guid))
2428 if (!prs_uint32("action", ps, depth, &info->action))
2433 /*******************************************************************
2434 Parse a PORT_INFO_1 structure.
2435 ********************************************************************/
2437 bool smb_io_port_info_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2439 prs_struct *ps=&buffer->prs;
2441 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2444 buffer->struct_start=prs_offset(ps);
2446 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2452 /*******************************************************************
2453 Parse a PORT_INFO_2 structure.
2454 ********************************************************************/
2456 bool smb_io_port_info_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2458 prs_struct *ps=&buffer->prs;
2460 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2463 buffer->struct_start=prs_offset(ps);
2465 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2467 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2469 if (!smb_io_relstr("description", buffer, depth, &info->description))
2471 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2473 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2479 /*******************************************************************
2480 Parse a DRIVER_INFO_1 structure.
2481 ********************************************************************/
2483 bool smb_io_printer_driver_info_1(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2485 prs_struct *ps=&buffer->prs;
2487 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2490 buffer->struct_start=prs_offset(ps);
2492 if (!smb_io_relstr("name", buffer, depth, &info->name))
2498 /*******************************************************************
2499 Parse a DRIVER_INFO_2 structure.
2500 ********************************************************************/
2502 bool smb_io_printer_driver_info_2(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2504 prs_struct *ps=&buffer->prs;
2506 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2509 buffer->struct_start=prs_offset(ps);
2511 if (!prs_uint32("version", ps, depth, &info->version))
2513 if (!smb_io_relstr("name", buffer, depth, &info->name))
2515 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2517 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2519 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2521 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2527 /*******************************************************************
2528 Parse a DRIVER_INFO_3 structure.
2529 ********************************************************************/
2531 bool smb_io_printer_driver_info_3(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2533 prs_struct *ps=&buffer->prs;
2535 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2538 buffer->struct_start=prs_offset(ps);
2540 if (!prs_uint32("version", ps, depth, &info->version))
2542 if (!smb_io_relstr("name", buffer, depth, &info->name))
2544 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2546 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2548 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2550 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2552 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2555 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2558 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2560 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2566 /*******************************************************************
2567 Parse a DRIVER_INFO_6 structure.
2568 ********************************************************************/
2570 bool smb_io_printer_driver_info_6(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2572 prs_struct *ps=&buffer->prs;
2574 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2577 buffer->struct_start=prs_offset(ps);
2579 if (!prs_uint32("version", ps, depth, &info->version))
2581 if (!smb_io_relstr("name", buffer, depth, &info->name))
2583 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2585 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2587 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2589 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2591 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2594 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2597 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2599 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2602 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2605 if (!prs_uint64("date", ps, depth, &info->driver_date))
2608 if (!prs_uint32("padding", ps, depth, &info->padding))
2611 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2614 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2617 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2619 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2621 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2623 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2629 /*******************************************************************
2630 Parse a JOB_INFO_1 structure.
2631 ********************************************************************/
2633 bool smb_io_job_info_1(const char *desc, RPC_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2635 prs_struct *ps=&buffer->prs;
2637 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2640 buffer->struct_start=prs_offset(ps);
2642 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2644 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2646 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2648 if (!smb_io_relstr("username", buffer, depth, &info->username))
2650 if (!smb_io_relstr("document", buffer, depth, &info->document))
2652 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2654 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2656 if (!prs_uint32("status", ps, depth, &info->status))
2658 if (!prs_uint32("priority", ps, depth, &info->priority))
2660 if (!prs_uint32("position", ps, depth, &info->position))
2662 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2664 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2666 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2672 /*******************************************************************
2673 Parse a JOB_INFO_2 structure.
2674 ********************************************************************/
2676 bool smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2679 prs_struct *ps=&buffer->prs;
2681 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2684 buffer->struct_start=prs_offset(ps);
2686 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2688 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2690 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2692 if (!smb_io_relstr("username", buffer, depth, &info->username))
2694 if (!smb_io_relstr("document", buffer, depth, &info->document))
2696 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2698 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2701 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2703 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2705 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2707 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2709 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2712 /* SEC_DESC sec_desc;*/
2713 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2716 if (!prs_uint32("status",ps, depth, &info->status))
2718 if (!prs_uint32("priority",ps, depth, &info->priority))
2720 if (!prs_uint32("position",ps, depth, &info->position))
2722 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2724 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2726 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2728 if (!prs_uint32("size",ps, depth, &info->size))
2730 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2732 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2734 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2740 /*******************************************************************
2741 ********************************************************************/
2743 bool smb_io_form_1(const char *desc, RPC_BUFFER *buffer, FORM_1 *info, int depth)
2745 prs_struct *ps=&buffer->prs;
2747 prs_debug(ps, depth, desc, "smb_io_form_1");
2750 buffer->struct_start=prs_offset(ps);
2752 if (!prs_uint32("flag", ps, depth, &info->flag))
2755 if (!smb_io_relstr("name", buffer, depth, &info->name))
2758 if (!prs_uint32("width", ps, depth, &info->width))
2760 if (!prs_uint32("length", ps, depth, &info->length))
2762 if (!prs_uint32("left", ps, depth, &info->left))
2764 if (!prs_uint32("top", ps, depth, &info->top))
2766 if (!prs_uint32("right", ps, depth, &info->right))
2768 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2776 /*******************************************************************
2777 Parse a DRIVER_DIRECTORY_1 structure.
2778 ********************************************************************/
2780 bool smb_io_driverdir_1(const char *desc, RPC_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2782 prs_struct *ps=&buffer->prs;
2784 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
2787 buffer->struct_start=prs_offset(ps);
2789 if (!smb_io_unistr(desc, &info->name, ps, depth))
2795 /*******************************************************************
2796 Parse a PORT_INFO_1 structure.
2797 ********************************************************************/
2799 bool smb_io_port_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2801 prs_struct *ps=&buffer->prs;
2803 prs_debug(ps, depth, desc, "smb_io_port_1");
2806 buffer->struct_start=prs_offset(ps);
2808 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2814 /*******************************************************************
2815 Parse a PORT_INFO_2 structure.
2816 ********************************************************************/
2818 bool smb_io_port_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2820 prs_struct *ps=&buffer->prs;
2822 prs_debug(ps, depth, desc, "smb_io_port_2");
2825 buffer->struct_start=prs_offset(ps);
2827 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2829 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2831 if(!smb_io_relstr("description", buffer, depth, &info->description))
2833 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2835 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2841 /*******************************************************************
2842 ********************************************************************/
2844 bool smb_io_printprocessor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2846 prs_struct *ps=&buffer->prs;
2848 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2851 buffer->struct_start=prs_offset(ps);
2853 if (smb_io_relstr("name", buffer, depth, &info->name))
2859 /*******************************************************************
2860 ********************************************************************/
2862 bool smb_io_printprocdatatype_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2864 prs_struct *ps=&buffer->prs;
2866 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2869 buffer->struct_start=prs_offset(ps);
2871 if (smb_io_relstr("name", buffer, depth, &info->name))
2877 /*******************************************************************
2878 ********************************************************************/
2880 bool smb_io_printmonitor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2882 prs_struct *ps=&buffer->prs;
2884 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2887 buffer->struct_start=prs_offset(ps);
2889 if (!smb_io_relstr("name", buffer, depth, &info->name))
2895 /*******************************************************************
2896 ********************************************************************/
2898 bool smb_io_printmonitor_info_2(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2900 prs_struct *ps=&buffer->prs;
2902 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2905 buffer->struct_start=prs_offset(ps);
2907 if (!smb_io_relstr("name", buffer, depth, &info->name))
2909 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
2911 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2917 /*******************************************************************
2918 return the size required by a struct in the stream
2919 ********************************************************************/
2921 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2925 size+=size_of_relative_string( &info->printername );
2926 size+=size_of_relative_string( &info->servername );
2928 size+=size_of_uint32( &info->cjobs);
2929 size+=size_of_uint32( &info->total_jobs);
2930 size+=size_of_uint32( &info->total_bytes);
2932 size+=size_of_uint16( &info->year);
2933 size+=size_of_uint16( &info->month);
2934 size+=size_of_uint16( &info->dayofweek);
2935 size+=size_of_uint16( &info->day);
2936 size+=size_of_uint16( &info->hour);
2937 size+=size_of_uint16( &info->minute);
2938 size+=size_of_uint16( &info->second);
2939 size+=size_of_uint16( &info->milliseconds);
2941 size+=size_of_uint32( &info->global_counter);
2942 size+=size_of_uint32( &info->total_pages);
2944 size+=size_of_uint16( &info->major_version);
2945 size+=size_of_uint16( &info->build_version);
2947 size+=size_of_uint32( &info->unknown7);
2948 size+=size_of_uint32( &info->unknown8);
2949 size+=size_of_uint32( &info->unknown9);
2950 size+=size_of_uint32( &info->session_counter);
2951 size+=size_of_uint32( &info->unknown11);
2952 size+=size_of_uint32( &info->printer_errors);
2953 size+=size_of_uint32( &info->unknown13);
2954 size+=size_of_uint32( &info->unknown14);
2955 size+=size_of_uint32( &info->unknown15);
2956 size+=size_of_uint32( &info->unknown16);
2957 size+=size_of_uint32( &info->change_id);
2958 size+=size_of_uint32( &info->unknown18);
2959 size+=size_of_uint32( &info->status);
2960 size+=size_of_uint32( &info->unknown20);
2961 size+=size_of_uint32( &info->c_setprinter);
2963 size+=size_of_uint16( &info->unknown22);
2964 size+=size_of_uint16( &info->unknown23);
2965 size+=size_of_uint16( &info->unknown24);
2966 size+=size_of_uint16( &info->unknown25);
2967 size+=size_of_uint16( &info->unknown26);
2968 size+=size_of_uint16( &info->unknown27);
2969 size+=size_of_uint16( &info->unknown28);
2970 size+=size_of_uint16( &info->unknown29);
2975 /*******************************************************************
2976 return the size required by a struct in the stream
2977 ********************************************************************/
2979 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2983 size+=size_of_uint32( &info->flags );
2984 size+=size_of_relative_string( &info->description );
2985 size+=size_of_relative_string( &info->name );
2986 size+=size_of_relative_string( &info->comment );
2991 /*******************************************************************
2992 return the size required by a struct in the stream
2993 ********************************************************************/
2995 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
3001 size += ndr_size_security_descriptor( info->secdesc, NULL, 0 );
3003 size+=size_of_device_mode( info->devmode );
3005 size+=size_of_relative_string( &info->servername );
3006 size+=size_of_relative_string( &info->printername );
3007 size+=size_of_relative_string( &info->sharename );
3008 size+=size_of_relative_string( &info->portname );
3009 size+=size_of_relative_string( &info->drivername );
3010 size+=size_of_relative_string( &info->comment );
3011 size+=size_of_relative_string( &info->location );
3013 size+=size_of_relative_string( &info->sepfile );
3014 size+=size_of_relative_string( &info->printprocessor );
3015 size+=size_of_relative_string( &info->datatype );
3016 size+=size_of_relative_string( &info->parameters );
3018 size+=size_of_uint32( &info->attributes );
3019 size+=size_of_uint32( &info->priority );
3020 size+=size_of_uint32( &info->defaultpriority );
3021 size+=size_of_uint32( &info->starttime );
3022 size+=size_of_uint32( &info->untiltime );
3023 size+=size_of_uint32( &info->status );
3024 size+=size_of_uint32( &info->cjobs );
3025 size+=size_of_uint32( &info->averageppm );
3028 * add any adjustments for alignment. This is
3029 * not optimal since we could be calling this
3030 * function from a loop (e.g. enumprinters), but
3031 * it is easier to maintain the calculation here and
3032 * not place the burden on the caller to remember. --jerry
3034 if ((size % 4) != 0)
3035 size += 4 - (size % 4);
3040 /*******************************************************************
3041 return the size required by a struct in the stream
3042 ********************************************************************/
3044 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
3048 size+=size_of_relative_string( &info->printername );
3049 size+=size_of_relative_string( &info->servername );
3051 size+=size_of_uint32( &info->attributes );
3055 /*******************************************************************
3056 return the size required by a struct in the stream
3057 ********************************************************************/
3059 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
3063 size+=size_of_relative_string( &info->printername );
3064 size+=size_of_relative_string( &info->portname );
3066 size+=size_of_uint32( &info->attributes );
3067 size+=size_of_uint32( &info->device_not_selected_timeout );
3068 size+=size_of_uint32( &info->transmission_retry_timeout );
3072 /*******************************************************************
3073 return the size required by a struct in the stream
3074 ********************************************************************/
3076 uint32 spoolss_size_printer_info_6(PRINTER_INFO_6 *info)
3078 return sizeof(uint32);
3081 /*******************************************************************
3082 return the size required by a struct in the stream
3083 ********************************************************************/
3085 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
3087 /* The 8 is for the self relative pointer - 8 byte aligned.. */
3088 return 8 + (uint32)ndr_size_security_descriptor( info->secdesc, NULL, 0 );
3091 /*******************************************************************
3092 return the size required by a struct in the stream
3093 ********************************************************************/
3095 uint32 spoolss_size_printer_info_7(PRINTER_INFO_7 *info)
3099 size+=size_of_relative_string( &info->guid );
3100 size+=size_of_uint32( &info->action );
3104 /*******************************************************************
3105 return the size required by a struct in the stream
3106 ********************************************************************/
3108 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
3111 size+=size_of_relative_string( &info->name );
3116 /*******************************************************************
3117 return the size required by a struct in the stream
3118 ********************************************************************/
3120 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
3123 size+=size_of_uint32( &info->version );
3124 size+=size_of_relative_string( &info->name );
3125 size+=size_of_relative_string( &info->architecture );
3126 size+=size_of_relative_string( &info->driverpath );
3127 size+=size_of_relative_string( &info->datafile );
3128 size+=size_of_relative_string( &info->configfile );
3133 /*******************************************************************
3134 return the size required by a string array.
3135 ********************************************************************/
3137 uint32 spoolss_size_string_array(uint16 *string)
3142 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
3144 i=i+2; /* to count all chars including the leading zero */
3145 i=2*i; /* because we need the value in bytes */
3146 i=i+4; /* the offset pointer size */
3151 /*******************************************************************
3152 return the size required by a struct in the stream
3153 ********************************************************************/
3155 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3159 size+=size_of_uint32( &info->version );
3160 size+=size_of_relative_string( &info->name );
3161 size+=size_of_relative_string( &info->architecture );
3162 size+=size_of_relative_string( &info->driverpath );
3163 size+=size_of_relative_string( &info->datafile );
3164 size+=size_of_relative_string( &info->configfile );
3165 size+=size_of_relative_string( &info->helpfile );
3166 size+=size_of_relative_string( &info->monitorname );
3167 size+=size_of_relative_string( &info->defaultdatatype );
3169 size+=spoolss_size_string_array(info->dependentfiles);
3174 /*******************************************************************
3175 return the size required by a struct in the stream
3176 ********************************************************************/
3178 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3182 size+=size_of_uint32( &info->version );
3183 size+=size_of_relative_string( &info->name );
3184 size+=size_of_relative_string( &info->architecture );
3185 size+=size_of_relative_string( &info->driverpath );
3186 size+=size_of_relative_string( &info->datafile );
3187 size+=size_of_relative_string( &info->configfile );
3188 size+=size_of_relative_string( &info->helpfile );
3190 size+=spoolss_size_string_array(info->dependentfiles);
3192 size+=size_of_relative_string( &info->monitorname );
3193 size+=size_of_relative_string( &info->defaultdatatype );
3195 size+=spoolss_size_string_array(info->previousdrivernames);
3197 size+=size_of_nttime(&info->driver_date);
3198 size+=size_of_uint32( &info->padding );
3199 size+=size_of_uint32( &info->driver_version_low );
3200 size+=size_of_uint32( &info->driver_version_high );
3201 size+=size_of_relative_string( &info->mfgname );
3202 size+=size_of_relative_string( &info->oem_url );
3203 size+=size_of_relative_string( &info->hardware_id );
3204 size+=size_of_relative_string( &info->provider );
3209 /*******************************************************************
3210 return the size required by a struct in the stream
3211 ********************************************************************/
3213 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3216 size+=size_of_uint32( &info->jobid );
3217 size+=size_of_relative_string( &info->printername );
3218 size+=size_of_relative_string( &info->machinename );
3219 size+=size_of_relative_string( &info->username );
3220 size+=size_of_relative_string( &info->document );
3221 size+=size_of_relative_string( &info->datatype );
3222 size+=size_of_relative_string( &info->text_status );
3223 size+=size_of_uint32( &info->status );
3224 size+=size_of_uint32( &info->priority );
3225 size+=size_of_uint32( &info->position );
3226 size+=size_of_uint32( &info->totalpages );
3227 size+=size_of_uint32( &info->pagesprinted );
3228 size+=size_of_systemtime( &info->submitted );
3233 /*******************************************************************
3234 return the size required by a struct in the stream
3235 ********************************************************************/
3237 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3241 size+=4; /* size of sec desc ptr */
3243 size+=size_of_uint32( &info->jobid );
3244 size+=size_of_relative_string( &info->printername );
3245 size+=size_of_relative_string( &info->machinename );
3246 size+=size_of_relative_string( &info->username );
3247 size+=size_of_relative_string( &info->document );
3248 size+=size_of_relative_string( &info->notifyname );
3249 size+=size_of_relative_string( &info->datatype );
3250 size+=size_of_relative_string( &info->printprocessor );
3251 size+=size_of_relative_string( &info->parameters );
3252 size+=size_of_relative_string( &info->drivername );
3253 size+=size_of_device_mode( info->devmode );
3254 size+=size_of_relative_string( &info->text_status );
3255 /* SEC_DESC sec_desc;*/
3256 size+=size_of_uint32( &info->status );
3257 size+=size_of_uint32( &info->priority );
3258 size+=size_of_uint32( &info->position );
3259 size+=size_of_uint32( &info->starttime );
3260 size+=size_of_uint32( &info->untiltime );
3261 size+=size_of_uint32( &info->totalpages );
3262 size+=size_of_uint32( &info->size );
3263 size+=size_of_systemtime( &info->submitted );
3264 size+=size_of_uint32( &info->timeelapsed );
3265 size+=size_of_uint32( &info->pagesprinted );
3270 /*******************************************************************
3271 return the size required by a struct in the stream
3272 ********************************************************************/
3274 uint32 spoolss_size_form_1(FORM_1 *info)
3278 size+=size_of_uint32( &info->flag );
3279 size+=size_of_relative_string( &info->name );
3280 size+=size_of_uint32( &info->width );
3281 size+=size_of_uint32( &info->length );
3282 size+=size_of_uint32( &info->left );
3283 size+=size_of_uint32( &info->top );
3284 size+=size_of_uint32( &info->right );
3285 size+=size_of_uint32( &info->bottom );
3290 /*******************************************************************
3291 return the size required by a struct in the stream
3292 ********************************************************************/
3294 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3298 size+=size_of_relative_string( &info->port_name );
3303 /*******************************************************************
3304 return the size required by a struct in the stream
3305 ********************************************************************/
3307 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3311 size=str_len_uni(&info->name); /* the string length */
3312 size=size+1; /* add the leading zero */
3313 size=size*2; /* convert in char */
3318 /*******************************************************************
3319 return the size required by a struct in the stream
3320 ********************************************************************/
3322 uint32 spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1 *info)
3326 size=str_len_uni(&info->name); /* the string length */
3327 size=size+1; /* add the leading zero */
3328 size=size*2; /* convert in char */
3333 /*******************************************************************
3334 return the size required by a struct in the stream
3335 ********************************************************************/
3337 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3341 size+=size_of_relative_string( &info->port_name );
3342 size+=size_of_relative_string( &info->monitor_name );
3343 size+=size_of_relative_string( &info->description );
3345 size+=size_of_uint32( &info->port_type );
3346 size+=size_of_uint32( &info->reserved );
3351 /*******************************************************************
3352 return the size required by a struct in the stream
3353 ********************************************************************/
3355 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3358 size+=size_of_relative_string( &info->name );
3363 /*******************************************************************
3364 return the size required by a struct in the stream
3365 ********************************************************************/
3367 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3370 size+=size_of_relative_string( &info->name );
3375 /*******************************************************************
3376 return the size required by a struct in the stream
3377 ********************************************************************/
3378 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
3385 /* uint32(offset) + uint32(length) + length) */
3386 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
3387 size += (size_of_uint32(&p->data_len)*2) + p->data_len + (p->data_len%2) ;
3389 size += size_of_uint32(&p->type);
3394 /*******************************************************************
3395 return the size required by a struct in the stream
3396 ********************************************************************/
3398 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3401 size+=size_of_relative_string( &info->name );
3406 /*******************************************************************
3407 return the size required by a struct in the stream
3408 ********************************************************************/
3410 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3413 size+=size_of_relative_string( &info->name);
3414 size+=size_of_relative_string( &info->environment);
3415 size+=size_of_relative_string( &info->dll_name);
3420 /*******************************************************************
3422 ********************************************************************/
3424 bool make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3425 const POLICY_HND *hnd,
3426 const fstring architecture,
3427 uint32 level, uint32 clientmajor, uint32 clientminor,
3428 RPC_BUFFER *buffer, uint32 offered)
3433 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3435 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3438 q_u->clientmajorversion=clientmajor;
3439 q_u->clientminorversion=clientminor;
3442 q_u->offered=offered;
3447 /*******************************************************************
3449 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3450 ********************************************************************/
3452 bool spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3454 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3460 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3462 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3464 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3469 if(!prs_uint32("level", ps, depth, &q_u->level))
3472 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3478 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3481 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3483 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3489 /*******************************************************************
3491 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3492 ********************************************************************/
3494 bool spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3496 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3502 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3507 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3509 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3511 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3513 if (!prs_werror("status", ps, depth, &r_u->status))
3519 /*******************************************************************
3521 ********************************************************************/
3523 bool make_spoolss_q_enumprinters(
3524 SPOOL_Q_ENUMPRINTERS *q_u,
3534 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3535 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3539 q_u->offered=offered;
3544 /*******************************************************************
3546 ********************************************************************/
3548 bool make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3549 fstring servername, uint32 level,
3550 RPC_BUFFER *buffer, uint32 offered)
3552 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3553 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3557 q_u->offered=offered;
3562 /*******************************************************************
3564 * called from spoolss_enumprinters (srv_spoolss.c)
3565 ********************************************************************/
3567 bool spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3569 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3575 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3577 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3580 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3585 if (!prs_uint32("level", ps, depth, &q_u->level))
3588 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3593 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3599 /*******************************************************************
3600 Parse a SPOOL_R_ENUMPRINTERS structure.
3601 ********************************************************************/
3603 bool spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3605 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3611 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3617 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3620 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3623 if (!prs_werror("status", ps, depth, &r_u->status))
3629 /*******************************************************************
3630 * write a structure.
3631 * called from spoolss_r_enum_printers (srv_spoolss.c)
3633 ********************************************************************/
3635 bool spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3637 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3643 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3649 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3652 if (!prs_werror("status", ps, depth, &r_u->status))
3658 /*******************************************************************
3660 * called from spoolss_getprinter (srv_spoolss.c)
3661 ********************************************************************/
3663 bool spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3665 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3671 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3673 if (!prs_uint32("level", ps, depth, &q_u->level))
3676 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3681 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3687 /*******************************************************************
3689 ********************************************************************/
3691 bool make_spoolss_q_getprinter(
3692 TALLOC_CTX *mem_ctx,
3693 SPOOL_Q_GETPRINTER *q_u,
3694 const POLICY_HND *hnd,
3704 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3708 q_u->offered=offered;
3713 /*******************************************************************
3715 ********************************************************************/
3716 bool make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
3717 const POLICY_HND *hnd, uint32 level, PRINTER_INFO_CTR *info,
3721 DEVICEMODE *devmode;
3726 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3729 q_u->info.level = level;
3730 q_u->info.info_ptr = 1; /* Info is != NULL, see above */
3733 /* There's no such thing as a setprinter level 1 */
3736 secdesc = info->printers_2->secdesc;
3737 devmode = info->printers_2->devmode;
3739 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
3740 #if 1 /* JERRY TEST */
3741 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
3742 if (!q_u->secdesc_ctr)
3744 q_u->secdesc_ctr->sd = secdesc;
3745 q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3747 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
3748 q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
3749 q_u->devmode_ctr.devmode = devmode;
3751 q_u->secdesc_ctr = NULL;
3753 q_u->devmode_ctr.devmode_ptr = 0;
3754 q_u->devmode_ctr.size = 0;
3755 q_u->devmode_ctr.devmode = NULL;
3759 secdesc = info->printers_3->secdesc;
3761 make_spoolss_printer_info_3 (mem_ctx, &q_u->info.info_3, info->printers_3);
3763 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
3764 if (!q_u->secdesc_ctr)
3766 q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3767 q_u->secdesc_ctr->sd = secdesc;
3771 make_spoolss_printer_info_7 (mem_ctx, &q_u->info.info_7, info->printers_7);
3775 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
3780 q_u->command = command;
3786 /*******************************************************************
3787 ********************************************************************/
3789 bool spoolss_io_r_setprinter(const char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3791 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3797 if(!prs_werror("status", ps, depth, &r_u->status))
3803 /*******************************************************************
3804 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3805 ********************************************************************/
3807 bool spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3809 uint32 ptr_sec_desc = 0;
3811 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3817 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3819 if(!prs_uint32("level", ps, depth, &q_u->level))
3822 /* check for supported levels and structures we know about */
3824 switch ( q_u->level ) {
3829 /* supported levels */
3832 DEBUG(0,("spoolss_io_q_setprinter: unsupported printer info level [%d]\n",
3838 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3841 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3851 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3856 /* FIXME ! Our parsing here is wrong I think,
3857 * but for a level3 it makes no sense for
3858 * ptr_sec_desc to be NULL. JRA. Based on
3859 * a Vista sniff from Martin Zielinski <mz@seh.de>.
3861 if (UNMARSHALLING(ps)) {
3864 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3871 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3876 /* Parse a NULL security descriptor. This should really
3877 happen inside the sec_io_desc_buf() function. */
3879 prs_debug(ps, depth, "", "sec_io_desc_buf");
3880 if (!prs_uint32("size", ps, depth + 1, &dummy))
3882 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
3886 if(!prs_uint32("command", ps, depth, &q_u->command))
3892 /*******************************************************************
3893 ********************************************************************/
3895 bool spoolss_io_r_fcpn(const char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3897 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3903 if(!prs_werror("status", ps, depth, &r_u->status))
3909 /*******************************************************************
3910 ********************************************************************/
3912 bool spoolss_io_q_fcpn(const char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3915 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3921 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3928 /*******************************************************************
3929 ********************************************************************/
3931 bool spoolss_io_r_addjob(const char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3933 prs_debug(ps, depth, desc, "");
3939 if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3945 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3948 if(!prs_werror("status", ps, depth, &r_u->status))
3954 /*******************************************************************
3955 ********************************************************************/
3957 bool spoolss_io_q_addjob(const char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3959 prs_debug(ps, depth, desc, "");
3965 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3967 if(!prs_uint32("level", ps, depth, &q_u->level))
3970 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3976 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3982 /*******************************************************************
3983 ********************************************************************/
3985 bool spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3987 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3993 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3999 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4002 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4005 if (!prs_werror("status", ps, depth, &r_u->status))
4011 /*******************************************************************
4012 ********************************************************************/
4014 bool make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
4025 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4026 q_u->firstjob = firstjob;
4027 q_u->numofjobs = numofjobs;
4029 q_u->buffer= buffer;
4030 q_u->offered = offered;
4034 /*******************************************************************
4035 ********************************************************************/
4037 bool spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
4039 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
4045 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
4048 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
4050 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
4052 if (!prs_uint32("level", ps, depth, &q_u->level))
4055 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4061 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4067 /*******************************************************************
4068 ********************************************************************/
4070 bool spoolss_io_r_schedulejob(const char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
4072 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
4078 if(!prs_werror("status", ps, depth, &r_u->status))
4084 /*******************************************************************
4085 ********************************************************************/
4087 bool spoolss_io_q_schedulejob(const char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
4089 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
4095 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4097 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4103 /*******************************************************************
4104 ********************************************************************/
4106 bool spoolss_io_r_setjob(const char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
4108 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
4114 if(!prs_werror("status", ps, depth, &r_u->status))
4120 /*******************************************************************
4121 ********************************************************************/
4123 bool spoolss_io_q_setjob(const char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
4125 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
4131 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4133 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4136 * level is usually 0. If (level!=0) then I'm in trouble !
4137 * I will try to generate setjob command with level!=0, one day.
4139 if(!prs_uint32("level", ps, depth, &q_u->level))
4141 if(!prs_uint32("command", ps, depth, &q_u->command))
4147 /*******************************************************************
4148 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
4149 ********************************************************************/
4151 bool spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
4153 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
4159 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4165 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4168 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4171 if (!prs_werror("status", ps, depth, &r_u->status))
4177 /*******************************************************************
4179 ********************************************************************/
4181 bool make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
4183 const char *environment,
4185 RPC_BUFFER *buffer, uint32 offered)
4187 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
4188 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
4192 q_u->offered=offered;
4197 /*******************************************************************
4198 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4199 ********************************************************************/
4201 bool spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
4204 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
4210 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4212 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
4217 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4219 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4224 if (!prs_uint32("level", ps, depth, &q_u->level))
4227 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4233 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4239 /*******************************************************************
4240 ********************************************************************/
4242 bool spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4245 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4250 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4252 if (!prs_uint32("level", ps, depth, &q_u->level))
4255 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4260 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4266 /*******************************************************************
4267 ********************************************************************/
4269 bool spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4271 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4277 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4283 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4286 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4289 if (!prs_werror("status", ps, depth, &r_u->status))
4295 /*******************************************************************
4296 ********************************************************************/
4298 bool spoolss_io_q_getform(const char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4301 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4306 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4308 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4314 if (!prs_uint32("level", ps, depth, &q_u->level))
4317 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4322 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4328 /*******************************************************************
4329 ********************************************************************/
4331 bool spoolss_io_r_getform(const char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4333 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4339 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4345 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4348 if (!prs_werror("status", ps, depth, &r_u->status))
4354 /*******************************************************************
4355 Parse a SPOOL_R_ENUMPORTS structure.
4356 ********************************************************************/
4358 bool spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4360 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4366 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4372 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4375 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4378 if (!prs_werror("status", ps, depth, &r_u->status))
4384 /*******************************************************************
4385 ********************************************************************/
4387 bool spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4389 prs_debug(ps, depth, desc, "");
4395 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4397 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4402 if (!prs_uint32("level", ps, depth, &q_u->level))
4405 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4410 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4416 /*******************************************************************
4417 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4418 ********************************************************************/
4420 bool spool_io_printer_info_level_1(const char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4422 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4428 if(!prs_uint32("flags", ps, depth, &il->flags))
4430 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4432 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4434 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4437 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4439 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4441 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4447 /*******************************************************************
4448 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4449 ********************************************************************/
4451 bool spool_io_printer_info_level_3(const char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4453 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4459 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4465 /*******************************************************************
4466 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4467 ********************************************************************/
4469 bool spool_io_printer_info_level_2(const char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4471 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4477 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4479 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4481 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4483 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4486 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4488 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4490 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4492 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4494 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4496 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4498 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4500 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4502 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4505 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4507 if(!prs_uint32("priority", ps, depth, &il->priority))
4509 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4511 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4513 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4515 if(!prs_uint32("status", ps, depth, &il->status))
4517 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4519 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4522 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4524 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4526 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4528 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4530 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4532 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4534 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4536 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4538 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4540 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4542 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4548 bool spool_io_printer_info_level_7(const char *desc, SPOOL_PRINTER_INFO_LEVEL_7 *il, prs_struct *ps, int depth)
4550 prs_debug(ps, depth, desc, "spool_io_printer_info_level_7");
4556 if(!prs_uint32("guid_ptr", ps, depth, &il->guid_ptr))
4558 if(!prs_uint32("action", ps, depth, &il->action))
4561 if(!smb_io_unistr2("servername", &il->guid, il->guid_ptr, ps, depth))
4566 /*******************************************************************
4567 ********************************************************************/
4569 bool spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4571 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4576 if(!prs_uint32("level", ps, depth, &il->level))
4578 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4581 /* if no struct inside just return */
4582 if (il->info_ptr==0) {
4583 if (UNMARSHALLING(ps)) {
4590 switch (il->level) {
4592 * level 0 is used by setprinter when managing the queue
4593 * (hold, stop, start a queue)
4597 /* DOCUMENT ME!!! What is level 1 used for? */
4600 if (UNMARSHALLING(ps)) {
4601 if ((il->info_1=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_1,1)) == NULL)
4604 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4609 * level 2 is used by addprinter
4610 * and by setprinter when updating printer's info
4613 if (UNMARSHALLING(ps)) {
4614 if ((il->info_2=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_2,1)) == NULL)
4617 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4620 /* DOCUMENT ME!!! What is level 3 used for? */
4623 if (UNMARSHALLING(ps)) {
4624 if ((il->info_3=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_3,1)) == NULL)
4627 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4632 if (UNMARSHALLING(ps))
4633 if ((il->info_7=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_7,1)) == NULL)
4635 if (!spool_io_printer_info_level_7("", il->info_7, ps, depth))
4643 /*******************************************************************
4644 ********************************************************************/
4646 bool spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4648 uint32 ptr_sec_desc = 0;
4650 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4656 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->server_name))
4658 if (!prs_io_unistr2("servername", ps, depth, q_u->server_name))
4664 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4667 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4670 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4676 switch (q_u->level) {
4678 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4681 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4685 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4690 /* Parse a NULL security descriptor. This should really
4691 happen inside the sec_io_desc_buf() function. */
4693 prs_debug(ps, depth, "", "sec_io_desc_buf");
4694 if (!prs_uint32("size", ps, depth + 1, &dummy))
4696 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
4700 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4702 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4708 /*******************************************************************
4709 ********************************************************************/
4711 bool spoolss_io_r_addprinterex(const char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4712 prs_struct *ps, int depth)
4714 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4717 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4720 if(!prs_werror("status", ps, depth, &r_u->status))
4726 /*******************************************************************
4727 ********************************************************************/
4729 bool spool_io_printer_driver_info_level_3(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4730 prs_struct *ps, int depth)
4732 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4734 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4738 if (UNMARSHALLING(ps)) {
4739 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_3,1);
4751 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4753 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4755 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4757 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4759 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4761 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4763 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4765 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4767 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4769 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4771 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4777 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4779 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4781 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4783 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4785 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4787 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4789 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4791 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4797 if (il->dependentfiles_ptr)
4798 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4803 /*******************************************************************
4804 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4805 ********************************************************************/
4807 bool spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4808 prs_struct *ps, int depth)
4810 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4812 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4816 if (UNMARSHALLING(ps)) {
4817 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_6,1);
4830 * I know this seems weird, but I have no other explanation.
4831 * This is observed behavior on both NT4 and 2K servers.
4835 if (!prs_align_uint64(ps))
4838 /* parse the main elements the packet */
4840 if(!prs_uint32("cversion ", ps, depth, &il->version))
4842 if(!prs_uint32("name ", ps, depth, &il->name_ptr))
4844 if(!prs_uint32("environment ", ps, depth, &il->environment_ptr))
4846 if(!prs_uint32("driverpath ", ps, depth, &il->driverpath_ptr))
4848 if(!prs_uint32("datafile ", ps, depth, &il->datafile_ptr))
4850 if(!prs_uint32("configfile ", ps, depth, &il->configfile_ptr))
4852 if(!prs_uint32("helpfile ", ps, depth, &il->helpfile_ptr))
4854 if(!prs_uint32("monitorname ", ps, depth, &il->monitorname_ptr))
4856 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4858 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_len))
4860 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_ptr))
4862 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_len))
4864 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_ptr))
4866 if(!smb_io_time("driverdate ", &il->driverdate, ps, depth))
4868 if(!prs_uint32("dummy4 ", ps, depth, &il->dummy4))
4870 if(!prs_uint64("driverversion ", ps, depth, &il->driverversion))
4872 if(!prs_uint32("mfgname ", ps, depth, &il->mfgname_ptr))
4874 if(!prs_uint32("oemurl ", ps, depth, &il->oemurl_ptr))
4876 if(!prs_uint32("hardwareid ", ps, depth, &il->hardwareid_ptr))
4878 if(!prs_uint32("provider ", ps, depth, &il->provider_ptr))
4881 /* parse the structures in the packet */
4883 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4888 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4893 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4898 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4903 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4908 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4913 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4918 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4922 if (il->dependentfiles_ptr) {
4923 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4928 if (il->previousnames_ptr) {
4929 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4934 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4938 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4942 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4946 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4952 /*******************************************************************
4953 convert a buffer of UNICODE strings null terminated
4954 the buffer is terminated by a NULL
4956 convert to an dos codepage array (null terminated)
4958 dynamically allocate memory
4960 ********************************************************************/
4962 static bool uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
4971 src = (char *)buf5->buffer;
4972 *ar = SMB_MALLOC_ARRAY(fstring, 1);
4977 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
4978 rpcstr_pull(f, src, sizeof(f)-1, -1, STR_TERMINATE);
4979 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
4980 *ar = SMB_REALLOC_ARRAY(*ar, fstring, n+2);
4984 fstrcpy((*ar)[n], f);
4988 fstrcpy((*ar)[n], "");
4993 /*******************************************************************
4994 read a UNICODE array with null terminated strings
4995 and null terminated array
4996 and size of array at beginning
4997 ********************************************************************/
4999 bool smb_io_unibuffer(const char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
5001 if (buffer==NULL) return False;
5004 buffer->uni_str_len=buffer->uni_max_len;
5006 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
5009 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
5015 /*******************************************************************
5016 ********************************************************************/
5018 bool spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
5020 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
5025 if(!prs_uint32("level", ps, depth, &il->level))
5027 if(!prs_uint32("ptr", ps, depth, &il->ptr))
5033 switch (il->level) {
5035 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
5039 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
5049 /*******************************************************************
5050 init a SPOOL_Q_ADDPRINTERDRIVER struct
5051 ******************************************************************/
5053 bool make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
5054 SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
5055 uint32 level, PRINTER_DRIVER_CTR *info)
5057 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
5059 if (!srv_name || !info) {
5063 q_u->server_name_ptr = 1; /* srv_name is != NULL, see above */
5064 init_unistr2(&q_u->server_name, srv_name, UNI_STR_TERMINATE);
5068 q_u->info.level = level;
5069 q_u->info.ptr = 1; /* Info is != NULL, see above */
5072 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
5074 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
5078 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
5085 bool make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
5086 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
5087 DRIVER_INFO_3 *info3)
5090 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
5092 if (!(inf=TALLOC_ZERO_P(mem_ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)))
5095 inf->cversion = info3->version;
5096 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
5097 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
5098 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
5099 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
5100 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
5101 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
5102 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
5103 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
5105 init_unistr2_from_unistr(inf, &inf->name, &info3->name);
5106 init_unistr2_from_unistr(inf, &inf->environment, &info3->architecture);
5107 init_unistr2_from_unistr(inf, &inf->driverpath, &info3->driverpath);
5108 init_unistr2_from_unistr(inf, &inf->datafile, &info3->datafile);
5109 init_unistr2_from_unistr(inf, &inf->configfile, &info3->configfile);
5110 init_unistr2_from_unistr(inf, &inf->helpfile, &info3->helpfile);
5111 init_unistr2_from_unistr(inf, &inf->monitorname, &info3->monitorname);
5112 init_unistr2_from_unistr(inf, &inf->defaultdatatype, &info3->defaultdatatype);
5114 if (info3->dependentfiles) {
5116 bool null_char = False;
5117 uint16 *ptr = info3->dependentfiles;
5122 /* the null_char bool is used to help locate
5123 two '\0's back to back */
5140 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
5141 inf->dependentfilessize = (info3->dependentfiles != NULL) ? len : 0;
5142 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles)) {
5147 *spool_drv_info = inf;
5152 /*******************************************************************
5153 make a BUFFER5 struct from a uint16*
5154 ******************************************************************/
5156 bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
5159 buf5->buf_len = len;
5162 if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
5163 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
5167 buf5->buffer = NULL;
5176 /*******************************************************************
5177 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5178 ********************************************************************/
5180 bool spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5182 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
5188 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5190 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5195 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5198 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5204 /*******************************************************************
5205 ********************************************************************/
5207 bool spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5209 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
5212 if(!prs_werror("status", ps, depth, &q_u->status))
5218 /*******************************************************************
5219 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5220 ********************************************************************/
5222 bool spoolss_io_q_addprinterdriverex(const char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5224 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriverex");
5230 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5232 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5237 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5240 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5245 if(!prs_uint32("copy flags", ps, depth, &q_u->copy_flags))
5251 /*******************************************************************
5252 ********************************************************************/
5254 bool spoolss_io_r_addprinterdriverex(const char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5256 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriverex");
5259 if(!prs_werror("status", ps, depth, &q_u->status))
5265 /*******************************************************************
5266 ********************************************************************/
5268 bool uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
5269 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
5271 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
5273 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5277 *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_3);
5285 d->cversion=uni->cversion;
5287 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name));
5288 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment));
5289 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath));
5290 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile));
5291 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile));
5292 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile));
5293 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname));
5294 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype));
5296 DEBUGADD(8,( "version: %d\n", d->cversion));
5297 DEBUGADD(8,( "name: %s\n", d->name));
5298 DEBUGADD(8,( "environment: %s\n", d->environment));
5299 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5300 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5301 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5302 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5303 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5304 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5306 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5313 /*******************************************************************
5314 ********************************************************************/
5315 bool uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5316 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5318 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5320 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5324 *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_6);
5332 d->version=uni->version;
5334 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name));
5335 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment));
5336 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath));
5337 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile));
5338 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile));
5339 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile));
5340 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname));
5341 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype));
5343 DEBUGADD(8,( "version: %d\n", d->version));
5344 DEBUGADD(8,( "name: %s\n", d->name));
5345 DEBUGADD(8,( "environment: %s\n", d->environment));
5346 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5347 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5348 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5349 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5350 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5351 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5353 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5355 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5365 bool uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5366 NT_PRINTER_INFO_LEVEL_2 *d)
5368 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5370 d->attributes=uni->attributes;
5371 d->priority=uni->priority;
5372 d->default_priority=uni->default_priority;
5373 d->starttime=uni->starttime;
5374 d->untiltime=uni->untiltime;
5375 d->status=uni->status;
5376 d->cjobs=uni->cjobs;
5378 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername));
5379 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername));
5380 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename));
5381 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname));
5382 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername));
5383 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment));
5384 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location));
5385 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile));
5386 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor));
5387 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype));
5388 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters));
5393 /*******************************************************************
5395 ********************************************************************/
5397 bool make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5398 fstring servername, fstring env_name, uint32 level,
5399 RPC_BUFFER *buffer, uint32 offered)
5401 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5402 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5406 q_u->offered=offered;
5411 /*******************************************************************
5412 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5413 ********************************************************************/
5415 bool spoolss_io_q_getprinterdriverdir(const char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5417 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5422 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5424 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5430 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5432 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5438 if(!prs_uint32("level", ps, depth, &q_u->level))
5441 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5447 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5453 /*******************************************************************
5454 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5455 ********************************************************************/
5457 bool spoolss_io_r_getprinterdriverdir(const char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5459 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5465 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5471 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5474 if (!prs_werror("status", ps, depth, &r_u->status))
5480 /*******************************************************************
5481 ********************************************************************/
5483 bool spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5485 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5491 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5497 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5500 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5503 if (!prs_werror("status", ps, depth, &r_u->status))
5509 /*******************************************************************
5510 ********************************************************************/
5512 bool spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5514 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5520 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5522 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5528 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5530 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5536 if (!prs_uint32("level", ps, depth, &q_u->level))
5539 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5545 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5551 /*******************************************************************
5552 ********************************************************************/
5554 bool spoolss_io_q_addprintprocessor(const char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5556 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5562 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5564 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5569 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5574 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5579 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5585 /*******************************************************************
5586 ********************************************************************/
5588 bool spoolss_io_r_addprintprocessor(const char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5590 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5596 if (!prs_werror("status", ps, depth, &r_u->status))
5602 /*******************************************************************
5603 ********************************************************************/
5605 bool spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5607 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5613 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5619 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5622 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5625 if (!prs_werror("status", ps, depth, &r_u->status))
5631 /*******************************************************************
5632 ********************************************************************/
5634 bool spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5636 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5642 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5644 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5650 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5652 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5658 if (!prs_uint32("level", ps, depth, &q_u->level))
5661 if(!prs_rpcbuffer_p("buffer", ps, depth, &q_u->buffer))
5667 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5673 /*******************************************************************
5674 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5675 ********************************************************************/
5677 bool spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5679 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5685 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5687 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5693 if (!prs_uint32("level", ps, depth, &q_u->level))
5696 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5702 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5708 /*******************************************************************
5709 ********************************************************************/
5711 bool spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5713 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5719 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5725 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5728 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5731 if (!prs_werror("status", ps, depth, &r_u->status))
5737 /*******************************************************************
5738 ********************************************************************/
5740 bool spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5742 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5747 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5750 if (UNMARSHALLING(ps) && r_u->valuesize) {
5751 r_u->value = PRS_ALLOC_MEM(ps, uint16, r_u->valuesize);
5753 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
5758 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5764 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5767 if(!prs_uint32("type", ps, depth, &r_u->type))
5770 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5773 if (UNMARSHALLING(ps) && r_u->datasize) {
5774 r_u->data = PRS_ALLOC_MEM(ps, uint8, r_u->datasize);
5776 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
5781 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5786 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5788 if(!prs_werror("status", ps, depth, &r_u->status))
5794 /*******************************************************************
5795 ********************************************************************/
5797 bool spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5799 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5804 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5806 if(!prs_uint32("index", ps, depth, &q_u->index))
5808 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5810 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5816 /*******************************************************************
5817 ********************************************************************/
5819 bool make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5820 const POLICY_HND *hnd,
5821 uint32 idx, uint32 valuelen, uint32 datalen)
5823 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5825 q_u->valuesize=valuelen;
5826 q_u->datasize=datalen;
5831 /*******************************************************************
5832 ********************************************************************/
5834 bool make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
5835 const POLICY_HND *hnd, const char *key,
5838 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5839 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
5845 /*******************************************************************
5846 ********************************************************************/
5847 bool make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
5848 char* value, uint32 data_type, char* data, uint32 data_size)
5850 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5851 q_u->type = data_type;
5852 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
5854 q_u->max_len = q_u->real_len = data_size;
5855 q_u->data = (unsigned char *)data;
5860 /*******************************************************************
5861 ********************************************************************/
5862 bool make_spoolss_q_setprinterdataex(SPOOL_Q_SETPRINTERDATAEX *q_u, const POLICY_HND *hnd,
5863 char *key, char* value, uint32 data_type, char* data,
5866 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5867 q_u->type = data_type;
5868 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
5869 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
5871 q_u->max_len = q_u->real_len = data_size;
5872 q_u->data = (unsigned char *)data;
5877 /*******************************************************************
5878 ********************************************************************/
5880 bool spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5882 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5887 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5889 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5895 if(!prs_uint32("type", ps, depth, &q_u->type))
5898 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5908 if (UNMARSHALLING(ps))
5909 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
5910 if(q_u->data == NULL)
5912 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5920 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5926 /*******************************************************************
5927 ********************************************************************/
5929 bool spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5931 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5936 if(!prs_werror("status", ps, depth, &r_u->status))
5942 /*******************************************************************
5943 ********************************************************************/
5944 bool spoolss_io_q_resetprinter(const char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
5946 prs_debug(ps, depth, desc, "spoolss_io_q_resetprinter");
5951 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5954 if (!prs_uint32("datatype_ptr", ps, depth, &q_u->datatype_ptr))
5957 if (q_u->datatype_ptr) {
5958 if (!smb_io_unistr2("datatype", &q_u->datatype, q_u->datatype_ptr?True:False, ps, depth))
5962 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
5969 /*******************************************************************
5970 ********************************************************************/
5971 bool spoolss_io_r_resetprinter(const char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
5973 prs_debug(ps, depth, desc, "spoolss_io_r_resetprinter");
5978 if(!prs_werror("status", ps, depth, &r_u->status))
5984 /*******************************************************************
5985 ********************************************************************/
5987 static bool spoolss_io_addform(const char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5989 prs_debug(ps, depth, desc, "spoolss_io_addform");
5996 if(!prs_uint32("flags", ps, depth, &f->flags))
5998 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
6000 if(!prs_uint32("size_x", ps, depth, &f->size_x))
6002 if(!prs_uint32("size_y", ps, depth, &f->size_y))
6004 if(!prs_uint32("left", ps, depth, &f->left))
6006 if(!prs_uint32("top", ps, depth, &f->top))
6008 if(!prs_uint32("right", ps, depth, &f->right))
6010 if(!prs_uint32("bottom", ps, depth, &f->bottom))
6013 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
6020 /*******************************************************************
6021 ********************************************************************/
6023 bool spoolss_io_q_deleteform(const char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
6025 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
6030 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6032 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
6038 /*******************************************************************
6039 ********************************************************************/
6041 bool spoolss_io_r_deleteform(const char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
6043 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
6048 if(!prs_werror("status", ps, depth, &r_u->status))
6054 /*******************************************************************
6055 ********************************************************************/
6057 bool spoolss_io_q_addform(const char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
6059 uint32 useless_ptr=1;
6060 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
6065 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6067 if(!prs_uint32("level", ps, depth, &q_u->level))
6069 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6074 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6076 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6083 /*******************************************************************
6084 ********************************************************************/
6086 bool spoolss_io_r_addform(const char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
6088 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
6093 if(!prs_werror("status", ps, depth, &r_u->status))
6099 /*******************************************************************
6100 ********************************************************************/
6102 bool spoolss_io_q_setform(const char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
6104 uint32 useless_ptr=1;
6105 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
6110 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6112 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
6118 if(!prs_uint32("level", ps, depth, &q_u->level))
6120 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6125 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6127 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6134 /*******************************************************************
6135 ********************************************************************/
6137 bool spoolss_io_r_setform(const char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
6139 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
6144 if(!prs_werror("status", ps, depth, &r_u->status))
6150 /*******************************************************************
6151 Parse a SPOOL_R_GETJOB structure.
6152 ********************************************************************/
6154 bool spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
6156 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
6162 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
6168 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6171 if (!prs_werror("status", ps, depth, &r_u->status))
6177 /*******************************************************************
6178 Parse a SPOOL_Q_GETJOB structure.
6179 ********************************************************************/
6181 bool spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
6183 prs_debug(ps, depth, desc, "");
6189 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6191 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
6193 if(!prs_uint32("level", ps, depth, &q_u->level))
6196 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
6202 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6208 void free_devmode(DEVICEMODE *devmode)
6210 if (devmode!=NULL) {
6211 SAFE_FREE(devmode->dev_private);
6216 void free_printer_info_1(PRINTER_INFO_1 *printer)
6221 void free_printer_info_2(PRINTER_INFO_2 *printer)
6223 if (printer!=NULL) {
6224 free_devmode(printer->devmode);
6225 printer->devmode = NULL;
6230 void free_printer_info_3(PRINTER_INFO_3 *printer)
6235 void free_printer_info_4(PRINTER_INFO_4 *printer)
6240 void free_printer_info_5(PRINTER_INFO_5 *printer)
6245 void free_printer_info_6(PRINTER_INFO_6 *printer)
6250 void free_printer_info_7(PRINTER_INFO_7 *printer)
6255 void free_job_info_2(JOB_INFO_2 *job)
6258 free_devmode(job->devmode);
6261 /*******************************************************************
6263 ********************************************************************/
6265 bool make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
6266 const fstring string, uint32 printer, uint32 type)
6271 init_unistr2(&q_u->string, string, UNI_STR_TERMINATE);
6273 q_u->printer=printer;
6282 /*******************************************************************
6283 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
6284 ********************************************************************/
6286 bool spoolss_io_q_replyopenprinter(const char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
6288 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
6294 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
6300 if(!prs_uint32("printer", ps, depth, &q_u->printer))
6302 if(!prs_uint32("type", ps, depth, &q_u->type))
6305 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6307 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6313 /*******************************************************************
6314 Parse a SPOOL_R_REPLYOPENPRINTER structure.
6315 ********************************************************************/
6317 bool spoolss_io_r_replyopenprinter(const char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
6319 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
6325 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6328 if (!prs_werror("status", ps, depth, &r_u->status))
6334 /*******************************************************************
6336 ********************************************************************/
6337 bool make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd,
6338 uint32 condition, uint32 change_id)
6341 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6343 q_u->condition = condition;
6344 q_u->change_id = change_id;
6347 q_u->unknown1 = 0x1;
6348 memset(q_u->unknown2, 0x0, 5);
6349 q_u->unknown2[0] = 0x1;
6354 /*******************************************************************
6355 Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
6356 ********************************************************************/
6357 bool spoolss_io_q_routerreplyprinter (const char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
6360 prs_debug(ps, depth, desc, "spoolss_io_q_routerreplyprinter");
6366 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6369 if (!prs_uint32("condition", ps, depth, &q_u->condition))
6372 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6375 if (!prs_uint32("change_id", ps, depth, &q_u->change_id))
6378 if (!prs_uint8s(False, "dev_private", ps, depth, q_u->unknown2, 5))
6384 /*******************************************************************
6385 Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
6386 ********************************************************************/
6387 bool spoolss_io_r_routerreplyprinter (const char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
6389 prs_debug(ps, depth, desc, "spoolss_io_r_routerreplyprinter");
6395 if (!prs_werror("status", ps, depth, &r_u->status))
6401 /*******************************************************************
6403 ********************************************************************/
6405 bool make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
6410 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6415 /*******************************************************************
6416 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6417 ********************************************************************/
6419 bool spoolss_io_q_replycloseprinter(const char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
6421 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
6427 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6433 /*******************************************************************
6434 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6435 ********************************************************************/
6437 bool spoolss_io_r_replycloseprinter(const char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6439 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6445 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6448 if (!prs_werror("status", ps, depth, &r_u->status))
6454 #if 0 /* JERRY - not currently used but could be :-) */
6456 /*******************************************************************
6457 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
6458 ******************************************************************/
6459 static bool copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
6460 SPOOL_NOTIFY_INFO_DATA *src, int n)
6464 memcpy(dst, src, sizeof(SPOOL_NOTIFY_INFO_DATA)*n);
6466 for (i=0; i<n; i++) {
6470 if (src->size != POINTER)
6472 len = src->notify_data.data.length;
6473 s = SMB_MALLOC_ARRAY(uint16, len);
6475 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
6479 memcpy(s, src->notify_data.data.string, len*2);
6480 dst->notify_data.data.string = s;
6486 /*******************************************************************
6487 Deep copy a SPOOL_NOTIFY_INFO structure
6488 ******************************************************************/
6489 static bool copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
6492 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
6496 dst->version = src->version;
6497 dst->flags = src->flags;
6498 dst->count = src->count;
6502 dst->data = SMB_MALLOC_ARRAY(SPOOL_NOTIFY_INFO_DATA, dst->count);
6504 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
6507 if (dst->data == NULL) {
6508 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
6513 return (copy_spool_notify_info_data(dst->data, src->data, src->count));
6520 /*******************************************************************
6522 ********************************************************************/
6524 bool make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6525 uint32 change_low, uint32 change_high,
6526 SPOOL_NOTIFY_INFO *info)
6531 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6533 q_u->change_low=change_low;
6534 q_u->change_high=change_high;
6539 q_u->info_ptr=0x0FF0ADDE;
6541 q_u->info.version=2;
6544 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
6546 q_u->info.version = info->version;
6547 q_u->info.flags = info->flags;
6548 q_u->info.count = info->count;
6549 /* pointer field - be careful! */
6550 q_u->info.data = info->data;
6553 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6560 /*******************************************************************
6561 Parse a SPOOL_Q_REPLY_RRPCN structure.
6562 ********************************************************************/
6564 bool spoolss_io_q_reply_rrpcn(const char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6566 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6572 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6575 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6578 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6581 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6584 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6587 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6590 if(q_u->info_ptr!=0)
6591 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6597 /*******************************************************************
6598 Parse a SPOOL_R_REPLY_RRPCN structure.
6599 ********************************************************************/
6601 bool spoolss_io_r_reply_rrpcn(const char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6603 prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
6609 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6612 if (!prs_werror("status", ps, depth, &r_u->status))
6618 /*******************************************************************
6620 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6621 ********************************************************************/
6623 bool spoolss_io_q_getprinterdataex(const char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6628 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
6633 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6637 if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
6641 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
6645 if (!prs_uint32("size", ps, depth, &q_u->size))
6651 /*******************************************************************
6652 * write a structure.
6653 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6654 ********************************************************************/
6656 bool spoolss_io_r_getprinterdataex(const char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6661 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
6666 if (!prs_uint32("type", ps, depth, &r_u->type))
6668 if (!prs_uint32("size", ps, depth, &r_u->size))
6671 if (UNMARSHALLING(ps) && r_u->size) {
6672 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
6677 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
6683 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6685 if (!prs_werror("status", ps, depth, &r_u->status))
6691 /*******************************************************************
6693 ********************************************************************/
6695 bool spoolss_io_q_setprinterdataex(const char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6697 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
6702 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6704 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6710 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6716 if(!prs_uint32("type", ps, depth, &q_u->type))
6719 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6729 if (UNMARSHALLING(ps))
6730 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
6731 if(q_u->data == NULL)
6733 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6741 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6747 /*******************************************************************
6748 * write a structure.
6749 ********************************************************************/
6751 bool spoolss_io_r_setprinterdataex(const char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6753 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
6758 if(!prs_werror("status", ps, depth, &r_u->status))
6764 /*******************************************************************
6766 ********************************************************************/
6767 bool make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u,
6768 POLICY_HND *hnd, const char *key,
6771 DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
6773 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6774 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
6780 /*******************************************************************
6782 ********************************************************************/
6784 bool spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
6786 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
6791 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6794 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6800 if(!prs_uint32("size", ps, depth, &q_u->size))
6806 /*******************************************************************
6807 * write a structure.
6808 ********************************************************************/
6810 bool spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
6812 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
6818 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
6824 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6827 if(!prs_werror("status", ps, depth, &r_u->status))
6833 /*******************************************************************
6835 ********************************************************************/
6837 bool make_spoolss_q_deleteprinterkey(SPOOL_Q_DELETEPRINTERKEY *q_u,
6838 POLICY_HND *hnd, char *keyname)
6840 DEBUG(5,("make_spoolss_q_deleteprinterkey\n"));
6842 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6843 init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
6848 /*******************************************************************
6850 ********************************************************************/
6852 bool spoolss_io_q_deleteprinterkey(const char *desc, SPOOL_Q_DELETEPRINTERKEY *q_u, prs_struct *ps, int depth)
6854 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterkey");
6859 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6862 if(!smb_io_unistr2("", &q_u->keyname, True, ps, depth))
6868 /*******************************************************************
6869 * write a structure.
6870 ********************************************************************/
6872 bool spoolss_io_r_deleteprinterkey(const char *desc, SPOOL_R_DELETEPRINTERKEY *r_u, prs_struct *ps, int depth)
6874 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterkey");
6880 if(!prs_werror("status", ps, depth, &r_u->status))
6887 /*******************************************************************
6889 ********************************************************************/
6891 bool spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6893 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
6898 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6901 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6907 if(!prs_uint32("size", ps, depth, &q_u->size))
6913 /*******************************************************************
6914 ********************************************************************/
6916 static bool spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
6917 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
6920 uint32 valuename_offset,
6923 const uint32 basic_unit = 20; /* size of static portion of enum_values */
6925 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
6929 * offset data begins at 20 bytes per structure * size_of_array.
6930 * Don't forget the uint32 at the beginning
6933 current_offset = basic_unit * ctr->size_of_array;
6935 /* first loop to write basic enum_value information */
6937 if (UNMARSHALLING(ps) && ctr->size_of_array) {
6938 ctr->values = PRS_ALLOC_MEM(ps, PRINTER_ENUM_VALUES, ctr->size_of_array);
6943 for (i=0; i<ctr->size_of_array; i++) {
6944 uint32 base_offset, return_offset;
6946 base_offset = prs_offset(ps);
6948 valuename_offset = current_offset;
6949 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
6952 /* Read or write the value. */
6954 return_offset = prs_offset(ps);
6956 if (!prs_set_offset(ps, base_offset + valuename_offset)) {
6960 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
6964 if (!prs_set_offset(ps, return_offset))
6967 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
6970 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
6973 data_offset = ctr->values[i].value_len + valuename_offset;
6975 if (!prs_uint32("data_offset", ps, depth, &data_offset))
6978 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
6981 /* Read or write the data. */
6983 return_offset = prs_offset(ps);
6985 if (!prs_set_offset(ps, base_offset + data_offset)) {
6989 if ( ctr->values[i].data_len ) {
6990 if ( UNMARSHALLING(ps) ) {
6991 ctr->values[i].data = PRS_ALLOC_MEM(ps, uint8, ctr->values[i].data_len);
6992 if (!ctr->values[i].data)
6995 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
6999 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
7000 /* account for 2 byte alignment */
7001 current_offset += (current_offset % 2);
7003 /* Remember how far we got. */
7004 data_offset = prs_offset(ps);
7007 if (!prs_set_offset(ps, return_offset))
7012 /* Go to the last data offset we got to. */
7014 if (!prs_set_offset(ps, data_offset))
7017 /* And ensure we're 2 byte aligned. */
7019 if ( !prs_align_uint16(ps) )
7025 /*******************************************************************
7026 * write a structure.
7027 ********************************************************************/
7029 bool spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
7031 uint32 data_offset, end_offset;
7032 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
7038 if (!prs_uint32("size", ps, depth, &r_u->ctr.size))
7041 data_offset = prs_offset(ps);
7043 if (!prs_set_offset(ps, data_offset + r_u->ctr.size))
7049 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7052 if(!prs_uint32("returned", ps, depth, &r_u->returned))
7055 if(!prs_werror("status", ps, depth, &r_u->status))
7058 r_u->ctr.size_of_array = r_u->returned;
7060 end_offset = prs_offset(ps);
7062 if (!prs_set_offset(ps, data_offset))
7066 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
7069 if (!prs_set_offset(ps, end_offset))
7074 /*******************************************************************
7075 * write a structure.
7076 ********************************************************************/
7079 uint32 GetPrintProcessorDirectory(
7081 [in] unistr2 *environment,
7083 [in,out] RPC_BUFFER buffer,
7084 [in] uint32 offered,
7085 [out] uint32 needed,
7086 [out] uint32 returned
7091 bool make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, RPC_BUFFER *buffer, uint32 offered)
7093 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
7095 init_unistr2(&q_u->name, name, UNI_STR_TERMINATE);
7096 init_unistr2(&q_u->environment, environment, UNI_STR_TERMINATE);
7100 q_u->buffer = buffer;
7101 q_u->offered = offered;
7106 bool spoolss_io_q_getprintprocessordirectory(const char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
7110 prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
7116 if (!prs_uint32("ptr", ps, depth, &ptr))
7120 if(!smb_io_unistr2("name", &q_u->name, True, ps, depth))
7127 if (!prs_uint32("ptr", ps, depth, &ptr))
7131 if(!smb_io_unistr2("environment", &q_u->environment, True,
7139 if(!prs_uint32("level", ps, depth, &q_u->level))
7142 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
7148 if(!prs_uint32("offered", ps, depth, &q_u->offered))
7154 /*******************************************************************
7155 * write a structure.
7156 ********************************************************************/
7158 bool spoolss_io_r_getprintprocessordirectory(const char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
7160 prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
7166 if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
7172 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7175 if(!prs_werror("status", ps, depth, &r_u->status))
7181 bool smb_io_printprocessordirectory_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
7183 prs_struct *ps=&buffer->prs;
7185 prs_debug(ps, depth, desc, "smb_io_printprocessordirectory_1");
7188 buffer->struct_start=prs_offset(ps);
7190 if (!smb_io_unistr(desc, &info->name, ps, depth))
7196 /*******************************************************************
7198 ********************************************************************/
7200 bool make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle,
7201 int level, FORM *form)
7203 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7205 q_u->level2 = level;
7206 memcpy(&q_u->form, form, sizeof(FORM));
7211 /*******************************************************************
7213 ********************************************************************/
7215 bool make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
7216 int level, const char *form_name, FORM *form)
7218 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7220 q_u->level2 = level;
7221 memcpy(&q_u->form, form, sizeof(FORM));
7222 init_unistr2(&q_u->name, form_name, UNI_STR_TERMINATE);
7227 /*******************************************************************
7229 ********************************************************************/
7231 bool make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle,
7234 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7235 init_unistr2(&q_u->name, form, UNI_STR_TERMINATE);
7239 /*******************************************************************
7241 ********************************************************************/
7243 bool make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
7244 const char *formname, uint32 level,
7245 RPC_BUFFER *buffer, uint32 offered)
7247 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7249 init_unistr2(&q_u->formname, formname, UNI_STR_TERMINATE);
7251 q_u->offered=offered;
7256 /*******************************************************************
7258 ********************************************************************/
7260 bool make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
7261 uint32 level, RPC_BUFFER *buffer,
7264 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7267 q_u->offered=offered;
7272 /*******************************************************************
7274 ********************************************************************/
7276 bool make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle,
7277 uint32 jobid, uint32 level, uint32 command)
7279 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7283 /* Hmm - the SPOOL_Q_SETJOB structure has a JOB_INFO ctr in it but
7284 the server side code has it marked as unused. */
7286 q_u->command = command;
7291 /*******************************************************************
7293 ********************************************************************/
7295 bool make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
7296 uint32 jobid, uint32 level, RPC_BUFFER *buffer,
7299 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7302 q_u->buffer = buffer;
7303 q_u->offered = offered;
7308 /*******************************************************************
7310 ********************************************************************/
7312 bool make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u,
7315 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7320 /*******************************************************************
7322 ********************************************************************/
7324 bool make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u,
7327 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7332 /*******************************************************************
7334 ********************************************************************/
7336 bool make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
7337 POLICY_HND *handle, uint32 level,
7338 char *docname, char *outputfile,
7341 DOC_INFO_CONTAINER *ctr = &q_u->doc_info_container;
7343 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7349 ctr->docinfo.switch_value = level;
7351 ctr->docinfo.doc_info_1.p_docname = docname ? 1 : 0;
7352 ctr->docinfo.doc_info_1.p_outputfile = outputfile ? 1 : 0;
7353 ctr->docinfo.doc_info_1.p_datatype = datatype ? 1 : 0;
7355 init_unistr2(&ctr->docinfo.doc_info_1.docname, docname, UNI_STR_TERMINATE);
7356 init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile, UNI_STR_TERMINATE);
7357 init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype, UNI_STR_TERMINATE);
7361 /* DOC_INFO_2 is only used by Windows 9x and since it
7362 doesn't do printing over RPC we don't have to worry
7365 DEBUG(3, ("unsupported info level %d\n", level));
7372 /*******************************************************************
7374 ********************************************************************/
7376 bool make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u,
7379 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7384 /*******************************************************************
7386 ********************************************************************/
7388 bool make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u,
7389 POLICY_HND *handle, uint32 data_size,
7392 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7393 q_u->buffer_size = q_u->buffer_size2 = data_size;
7394 q_u->buffer = (unsigned char *)data;
7398 /*******************************************************************
7400 ********************************************************************/
7402 bool make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u,
7403 POLICY_HND *handle, char *valuename)
7405 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7406 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
7411 /*******************************************************************
7413 ********************************************************************/
7415 bool make_spoolss_q_deleteprinterdataex(SPOOL_Q_DELETEPRINTERDATAEX *q_u,
7416 POLICY_HND *handle, char *key,
7419 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7420 init_unistr2(&q_u->valuename, value, UNI_STR_TERMINATE);
7421 init_unistr2(&q_u->keyname, key, UNI_STR_TERMINATE);
7426 /*******************************************************************
7428 ********************************************************************/
7430 bool make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
7431 uint32 flags, uint32 options, const char *localmachine,
7432 uint32 printerlocal, SPOOL_NOTIFY_OPTION *option)
7434 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7437 q_u->options = options;
7439 q_u->localmachine_ptr = 1;
7441 init_unistr2(&q_u->localmachine, localmachine, UNI_STR_TERMINATE);
7443 q_u->printerlocal = printerlocal;
7446 q_u->option_ptr = 1;
7448 q_u->option = option;
7454 /*******************************************************************
7455 ********************************************************************/
7457 bool spoolss_io_q_xcvdataport(const char *desc, SPOOL_Q_XCVDATAPORT *q_u, prs_struct *ps, int depth)
7459 prs_debug(ps, depth, desc, "spoolss_io_q_xcvdataport");
7465 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
7468 if(!smb_io_unistr2("", &q_u->dataname, True, ps, depth))
7474 if(!prs_rpcbuffer("", ps, depth, &q_u->indata))
7480 if (!prs_uint32("indata_len", ps, depth, &q_u->indata_len))
7482 if (!prs_uint32("offered", ps, depth, &q_u->offered))
7484 if (!prs_uint32("unknown", ps, depth, &q_u->unknown))
7490 /*******************************************************************
7491 ********************************************************************/
7493 bool spoolss_io_r_xcvdataport(const char *desc, SPOOL_R_XCVDATAPORT *r_u, prs_struct *ps, int depth)
7495 prs_debug(ps, depth, desc, "spoolss_io_r_xcvdataport");
7500 if(!prs_rpcbuffer("", ps, depth, &r_u->outdata))
7506 if (!prs_uint32("needed", ps, depth, &r_u->needed))
7508 if (!prs_uint32("unknown", ps, depth, &r_u->unknown))
7511 if(!prs_werror("status", ps, depth, &r_u->status))
7517 /*******************************************************************
7518 ********************************************************************/
7520 bool make_monitorui_buf( RPC_BUFFER *buf, const char *dllname )
7527 init_unistr( &string, dllname );
7529 if ( !prs_unistr( "ui_dll", &buf->prs, 0, &string ) )
7535 /*******************************************************************
7536 ********************************************************************/
7538 #define PORT_DATA_1_PAD 540
7540 static bool smb_io_port_data_1( const char *desc, RPC_BUFFER *buf, int depth, SPOOL_PORT_DATA_1 *p1 )
7542 prs_struct *ps = &buf->prs;
7543 uint8 padding[PORT_DATA_1_PAD];
7545 prs_debug(ps, depth, desc, "smb_io_port_data_1");
7551 if( !prs_uint16s(True, "portname", ps, depth, p1->portname, MAX_PORTNAME))
7554 if (!prs_uint32("version", ps, depth, &p1->version))
7556 if (!prs_uint32("protocol", ps, depth, &p1->protocol))
7558 if (!prs_uint32("size", ps, depth, &p1->size))
7560 if (!prs_uint32("reserved", ps, depth, &p1->reserved))
7563 if( !prs_uint16s(True, "hostaddress", ps, depth, p1->hostaddress, MAX_NETWORK_NAME))
7565 if( !prs_uint16s(True, "snmpcommunity", ps, depth, p1->snmpcommunity, MAX_SNMP_COMM_NAME))
7568 if (!prs_uint32("dblspool", ps, depth, &p1->dblspool))
7571 if( !prs_uint16s(True, "queue", ps, depth, p1->queue, MAX_QUEUE_NAME))
7573 if( !prs_uint16s(True, "ipaddress", ps, depth, p1->ipaddress, MAX_IPADDR_STRING))
7576 if( !prs_uint8s(False, "", ps, depth, padding, PORT_DATA_1_PAD))
7579 if (!prs_uint32("port", ps, depth, &p1->port))
7581 if (!prs_uint32("snmpenabled", ps, depth, &p1->snmpenabled))
7583 if (!prs_uint32("snmpdevindex", ps, depth, &p1->snmpdevindex))
7589 /*******************************************************************
7590 ********************************************************************/
7592 bool convert_port_data_1( NT_PORT_DATA_1 *port1, RPC_BUFFER *buf )
7594 SPOOL_PORT_DATA_1 spdata_1;
7596 ZERO_STRUCT( spdata_1 );
7598 if ( !smb_io_port_data_1( "port_data_1", buf, 0, &spdata_1 ) )
7601 rpcstr_pull(port1->name, spdata_1.portname, sizeof(port1->name), -1, 0);
7602 rpcstr_pull(port1->queue, spdata_1.queue, sizeof(port1->queue), -1, 0);
7603 rpcstr_pull(port1->hostaddr, spdata_1.hostaddress, sizeof(port1->hostaddr), -1, 0);
7605 port1->port = spdata_1.port;
7607 switch ( spdata_1.protocol ) {
7609 port1->protocol = PORT_PROTOCOL_DIRECT;
7612 port1->protocol = PORT_PROTOCOL_LPR;
7615 DEBUG(3,("convert_port_data_1: unknown protocol [%d]!\n",
7616 spdata_1.protocol));