this is a big global fix for the ptr = Realloc(ptr, size) bug.
[ira/wip.git] / source / rpc_parse / parse_spoolss.c
index fb4150b2ce314338e87c915423256cde9aef347d..dd2c4a541abddebbe513ea74dbe9dfb9d0ecb438 100644 (file)
@@ -407,7 +407,7 @@ BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
                                if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2)) 
                                        return False;
                        } else {
-                               if(!prs_uint8s(True,"string",ps,depth,(uint8 *)data->notify_data.data.string,x*2))
+                               if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
                                        return False;
                        }
                } else {
@@ -418,7 +418,7 @@ BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
                        if (!data->notify_data.data.string) 
                                return False;
 
-                       if(!prs_uint16s(True,"string",ps,depth,data->notify_data.data.string,x))
+                       if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
                                return False;
                }
        }
@@ -539,7 +539,7 @@ static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps,
  * on reading allocate memory for the private member
  ********************************************************************/
 
-static BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
+BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
 {
        prs_debug(ps, depth, desc, "spoolss_io_devmode");
        depth++;
@@ -550,7 +550,7 @@ static BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE
                        return False;
        }
 
-       if (!prs_uint16s(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
+       if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
                return False;
        if (!prs_uint16("specversion",      ps, depth, &devmode->specversion))
                return False;
@@ -595,7 +595,7 @@ static BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE
                        return False;
        }
 
-       if (!prs_uint16s(True, "formname",  ps, depth, devmode->formname.buffer, 32))
+       if (!prs_uint16uni(True, "formname",  ps, depth, devmode->formname.buffer, 32))
                return False;
        if (!prs_uint16("logpixels",        ps, depth, &devmode->logpixels))
                return False;
@@ -760,12 +760,18 @@ BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
 /*******************************************************************
  * init a structure.
  ********************************************************************/
-
-BOOL make_spoolss_q_addprinterex(TALLOC_CTX *ctx, SPOOL_Q_ADDPRINTEREX *q_u, const char *srv_name,
-                                const char* clientname, const char* user_name,
-                                uint32 level, PRINTER_INFO_2 *info)
+BOOL make_spoolss_q_addprinterex(
+       TALLOC_CTX *mem_ctx,
+       SPOOL_Q_ADDPRINTEREX *q_u, 
+       const char *srv_name,
+       const char* clientname, 
+       const char* user_name,
+       uint32 level, 
+       PRINTER_INFO_CTR *ctr)
 {
        DEBUG(5,("make_spoolss_q_addprinterex\n"));
+       
+       if (!ctr) return False;
 
        q_u->server_name_ptr = (srv_name!=NULL)?1:0;
        init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
@@ -773,12 +779,12 @@ BOOL make_spoolss_q_addprinterex(TALLOC_CTX *ctx, SPOOL_Q_ADDPRINTEREX *q_u, con
        q_u->level = level;
        
        q_u->info.level = level;
-       q_u->info.info_ptr = (info!=NULL)?1:0;
+       q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
        switch (level)
        {
                case 2:
                        /* init q_u->info.info2 from *info */
-                       if (!make_spool_printer_info_2( ctx, &q_u->info.info_2, info))
+                       if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2))
                        {
                                DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
                                return False;
@@ -812,17 +818,19 @@ BOOL make_spoolss_q_addprinterex(TALLOC_CTX *ctx, SPOOL_Q_ADDPRINTEREX *q_u, con
 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
 *******************************************************************/
 
-BOOL make_spool_printer_info_2(TALLOC_CTX *ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2, 
-                              PRINTER_INFO_2 *info)
+BOOL make_spoolss_printer_info_2(
+       TALLOC_CTX *mem_ctx,
+       SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2, 
+       PRINTER_INFO_2 *info
+)
 {
 
        SPOOL_PRINTER_INFO_LEVEL_2 *inf;
 
        /* allocate the necessary memory */
-       inf = (SPOOL_PRINTER_INFO_LEVEL_2*)talloc_zero(ctx,sizeof(SPOOL_PRINTER_INFO_LEVEL_2));
-       if (spool_info2 == NULL)
+       if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_2*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_2))))
        {
-               DEBUG(0,("make_spool_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
+               DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
                return False;
        }
        
@@ -858,7 +866,7 @@ BOOL make_spool_printer_info_2(TALLOC_CTX *ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spo
        init_unistr2_from_unistr(&inf->datatype,        &info->datatype);
        init_unistr2_from_unistr(&inf->parameters,      &info->parameters);
        init_unistr2_from_unistr(&inf->datatype,        &info->datatype);
-       inf->secdesc    = NULL;
+       inf->secdesc            = inf->secdesc;
 
        *spool_info2 = inf;
 
@@ -900,6 +908,31 @@ BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_
        return True;
 }
 
+/*******************************************************************
+ * init a structure.
+ ********************************************************************/
+BOOL make_spoolss_q_deleteprinterdriver(
+       TALLOC_CTX *mem_ctx,
+       SPOOL_Q_DELETEPRINTERDRIVER *q_u, 
+       const char *server,
+       const char* arch, 
+       const char* driver 
+)
+{
+       DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
+       
+       q_u->server_ptr = (server!=NULL)?1:0;
+
+       /* these must be NULL terminated or else NT4 will
+          complain about invalid parameters --jerry */
+       init_unistr2(&q_u->server, server, strlen(server)+1);
+       init_unistr2(&q_u->arch, arch, strlen(arch)+1);
+       init_unistr2(&q_u->driver, driver, strlen(driver)+1);
+
+       
+       return True;
+}
+
 /*******************************************************************
  * write a structure.
  * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
@@ -1143,6 +1176,58 @@ BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_stru
        return True;
 }
 
+
+/*******************************************************************
+ * read a structure.
+ * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
+ * called from spoolss_deleteprinterdriver (cli_spoolss.c)
+ ********************************************************************/
+
+BOOL spoolss_io_q_deleteprinterdriver(char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
+{
+       if (q_u == NULL) return False;
+
+       prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
+               return False;           
+       if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
+               return False;
+       if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
+               return False;
+       if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
+               return False;
+
+
+       return True;
+}
+
+
+/*******************************************************************
+ * write a structure.
+ ********************************************************************/
+BOOL spoolss_io_r_deleteprinterdriver(char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
+{
+       if (r_u == NULL) return False;
+
+       prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+
+       if (!prs_uint32("status", ps, depth, &r_u->status))
+               return False;
+
+       return True;
+}
+
+
+
 /*******************************************************************
  * read a structure.
  * called from static spoolss_q_closeprinter (srv_spoolss.c)
@@ -1631,7 +1716,7 @@ static BOOL spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int d
  *
  ********************************************************************/
 
-static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
+static BOOL smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
 {
        prs_struct *ps=&buffer->prs;
        
@@ -1684,7 +1769,7 @@ static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR
  * used by 2 RPC structs
  ********************************************************************/
 
-static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
+static BOOL smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
 {
        UNISTR chaine;
        
@@ -1776,12 +1861,17 @@ static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, ui
                           an extra NULL for termination */
                        if (l_chaine > 0)
                        {
+                               uint16 *tc2;
+                       
                                realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16);
 
                                /* Yes this should be realloc - it's freed below. JRA */
 
-                               if((chaine2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL)
+                               if((tc2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL) {
+                                       if (chaine2) free(chaine2);
                                        return False;
+                               }
+                               else chaine2 = tc2;
                                memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
                                l_chaine2+=l_chaine+1;
                        }
@@ -1807,11 +1897,11 @@ static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, ui
  Parse a DEVMODE structure and its relative pointer.
 ********************************************************************/
 
-static BOOL new_smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
+static BOOL smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
 {
        prs_struct *ps= &buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_relsecdesc");
+       prs_debug(ps, depth, desc, "smb_io_relsecdesc");
        depth++;
 
        if (MARSHALLING(ps)) {
@@ -1868,11 +1958,11 @@ static BOOL new_smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC
  Parse a DEVMODE structure and its relative pointer.
 ********************************************************************/
 
-static BOOL new_smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
+static BOOL smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_reldevmode");
+       prs_debug(ps, depth, desc, "smb_io_reldevmode");
        depth++;
 
        if (MARSHALLING(ps)) {
@@ -1932,7 +2022,7 @@ static BOOL new_smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEV
  Parse a PRINTER_INFO_0 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
+BOOL smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -1941,9 +2031,9 @@ BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *i
        
        buffer->struct_start=prs_offset(ps);
 
-       if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
+       if (!smb_io_relstr("printername", buffer, depth, &info->printername))
                return False;
-       if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
+       if (!smb_io_relstr("servername", buffer, depth, &info->servername))
                return False;
        
        if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
@@ -2033,22 +2123,22 @@ BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *i
  Parse a PRINTER_INFO_1 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
+BOOL smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_printer_info_1");
+       prs_debug(ps, depth, desc, "smb_io_printer_info_1");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
 
        if (!prs_uint32("flags", ps, depth, &info->flags))
                return False;
-       if (!new_smb_io_relstr("description", buffer, depth, &info->description))
+       if (!smb_io_relstr("description", buffer, depth, &info->description))
                return False;
-       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (!smb_io_relstr("name", buffer, depth, &info->name))
                return False;
-       if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
+       if (!smb_io_relstr("comment", buffer, depth, &info->comment))
                return False;   
 
        return True;
@@ -2058,44 +2148,44 @@ BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *i
  Parse a PRINTER_INFO_2 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
+BOOL smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_printer_info_2");
+       prs_debug(ps, depth, desc, "smb_io_printer_info_2");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
        
-       if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
+       if (!smb_io_relstr("servername", buffer, depth, &info->servername))
                return False;
-       if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
+       if (!smb_io_relstr("printername", buffer, depth, &info->printername))
                return False;
-       if (!new_smb_io_relstr("sharename", buffer, depth, &info->sharename))
+       if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
                return False;
-       if (!new_smb_io_relstr("portname", buffer, depth, &info->portname))
+       if (!smb_io_relstr("portname", buffer, depth, &info->portname))
                return False;
-       if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
+       if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
                return False;
-       if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
+       if (!smb_io_relstr("comment", buffer, depth, &info->comment))
                return False;
-       if (!new_smb_io_relstr("location", buffer, depth, &info->location))
+       if (!smb_io_relstr("location", buffer, depth, &info->location))
                return False;
 
        /* NT parses the DEVMODE at the end of the struct */
-       if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
+       if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
                return False;
        
-       if (!new_smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
+       if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
                return False;
-       if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
+       if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
                return False;
-       if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
+       if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
                return False;
-       if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
+       if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
                return False;
 
-       if (!new_smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
+       if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
                return False;
 
        if (!prs_uint32("attributes", ps, depth, &info->attributes))
@@ -2129,11 +2219,11 @@ BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *i
  Parse a PRINTER_INFO_3 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
+BOOL smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_printer_info_3");
+       prs_debug(ps, depth, desc, "smb_io_printer_info_3");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
@@ -2150,16 +2240,16 @@ BOOL new_smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *i
  Parse a PORT_INFO_1 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
+BOOL smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_port_info_1");
+       prs_debug(ps, depth, desc, "smb_io_port_info_1");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
        
-       if (!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
+       if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
                return False;
 
        return True;
@@ -2169,20 +2259,20 @@ BOOL new_smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, i
  Parse a PORT_INFO_2 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
+BOOL smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_port_info_2");
+       prs_debug(ps, depth, desc, "smb_io_port_info_2");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
        
-       if (!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
+       if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
                return False;
-       if (!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
+       if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
                return False;
-       if (!new_smb_io_relstr("description", buffer, depth, &info->description))
+       if (!smb_io_relstr("description", buffer, depth, &info->description))
                return False;
        if (!prs_uint32("port_type", ps, depth, &info->port_type))
                return False;
@@ -2196,16 +2286,16 @@ BOOL new_smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, i
  Parse a DRIVER_INFO_1 structure.
 ********************************************************************/
 
-BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth) 
+BOOL smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth) 
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_1");
+       prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
 
-       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (!smb_io_relstr("name", buffer, depth, &info->name))
                return False;
 
        return True;
@@ -2215,26 +2305,26 @@ BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INF
  Parse a DRIVER_INFO_2 structure.
 ********************************************************************/
 
-BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth) 
+BOOL smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth) 
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_2");
+       prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
 
        if (!prs_uint32("version", ps, depth, &info->version))
                return False;
-       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (!smb_io_relstr("name", buffer, depth, &info->name))
                return False;
-       if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
+       if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
                return False;
-       if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
+       if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
                return False;
-       if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
+       if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
                return False;
-       if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
+       if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
                return False;
 
        return True;
@@ -2244,36 +2334,36 @@ BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INF
  Parse a DRIVER_INFO_3 structure.
 ********************************************************************/
 
-BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
+BOOL smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_3");
+       prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
 
        if (!prs_uint32("version", ps, depth, &info->version))
                return False;
-       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (!smb_io_relstr("name", buffer, depth, &info->name))
                return False;
-       if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
+       if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
                return False;
-       if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
+       if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
                return False;
-       if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
+       if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
                return False;
-       if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
+       if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
                return False;
-       if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
+       if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
                return False;
 
-       if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
+       if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
                return False;
 
-       if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
+       if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
                return False;
-       if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
+       if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
                return False;
 
        return True;
@@ -2283,39 +2373,39 @@ BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INF
  Parse a DRIVER_INFO_6 structure.
 ********************************************************************/
 
-BOOL new_smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
+BOOL smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_6");
+       prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
 
        if (!prs_uint32("version", ps, depth, &info->version))
                return False;
-       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (!smb_io_relstr("name", buffer, depth, &info->name))
                return False;
-       if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
+       if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
                return False;
-       if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
+       if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
                return False;
-       if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
+       if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
                return False;
-       if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
+       if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
                return False;
-       if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
+       if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
                return False;
 
-       if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
+       if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
                return False;
 
-       if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
+       if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
                return False;
-       if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
+       if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
                return False;
 
-       if (!new_smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
+       if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
                return False;
 
        if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
@@ -2332,13 +2422,13 @@ BOOL new_smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INF
        if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
                return False;
 
-       if (!new_smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
+       if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
                return False;
-       if (!new_smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
+       if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
                return False;
-       if (!new_smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
+       if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
                return False;
-       if (!new_smb_io_relstr("provider", buffer, depth, &info->provider))
+       if (!smb_io_relstr("provider", buffer, depth, &info->provider))
                return False;
        
        return True;
@@ -2348,28 +2438,28 @@ BOOL new_smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INF
  Parse a JOB_INFO_1 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
+BOOL smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_job_info_1");
+       prs_debug(ps, depth, desc, "smb_io_job_info_1");
        depth++;        
        
        buffer->struct_start=prs_offset(ps);
 
        if (!prs_uint32("jobid", ps, depth, &info->jobid))
                return False;
-       if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
+       if (!smb_io_relstr("printername", buffer, depth, &info->printername))
                return False;
-       if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
+       if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
                return False;
-       if (!new_smb_io_relstr("username", buffer, depth, &info->username))
+       if (!smb_io_relstr("username", buffer, depth, &info->username))
                return False;
-       if (!new_smb_io_relstr("document", buffer, depth, &info->document))
+       if (!smb_io_relstr("document", buffer, depth, &info->document))
                return False;
-       if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
+       if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
                return False;
-       if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
+       if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
                return False;
        if (!prs_uint32("status", ps, depth, &info->status))
                return False;
@@ -2391,40 +2481,40 @@ BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int
  Parse a JOB_INFO_2 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
+BOOL smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
 {      
-       uint pipo=0;
+       uint32 pipo=0;
        prs_struct *ps=&buffer->prs;
        
-       prs_debug(ps, depth, desc, "new_smb_io_job_info_2");
+       prs_debug(ps, depth, desc, "smb_io_job_info_2");
        depth++;        
 
        buffer->struct_start=prs_offset(ps);
        
        if (!prs_uint32("jobid",ps, depth, &info->jobid))
                return False;
-       if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
+       if (!smb_io_relstr("printername", buffer, depth, &info->printername))
                return False;
-       if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
+       if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
                return False;
-       if (!new_smb_io_relstr("username", buffer, depth, &info->username))
+       if (!smb_io_relstr("username", buffer, depth, &info->username))
                return False;
-       if (!new_smb_io_relstr("document", buffer, depth, &info->document))
+       if (!smb_io_relstr("document", buffer, depth, &info->document))
                return False;
-       if (!new_smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
+       if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
                return False;
-       if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
+       if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
                return False;
 
-       if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
+       if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
                return False;
-       if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
+       if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
                return False;
-       if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
+       if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
                return False;
-       if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
+       if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
                return False;
-       if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
+       if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
                return False;
 
 /*     SEC_DESC sec_desc;*/
@@ -2458,11 +2548,11 @@ BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int
 /*******************************************************************
 ********************************************************************/  
 
-BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
+BOOL smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
        
-       prs_debug(ps, depth, desc, "new_smb_io_form_1");
+       prs_debug(ps, depth, desc, "smb_io_form_1");
        depth++;
                
        buffer->struct_start=prs_offset(ps);
@@ -2470,7 +2560,7 @@ BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
        if (!prs_uint32("flag", ps, depth, &info->flag))
                return False;
                
-       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (!smb_io_relstr("name", buffer, depth, &info->name))
                return False;
 
        if (!prs_uint32("width", ps, depth, &info->width))
@@ -2493,11 +2583,11 @@ BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
  Read/write a BUFFER struct.
 ********************************************************************/  
 
-static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
+static BOOL spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
 {
        NEW_BUFFER *buffer = *pp_buffer;
 
-       prs_debug(ps, depth, desc, "new_spoolss_io_buffer");
+       prs_debug(ps, depth, desc, "spoolss_io_buffer");
        depth++;
        
        if (UNMARSHALLING(ps))
@@ -2515,7 +2605,12 @@ static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUF
                buffer->string_at_end=0;
                
                if (buffer->ptr==0) {
-                       if (!prs_init(&buffer->prs, 0, 4, prs_get_mem_context(ps), UNMARSHALL))
+                       /*
+                        * JRA. I'm not sure if the data in here is in big-endian format if
+                        * the client is big-endian. Leave as default (little endian) for now.
+                        */
+
+                       if (!prs_init(&buffer->prs, 0, prs_get_mem_context(ps), UNMARSHALL))
                                return False;
                        return True;
                }
@@ -2523,7 +2618,12 @@ static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUF
                if (!prs_uint32("size", ps, depth, &buffer->size))
                        return False;
                                        
-               if (!prs_init(&buffer->prs, buffer->size, 4, prs_get_mem_context(ps), UNMARSHALL))
+               /*
+                * JRA. I'm not sure if the data in here is in big-endian format if
+                * the client is big-endian. Leave as default (little endian) for now.
+                */
+
+               if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
                        return False;
 
                if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
@@ -2540,16 +2640,28 @@ static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUF
                return True;
        }
        else {
+               BOOL ret = False;
+
                /* writing */
-               if (buffer->ptr==0)
+               if (buffer->ptr==0) {
+                       /* We have finished with the data in buffer->prs - free it. */
+                       prs_mem_free(&buffer->prs);
                        return True;
-               
+               }
+       
                if (!prs_uint32("size", ps, depth, &buffer->size))
-                       return False;
+                       goto out;
+
                if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
-                       return False;
+                       goto out;
 
-               return True;
+               ret = True;
+       out:
+
+               /* We have finished with the data in buffer->prs - free it. */
+               prs_mem_free(&buffer->prs);
+
+               return ret;
        }
 }
 
@@ -2559,7 +2671,7 @@ static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUF
  this is ok. This is an OPTIMIZATION and is not strictly neccessary.
 ********************************************************************/  
 
-void new_spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
+void spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
 {
        prs_switch_type(&src->prs, MARSHALL);
        if(!prs_set_offset(&src->prs, 0))
@@ -2582,11 +2694,11 @@ uint32 new_get_buffer_size(NEW_BUFFER *buffer)
  Parse a DRIVER_DIRECTORY_1 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
+BOOL smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_driverdir_1");
+       prs_debug(ps, depth, desc, "smb_io_driverdir_1");
        depth++;
 
        buffer->struct_start=prs_offset(ps);
@@ -2601,16 +2713,16 @@ BOOL new_smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *
  Parse a PORT_INFO_1 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
+BOOL smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_port_1");
+       prs_debug(ps, depth, desc, "smb_io_port_1");
        depth++;
 
        buffer->struct_start=prs_offset(ps);
 
-       if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
+       if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
                return False;
 
        return True;
@@ -2620,20 +2732,20 @@ BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int de
  Parse a PORT_INFO_2 structure.
 ********************************************************************/  
 
-BOOL new_smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
+BOOL smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
-       prs_debug(ps, depth, desc, "new_smb_io_port_2");
+       prs_debug(ps, depth, desc, "smb_io_port_2");
        depth++;
 
        buffer->struct_start=prs_offset(ps);
 
-       if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
+       if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
                return False;
-       if(!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
+       if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
                return False;
-       if(!new_smb_io_relstr("description", buffer, depth, &info->description))
+       if(!smb_io_relstr("description", buffer, depth, &info->description))
                return False;
        if(!prs_uint32("port_type", ps, depth, &info->port_type))
                return False;
@@ -2655,7 +2767,7 @@ BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR
 
        buffer->struct_start=prs_offset(ps);
        
-       if (new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (smb_io_relstr("name", buffer, depth, &info->name))
                return False;
 
        return True;
@@ -2673,7 +2785,7 @@ BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDA
 
        buffer->struct_start=prs_offset(ps);
        
-       if (new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (smb_io_relstr("name", buffer, depth, &info->name))
                return False;
 
        return True;
@@ -2691,7 +2803,7 @@ BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *
 
        buffer->struct_start=prs_offset(ps);
 
-       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (!smb_io_relstr("name", buffer, depth, &info->name))
                return False;
 
        return True;
@@ -2709,11 +2821,11 @@ BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *
 
        buffer->struct_start=prs_offset(ps);
 
-       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+       if (!smb_io_relstr("name", buffer, depth, &info->name))
                return False;
-       if (!new_smb_io_relstr("environment", buffer, depth, &info->environment))
+       if (!smb_io_relstr("environment", buffer, depth, &info->environment))
                return False;
-       if (!new_smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
+       if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
                return False;
 
        return True;
@@ -3176,7 +3288,7 @@ BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u,
        if(!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if(!prs_align(ps))
@@ -3206,7 +3318,7 @@ BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u,
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3227,9 +3339,14 @@ BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, uint32 flags, 
-                               fstring servername, uint32 level, 
-                               NEW_BUFFER *buffer, uint32 offered)
+BOOL make_spoolss_q_enumprinters(
+       SPOOL_Q_ENUMPRINTERS *q_u, 
+       uint32 flags, 
+       fstring servername, 
+       uint32 level, 
+       NEW_BUFFER *buffer, 
+       uint32 offered
+)
 {
        q_u->flags=flags;
        
@@ -3287,7 +3404,7 @@ BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
 
-       if (!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3302,15 +3419,15 @@ BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct
  Parse a SPOOL_R_ENUMPRINTERS structure.
  ********************************************************************/
 
-BOOL new_spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
+BOOL spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
 {
-       prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinters");
+       prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
        depth++;
 
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3342,7 +3459,7 @@ BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3375,7 +3492,7 @@ BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
 
-       if (!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3390,8 +3507,14 @@ BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level, 
-                               NEW_BUFFER *buffer, uint32 offered)
+BOOL make_spoolss_q_getprinter(
+       TALLOC_CTX *mem_ctx,
+       SPOOL_Q_GETPRINTER *q_u, 
+       const POLICY_HND *hnd, 
+       uint32 level, 
+       NEW_BUFFER *buffer, 
+       uint32 offered
+)
 {
        if (q_u == NULL)
        {
@@ -3406,6 +3529,74 @@ BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, u
        return True;
 }
 
+/*******************************************************************
+ * init a structure.
+ ********************************************************************/
+BOOL make_spoolss_q_setprinter(
+       TALLOC_CTX *mem_ctx,
+       SPOOL_Q_SETPRINTER *q_u, 
+       const POLICY_HND *hnd, 
+       uint32 level, 
+       PRINTER_INFO_CTR *info, 
+       uint32 command
+)
+{
+       SEC_DESC *secdesc;
+       DEVICEMODE *devmode;
+
+       if (q_u == NULL)
+       {
+               return False;
+       }
+       
+       memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
+
+       q_u->level = level;
+       q_u->info.level = level;
+       q_u->info.info_ptr = (info != NULL) ? 1 : 0;
+       switch (level)
+       {
+       case 2:
+               secdesc = info->printers_2->secdesc;
+               devmode = info->printers_2->devmode;
+               
+               /* FIXMEE!!  HACK ALERT!!!  --jerry */
+               info->printers_2->devmode = NULL;
+               info->printers_2->secdesc = NULL;
+               
+               make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
+#if 0  /* JERRY TEST */
+               q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF));
+               if (!q_u->secdesc_ctr)
+                       return False;
+               q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
+               q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
+               q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
+               q_u->secdesc_ctr->sec = secdesc;
+
+               q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
+               q_u->devmode_ctr.size = sizeof(DEVICEMODE) + (3*sizeof(uint32));
+               q_u->devmode_ctr.devmode = devmode;
+#else
+               q_u->secdesc_ctr = NULL;
+       
+               q_u->devmode_ctr.devmode_ptr = 0;
+               q_u->devmode_ctr.size = 0;
+               q_u->devmode_ctr.devmode = NULL;
+#endif
+               break;
+       default: 
+               DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
+                       break;
+       }
+
+       
+       q_u->command = command;
+
+       return True;
+}
+
+
 /*******************************************************************
 ********************************************************************/  
 
@@ -3530,7 +3721,7 @@ BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int de
        if(!prs_align(ps))
                return False;
        
-       if(!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if(!prs_align(ps))
@@ -3561,7 +3752,7 @@ BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int de
        if(!prs_uint32("level", ps, depth, &q_u->level))
                return False;
        
-       if(!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if(!prs_align(ps))
@@ -3584,7 +3775,7 @@ BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, in
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3646,7 +3837,7 @@ BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, in
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
 
-       if (!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;   
 
        if (!prs_uint32("offered", ps, depth, &q_u->offered))
@@ -3739,15 +3930,15 @@ BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int de
  Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
 ********************************************************************/  
 
-BOOL new_spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
+BOOL spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
 {
-       prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinterdrivers");
+       prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
        depth++;
 
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3815,7 +4006,7 @@ BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3843,7 +4034,7 @@ BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps,
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;   
        
-       if (!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3857,15 +4048,15 @@ BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
+BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
 {
-       prs_debug(ps, depth, desc, "new_spoolss_io_r_enumforms");
+       prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
        depth++;
 
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3905,7 +4096,7 @@ BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;   
        
-       if (!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3919,15 +4110,15 @@ BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int
 /*******************************************************************
 ********************************************************************/  
 
-BOOL new_spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
+BOOL spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
 {
-       prs_debug(ps, depth, desc, "new_spoolss_io_r_getform");
+       prs_debug(ps, depth, desc, "spoolss_io_r_getform");
        depth++;
 
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3946,15 +4137,15 @@ BOOL new_spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps,
  Parse a SPOOL_R_ENUMPORTS structure.
 ********************************************************************/  
 
-BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
+BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
 {
-       prs_debug(ps, depth, desc, "new_spoolss_io_r_enumports");
+       prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
        depth++;
 
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3993,7 +4184,7 @@ BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps,
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4517,7 +4708,7 @@ BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_
 ********************************************************************/  
 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
 {
-       fstring f;
+       fstring f, *tar;
        int n = 0;
        char *src;
 
@@ -4527,9 +4718,11 @@ static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
        *ar = NULL;
 
        while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
-               unistr_to_dos(f, src, sizeof(f)-1);
+               rpcstr_pull(f, src, sizeof(f)-1, -1, 0);
                src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
-               *ar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
+               tar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
+               if (!tar) return False;
+               else *ar = tar;
                fstrcpy((*ar)[n], f);
                n++;
        }
@@ -4598,9 +4791,12 @@ BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LE
  init a SPOOL_Q_ADDPRINTERDRIVER struct
  ******************************************************************/
 
-BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *ctx, SPOOL_Q_ADDPRINTERDRIVER *q_u, 
-                                    const char* srv_name, uint32 level, 
-                                    PRINTER_DRIVER_CTR *info)
+BOOL make_spoolss_q_addprinterdriver(
+       TALLOC_CTX *mem_ctx,
+       SPOOL_Q_ADDPRINTERDRIVER *q_u, 
+       const char* srv_name, 
+       uint32 level, 
+       PRINTER_DRIVER_CTR *info)
 {
        DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
        
@@ -4613,54 +4809,57 @@ BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *ctx, SPOOL_Q_ADDPRINTERDRIVER *
        q_u->info.ptr = (info!=NULL)?1:0;
        switch (level)
        {
-               /* info level 3 is supported by Windows 95/98, 
-                  WinNT and Win2k */
-               case 3 :
-                       q_u->info.info_3=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)
-                                         talloc_zero(ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
-                       make_spool_driver_info_3(ctx,q_u->info.info_3, info->info3);
-                       break;
+       /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
+       case 3 :
+               make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
+               break;
                
-               /* info level 6 is supported by WinME and Win2k */
-               case 6:
-                       /* WRITEME!!  will add later  --jerry */
-                       break;
-               default:
-                       DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown \
-info level [%d]\n", level));
-                       break;
-       
+       /* info level 6 is supported by WinME and Win2k */
+       case 6:
+               /* WRITEME!!  will add later  --jerry */
+               break;
+               
+       default:
+               DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
+               break;
        }
        
        return True;
 }
 
-BOOL make_spool_driver_info_3(TALLOC_CTX *ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *spool_drv_info,
-                             DRIVER_INFO_3 *info3)
+BOOL make_spoolss_driver_info_3(
+       TALLOC_CTX *mem_ctx,
+       SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
+       DRIVER_INFO_3 *info3
+)
 {
        uint32          len = 0;
        uint16          *ptr = info3->dependentfiles;
        BOOL            done = False;
        BOOL            null_char = False;
-
-       spool_drv_info->cversion        = info3->version;
-       spool_drv_info->name_ptr        = (info3->name.buffer!=NULL)?1:0;
-       spool_drv_info->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
-       spool_drv_info->driverpath_ptr  = (info3->driverpath.buffer!=NULL)?1:0;
-       spool_drv_info->datafile_ptr    = (info3->datafile.buffer!=NULL)?1:0;
-       spool_drv_info->configfile_ptr  = (info3->configfile.buffer!=NULL)?1:0;
-       spool_drv_info->helpfile_ptr    = (info3->helpfile.buffer!=NULL)?1:0;
-       spool_drv_info->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
-       spool_drv_info->defaultdatatype_ptr     = (info3->defaultdatatype.buffer!=NULL)?1:0;
-
-       init_unistr2_from_unistr(&spool_drv_info->name, &info3->name);
-       init_unistr2_from_unistr(&spool_drv_info->environment, &info3->architecture);
-       init_unistr2_from_unistr(&spool_drv_info->driverpath, &info3->driverpath);
-       init_unistr2_from_unistr(&spool_drv_info->datafile, &info3->datafile);
-       init_unistr2_from_unistr(&spool_drv_info->configfile, &info3->configfile);
-       init_unistr2_from_unistr(&spool_drv_info->helpfile, &info3->helpfile);
-       init_unistr2_from_unistr(&spool_drv_info->monitorname, &info3->monitorname);
-       init_unistr2_from_unistr(&spool_drv_info->defaultdatatype, &info3->defaultdatatype);
+       SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
+
+       if (!(inf=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)talloc_zero(mem_ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3))))
+               return False;
+       
+       inf->cversion   = info3->version;
+       inf->name_ptr   = (info3->name.buffer!=NULL)?1:0;
+       inf->environment_ptr    = (info3->architecture.buffer!=NULL)?1:0;
+       inf->driverpath_ptr     = (info3->driverpath.buffer!=NULL)?1:0;
+       inf->datafile_ptr       = (info3->datafile.buffer!=NULL)?1:0;
+       inf->configfile_ptr     = (info3->configfile.buffer!=NULL)?1:0;
+       inf->helpfile_ptr       = (info3->helpfile.buffer!=NULL)?1:0;
+       inf->monitorname_ptr    = (info3->monitorname.buffer!=NULL)?1:0;
+       inf->defaultdatatype_ptr        = (info3->defaultdatatype.buffer!=NULL)?1:0;
+
+       init_unistr2_from_unistr(&inf->name, &info3->name);
+       init_unistr2_from_unistr(&inf->environment, &info3->architecture);
+       init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
+       init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
+       init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
+       init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
+       init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
+       init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
 
        while (!done)
        {
@@ -4683,30 +4882,38 @@ BOOL make_spool_driver_info_3(TALLOC_CTX *ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
                len++;
                ptr++;
        }
-       spool_drv_info->dependentfiles_ptr = (info3->dependentfiles!=NULL)?1:0;
-       spool_drv_info->dependentfilessize = len;
-       if(!make_spool_buffer5(ctx, &spool_drv_info->dependentfiles, len, info3->dependentfiles))
+       inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
+       inf->dependentfilessize = len;
+       if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
+       {
+               safe_free (inf);
                return False;
+       }
+       
+       *spool_drv_info = inf;
        
        return True;
-}           
+}
 
 /*******************************************************************
  make a BUFFER5 struct from a uint16*
  ******************************************************************/
 
-BOOL make_spool_buffer5(TALLOC_CTX *ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
+BOOL make_spoolss_buffer5(
+       TALLOC_CTX *mem_ctx,
+       BUFFER5 *buf5, 
+       uint32 len, 
+       uint16 *src
+)
 {
 
        buf5->buf_len = len;
-       if((buf5->buffer=(uint16*)talloc(ctx, sizeof(uint16)*len)) == NULL)
+       if((buf5->buffer=(uint16*)talloc_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL)
        {
-               DEBUG(0,("make_spool_buffer5: Unable to malloc memory for buffer!\n"));
+               DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
                return False;
        }
        
-       memcpy(buf5->buffer, src, sizeof(uint16)*len);
-
        return True;
 }
 
@@ -4793,9 +5000,11 @@ BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
        DEBUGADD(8,( "monitorname:     %s\n", d->monitorname));
        DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
 
-       uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles );
-
-       return True;
+       if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
+               return True;
+       
+       free(*asc);
+       return False;
 }
 
 /*******************************************************************
@@ -4838,10 +5047,16 @@ BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
        DEBUGADD(8,( "monitorname:     %s\n", d->monitorname));
        DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
 
-       uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles );
-       uniarray_2_dosarray(&uni->previousnames, &d->previousnames );
-
+       if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
+               goto error;
+       if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
+               goto error;
+       
        return True;
+       
+error:
+       free(*asc);
+       return False;
 }
 
 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
@@ -4942,7 +5157,7 @@ BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q
        if(!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
                
        if(!prs_align(ps))
@@ -4966,7 +5181,7 @@ BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4992,7 +5207,7 @@ BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5040,7 +5255,7 @@ BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5055,6 +5270,57 @@ BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q
 /*******************************************************************
 ********************************************************************/  
 
+BOOL spoolss_io_q_addprintprocessor(char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
+               return False;
+       if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
+               return False;
+               
+       if (!prs_align(ps))
+               return False;
+       if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
+               return False;
+               
+       if (!prs_align(ps))
+               return False;
+       if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
+               return False;
+
+       if (!prs_align(ps))
+               return False;
+       if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+********************************************************************/  
+
+BOOL spoolss_io_r_addprintprocessor(char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
+{              
+       prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("status", ps, depth, &r_u->status))
+               return False;
+
+       return True;            
+}
+
+/*******************************************************************
+********************************************************************/  
+
 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
@@ -5063,7 +5329,7 @@ BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATY
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5111,7 +5377,7 @@ BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATY
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!new_spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
+       if(!spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5146,7 +5412,7 @@ BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u,
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5169,7 +5435,7 @@ BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u,
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5200,14 +5466,8 @@ BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_
        if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
                return False;
 
-       if (MARSHALLING(ps)) {
-               /* "Value is actually a UNICODE string. It's already little-endian so don't reverse. */
-               if(!prs_uint8s(False, "value", ps, depth, (uint8 *)r_u->value, r_u->valuesize * 2))
-                       return False;
-       } else {
-               if(!prs_uint16s(False, "value", ps, depth, r_u->value, r_u->valuesize ))
-                       return False;
-       }
+       if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
+               return False;
 
        if(!prs_align(ps))
                return False;
@@ -5300,12 +5560,14 @@ BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_st
                case 0x3:
                case 0x4:
                case 0x7:
-                       if (UNMARSHALLING(ps))
-                               q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
-                       if(q_u->data == NULL)
-                               return False;
-                       if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
-                               return False;
+            if (q_u->max_len) {
+                if (UNMARSHALLING(ps))
+                               q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
+                       if(q_u->data == NULL)
+                               return False;
+                       if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
+                               return False;
+            }
                        if(!prs_align(ps))
                                return False;
                        break;
@@ -5365,6 +5627,7 @@ BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
        }
                
        DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
+       dump_data(10, (char *)(*param)->data, (*param)->data_len);
 
        return True;
 }
@@ -5547,7 +5810,7 @@ BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int de
        if (!prs_align(ps))
                return False;
                
-       if (!new_spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5581,7 +5844,7 @@ BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int de
        if(!prs_uint32("level", ps, depth, &q_u->level))
                return False;
        
-       if(!new_spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
                return False;
 
        if(!prs_align(ps))
@@ -5622,124 +5885,10 @@ void free_printer_info_3(PRINTER_INFO_3 *printer)
        }
 }
 
-static PRINTER_INFO_2 *prt2_dup(const PRINTER_INFO_2* from)
-{
-       PRINTER_INFO_2 *copy = (PRINTER_INFO_2 *)malloc(sizeof(PRINTER_INFO_2));
-       if (copy != NULL) {
-               if (from != NULL)
-                       memcpy(copy, from, sizeof(*copy));
-               else
-                       ZERO_STRUCTP(copy);
-       }
-       return copy;
-}
-
-void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries)
-{
-       void(*fn)(void*) = (void(*)(void*))&free_printer_info_2;
-       free_void_array(num_entries, (void**)entries, *fn);
-}
-
-PRINTER_INFO_2 *add_print2_to_array(uint32 *len, PRINTER_INFO_2 ***array,
-                               const PRINTER_INFO_2 *prt)
-{
-       void*(*fn)(const void*) = (void*(*)(const void*))&prt2_dup;
-       return (PRINTER_INFO_2*)add_copy_to_array(len,
-                  (void***)array, (const void*)prt, *fn, True);
-}
-
-static PRINTER_INFO_1 *prt1_dup(const PRINTER_INFO_1* from)
-{
-       PRINTER_INFO_1 *copy = (PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1));
-       if (copy != NULL) {
-               if (from != NULL)
-                       memcpy(copy, from, sizeof(*copy));
-               else
-                       ZERO_STRUCTP(copy);
-       }
-       return copy;
-}
-
-void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries)
-{
-       void(*fn)(void*) = (void(*)(void*))&free;
-       free_void_array(num_entries, (void**)entries, *fn);
-}
-
-PRINTER_INFO_1 *add_print1_to_array(uint32 *len, PRINTER_INFO_1 ***array,
-                               const PRINTER_INFO_1 *prt)
-{
-       void*(*fn)(const void*) = (void*(*)(const void*))&prt1_dup;
-       return (PRINTER_INFO_1*)add_copy_to_array(len,
-                          (void***)array, (const void*)prt, *fn, True);
-}
-
-static JOB_INFO_1 *job1_dup(const JOB_INFO_1* from)
-{
-       JOB_INFO_1 *copy = (JOB_INFO_1 *)malloc(sizeof(JOB_INFO_1));
-       if (copy != NULL)
-       {
-               if (from != NULL)
-               {
-                       memcpy(copy, from, sizeof(*copy));
-               }
-               else
-               {
-                       ZERO_STRUCTP(copy);
-               }
-       }
-       return copy;
-}
-
-void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries)
-{
-       void(*fn)(void*) = (void(*)(void*))&free;
-       free_void_array(num_entries, (void**)entries, *fn);
-}
-
-JOB_INFO_1 *add_job1_to_array(uint32 *len, JOB_INFO_1 ***array,
-                               const JOB_INFO_1 *job)
-{
-       void*(*fn)(const void*) = (void*(*)(const void*))&job1_dup;
-       return (JOB_INFO_1*)add_copy_to_array(len,
-                          (void***)array, (const void*)job, *fn, True);
-}
-
-static JOB_INFO_2 *job2_dup(const JOB_INFO_2* from)
-{
-       JOB_INFO_2 *copy = (JOB_INFO_2 *)malloc(sizeof(JOB_INFO_2));
-       if (copy != NULL)
-       {
-               if (from != NULL)
-               {
-                       memcpy(copy, from, sizeof(*copy));
-               }
-               else
-               {
-                       ZERO_STRUCTP(copy);
-               }
-       }
-       return copy;
-}
-
 void free_job_info_2(JOB_INFO_2 *job)
 {
-       if (job!=NULL)
-               free_devmode(job->devmode);
-}
-
-void free_job2_array(uint32 num_entries, JOB_INFO_2 **entries)
-{
-       void(*fn)(void*) = (void(*)(void*))&free_job_info_2;
-       free_void_array(num_entries, (void**)entries, *fn);
-}
-
-JOB_INFO_2 *add_job2_to_array(uint32 *len, JOB_INFO_2 ***array,
-                               const JOB_INFO_2 *job)
-{
-       void*(*fn)(const void*) = (void*(*)(const void*))&job2_dup;
-       return (JOB_INFO_2*)add_copy_to_array(len,
-                          (void***)array, (const void*)job, *fn, True);
+    if (job!=NULL)
+        free_devmode(job->devmode);
 }
 
 /*******************************************************************