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