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 NOTIFY OPTION TYPE structure.
75 ********************************************************************/
77 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
78 structure. The _TYPE structure is really the deferred referrants (i.e
79 the notify fields array) of the _TYPE structure. -tpot */
81 static bool smb_io_notify_option_type(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
83 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
89 if(!prs_uint16("type", ps, depth, &type->type))
91 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
93 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
95 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
97 if(!prs_uint32("count", ps, depth, &type->count))
99 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
105 /*******************************************************************
106 reads or writes an NOTIFY OPTION TYPE DATA.
107 ********************************************************************/
109 static bool smb_io_notify_option_type_data(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
113 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
116 /* if there are no fields just return */
117 if (type->fields_ptr==0)
123 if(!prs_uint32("count2", ps, depth, &type->count2))
126 if (type->count2 != type->count)
127 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
129 if (type->count2 > MAX_NOTIFY_TYPE_FOR_NOW) {
133 /* parse the option type data */
134 for(i=0;i<type->count2;i++)
135 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
140 /*******************************************************************
141 reads or writes an NOTIFY OPTION structure.
142 ********************************************************************/
144 static bool smb_io_notify_option_type_ctr(const char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
148 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
151 if(!prs_uint32("count", ps, depth, &ctr->count))
155 if (UNMARSHALLING(ps) && ctr->count)
156 if((ctr->type=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION_TYPE,ctr->count)) == NULL)
159 /* the option type struct */
160 for(i=0;i<ctr->count;i++)
161 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
164 /* the type associated with the option type struct */
165 for(i=0;i<ctr->count;i++)
166 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
172 /*******************************************************************
173 reads or writes an NOTIFY OPTION structure.
174 ********************************************************************/
176 static bool smb_io_notify_option(const char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
178 prs_debug(ps, depth, desc, "smb_io_notify_option");
181 if(!prs_uint32("version", ps, depth, &option->version))
183 if(!prs_uint32("flags", ps, depth, &option->flags))
185 if(!prs_uint32("count", ps, depth, &option->count))
187 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
190 /* marshalling or unmarshalling, that would work */
191 if (option->option_type_ptr!=0) {
192 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
196 option->ctr.type=NULL;
203 /*******************************************************************
204 reads or writes an NOTIFY INFO DATA structure.
205 ********************************************************************/
207 static bool smb_io_notify_info_data(const char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
209 uint32 useless_ptr=0x0FF0ADDE;
211 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
216 if(!prs_uint16("type", ps, depth, &data->type))
218 if(!prs_uint16("field", ps, depth, &data->field))
221 if(!prs_uint32("how many words", ps, depth, &data->size))
223 if(!prs_uint32("id", ps, depth, &data->id))
225 if(!prs_uint32("how many words", ps, depth, &data->size))
228 switch (data->enc_type) {
230 /* One and two value data has two uint32 values */
232 case NOTIFY_ONE_VALUE:
233 case NOTIFY_TWO_VALUE:
235 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
237 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
241 /* Pointers and strings have a string length and a
242 pointer. For a string the length is expressed as
243 the number of uint16 characters plus a trailing
248 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length ))
250 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
257 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
260 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
266 if( !prs_uint32( "sd size", ps, depth, &data->notify_data.sd.size ) )
268 if( !prs_uint32( "pointer", ps, depth, &useless_ptr ) )
274 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data\n",
282 /*******************************************************************
283 reads or writes an NOTIFY INFO DATA structure.
284 ********************************************************************/
286 bool smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *data,
287 prs_struct *ps, int depth)
289 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
295 switch(data->enc_type) {
297 /* No data for values */
299 case NOTIFY_ONE_VALUE:
300 case NOTIFY_TWO_VALUE:
304 /* Strings start with a length in uint16s */
309 data->notify_data.data.length /= 2;
311 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
314 if (UNMARSHALLING(ps) && data->notify_data.data.length) {
315 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
316 data->notify_data.data.length);
318 if (!data->notify_data.data.string)
322 if (!prs_uint16uni(True, "string", ps, depth, data->notify_data.data.string,
323 data->notify_data.data.length))
327 data->notify_data.data.length *= 2;
333 if (UNMARSHALLING(ps) && data->notify_data.data.length) {
334 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
335 data->notify_data.data.length);
337 if (!data->notify_data.data.string)
341 if(!prs_uint8s(True,"buffer",ps,depth,(uint8*)data->notify_data.data.string,data->notify_data.data.length))
347 if( !prs_uint32("secdesc size ", ps, depth, &data->notify_data.sd.size ) )
349 if ( !sec_io_desc( "sec_desc", &data->notify_data.sd.desc, ps, depth ) )
354 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data_strings\n",
360 if (isvalue==False) {
362 /* length of string in unicode include \0 */
363 x=data->notify_data.data.length+1;
365 if (data->field != 16)
366 if(!prs_uint32("string length", ps, depth, &x ))
369 if (MARSHALLING(ps)) {
370 /* These are already in little endian format. Don't byte swap. */
373 /* No memory allocated for this string
374 therefore following the data.string
375 pointer is a bad idea. Use a pointer to
376 the uint32 length union member to
377 provide a source for a unicode NULL */
379 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
383 if (data->field == 16)
386 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
391 /* Tallocate memory for string */
394 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16, x * 2);
395 if (!data->notify_data.data.string)
398 data->notify_data.data.string = NULL;
401 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
409 /* Win2k does not seem to put this parse align here */
417 /*******************************************************************
418 reads or writes an NOTIFY INFO structure.
419 ********************************************************************/
421 static bool smb_io_notify_info(const char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
425 prs_debug(ps, depth, desc, "smb_io_notify_info");
431 if(!prs_uint32("count", ps, depth, &info->count))
433 if(!prs_uint32("version", ps, depth, &info->version))
435 if(!prs_uint32("flags", ps, depth, &info->flags))
437 if(!prs_uint32("count", ps, depth, &info->count))
440 for (i=0;i<info->count;i++) {
441 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
445 /* now do the strings at the end of the stream */
446 for (i=0;i<info->count;i++) {
447 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
454 /*******************************************************************
455 ********************************************************************/
457 bool spool_io_user_level_1( const char *desc, prs_struct *ps, int depth, SPOOL_USER_1 *q_u )
459 prs_debug(ps, depth, desc, "");
465 if (!prs_uint32("size", ps, depth, &q_u->size))
468 if (!prs_io_unistr2_p("", ps, depth, &q_u->client_name))
470 if (!prs_io_unistr2_p("", ps, depth, &q_u->user_name))
473 if (!prs_uint32("build", ps, depth, &q_u->build))
475 if (!prs_uint32("major", ps, depth, &q_u->major))
477 if (!prs_uint32("minor", ps, depth, &q_u->minor))
479 if (!prs_uint32("processor", ps, depth, &q_u->processor))
482 if (!prs_io_unistr2("", ps, depth, q_u->client_name))
487 if (!prs_io_unistr2("", ps, depth, q_u->user_name))
493 /*******************************************************************
494 ********************************************************************/
496 static bool spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
501 prs_debug(ps, depth, desc, "spool_io_user_level");
507 if (!prs_uint32("level", ps, depth, &q_u->level))
510 switch ( q_u->level )
513 if ( !prs_pointer( "" , ps, depth, (void*)&q_u->user.user1,
514 sizeof(SPOOL_USER_1), (PRS_POINTER_CAST)spool_io_user_level_1 ))
526 /*******************************************************************
527 * read or write a DEVICEMODE struct.
528 * on reading allocate memory for the private member
529 ********************************************************************/
531 #define DM_NUM_OPTIONAL_FIELDS 8
533 bool spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
535 int available_space; /* size of the device mode left to parse */
536 /* only important on unmarshalling */
538 uint16 *unistr_buffer;
541 struct optional_fields {
544 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
545 { "icmmethod", NULL },
546 { "icmintent", NULL },
547 { "mediatype", NULL },
548 { "dithertype", NULL },
549 { "reserved1", NULL },
550 { "reserved2", NULL },
551 { "panningwidth", NULL },
552 { "panningheight", NULL }
555 /* assign at run time to keep non-gcc compilers happy */
557 opt_fields[0].field = &devmode->icmmethod;
558 opt_fields[1].field = &devmode->icmintent;
559 opt_fields[2].field = &devmode->mediatype;
560 opt_fields[3].field = &devmode->dithertype;
561 opt_fields[4].field = &devmode->reserved1;
562 opt_fields[5].field = &devmode->reserved2;
563 opt_fields[6].field = &devmode->panningwidth;
564 opt_fields[7].field = &devmode->panningheight;
567 prs_debug(ps, depth, desc, "spoolss_io_devmode");
570 if (UNMARSHALLING(ps)) {
571 devmode->devicename.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
572 if (devmode->devicename.buffer == NULL)
574 unistr_buffer = devmode->devicename.buffer;
577 /* devicename is a static sized string but the buffer we set is not */
578 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
579 memset( unistr_buffer, 0x0, MAXDEVICENAME );
580 for ( j=0; devmode->devicename.buffer[j]; j++ )
581 unistr_buffer[j] = devmode->devicename.buffer[j];
584 if (!prs_uint16uni(True,"devicename", ps, depth, unistr_buffer, MAXDEVICENAME))
587 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
590 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
592 if (!prs_uint16("size", ps, depth, &devmode->size))
594 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
596 if (!prs_uint32("fields", ps, depth, &devmode->fields))
598 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
600 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
602 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
604 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
606 if (!prs_uint16("scale", ps, depth, &devmode->scale))
608 if (!prs_uint16("copies", ps, depth, &devmode->copies))
610 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
612 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
614 if (!prs_uint16("color", ps, depth, &devmode->color))
616 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
618 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
620 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
622 if (!prs_uint16("collate", ps, depth, &devmode->collate))
625 if (UNMARSHALLING(ps)) {
626 devmode->formname.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
627 if (devmode->formname.buffer == NULL)
629 unistr_buffer = devmode->formname.buffer;
632 /* devicename is a static sized string but the buffer we set is not */
633 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
634 memset( unistr_buffer, 0x0, MAXDEVICENAME );
635 for ( j=0; devmode->formname.buffer[j]; j++ )
636 unistr_buffer[j] = devmode->formname.buffer[j];
639 if (!prs_uint16uni(True, "formname", ps, depth, unistr_buffer, MAXDEVICENAME))
641 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
643 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
645 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
647 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
649 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
651 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
654 * every device mode I've ever seen on the wire at least has up
655 * to the displayfrequency field. --jerry (05-09-2002)
658 /* add uint32's + uint16's + two UNICODE strings */
660 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
662 /* Sanity check - we only have uint32's left tp parse */
664 if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {
665 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
666 available_space, devmode->size));
667 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
672 * Conditional parsing. Assume that the DeviceMode has been
673 * zero'd by the caller.
676 while ((available_space > 0) && (i < DM_NUM_OPTIONAL_FIELDS))
678 DEBUG(11, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));
679 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
681 available_space -= sizeof(uint32);
685 /* Sanity Check - we should no available space at this point unless
686 MS changes the device mode structure */
688 if (available_space) {
689 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
690 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
691 available_space, devmode->size));
692 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
697 if (devmode->driverextra!=0) {
698 if (UNMARSHALLING(ps)) {
699 devmode->dev_private=PRS_ALLOC_MEM(ps, uint8, devmode->driverextra);
700 if(devmode->dev_private == NULL)
702 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for dev_private\n",devmode->driverextra));
705 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of dev_private\n",devmode->driverextra));
706 if (!prs_uint8s(False, "dev_private", ps, depth,
707 devmode->dev_private, devmode->driverextra))
714 /*******************************************************************
715 Read or write a DEVICEMODE container
716 ********************************************************************/
718 static bool spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
723 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
729 if (!prs_uint32("size", ps, depth, &dm_c->size))
732 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
735 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
736 if (UNMARSHALLING(ps))
737 /* if while reading there is no DEVMODE ... */
742 /* so we have a DEVICEMODE to follow */
743 if (UNMARSHALLING(ps)) {
744 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
745 dm_c->devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1);
746 if(dm_c->devmode == NULL)
750 /* this is bad code, shouldn't be there */
751 if (!prs_uint32("size", ps, depth, &dm_c->size))
754 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
760 /*******************************************************************
762 ********************************************************************/
764 bool make_spoolss_q_addprinterex( TALLOC_CTX *mem_ctx, SPOOL_Q_ADDPRINTEREX *q_u,
765 const char *srv_name, const char* clientname, const char* user_name,
766 uint32 level, PRINTER_INFO_CTR *ctr)
768 DEBUG(5,("make_spoolss_q_addprinterex\n"));
770 if (!ctr || !ctr->printers_2)
775 q_u->server_name = TALLOC_P( mem_ctx, UNISTR2 );
776 if (!q_u->server_name) {
779 init_unistr2(q_u->server_name, srv_name, UNI_FLAGS_NONE);
783 q_u->info.level = level;
784 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
787 /* init q_u->info.info2 from *info */
788 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) {
789 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
799 q_u->user_ctr.level = 1;
800 q_u->user_ctr.user.user1 = TALLOC_P( talloc_tos(), SPOOL_USER_1 );
801 if (!q_u->user_ctr.user.user1) {
804 q_u->user_ctr.user.user1->build = 1381;
805 q_u->user_ctr.user.user1->major = 2;
806 q_u->user_ctr.user.user1->minor = 0;
807 q_u->user_ctr.user.user1->processor = 0;
809 q_u->user_ctr.user.user1->client_name = TALLOC_P( mem_ctx, UNISTR2 );
810 if (!q_u->user_ctr.user.user1->client_name) {
813 q_u->user_ctr.user.user1->user_name = TALLOC_P( mem_ctx, UNISTR2 );
814 if (!q_u->user_ctr.user.user1->user_name) {
817 init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
818 init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
820 q_u->user_ctr.user.user1->size = q_u->user_ctr.user.user1->user_name->uni_str_len +
821 q_u->user_ctr.user.user1->client_name->uni_str_len + 2;
826 /*******************************************************************
827 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
828 *******************************************************************/
830 bool make_spoolss_printer_info_2(TALLOC_CTX *ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
831 PRINTER_INFO_2 *info)
834 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
836 /* allocate the necessary memory */
837 if (!(inf=TALLOC_P(ctx, SPOOL_PRINTER_INFO_LEVEL_2))) {
838 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
842 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
843 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
844 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
845 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
846 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
847 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
848 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
849 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
850 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
851 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
852 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
853 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
854 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
855 inf->attributes = info->attributes;
856 inf->priority = info->priority;
857 inf->default_priority = info->defaultpriority;
858 inf->starttime = info->starttime;
859 inf->untiltime = info->untiltime;
860 inf->cjobs = info->cjobs;
861 inf->averageppm = info->averageppm;
862 init_unistr2_from_unistr(inf, &inf->servername, &info->servername);
863 init_unistr2_from_unistr(inf, &inf->printername, &info->printername);
864 init_unistr2_from_unistr(inf, &inf->sharename, &info->sharename);
865 init_unistr2_from_unistr(inf, &inf->portname, &info->portname);
866 init_unistr2_from_unistr(inf, &inf->drivername, &info->drivername);
867 init_unistr2_from_unistr(inf, &inf->comment, &info->comment);
868 init_unistr2_from_unistr(inf, &inf->location, &info->location);
869 init_unistr2_from_unistr(inf, &inf->sepfile, &info->sepfile);
870 init_unistr2_from_unistr(inf, &inf->printprocessor, &info->printprocessor);
871 init_unistr2_from_unistr(inf, &inf->datatype, &info->datatype);
872 init_unistr2_from_unistr(inf, &inf->parameters, &info->parameters);
873 init_unistr2_from_unistr(inf, &inf->datatype, &info->datatype);
880 /*******************************************************************
881 create a SPOOL_PRINTER_INFO_3 struct from a PRINTER_INFO_3 struct
882 *******************************************************************/
884 bool make_spoolss_printer_info_3(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3 **spool_info3,
885 PRINTER_INFO_3 *info)
888 SPOOL_PRINTER_INFO_LEVEL_3 *inf;
890 /* allocate the necessary memory */
891 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3))) {
892 DEBUG(0,("make_spoolss_printer_info_3: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_3 sruct!\n"));
896 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
903 /*******************************************************************
904 create a SPOOL_PRINTER_INFO_7 struct from a PRINTER_INFO_7 struct
905 *******************************************************************/
907 bool make_spoolss_printer_info_7(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7 **spool_info7,
908 PRINTER_INFO_7 *info)
911 SPOOL_PRINTER_INFO_LEVEL_7 *inf;
913 /* allocate the necessary memory */
914 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7))) {
915 DEBUG(0,("make_spoolss_printer_info_7: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_7 struct!\n"));
919 inf->guid_ptr = (info->guid.buffer!=NULL)?1:0;
920 inf->action = info->action;
921 init_unistr2_from_unistr(inf, &inf->guid, &info->guid);
928 /*******************************************************************
930 ********************************************************************/
932 bool make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
933 const POLICY_HND *handle,
934 const char *valuename, uint32 size)
936 if (q_u == NULL) return False;
938 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
940 q_u->handle = *handle;
941 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
947 /*******************************************************************
949 * called from spoolss_q_getprinterdata (srv_spoolss.c)
950 ********************************************************************/
952 bool spoolss_io_q_getprinterdata(const char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
957 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
962 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
966 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
970 if (!prs_uint32("size", ps, depth, &q_u->size))
976 /*******************************************************************
978 * called from spoolss_r_getprinterdata (srv_spoolss.c)
979 ********************************************************************/
981 bool spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
986 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
991 if (!prs_uint32("type", ps, depth, &r_u->type))
993 if (!prs_uint32("size", ps, depth, &r_u->size))
996 if (UNMARSHALLING(ps) && r_u->size) {
997 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
1002 if (!prs_uint8s( False, "data", ps, depth, r_u->data, r_u->size ))
1008 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1010 if (!prs_werror("status", ps, depth, &r_u->status))
1016 /*******************************************************************
1018 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1019 ********************************************************************/
1021 bool spoolss_io_q_rffpcnex(const char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1023 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1029 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1031 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1033 if(!prs_uint32("options", ps, depth, &q_u->options))
1035 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1037 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1043 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1046 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1049 if (q_u->option_ptr!=0) {
1051 if (UNMARSHALLING(ps))
1052 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
1055 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1062 /*******************************************************************
1063 * write a structure.
1064 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1065 ********************************************************************/
1067 bool spoolss_io_r_rffpcnex(const char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1069 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1072 if(!prs_werror("status", ps, depth, &r_u->status))
1078 /*******************************************************************
1080 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1081 ********************************************************************/
1083 bool spoolss_io_q_rfnpcnex(const char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1085 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1091 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1094 if(!prs_uint32("change", ps, depth, &q_u->change))
1097 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1100 if (q_u->option_ptr!=0) {
1102 if (UNMARSHALLING(ps))
1103 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
1106 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1113 /*******************************************************************
1114 * write a structure.
1115 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1116 ********************************************************************/
1118 bool spoolss_io_r_rfnpcnex(const char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1120 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1126 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1129 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1134 if(!prs_werror("status", ps, depth, &r_u->status))
1140 /*******************************************************************
1141 * return the length of a uint16 (obvious, but the code is clean)
1142 ********************************************************************/
1144 static uint32 size_of_uint16(uint16 *value)
1146 return (sizeof(*value));
1149 /*******************************************************************
1150 * return the length of a uint32 (obvious, but the code is clean)
1151 ********************************************************************/
1153 static uint32 size_of_uint32(uint32 *value)
1155 return (sizeof(*value));
1158 /*******************************************************************
1159 * return the length of a NTTIME (obvious, but the code is clean)
1160 ********************************************************************/
1162 static uint32 size_of_nttime(NTTIME *value)
1164 return (sizeof(*value));
1167 /*******************************************************************
1168 * return the length of a uint32 (obvious, but the code is clean)
1169 ********************************************************************/
1171 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1176 return (4+devmode->size+devmode->driverextra);
1179 /*******************************************************************
1180 * return the length of a uint32 (obvious, but the code is clean)
1181 ********************************************************************/
1183 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1188 return (sizeof(SYSTEMTIME) +4);
1191 /*******************************************************************
1192 Parse a DEVMODE structure and its relative pointer.
1193 ********************************************************************/
1195 static bool smb_io_reldevmode(const char *desc, RPC_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1197 prs_struct *ps=&buffer->prs;
1199 prs_debug(ps, depth, desc, "smb_io_reldevmode");
1202 if (MARSHALLING(ps)) {
1203 uint32 struct_offset = prs_offset(ps);
1204 uint32 relative_offset;
1206 if (*devmode == NULL) {
1208 if (!prs_uint32("offset", ps, depth, &relative_offset))
1210 DEBUG(8, ("boing, the devmode was NULL\n"));
1215 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1217 /* mz: we have to align the device mode for VISTA */
1218 if (buffer->string_at_end % 4) {
1219 buffer->string_at_end += 4 - (buffer->string_at_end % 4);
1222 if(!prs_set_offset(ps, buffer->string_at_end))
1225 /* write the DEVMODE */
1226 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1229 if(!prs_set_offset(ps, struct_offset))
1232 relative_offset=buffer->string_at_end - buffer->struct_start;
1233 /* write its offset */
1234 if (!prs_uint32("offset", ps, depth, &relative_offset))
1240 /* read the offset */
1241 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1243 if (buffer->string_at_end == 0) {
1248 old_offset = prs_offset(ps);
1249 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1252 /* read the string */
1253 if((*devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1)) == NULL)
1255 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1258 if(!prs_set_offset(ps, old_offset))
1264 /*******************************************************************
1265 Parse a PRINTER_INFO_0 structure.
1266 ********************************************************************/
1268 bool smb_io_printer_info_0(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
1270 prs_struct *ps=&buffer->prs;
1272 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
1275 buffer->struct_start=prs_offset(ps);
1277 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1279 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
1282 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
1284 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
1286 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
1289 if(!prs_uint16("year", ps, depth, &info->year))
1291 if(!prs_uint16("month", ps, depth, &info->month))
1293 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
1295 if(!prs_uint16("day", ps, depth, &info->day))
1297 if(!prs_uint16("hour", ps, depth, &info->hour))
1299 if(!prs_uint16("minute", ps, depth, &info->minute))
1301 if(!prs_uint16("second", ps, depth, &info->second))
1303 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
1306 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
1308 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
1311 if(!prs_uint16("major_version", ps, depth, &info->major_version))
1313 if(!prs_uint16("build_version", ps, depth, &info->build_version))
1315 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
1317 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
1319 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
1321 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
1323 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
1325 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
1327 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
1329 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
1331 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
1333 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
1335 if(!prs_uint32("change_id", ps, depth, &info->change_id))
1337 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
1339 if(!prs_uint32("status" , ps, depth, &info->status))
1341 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
1343 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
1345 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
1347 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
1349 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
1351 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
1353 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
1355 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
1357 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
1359 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
1365 /*******************************************************************
1366 Parse a PRINTER_INFO_1 structure.
1367 ********************************************************************/
1369 bool smb_io_printer_info_1(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
1371 prs_struct *ps=&buffer->prs;
1373 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
1376 buffer->struct_start=prs_offset(ps);
1378 if (!prs_uint32("flags", ps, depth, &info->flags))
1380 if (!smb_io_relstr("description", buffer, depth, &info->description))
1382 if (!smb_io_relstr("name", buffer, depth, &info->name))
1384 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
1390 /*******************************************************************
1391 Parse a PRINTER_INFO_2 structure.
1392 ********************************************************************/
1394 bool smb_io_printer_info_2(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
1396 prs_struct *ps=&buffer->prs;
1397 uint32 dm_offset, sd_offset, current_offset;
1398 uint32 dummy_value = 0, has_secdesc = 0;
1400 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
1403 buffer->struct_start=prs_offset(ps);
1405 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
1407 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1409 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
1411 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
1413 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
1415 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
1417 if (!smb_io_relstr("location", buffer, depth, &info->location))
1420 /* save current offset and wind forwared by a uint32 */
1421 dm_offset = prs_offset(ps);
1422 if (!prs_uint32("devmode", ps, depth, &dummy_value))
1425 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
1427 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1429 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
1431 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
1434 /* save current offset for the sec_desc */
1435 sd_offset = prs_offset(ps);
1436 if (!prs_uint32("sec_desc", ps, depth, &has_secdesc))
1440 /* save current location so we can pick back up here */
1441 current_offset = prs_offset(ps);
1443 /* parse the devmode */
1444 if (!prs_set_offset(ps, dm_offset))
1446 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1449 /* parse the sec_desc */
1450 if (info->secdesc) {
1451 if (!prs_set_offset(ps, sd_offset))
1453 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
1457 /* pick up where we left off */
1458 if (!prs_set_offset(ps, current_offset))
1461 if (!prs_uint32("attributes", ps, depth, &info->attributes))
1463 if (!prs_uint32("priority", ps, depth, &info->priority))
1465 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
1467 if (!prs_uint32("starttime", ps, depth, &info->starttime))
1469 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
1471 if (!prs_uint32("status", ps, depth, &info->status))
1473 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
1475 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
1481 /*******************************************************************
1482 Parse a PRINTER_INFO_3 structure.
1483 ********************************************************************/
1485 bool smb_io_printer_info_3(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
1488 prs_struct *ps=&buffer->prs;
1490 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
1493 buffer->struct_start=prs_offset(ps);
1495 if (MARSHALLING(ps)) {
1496 /* Ensure the SD is 8 byte aligned in the buffer. */
1497 uint32 start = prs_offset(ps); /* Remember the start position. */
1500 /* Write a dummy value. */
1501 if (!prs_uint32("offset", ps, depth, &off_val))
1505 if (!prs_align_uint64(ps))
1508 /* Remember where we must seek back to write the SD. */
1509 offset = prs_offset(ps);
1511 /* Calculate the real offset for the SD. */
1513 off_val = offset - start;
1515 /* Seek back to where we store the SD offset & store. */
1516 prs_set_offset(ps, start);
1517 if (!prs_uint32("offset", ps, depth, &off_val))
1520 /* Return to after the 8 byte align. */
1521 prs_set_offset(ps, offset);
1524 if (!prs_uint32("offset", ps, depth, &offset))
1526 /* Seek within the buffer. */
1527 if (!prs_set_offset(ps, offset))
1530 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
1536 /*******************************************************************
1537 Parse a PRINTER_INFO_4 structure.
1538 ********************************************************************/
1540 bool smb_io_printer_info_4(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
1542 prs_struct *ps=&buffer->prs;
1544 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
1547 buffer->struct_start=prs_offset(ps);
1549 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1551 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
1553 if (!prs_uint32("attributes", ps, depth, &info->attributes))
1558 /*******************************************************************
1559 Parse a PRINTER_INFO_5 structure.
1560 ********************************************************************/
1562 bool smb_io_printer_info_5(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
1564 prs_struct *ps=&buffer->prs;
1566 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
1569 buffer->struct_start=prs_offset(ps);
1571 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1573 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
1575 if (!prs_uint32("attributes", ps, depth, &info->attributes))
1577 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
1579 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
1584 /*******************************************************************
1585 Parse a PRINTER_INFO_6 structure.
1586 ********************************************************************/
1588 bool smb_io_printer_info_6(const char *desc, RPC_BUFFER *buffer,
1589 PRINTER_INFO_6 *info, int depth)
1591 prs_struct *ps=&buffer->prs;
1593 prs_debug(ps, depth, desc, "smb_io_printer_info_6");
1596 if (!prs_uint32("status", ps, depth, &info->status))
1602 /*******************************************************************
1603 Parse a PRINTER_INFO_7 structure.
1604 ********************************************************************/
1606 bool smb_io_printer_info_7(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_7 *info, int depth)
1608 prs_struct *ps=&buffer->prs;
1610 prs_debug(ps, depth, desc, "smb_io_printer_info_7");
1613 buffer->struct_start=prs_offset(ps);
1615 if (!smb_io_relstr("guid", buffer, depth, &info->guid))
1617 if (!prs_uint32("action", ps, depth, &info->action))
1622 /*******************************************************************
1623 Parse a PORT_INFO_1 structure.
1624 ********************************************************************/
1626 bool smb_io_port_info_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
1628 prs_struct *ps=&buffer->prs;
1630 prs_debug(ps, depth, desc, "smb_io_port_info_1");
1633 buffer->struct_start=prs_offset(ps);
1635 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
1641 /*******************************************************************
1642 Parse a PORT_INFO_2 structure.
1643 ********************************************************************/
1645 bool smb_io_port_info_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
1647 prs_struct *ps=&buffer->prs;
1649 prs_debug(ps, depth, desc, "smb_io_port_info_2");
1652 buffer->struct_start=prs_offset(ps);
1654 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
1656 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
1658 if (!smb_io_relstr("description", buffer, depth, &info->description))
1660 if (!prs_uint32("port_type", ps, depth, &info->port_type))
1662 if (!prs_uint32("reserved", ps, depth, &info->reserved))
1668 /*******************************************************************
1669 Parse a DRIVER_INFO_1 structure.
1670 ********************************************************************/
1672 bool smb_io_printer_driver_info_1(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
1674 prs_struct *ps=&buffer->prs;
1676 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
1679 buffer->struct_start=prs_offset(ps);
1681 if (!smb_io_relstr("name", buffer, depth, &info->name))
1687 /*******************************************************************
1688 Parse a DRIVER_INFO_2 structure.
1689 ********************************************************************/
1691 bool smb_io_printer_driver_info_2(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
1693 prs_struct *ps=&buffer->prs;
1695 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
1698 buffer->struct_start=prs_offset(ps);
1700 if (!prs_uint32("version", ps, depth, &info->version))
1702 if (!smb_io_relstr("name", buffer, depth, &info->name))
1704 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
1706 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
1708 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
1710 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
1716 /*******************************************************************
1717 Parse a DRIVER_INFO_3 structure.
1718 ********************************************************************/
1720 bool smb_io_printer_driver_info_3(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
1722 prs_struct *ps=&buffer->prs;
1724 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
1727 buffer->struct_start=prs_offset(ps);
1729 if (!prs_uint32("version", ps, depth, &info->version))
1731 if (!smb_io_relstr("name", buffer, depth, &info->name))
1733 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
1735 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
1737 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
1739 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
1741 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
1744 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
1747 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
1749 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
1755 /*******************************************************************
1756 Parse a DRIVER_INFO_6 structure.
1757 ********************************************************************/
1759 bool smb_io_printer_driver_info_6(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
1761 prs_struct *ps=&buffer->prs;
1763 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
1766 buffer->struct_start=prs_offset(ps);
1768 if (!prs_uint32("version", ps, depth, &info->version))
1770 if (!smb_io_relstr("name", buffer, depth, &info->name))
1772 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
1774 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
1776 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
1778 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
1780 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
1783 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
1786 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
1788 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
1791 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
1794 if (!prs_uint64("date", ps, depth, &info->driver_date))
1797 if (!prs_uint32("padding", ps, depth, &info->padding))
1800 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
1803 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
1806 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
1808 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
1810 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
1812 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
1818 /*******************************************************************
1819 Parse a JOB_INFO_1 structure.
1820 ********************************************************************/
1822 bool smb_io_job_info_1(const char *desc, RPC_BUFFER *buffer, JOB_INFO_1 *info, int depth)
1824 prs_struct *ps=&buffer->prs;
1826 prs_debug(ps, depth, desc, "smb_io_job_info_1");
1829 buffer->struct_start=prs_offset(ps);
1831 if (!prs_uint32("jobid", ps, depth, &info->jobid))
1833 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1835 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
1837 if (!smb_io_relstr("username", buffer, depth, &info->username))
1839 if (!smb_io_relstr("document", buffer, depth, &info->document))
1841 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
1843 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
1845 if (!prs_uint32("status", ps, depth, &info->status))
1847 if (!prs_uint32("priority", ps, depth, &info->priority))
1849 if (!prs_uint32("position", ps, depth, &info->position))
1851 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
1853 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
1855 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
1861 /*******************************************************************
1862 Parse a JOB_INFO_2 structure.
1863 ********************************************************************/
1865 bool smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, int depth)
1868 prs_struct *ps=&buffer->prs;
1870 prs_debug(ps, depth, desc, "smb_io_job_info_2");
1873 buffer->struct_start=prs_offset(ps);
1875 if (!prs_uint32("jobid",ps, depth, &info->jobid))
1877 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1879 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
1881 if (!smb_io_relstr("username", buffer, depth, &info->username))
1883 if (!smb_io_relstr("document", buffer, depth, &info->document))
1885 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
1887 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
1890 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1892 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
1894 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
1896 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1898 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
1901 /* SEC_DESC sec_desc;*/
1902 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
1905 if (!prs_uint32("status",ps, depth, &info->status))
1907 if (!prs_uint32("priority",ps, depth, &info->priority))
1909 if (!prs_uint32("position",ps, depth, &info->position))
1911 if (!prs_uint32("starttime",ps, depth, &info->starttime))
1913 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
1915 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
1917 if (!prs_uint32("size",ps, depth, &info->size))
1919 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
1921 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
1923 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
1929 /*******************************************************************
1930 ********************************************************************/
1932 bool smb_io_form_1(const char *desc, RPC_BUFFER *buffer, FORM_1 *info, int depth)
1934 prs_struct *ps=&buffer->prs;
1936 prs_debug(ps, depth, desc, "smb_io_form_1");
1939 buffer->struct_start=prs_offset(ps);
1941 if (!prs_uint32("flag", ps, depth, &info->flag))
1944 if (!smb_io_relstr("name", buffer, depth, &info->name))
1947 if (!prs_uint32("width", ps, depth, &info->width))
1949 if (!prs_uint32("length", ps, depth, &info->length))
1951 if (!prs_uint32("left", ps, depth, &info->left))
1953 if (!prs_uint32("top", ps, depth, &info->top))
1955 if (!prs_uint32("right", ps, depth, &info->right))
1957 if (!prs_uint32("bottom", ps, depth, &info->bottom))
1963 /*******************************************************************
1964 Parse a PORT_INFO_1 structure.
1965 ********************************************************************/
1967 bool smb_io_port_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
1969 prs_struct *ps=&buffer->prs;
1971 prs_debug(ps, depth, desc, "smb_io_port_1");
1974 buffer->struct_start=prs_offset(ps);
1976 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
1982 /*******************************************************************
1983 Parse a PORT_INFO_2 structure.
1984 ********************************************************************/
1986 bool smb_io_port_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
1988 prs_struct *ps=&buffer->prs;
1990 prs_debug(ps, depth, desc, "smb_io_port_2");
1993 buffer->struct_start=prs_offset(ps);
1995 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
1997 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
1999 if(!smb_io_relstr("description", buffer, depth, &info->description))
2001 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2003 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2009 /*******************************************************************
2010 ********************************************************************/
2012 bool smb_io_printprocessor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2014 prs_struct *ps=&buffer->prs;
2016 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2019 buffer->struct_start=prs_offset(ps);
2021 if (smb_io_relstr("name", buffer, depth, &info->name))
2027 /*******************************************************************
2028 ********************************************************************/
2030 bool smb_io_printprocdatatype_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2032 prs_struct *ps=&buffer->prs;
2034 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2037 buffer->struct_start=prs_offset(ps);
2039 if (smb_io_relstr("name", buffer, depth, &info->name))
2045 /*******************************************************************
2046 ********************************************************************/
2048 bool smb_io_printmonitor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2050 prs_struct *ps=&buffer->prs;
2052 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2055 buffer->struct_start=prs_offset(ps);
2057 if (!smb_io_relstr("name", buffer, depth, &info->name))
2063 /*******************************************************************
2064 ********************************************************************/
2066 bool smb_io_printmonitor_info_2(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2068 prs_struct *ps=&buffer->prs;
2070 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2073 buffer->struct_start=prs_offset(ps);
2075 if (!smb_io_relstr("name", buffer, depth, &info->name))
2077 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
2079 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2085 /*******************************************************************
2086 return the size required by a struct in the stream
2087 ********************************************************************/
2089 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2093 size+=size_of_relative_string( &info->printername );
2094 size+=size_of_relative_string( &info->servername );
2096 size+=size_of_uint32( &info->cjobs);
2097 size+=size_of_uint32( &info->total_jobs);
2098 size+=size_of_uint32( &info->total_bytes);
2100 size+=size_of_uint16( &info->year);
2101 size+=size_of_uint16( &info->month);
2102 size+=size_of_uint16( &info->dayofweek);
2103 size+=size_of_uint16( &info->day);
2104 size+=size_of_uint16( &info->hour);
2105 size+=size_of_uint16( &info->minute);
2106 size+=size_of_uint16( &info->second);
2107 size+=size_of_uint16( &info->milliseconds);
2109 size+=size_of_uint32( &info->global_counter);
2110 size+=size_of_uint32( &info->total_pages);
2112 size+=size_of_uint16( &info->major_version);
2113 size+=size_of_uint16( &info->build_version);
2115 size+=size_of_uint32( &info->unknown7);
2116 size+=size_of_uint32( &info->unknown8);
2117 size+=size_of_uint32( &info->unknown9);
2118 size+=size_of_uint32( &info->session_counter);
2119 size+=size_of_uint32( &info->unknown11);
2120 size+=size_of_uint32( &info->printer_errors);
2121 size+=size_of_uint32( &info->unknown13);
2122 size+=size_of_uint32( &info->unknown14);
2123 size+=size_of_uint32( &info->unknown15);
2124 size+=size_of_uint32( &info->unknown16);
2125 size+=size_of_uint32( &info->change_id);
2126 size+=size_of_uint32( &info->unknown18);
2127 size+=size_of_uint32( &info->status);
2128 size+=size_of_uint32( &info->unknown20);
2129 size+=size_of_uint32( &info->c_setprinter);
2131 size+=size_of_uint16( &info->unknown22);
2132 size+=size_of_uint16( &info->unknown23);
2133 size+=size_of_uint16( &info->unknown24);
2134 size+=size_of_uint16( &info->unknown25);
2135 size+=size_of_uint16( &info->unknown26);
2136 size+=size_of_uint16( &info->unknown27);
2137 size+=size_of_uint16( &info->unknown28);
2138 size+=size_of_uint16( &info->unknown29);
2143 /*******************************************************************
2144 return the size required by a struct in the stream
2145 ********************************************************************/
2147 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2151 size+=size_of_uint32( &info->flags );
2152 size+=size_of_relative_string( &info->description );
2153 size+=size_of_relative_string( &info->name );
2154 size+=size_of_relative_string( &info->comment );
2159 /*******************************************************************
2160 return the size required by a struct in the stream
2161 ********************************************************************/
2163 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2169 size += ndr_size_security_descriptor( info->secdesc, NULL, 0 );
2171 size+=size_of_device_mode( info->devmode );
2173 size+=size_of_relative_string( &info->servername );
2174 size+=size_of_relative_string( &info->printername );
2175 size+=size_of_relative_string( &info->sharename );
2176 size+=size_of_relative_string( &info->portname );
2177 size+=size_of_relative_string( &info->drivername );
2178 size+=size_of_relative_string( &info->comment );
2179 size+=size_of_relative_string( &info->location );
2181 size+=size_of_relative_string( &info->sepfile );
2182 size+=size_of_relative_string( &info->printprocessor );
2183 size+=size_of_relative_string( &info->datatype );
2184 size+=size_of_relative_string( &info->parameters );
2186 size+=size_of_uint32( &info->attributes );
2187 size+=size_of_uint32( &info->priority );
2188 size+=size_of_uint32( &info->defaultpriority );
2189 size+=size_of_uint32( &info->starttime );
2190 size+=size_of_uint32( &info->untiltime );
2191 size+=size_of_uint32( &info->status );
2192 size+=size_of_uint32( &info->cjobs );
2193 size+=size_of_uint32( &info->averageppm );
2196 * add any adjustments for alignment. This is
2197 * not optimal since we could be calling this
2198 * function from a loop (e.g. enumprinters), but
2199 * it is easier to maintain the calculation here and
2200 * not place the burden on the caller to remember. --jerry
2202 if ((size % 4) != 0)
2203 size += 4 - (size % 4);
2208 /*******************************************************************
2209 return the size required by a struct in the stream
2210 ********************************************************************/
2212 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
2216 size+=size_of_relative_string( &info->printername );
2217 size+=size_of_relative_string( &info->servername );
2219 size+=size_of_uint32( &info->attributes );
2223 /*******************************************************************
2224 return the size required by a struct in the stream
2225 ********************************************************************/
2227 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
2231 size+=size_of_relative_string( &info->printername );
2232 size+=size_of_relative_string( &info->portname );
2234 size+=size_of_uint32( &info->attributes );
2235 size+=size_of_uint32( &info->device_not_selected_timeout );
2236 size+=size_of_uint32( &info->transmission_retry_timeout );
2240 /*******************************************************************
2241 return the size required by a struct in the stream
2242 ********************************************************************/
2244 uint32 spoolss_size_printer_info_6(PRINTER_INFO_6 *info)
2246 return sizeof(uint32);
2249 /*******************************************************************
2250 return the size required by a struct in the stream
2251 ********************************************************************/
2253 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
2255 /* The 8 is for the self relative pointer - 8 byte aligned.. */
2256 return 8 + (uint32)ndr_size_security_descriptor( info->secdesc, NULL, 0 );
2259 /*******************************************************************
2260 return the size required by a struct in the stream
2261 ********************************************************************/
2263 uint32 spoolss_size_printer_info_7(PRINTER_INFO_7 *info)
2267 size+=size_of_relative_string( &info->guid );
2268 size+=size_of_uint32( &info->action );
2272 /*******************************************************************
2273 return the size required by a struct in the stream
2274 ********************************************************************/
2276 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2279 size+=size_of_relative_string( &info->name );
2284 /*******************************************************************
2285 return the size required by a struct in the stream
2286 ********************************************************************/
2288 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2291 size+=size_of_uint32( &info->version );
2292 size+=size_of_relative_string( &info->name );
2293 size+=size_of_relative_string( &info->architecture );
2294 size+=size_of_relative_string( &info->driverpath );
2295 size+=size_of_relative_string( &info->datafile );
2296 size+=size_of_relative_string( &info->configfile );
2301 /*******************************************************************
2302 return the size required by a string array.
2303 ********************************************************************/
2305 uint32 spoolss_size_string_array(uint16 *string)
2310 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
2312 i=i+2; /* to count all chars including the leading zero */
2313 i=2*i; /* because we need the value in bytes */
2314 i=i+4; /* the offset pointer size */
2319 /*******************************************************************
2320 return the size required by a struct in the stream
2321 ********************************************************************/
2323 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
2327 size+=size_of_uint32( &info->version );
2328 size+=size_of_relative_string( &info->name );
2329 size+=size_of_relative_string( &info->architecture );
2330 size+=size_of_relative_string( &info->driverpath );
2331 size+=size_of_relative_string( &info->datafile );
2332 size+=size_of_relative_string( &info->configfile );
2333 size+=size_of_relative_string( &info->helpfile );
2334 size+=size_of_relative_string( &info->monitorname );
2335 size+=size_of_relative_string( &info->defaultdatatype );
2337 size+=spoolss_size_string_array(info->dependentfiles);
2342 /*******************************************************************
2343 return the size required by a struct in the stream
2344 ********************************************************************/
2346 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
2350 size+=size_of_uint32( &info->version );
2351 size+=size_of_relative_string( &info->name );
2352 size+=size_of_relative_string( &info->architecture );
2353 size+=size_of_relative_string( &info->driverpath );
2354 size+=size_of_relative_string( &info->datafile );
2355 size+=size_of_relative_string( &info->configfile );
2356 size+=size_of_relative_string( &info->helpfile );
2358 size+=spoolss_size_string_array(info->dependentfiles);
2360 size+=size_of_relative_string( &info->monitorname );
2361 size+=size_of_relative_string( &info->defaultdatatype );
2363 size+=spoolss_size_string_array(info->previousdrivernames);
2365 size+=size_of_nttime(&info->driver_date);
2366 size+=size_of_uint32( &info->padding );
2367 size+=size_of_uint32( &info->driver_version_low );
2368 size+=size_of_uint32( &info->driver_version_high );
2369 size+=size_of_relative_string( &info->mfgname );
2370 size+=size_of_relative_string( &info->oem_url );
2371 size+=size_of_relative_string( &info->hardware_id );
2372 size+=size_of_relative_string( &info->provider );
2377 /*******************************************************************
2378 return the size required by a struct in the stream
2379 ********************************************************************/
2381 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
2384 size+=size_of_uint32( &info->jobid );
2385 size+=size_of_relative_string( &info->printername );
2386 size+=size_of_relative_string( &info->machinename );
2387 size+=size_of_relative_string( &info->username );
2388 size+=size_of_relative_string( &info->document );
2389 size+=size_of_relative_string( &info->datatype );
2390 size+=size_of_relative_string( &info->text_status );
2391 size+=size_of_uint32( &info->status );
2392 size+=size_of_uint32( &info->priority );
2393 size+=size_of_uint32( &info->position );
2394 size+=size_of_uint32( &info->totalpages );
2395 size+=size_of_uint32( &info->pagesprinted );
2396 size+=size_of_systemtime( &info->submitted );
2401 /*******************************************************************
2402 return the size required by a struct in the stream
2403 ********************************************************************/
2405 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
2409 size+=4; /* size of sec desc ptr */
2411 size+=size_of_uint32( &info->jobid );
2412 size+=size_of_relative_string( &info->printername );
2413 size+=size_of_relative_string( &info->machinename );
2414 size+=size_of_relative_string( &info->username );
2415 size+=size_of_relative_string( &info->document );
2416 size+=size_of_relative_string( &info->notifyname );
2417 size+=size_of_relative_string( &info->datatype );
2418 size+=size_of_relative_string( &info->printprocessor );
2419 size+=size_of_relative_string( &info->parameters );
2420 size+=size_of_relative_string( &info->drivername );
2421 size+=size_of_device_mode( info->devmode );
2422 size+=size_of_relative_string( &info->text_status );
2423 /* SEC_DESC sec_desc;*/
2424 size+=size_of_uint32( &info->status );
2425 size+=size_of_uint32( &info->priority );
2426 size+=size_of_uint32( &info->position );
2427 size+=size_of_uint32( &info->starttime );
2428 size+=size_of_uint32( &info->untiltime );
2429 size+=size_of_uint32( &info->totalpages );
2430 size+=size_of_uint32( &info->size );
2431 size+=size_of_systemtime( &info->submitted );
2432 size+=size_of_uint32( &info->timeelapsed );
2433 size+=size_of_uint32( &info->pagesprinted );
2438 /*******************************************************************
2439 return the size required by a struct in the stream
2440 ********************************************************************/
2442 uint32 spoolss_size_form_1(FORM_1 *info)
2446 size+=size_of_uint32( &info->flag );
2447 size+=size_of_relative_string( &info->name );
2448 size+=size_of_uint32( &info->width );
2449 size+=size_of_uint32( &info->length );
2450 size+=size_of_uint32( &info->left );
2451 size+=size_of_uint32( &info->top );
2452 size+=size_of_uint32( &info->right );
2453 size+=size_of_uint32( &info->bottom );
2458 /*******************************************************************
2459 return the size required by a struct in the stream
2460 ********************************************************************/
2462 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
2466 size+=size_of_relative_string( &info->port_name );
2471 /*******************************************************************
2472 return the size required by a struct in the stream
2473 ********************************************************************/
2475 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
2479 size+=size_of_relative_string( &info->port_name );
2480 size+=size_of_relative_string( &info->monitor_name );
2481 size+=size_of_relative_string( &info->description );
2483 size+=size_of_uint32( &info->port_type );
2484 size+=size_of_uint32( &info->reserved );
2489 /*******************************************************************
2490 return the size required by a struct in the stream
2491 ********************************************************************/
2493 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
2496 size+=size_of_relative_string( &info->name );
2501 /*******************************************************************
2502 return the size required by a struct in the stream
2503 ********************************************************************/
2505 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
2508 size+=size_of_relative_string( &info->name );
2513 /*******************************************************************
2514 return the size required by a struct in the stream
2515 ********************************************************************/
2516 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
2523 /* uint32(offset) + uint32(length) + length) */
2524 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
2525 size += (size_of_uint32(&p->data_len)*2) + p->data_len + (p->data_len%2) ;
2527 size += size_of_uint32(&p->type);
2532 /*******************************************************************
2533 return the size required by a struct in the stream
2534 ********************************************************************/
2536 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
2539 size+=size_of_relative_string( &info->name );
2544 /*******************************************************************
2545 return the size required by a struct in the stream
2546 ********************************************************************/
2548 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
2551 size+=size_of_relative_string( &info->name);
2552 size+=size_of_relative_string( &info->environment);
2553 size+=size_of_relative_string( &info->dll_name);
2558 /*******************************************************************
2560 ********************************************************************/
2562 bool make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
2563 const POLICY_HND *hnd,
2564 const fstring architecture,
2565 uint32 level, uint32 clientmajor, uint32 clientminor,
2566 RPC_BUFFER *buffer, uint32 offered)
2571 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2573 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
2576 q_u->clientmajorversion=clientmajor;
2577 q_u->clientminorversion=clientminor;
2580 q_u->offered=offered;
2585 /*******************************************************************
2587 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
2588 ********************************************************************/
2590 bool spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
2592 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
2598 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2600 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
2602 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
2607 if(!prs_uint32("level", ps, depth, &q_u->level))
2610 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2616 if(!prs_uint32("offered", ps, depth, &q_u->offered))
2619 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
2621 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
2627 /*******************************************************************
2629 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
2630 ********************************************************************/
2632 bool spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
2634 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
2640 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2645 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2647 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
2649 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
2651 if (!prs_werror("status", ps, depth, &r_u->status))
2657 /*******************************************************************
2659 ********************************************************************/
2661 bool make_spoolss_q_enumprinters(
2662 SPOOL_Q_ENUMPRINTERS *q_u,
2672 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
2673 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
2677 q_u->offered=offered;
2682 /*******************************************************************
2684 ********************************************************************/
2686 bool make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
2687 fstring servername, uint32 level,
2688 RPC_BUFFER *buffer, uint32 offered)
2690 q_u->name_ptr = (servername != NULL) ? 1 : 0;
2691 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
2695 q_u->offered=offered;
2700 /*******************************************************************
2702 * called from spoolss_enumprinters (srv_spoolss.c)
2703 ********************************************************************/
2705 bool spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
2707 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
2713 if (!prs_uint32("flags", ps, depth, &q_u->flags))
2715 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
2718 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
2723 if (!prs_uint32("level", ps, depth, &q_u->level))
2726 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2731 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2737 /*******************************************************************
2738 Parse a SPOOL_R_ENUMPRINTERS structure.
2739 ********************************************************************/
2741 bool spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
2743 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
2749 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2755 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2758 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2761 if (!prs_werror("status", ps, depth, &r_u->status))
2767 /*******************************************************************
2768 * write a structure.
2769 * called from spoolss_r_enum_printers (srv_spoolss.c)
2771 ********************************************************************/
2773 bool spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
2775 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
2781 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
2787 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2790 if (!prs_werror("status", ps, depth, &r_u->status))
2796 /*******************************************************************
2798 * called from spoolss_getprinter (srv_spoolss.c)
2799 ********************************************************************/
2801 bool spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
2803 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
2809 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2811 if (!prs_uint32("level", ps, depth, &q_u->level))
2814 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
2819 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2825 /*******************************************************************
2827 ********************************************************************/
2829 bool make_spoolss_q_getprinter(
2830 TALLOC_CTX *mem_ctx,
2831 SPOOL_Q_GETPRINTER *q_u,
2832 const POLICY_HND *hnd,
2842 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2846 q_u->offered=offered;
2851 /*******************************************************************
2853 ********************************************************************/
2854 bool make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
2855 const POLICY_HND *hnd, uint32 level, PRINTER_INFO_CTR *info,
2859 DEVICEMODE *devmode;
2864 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2867 q_u->info.level = level;
2868 q_u->info.info_ptr = 1; /* Info is != NULL, see above */
2871 /* There's no such thing as a setprinter level 1 */
2874 secdesc = info->printers_2->secdesc;
2875 devmode = info->printers_2->devmode;
2877 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
2878 #if 1 /* JERRY TEST */
2879 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
2880 if (!q_u->secdesc_ctr)
2882 q_u->secdesc_ctr->sd = secdesc;
2883 q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
2885 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
2886 q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
2887 q_u->devmode_ctr.devmode = devmode;
2889 q_u->secdesc_ctr = NULL;
2891 q_u->devmode_ctr.devmode_ptr = 0;
2892 q_u->devmode_ctr.size = 0;
2893 q_u->devmode_ctr.devmode = NULL;
2897 secdesc = info->printers_3->secdesc;
2899 make_spoolss_printer_info_3 (mem_ctx, &q_u->info.info_3, info->printers_3);
2901 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
2902 if (!q_u->secdesc_ctr)
2904 q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
2905 q_u->secdesc_ctr->sd = secdesc;
2909 make_spoolss_printer_info_7 (mem_ctx, &q_u->info.info_7, info->printers_7);
2913 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
2918 q_u->command = command;
2924 /*******************************************************************
2925 ********************************************************************/
2927 bool spoolss_io_r_setprinter(const char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
2929 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
2935 if(!prs_werror("status", ps, depth, &r_u->status))
2941 /*******************************************************************
2942 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
2943 ********************************************************************/
2945 bool spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
2947 uint32 ptr_sec_desc = 0;
2949 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
2955 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
2957 if(!prs_uint32("level", ps, depth, &q_u->level))
2960 /* check for supported levels and structures we know about */
2962 switch ( q_u->level ) {
2967 /* supported levels */
2970 DEBUG(0,("spoolss_io_q_setprinter: unsupported printer info level [%d]\n",
2976 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
2979 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
2989 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
2994 /* FIXME ! Our parsing here is wrong I think,
2995 * but for a level3 it makes no sense for
2996 * ptr_sec_desc to be NULL. JRA. Based on
2997 * a Vista sniff from Martin Zielinski <mz@seh.de>.
2999 if (UNMARSHALLING(ps)) {
3002 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3009 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3014 /* Parse a NULL security descriptor. This should really
3015 happen inside the sec_io_desc_buf() function. */
3017 prs_debug(ps, depth, "", "sec_io_desc_buf");
3018 if (!prs_uint32("size", ps, depth + 1, &dummy))
3020 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
3024 if(!prs_uint32("command", ps, depth, &q_u->command))
3030 /*******************************************************************
3031 ********************************************************************/
3033 bool spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3035 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3041 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3047 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3050 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3053 if (!prs_werror("status", ps, depth, &r_u->status))
3059 /*******************************************************************
3060 ********************************************************************/
3062 bool make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
3073 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3074 q_u->firstjob = firstjob;
3075 q_u->numofjobs = numofjobs;
3077 q_u->buffer= buffer;
3078 q_u->offered = offered;
3082 /*******************************************************************
3083 ********************************************************************/
3085 bool spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
3087 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
3093 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
3096 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
3098 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
3100 if (!prs_uint32("level", ps, depth, &q_u->level))
3103 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3109 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3115 /*******************************************************************
3116 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
3117 ********************************************************************/
3119 bool spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
3121 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
3127 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3133 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3136 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3139 if (!prs_werror("status", ps, depth, &r_u->status))
3145 /*******************************************************************
3147 ********************************************************************/
3149 bool make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
3151 const char *environment,
3153 RPC_BUFFER *buffer, uint32 offered)
3155 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
3156 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
3160 q_u->offered=offered;
3165 /*******************************************************************
3166 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
3167 ********************************************************************/
3169 bool spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
3172 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
3178 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3180 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
3185 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
3187 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3192 if (!prs_uint32("level", ps, depth, &q_u->level))
3195 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3201 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3207 /*******************************************************************
3208 ********************************************************************/
3210 bool spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
3213 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
3218 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3220 if (!prs_uint32("level", ps, depth, &q_u->level))
3223 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3228 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3234 /*******************************************************************
3235 ********************************************************************/
3237 bool spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
3239 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
3245 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3251 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
3254 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
3257 if (!prs_werror("status", ps, depth, &r_u->status))
3263 /*******************************************************************
3264 Parse a SPOOL_R_ENUMPORTS structure.
3265 ********************************************************************/
3267 bool spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
3269 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
3275 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3281 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3284 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3287 if (!prs_werror("status", ps, depth, &r_u->status))
3293 /*******************************************************************
3294 ********************************************************************/
3296 bool spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
3298 prs_debug(ps, depth, desc, "");
3304 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
3306 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
3311 if (!prs_uint32("level", ps, depth, &q_u->level))
3314 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3319 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3325 /*******************************************************************
3326 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
3327 ********************************************************************/
3329 bool spool_io_printer_info_level_1(const char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
3331 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
3337 if(!prs_uint32("flags", ps, depth, &il->flags))
3339 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
3341 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
3343 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3346 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
3348 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3350 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3356 /*******************************************************************
3357 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
3358 ********************************************************************/
3360 bool spool_io_printer_info_level_3(const char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
3362 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
3368 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
3374 /*******************************************************************
3375 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
3376 ********************************************************************/
3378 bool spool_io_printer_info_level_2(const char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
3380 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
3386 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
3388 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
3390 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
3392 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
3395 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
3397 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3399 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
3401 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
3403 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
3405 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
3407 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
3409 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
3411 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
3414 if(!prs_uint32("attributes", ps, depth, &il->attributes))
3416 if(!prs_uint32("priority", ps, depth, &il->priority))
3418 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
3420 if(!prs_uint32("starttime", ps, depth, &il->starttime))
3422 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
3424 if(!prs_uint32("status", ps, depth, &il->status))
3426 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
3428 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
3431 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
3433 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
3435 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
3437 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
3439 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
3441 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3443 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
3445 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
3447 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
3449 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
3451 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
3457 bool spool_io_printer_info_level_7(const char *desc, SPOOL_PRINTER_INFO_LEVEL_7 *il, prs_struct *ps, int depth)
3459 prs_debug(ps, depth, desc, "spool_io_printer_info_level_7");
3465 if(!prs_uint32("guid_ptr", ps, depth, &il->guid_ptr))
3467 if(!prs_uint32("action", ps, depth, &il->action))
3470 if(!smb_io_unistr2("servername", &il->guid, il->guid_ptr, ps, depth))
3475 /*******************************************************************
3476 ********************************************************************/
3478 bool spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
3480 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
3485 if(!prs_uint32("level", ps, depth, &il->level))
3487 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
3490 /* if no struct inside just return */
3491 if (il->info_ptr==0) {
3492 if (UNMARSHALLING(ps)) {
3499 switch (il->level) {
3501 * level 0 is used by setprinter when managing the queue
3502 * (hold, stop, start a queue)
3506 /* DOCUMENT ME!!! What is level 1 used for? */
3509 if (UNMARSHALLING(ps)) {
3510 if ((il->info_1=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_1,1)) == NULL)
3513 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
3518 * level 2 is used by addprinter
3519 * and by setprinter when updating printer's info
3522 if (UNMARSHALLING(ps)) {
3523 if ((il->info_2=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_2,1)) == NULL)
3526 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
3529 /* DOCUMENT ME!!! What is level 3 used for? */
3532 if (UNMARSHALLING(ps)) {
3533 if ((il->info_3=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_3,1)) == NULL)
3536 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
3541 if (UNMARSHALLING(ps))
3542 if ((il->info_7=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_7,1)) == NULL)
3544 if (!spool_io_printer_info_level_7("", il->info_7, ps, depth))
3552 /*******************************************************************
3553 ********************************************************************/
3555 bool spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
3557 uint32 ptr_sec_desc = 0;
3559 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
3565 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->server_name))
3567 if (!prs_io_unistr2("servername", ps, depth, q_u->server_name))
3573 if(!prs_uint32("info_level", ps, depth, &q_u->level))
3576 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3579 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3585 switch (q_u->level) {
3587 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3590 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3594 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3599 /* Parse a NULL security descriptor. This should really
3600 happen inside the sec_io_desc_buf() function. */
3602 prs_debug(ps, depth, "", "sec_io_desc_buf");
3603 if (!prs_uint32("size", ps, depth + 1, &dummy))
3605 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
3609 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
3611 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
3617 /*******************************************************************
3618 ********************************************************************/
3620 bool spoolss_io_r_addprinterex(const char *desc, SPOOL_R_ADDPRINTEREX *r_u,
3621 prs_struct *ps, int depth)
3623 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
3626 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
3629 if(!prs_werror("status", ps, depth, &r_u->status))
3635 /*******************************************************************
3636 ********************************************************************/
3638 bool spool_io_printer_driver_info_level_3(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
3639 prs_struct *ps, int depth)
3641 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
3643 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
3647 if (UNMARSHALLING(ps)) {
3648 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_3,1);
3660 if(!prs_uint32("cversion", ps, depth, &il->cversion))
3662 if(!prs_uint32("name", ps, depth, &il->name_ptr))
3664 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
3666 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
3668 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
3670 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
3672 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
3674 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
3676 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
3678 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
3680 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
3686 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3688 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
3690 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
3692 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
3694 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
3696 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
3698 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
3700 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
3706 if (il->dependentfiles_ptr)
3707 smb_io_buffer5("", &il->dependentfiles, ps, depth);
3712 /*******************************************************************
3713 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
3714 ********************************************************************/
3716 bool spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
3717 prs_struct *ps, int depth)
3719 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
3721 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
3725 if (UNMARSHALLING(ps)) {
3726 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_6,1);
3739 * I know this seems weird, but I have no other explanation.
3740 * This is observed behavior on both NT4 and 2K servers.
3744 if (!prs_align_uint64(ps))
3747 /* parse the main elements the packet */
3749 if(!prs_uint32("cversion ", ps, depth, &il->version))
3751 if(!prs_uint32("name ", ps, depth, &il->name_ptr))
3753 if(!prs_uint32("environment ", ps, depth, &il->environment_ptr))
3755 if(!prs_uint32("driverpath ", ps, depth, &il->driverpath_ptr))
3757 if(!prs_uint32("datafile ", ps, depth, &il->datafile_ptr))
3759 if(!prs_uint32("configfile ", ps, depth, &il->configfile_ptr))
3761 if(!prs_uint32("helpfile ", ps, depth, &il->helpfile_ptr))
3763 if(!prs_uint32("monitorname ", ps, depth, &il->monitorname_ptr))
3765 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
3767 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_len))
3769 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_ptr))
3771 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_len))
3773 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_ptr))
3775 if(!smb_io_time("driverdate ", &il->driverdate, ps, depth))
3777 if(!prs_uint32("dummy4 ", ps, depth, &il->dummy4))
3779 if(!prs_uint64("driverversion ", ps, depth, &il->driverversion))
3781 if(!prs_uint32("mfgname ", ps, depth, &il->mfgname_ptr))
3783 if(!prs_uint32("oemurl ", ps, depth, &il->oemurl_ptr))
3785 if(!prs_uint32("hardwareid ", ps, depth, &il->hardwareid_ptr))
3787 if(!prs_uint32("provider ", ps, depth, &il->provider_ptr))
3790 /* parse the structures in the packet */
3792 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3797 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
3802 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
3807 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
3812 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
3817 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
3822 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
3827 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
3831 if (il->dependentfiles_ptr) {
3832 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
3837 if (il->previousnames_ptr) {
3838 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
3843 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
3847 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
3851 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
3855 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
3861 /*******************************************************************
3862 read a UNICODE array with null terminated strings
3863 and null terminated array
3864 and size of array at beginning
3865 ********************************************************************/
3867 bool smb_io_unibuffer(const char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
3869 if (buffer==NULL) return False;
3872 buffer->uni_str_len=buffer->uni_max_len;
3874 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
3877 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
3883 /*******************************************************************
3884 ********************************************************************/
3886 bool spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
3888 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
3893 if(!prs_uint32("level", ps, depth, &il->level))
3895 if(!prs_uint32("ptr", ps, depth, &il->ptr))
3901 switch (il->level) {
3903 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
3907 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
3917 /*******************************************************************
3918 init a SPOOL_Q_ADDPRINTERDRIVER struct
3919 ******************************************************************/
3921 bool make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
3922 SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
3923 uint32 level, PRINTER_DRIVER_CTR *info)
3925 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
3927 if (!srv_name || !info) {
3931 q_u->server_name_ptr = 1; /* srv_name is != NULL, see above */
3932 init_unistr2(&q_u->server_name, srv_name, UNI_STR_TERMINATE);
3936 q_u->info.level = level;
3937 q_u->info.ptr = 1; /* Info is != NULL, see above */
3940 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
3942 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
3946 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
3953 bool make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
3954 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
3955 DRIVER_INFO_3 *info3)
3958 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
3960 if (!(inf=TALLOC_ZERO_P(mem_ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)))
3963 inf->cversion = info3->version;
3964 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
3965 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
3966 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
3967 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
3968 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
3969 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
3970 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
3971 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
3973 init_unistr2_from_unistr(inf, &inf->name, &info3->name);
3974 init_unistr2_from_unistr(inf, &inf->environment, &info3->architecture);
3975 init_unistr2_from_unistr(inf, &inf->driverpath, &info3->driverpath);
3976 init_unistr2_from_unistr(inf, &inf->datafile, &info3->datafile);
3977 init_unistr2_from_unistr(inf, &inf->configfile, &info3->configfile);
3978 init_unistr2_from_unistr(inf, &inf->helpfile, &info3->helpfile);
3979 init_unistr2_from_unistr(inf, &inf->monitorname, &info3->monitorname);
3980 init_unistr2_from_unistr(inf, &inf->defaultdatatype, &info3->defaultdatatype);
3982 if (info3->dependentfiles) {
3984 bool null_char = False;
3985 uint16 *ptr = info3->dependentfiles;
3990 /* the null_char bool is used to help locate
3991 two '\0's back to back */
4008 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
4009 inf->dependentfilessize = (info3->dependentfiles != NULL) ? len : 0;
4010 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles)) {
4015 *spool_drv_info = inf;
4020 /*******************************************************************
4021 make a BUFFER5 struct from a uint16*
4022 ******************************************************************/
4024 bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
4027 buf5->buf_len = len;
4030 if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
4031 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
4035 buf5->buffer = NULL;
4044 /*******************************************************************
4045 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
4046 ********************************************************************/
4048 bool spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4050 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
4056 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
4058 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4063 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4066 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
4072 /*******************************************************************
4073 ********************************************************************/
4075 bool spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4077 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
4080 if(!prs_werror("status", ps, depth, &q_u->status))
4086 /*******************************************************************
4087 ********************************************************************/
4089 bool uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
4090 NT_PRINTER_INFO_LEVEL_2 *d)
4092 DEBUG(7,("Converting from UNICODE to ASCII\n"));
4094 d->attributes=uni->attributes;
4095 d->priority=uni->priority;
4096 d->default_priority=uni->default_priority;
4097 d->starttime=uni->starttime;
4098 d->untiltime=uni->untiltime;
4099 d->status=uni->status;
4100 d->cjobs=uni->cjobs;
4102 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername));
4103 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername));
4104 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename));
4105 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname));
4106 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername));
4107 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment));
4108 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location));
4109 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile));
4110 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor));
4111 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype));
4112 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters));
4117 /*******************************************************************
4118 ********************************************************************/
4120 bool spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
4122 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
4128 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4134 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4137 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4140 if (!prs_werror("status", ps, depth, &r_u->status))
4146 /*******************************************************************
4147 ********************************************************************/
4149 bool spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
4151 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
4157 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4159 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4165 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
4167 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4173 if (!prs_uint32("level", ps, depth, &q_u->level))
4176 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4182 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4188 /*******************************************************************
4189 ********************************************************************/
4191 bool spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
4193 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
4199 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4205 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4208 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4211 if (!prs_werror("status", ps, depth, &r_u->status))
4217 /*******************************************************************
4218 ********************************************************************/
4220 bool spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
4222 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
4228 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4230 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4236 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
4238 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
4244 if (!prs_uint32("level", ps, depth, &q_u->level))
4247 if(!prs_rpcbuffer_p("buffer", ps, depth, &q_u->buffer))
4253 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4259 /*******************************************************************
4260 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
4261 ********************************************************************/
4263 bool spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
4265 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
4271 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4273 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4279 if (!prs_uint32("level", ps, depth, &q_u->level))
4282 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4288 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4294 /*******************************************************************
4295 ********************************************************************/
4297 bool spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
4299 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
4305 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4311 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4314 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4317 if (!prs_werror("status", ps, depth, &r_u->status))
4323 /*******************************************************************
4324 ********************************************************************/
4326 bool spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
4328 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
4333 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
4336 if (UNMARSHALLING(ps) && r_u->valuesize) {
4337 r_u->value = PRS_ALLOC_MEM(ps, uint16, r_u->valuesize);
4339 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
4344 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
4350 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
4353 if(!prs_uint32("type", ps, depth, &r_u->type))
4356 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
4359 if (UNMARSHALLING(ps) && r_u->datasize) {
4360 r_u->data = PRS_ALLOC_MEM(ps, uint8, r_u->datasize);
4362 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
4367 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
4372 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
4374 if(!prs_werror("status", ps, depth, &r_u->status))
4380 /*******************************************************************
4381 ********************************************************************/
4383 bool spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
4385 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
4390 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4392 if(!prs_uint32("index", ps, depth, &q_u->index))
4394 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
4396 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
4402 /*******************************************************************
4403 ********************************************************************/
4405 bool make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
4406 const POLICY_HND *hnd,
4407 uint32 idx, uint32 valuelen, uint32 datalen)
4409 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4411 q_u->valuesize=valuelen;
4412 q_u->datasize=datalen;
4417 /*******************************************************************
4418 ********************************************************************/
4420 bool make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
4421 const POLICY_HND *hnd, const char *key,
4424 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4425 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
4431 /*******************************************************************
4432 ********************************************************************/
4433 bool make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
4434 char* value, uint32 data_type, char* data, uint32 data_size)
4436 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4437 q_u->type = data_type;
4438 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
4440 q_u->max_len = q_u->real_len = data_size;
4441 q_u->data = (unsigned char *)data;
4446 /*******************************************************************
4447 ********************************************************************/
4449 bool spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
4451 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
4456 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
4458 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
4464 if(!prs_uint32("type", ps, depth, &q_u->type))
4467 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
4477 if (UNMARSHALLING(ps))
4478 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
4479 if(q_u->data == NULL)
4481 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
4489 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
4495 /*******************************************************************
4496 ********************************************************************/
4498 bool spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
4500 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
4505 if(!prs_werror("status", ps, depth, &r_u->status))
4511 /*******************************************************************
4512 Parse a SPOOL_R_GETJOB structure.
4513 ********************************************************************/
4515 bool spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
4517 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
4523 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4529 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4532 if (!prs_werror("status", ps, depth, &r_u->status))
4538 /*******************************************************************
4539 Parse a SPOOL_Q_GETJOB structure.
4540 ********************************************************************/
4542 bool spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
4544 prs_debug(ps, depth, desc, "");
4550 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4552 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4554 if(!prs_uint32("level", ps, depth, &q_u->level))
4557 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4563 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4569 void free_devmode(DEVICEMODE *devmode)
4571 if (devmode!=NULL) {
4572 SAFE_FREE(devmode->dev_private);
4577 void free_printer_info_1(PRINTER_INFO_1 *printer)
4582 void free_printer_info_2(PRINTER_INFO_2 *printer)
4584 if (printer!=NULL) {
4585 free_devmode(printer->devmode);
4586 printer->devmode = NULL;
4591 void free_printer_info_3(PRINTER_INFO_3 *printer)
4596 void free_printer_info_4(PRINTER_INFO_4 *printer)
4601 void free_printer_info_5(PRINTER_INFO_5 *printer)
4606 void free_printer_info_6(PRINTER_INFO_6 *printer)
4611 void free_printer_info_7(PRINTER_INFO_7 *printer)
4616 void free_job_info_2(JOB_INFO_2 *job)
4619 free_devmode(job->devmode);
4622 #if 0 /* JERRY - not currently used but could be :-) */
4624 /*******************************************************************
4625 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
4626 ******************************************************************/
4627 static bool copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
4628 SPOOL_NOTIFY_INFO_DATA *src, int n)
4632 memcpy(dst, src, sizeof(SPOOL_NOTIFY_INFO_DATA)*n);
4634 for (i=0; i<n; i++) {
4638 if (src->size != POINTER)
4640 len = src->notify_data.data.length;
4641 s = SMB_MALLOC_ARRAY(uint16, len);
4643 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
4647 memcpy(s, src->notify_data.data.string, len*2);
4648 dst->notify_data.data.string = s;
4654 /*******************************************************************
4655 Deep copy a SPOOL_NOTIFY_INFO structure
4656 ******************************************************************/
4657 static bool copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
4660 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
4664 dst->version = src->version;
4665 dst->flags = src->flags;
4666 dst->count = src->count;
4670 dst->data = SMB_MALLOC_ARRAY(SPOOL_NOTIFY_INFO_DATA, dst->count);
4672 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
4675 if (dst->data == NULL) {
4676 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
4681 return (copy_spool_notify_info_data(dst->data, src->data, src->count));
4688 /*******************************************************************
4690 ********************************************************************/
4692 bool make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
4693 uint32 change_low, uint32 change_high,
4694 SPOOL_NOTIFY_INFO *info)
4699 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4701 q_u->change_low=change_low;
4702 q_u->change_high=change_high;
4707 q_u->info_ptr=0x0FF0ADDE;
4709 q_u->info.version=2;
4712 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
4714 q_u->info.version = info->version;
4715 q_u->info.flags = info->flags;
4716 q_u->info.count = info->count;
4717 /* pointer field - be careful! */
4718 q_u->info.data = info->data;
4721 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
4728 /*******************************************************************
4729 Parse a SPOOL_Q_REPLY_RRPCN structure.
4730 ********************************************************************/
4732 bool spoolss_io_q_reply_rrpcn(const char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
4734 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
4740 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4743 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
4746 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
4749 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
4752 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
4755 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
4758 if(q_u->info_ptr!=0)
4759 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
4765 /*******************************************************************
4766 Parse a SPOOL_R_REPLY_RRPCN structure.
4767 ********************************************************************/
4769 bool spoolss_io_r_reply_rrpcn(const char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
4771 prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
4777 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
4780 if (!prs_werror("status", ps, depth, &r_u->status))
4786 /*******************************************************************
4788 ********************************************************************/
4789 bool make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u,
4790 POLICY_HND *hnd, const char *key,
4793 DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
4795 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4796 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
4802 /*******************************************************************
4804 ********************************************************************/
4806 bool spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
4808 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
4813 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
4816 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
4822 if(!prs_uint32("size", ps, depth, &q_u->size))
4828 /*******************************************************************
4829 * write a structure.
4830 ********************************************************************/
4832 bool spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
4834 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
4840 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
4846 if(!prs_uint32("needed", ps, depth, &r_u->needed))
4849 if(!prs_werror("status", ps, depth, &r_u->status))
4855 /*******************************************************************
4857 ********************************************************************/
4859 bool spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
4861 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
4866 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
4869 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
4875 if(!prs_uint32("size", ps, depth, &q_u->size))
4881 /*******************************************************************
4882 ********************************************************************/
4884 static bool spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
4885 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
4888 uint32 valuename_offset,
4891 const uint32 basic_unit = 20; /* size of static portion of enum_values */
4893 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
4897 * offset data begins at 20 bytes per structure * size_of_array.
4898 * Don't forget the uint32 at the beginning
4901 current_offset = basic_unit * ctr->size_of_array;
4903 /* first loop to write basic enum_value information */
4905 if (UNMARSHALLING(ps) && ctr->size_of_array) {
4906 ctr->values = PRS_ALLOC_MEM(ps, PRINTER_ENUM_VALUES, ctr->size_of_array);
4911 for (i=0; i<ctr->size_of_array; i++) {
4912 uint32 base_offset, return_offset;
4914 base_offset = prs_offset(ps);
4916 valuename_offset = current_offset;
4917 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
4920 /* Read or write the value. */
4922 return_offset = prs_offset(ps);
4924 if (!prs_set_offset(ps, base_offset + valuename_offset)) {
4928 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
4932 if (!prs_set_offset(ps, return_offset))
4935 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
4938 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
4941 data_offset = ctr->values[i].value_len + valuename_offset;
4943 if (!prs_uint32("data_offset", ps, depth, &data_offset))
4946 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
4949 /* Read or write the data. */
4951 return_offset = prs_offset(ps);
4953 if (!prs_set_offset(ps, base_offset + data_offset)) {
4957 if ( ctr->values[i].data_len ) {
4958 if ( UNMARSHALLING(ps) ) {
4959 ctr->values[i].data = PRS_ALLOC_MEM(ps, uint8, ctr->values[i].data_len);
4960 if (!ctr->values[i].data)
4963 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
4967 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
4968 /* account for 2 byte alignment */
4969 current_offset += (current_offset % 2);
4971 /* Remember how far we got. */
4972 data_offset = prs_offset(ps);
4975 if (!prs_set_offset(ps, return_offset))
4980 /* Go to the last data offset we got to. */
4982 if (!prs_set_offset(ps, data_offset))
4985 /* And ensure we're 2 byte aligned. */
4987 if ( !prs_align_uint16(ps) )
4993 /*******************************************************************
4994 * write a structure.
4995 ********************************************************************/
4997 bool spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
4999 uint32 data_offset, end_offset;
5000 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
5006 if (!prs_uint32("size", ps, depth, &r_u->ctr.size))
5009 data_offset = prs_offset(ps);
5011 if (!prs_set_offset(ps, data_offset + r_u->ctr.size))
5017 if(!prs_uint32("needed", ps, depth, &r_u->needed))
5020 if(!prs_uint32("returned", ps, depth, &r_u->returned))
5023 if(!prs_werror("status", ps, depth, &r_u->status))
5026 r_u->ctr.size_of_array = r_u->returned;
5028 end_offset = prs_offset(ps);
5030 if (!prs_set_offset(ps, data_offset))
5034 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
5037 if (!prs_set_offset(ps, end_offset))
5042 /*******************************************************************
5044 ********************************************************************/
5046 bool make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
5047 uint32 level, RPC_BUFFER *buffer,
5050 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
5053 q_u->offered=offered;
5058 /*******************************************************************
5060 ********************************************************************/
5062 bool make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
5063 uint32 jobid, uint32 level, RPC_BUFFER *buffer,
5066 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
5069 q_u->buffer = buffer;
5070 q_u->offered = offered;
5075 /*******************************************************************
5077 ********************************************************************/
5079 bool make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
5080 uint32 flags, uint32 options, const char *localmachine,
5081 uint32 printerlocal, SPOOL_NOTIFY_OPTION *option)
5083 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
5086 q_u->options = options;
5088 q_u->localmachine_ptr = 1;
5090 init_unistr2(&q_u->localmachine, localmachine, UNI_STR_TERMINATE);
5092 q_u->printerlocal = printerlocal;
5095 q_u->option_ptr = 1;
5097 q_u->option = option;