The first of Martin Zielinski <mz@seh.de> Vista printing patches.
[samba.git] / source / rpc_parse / parse_spoolss.c
index 03b204e69d4b1674d24213178586cb5cfd8c34a1..ec6d44293d2f1181eee3d83596ebbb228c5f9111 100644 (file)
@@ -9,7 +9,7 @@
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation; either version 3 of the License, or
  *  (at your option) any later version.
  *  
  *  This program is distributed in the hope that it will be useful,
@@ -18,8 +18,7 @@
  *  GNU General Public License for more details.
  *  
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "includes.h"
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_PARSE
 
-/*******************************************************************
-return the length of a UNISTR string.
-********************************************************************/  
-
-static uint32 str_len_uni(UNISTR *source)
-{
-       uint32 i=0;
-
-       if (!source->buffer)
-               return 0;
-
-       while (source->buffer[i])
-               i++;
-
-       return i;
-}
 
 /*******************************************************************
 This should be moved in a more generic lib.
 ********************************************************************/  
 
-BOOL spoolss_io_system_time(const char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
+bool spoolss_io_system_time(const char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
 {
        if(!prs_uint16("year", ps, depth, &systime->year))
                return False;
@@ -73,7 +56,7 @@ BOOL spoolss_io_system_time(const char *desc, prs_struct *ps, int depth, SYSTEMT
 /*******************************************************************
 ********************************************************************/  
 
-BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
+bool make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
 {
        systime->year=unixtime->tm_year+1900;
        systime->month=unixtime->tm_mon+1;
@@ -91,7 +74,7 @@ BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
 reads or writes an DOC_INFO structure.
 ********************************************************************/  
 
-static BOOL smb_io_doc_info_1(const char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
+static bool smb_io_doc_info_1(const char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
 {
        if (info_1 == NULL) return False;
 
@@ -122,7 +105,7 @@ static BOOL smb_io_doc_info_1(const char *desc, DOC_INFO_1 *info_1, prs_struct *
 reads or writes an DOC_INFO structure.
 ********************************************************************/  
 
-static BOOL smb_io_doc_info(const char *desc, DOC_INFO *info, prs_struct *ps, int depth)
+static bool smb_io_doc_info(const char *desc, DOC_INFO *info, prs_struct *ps, int depth)
 {
        uint32 useless_ptr=0;
        
@@ -171,7 +154,7 @@ static BOOL smb_io_doc_info(const char *desc, DOC_INFO *info, prs_struct *ps, in
 reads or writes an DOC_INFO_CONTAINER structure.
 ********************************************************************/  
 
-static BOOL smb_io_doc_info_container(const char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
+static bool smb_io_doc_info_container(const char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
 {
        if (cont == NULL) return False;
 
@@ -198,7 +181,7 @@ reads or writes an NOTIFY OPTION TYPE structure.
    structure.  The _TYPE structure is really the deferred referrants (i.e
    the notify fields array) of the _TYPE structure. -tpot */
 
-static BOOL smb_io_notify_option_type(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
+static bool smb_io_notify_option_type(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "smb_io_notify_option_type");
        depth++;
@@ -226,7 +209,7 @@ static BOOL smb_io_notify_option_type(const char *desc, SPOOL_NOTIFY_OPTION_TYPE
 reads or writes an NOTIFY OPTION TYPE DATA.
 ********************************************************************/  
 
-static BOOL smb_io_notify_option_type_data(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
+static bool smb_io_notify_option_type_data(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
 {
        int i;
 
@@ -246,6 +229,10 @@ static BOOL smb_io_notify_option_type_data(const char *desc, SPOOL_NOTIFY_OPTION
        if (type->count2 != type->count)
                DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
 
+       if (type->count2 > MAX_NOTIFY_TYPE_FOR_NOW) {
+               return False;
+       }
+
        /* parse the option type data */
        for(i=0;i<type->count2;i++)
                if(!prs_uint16("fields",ps,depth,&type->fields[i]))
@@ -257,7 +244,7 @@ static BOOL smb_io_notify_option_type_data(const char *desc, SPOOL_NOTIFY_OPTION
 reads or writes an NOTIFY OPTION structure.
 ********************************************************************/  
 
-static BOOL smb_io_notify_option_type_ctr(const char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
+static bool smb_io_notify_option_type_ctr(const char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
 {              
        int i;
        
@@ -268,8 +255,8 @@ static BOOL smb_io_notify_option_type_ctr(const char *desc, SPOOL_NOTIFY_OPTION_
                return False;
 
        /* reading */
-       if (UNMARSHALLING(ps))
-               if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)prs_alloc_mem(ps,ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
+       if (UNMARSHALLING(ps) && ctr->count)
+               if((ctr->type=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION_TYPE,ctr->count)) == NULL)
                        return False;
                
        /* the option type struct */
@@ -289,7 +276,7 @@ static BOOL smb_io_notify_option_type_ctr(const char *desc, SPOOL_NOTIFY_OPTION_
 reads or writes an NOTIFY OPTION structure.
 ********************************************************************/  
 
-static BOOL smb_io_notify_option(const char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
+static bool smb_io_notify_option(const char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "smb_io_notify_option");
        depth++;
@@ -320,7 +307,7 @@ static BOOL smb_io_notify_option(const char *desc, SPOOL_NOTIFY_OPTION *option,
 reads or writes an NOTIFY INFO DATA structure.
 ********************************************************************/  
 
-static BOOL smb_io_notify_info_data(const char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
+static bool smb_io_notify_info_data(const char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
 {
        uint32 useless_ptr=0x0FF0ADDE;
 
@@ -399,7 +386,7 @@ static BOOL smb_io_notify_info_data(const char *desc,SPOOL_NOTIFY_INFO_DATA *dat
 reads or writes an NOTIFY INFO DATA structure.
 ********************************************************************/  
 
-BOOL smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *data,
+bool smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *data,
                                      prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
@@ -421,20 +408,20 @@ BOOL smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *da
 
        case NOTIFY_STRING:
 
-               if (UNMARSHALLING(ps)) {
-                       data->notify_data.data.string = 
-                               (uint16 *)prs_alloc_mem(ps, data->notify_data.data.length);
-
-                       if (!data->notify_data.data.string) 
-                               return False;
-               }
-
                if (MARSHALLING(ps))
                        data->notify_data.data.length /= 2;
 
                if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
                        return False;
 
+               if (UNMARSHALLING(ps) && data->notify_data.data.length) {
+                       data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
+                                                               data->notify_data.data.length);
+
+                       if (!data->notify_data.data.string) 
+                               return False;
+               }
+
                if (!prs_uint16uni(True, "string", ps, depth, data->notify_data.data.string,
                                   data->notify_data.data.length))
                        return False;
@@ -446,9 +433,9 @@ BOOL smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *da
 
        case NOTIFY_POINTER:
 
-               if (UNMARSHALLING(ps)) {
-                       data->notify_data.data.string = 
-                               (uint16 *)prs_alloc_mem(ps, data->notify_data.data.length);
+               if (UNMARSHALLING(ps) && data->notify_data.data.length) {
+                       data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
+                                                               data->notify_data.data.length);
 
                        if (!data->notify_data.data.string) 
                                return False;
@@ -506,9 +493,13 @@ BOOL smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *da
 
                        /* Tallocate memory for string */
 
-                       data->notify_data.data.string = (uint16 *)prs_alloc_mem(ps, x * 2);
-                       if (!data->notify_data.data.string) 
-                               return False;
+                       if (x) {
+                               data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16, x * 2);
+                               if (!data->notify_data.data.string) 
+                                       return False;
+                       } else {
+                               data->notify_data.data.string = NULL;
+                       }
 
                        if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
                                return False;
@@ -530,7 +521,7 @@ BOOL smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *da
 reads or writes an NOTIFY INFO structure.
 ********************************************************************/  
 
-static BOOL smb_io_notify_info(const char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
+static bool smb_io_notify_info(const char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
 {
        int i;
 
@@ -566,23 +557,22 @@ static BOOL smb_io_notify_info(const char *desc, SPOOL_NOTIFY_INFO *info, prs_st
 /*******************************************************************
 ********************************************************************/  
 
-static BOOL spool_io_user_level_1(const char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
+bool spool_io_user_level_1( const char *desc, prs_struct *ps, int depth, SPOOL_USER_1 *q_u )
 {
        prs_debug(ps, depth, desc, "");
        depth++;
 
-       /* reading */
-       if (UNMARSHALLING(ps))
-               ZERO_STRUCTP(q_u);
-
        if (!prs_align(ps))
                return False;
+
        if (!prs_uint32("size", ps, depth, &q_u->size))
                return False;
-       if (!prs_uint32("client_name_ptr", ps, depth, &q_u->client_name_ptr))
+
+       if (!prs_io_unistr2_p("", ps, depth, &q_u->client_name))
                return False;
-       if (!prs_uint32("user_name_ptr", ps, depth, &q_u->user_name_ptr))
+       if (!prs_io_unistr2_p("", ps, depth, &q_u->user_name))
                return False;
+
        if (!prs_uint32("build", ps, depth, &q_u->build))
                return False;
        if (!prs_uint32("major", ps, depth, &q_u->major))
@@ -592,11 +582,12 @@ static BOOL spool_io_user_level_1(const char *desc, SPOOL_USER_1 *q_u, prs_struc
        if (!prs_uint32("processor", ps, depth, &q_u->processor))
                return False;
 
-       if (!smb_io_unistr2("", &q_u->client_name, q_u->client_name_ptr, ps, depth))
+       if (!prs_io_unistr2("", ps, depth, q_u->client_name))
                return False;
        if (!prs_align(ps))
                return False;
-       if (!smb_io_unistr2("", &q_u->user_name,   q_u->user_name_ptr,   ps, depth))
+
+       if (!prs_io_unistr2("", ps, depth, q_u->user_name))
                return False;
 
        return True;
@@ -605,7 +596,7 @@ static BOOL spool_io_user_level_1(const char *desc, SPOOL_USER_1 *q_u, prs_struc
 /*******************************************************************
 ********************************************************************/  
 
-static BOOL spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
+static bool spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
 {
        if (q_u==NULL)
                return False;
@@ -616,21 +607,20 @@ static BOOL spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struc
        if (!prs_align(ps))
                return False;
 
-       /* From looking at many captures in ethereal, it looks like
-          the level and ptr fields should be transposed.  -tpot */
-
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
-       if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
-               return False;
        
-       switch (q_u->level) {   
-       case 1:
-               if (!spool_io_user_level_1("", &q_u->user1, ps, depth))
-                       return False;
-               break;
-       default:
-               return False;   
+       switch ( q_u->level ) 
+       {       
+               case 1:
+                       if ( !prs_pointer( "" , ps, depth, (void*)&q_u->user.user1, 
+                               sizeof(SPOOL_USER_1), (PRS_POINTER_CAST)spool_io_user_level_1 )) 
+                       {
+                               return False;
+                       }
+                       break;
+               default:
+                       return False;   
        }       
 
        return True;
@@ -643,11 +633,13 @@ static BOOL spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struc
 
 #define DM_NUM_OPTIONAL_FIELDS                 8
 
-BOOL spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
+bool spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
 {
        int available_space;            /* size of the device mode left to parse */
                                        /* only important on unmarshalling       */
        int i = 0;
+       uint16 *unistr_buffer;
+       int j;
                                        
        struct optional_fields {
                fstring         name;
@@ -679,36 +671,25 @@ BOOL spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE
        depth++;
 
        if (UNMARSHALLING(ps)) {
-               devmode->devicename.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
+               devmode->devicename.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
                if (devmode->devicename.buffer == NULL)
                        return False;
+               unistr_buffer = devmode->devicename.buffer;
        }
-
-       if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, MAXDEVICENAME))
+       else {
+               /* devicename is a static sized string but the buffer we set is not */
+               unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
+               memset( unistr_buffer, 0x0, MAXDEVICENAME );
+               for ( j=0; devmode->devicename.buffer[j]; j++ )
+                       unistr_buffer[j] = devmode->devicename.buffer[j];
+       }
+               
+       if (!prs_uint16uni(True,"devicename", ps, depth, unistr_buffer, MAXDEVICENAME))
                return False;
        
        if (!prs_uint16("specversion",      ps, depth, &devmode->specversion))
                return False;
                
-       /* Sanity Check - look for unknown specversions, but don't fail if we see one.
-          Let the size determine that */
-          
-       switch (devmode->specversion) {
-               /* list of observed spec version's */
-               case 0x0320:
-               case 0x0400:
-               case 0x0401:
-               case 0x040d:
-                       break;
-                       
-               default:
-                       DEBUG(0,("spoolss_io_devmode: Unknown specversion in devicemode [0x%x]\n",
-                               devmode->specversion));
-                       DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
-                       break;
-       }
-                       
-       
        if (!prs_uint16("driverversion",    ps, depth, &devmode->driverversion))
                return False;
        if (!prs_uint16("size",             ps, depth, &devmode->size))
@@ -745,12 +726,20 @@ BOOL spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE
                return False;
 
        if (UNMARSHALLING(ps)) {
-               devmode->formname.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
+               devmode->formname.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
                if (devmode->formname.buffer == NULL)
                        return False;
+               unistr_buffer = devmode->formname.buffer;
        }
-
-       if (!prs_uint16uni(True, "formname",  ps, depth, devmode->formname.buffer, 32))
+       else {
+               /* devicename is a static sized string but the buffer we set is not */
+               unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
+               memset( unistr_buffer, 0x0, MAXDEVICENAME );
+               for ( j=0; devmode->formname.buffer[j]; j++ )
+                       unistr_buffer[j] = devmode->formname.buffer[j];
+       }
+       
+       if (!prs_uint16uni(True, "formname",  ps, depth, unistr_buffer, MAXDEVICENAME))
                return False;
        if (!prs_uint16("logpixels",        ps, depth, &devmode->logpixels))
                return False;
@@ -810,15 +799,15 @@ BOOL spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE
 
        if (devmode->driverextra!=0) {
                if (UNMARSHALLING(ps)) {
-                       devmode->private=(uint8 *)prs_alloc_mem(ps, devmode->driverextra*sizeof(uint8));
-                       if(devmode->private == NULL)
+                       devmode->dev_private=PRS_ALLOC_MEM(ps, uint8, devmode->driverextra);
+                       if(devmode->dev_private == NULL)
                                return False;
-                       DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra)); 
+                       DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for dev_private\n",devmode->driverextra)); 
                }
                        
-               DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
-               if (!prs_uint8s(False, "private",  ps, depth,
-                               devmode->private, devmode->driverextra))
+               DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of dev_private\n",devmode->driverextra));
+               if (!prs_uint8s(False, "dev_private",  ps, depth,
+                               devmode->dev_private, devmode->driverextra))
                        return False;
        }
 
@@ -829,7 +818,7 @@ BOOL spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE
  Read or write a DEVICEMODE container
 ********************************************************************/  
 
-static BOOL spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
+static bool spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
 {
        if (dm_c==NULL)
                return False;
@@ -856,7 +845,7 @@ static BOOL spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_str
        /* so we have a DEVICEMODE to follow */         
        if (UNMARSHALLING(ps)) {
                DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
-               dm_c->devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE));
+               dm_c->devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1);
                if(dm_c->devmode == NULL)
                        return False;
        }
@@ -874,7 +863,7 @@ static BOOL spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_str
 /*******************************************************************
 ********************************************************************/  
 
-static BOOL spoolss_io_printer_default(const char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
+static bool spoolss_io_printer_default(const char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
 {
        if (pd==NULL)
                return False;
@@ -907,7 +896,7 @@ static BOOL spoolss_io_printer_default(const char *desc, PRINTER_DEFAULT *pd, pr
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
+bool make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
                const fstring printername, 
                const fstring datatype, 
                uint32 access_required,
@@ -915,30 +904,44 @@ BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
                const fstring user_name)
 {
        DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
-       q_u->printername_ptr = (printername!=NULL)?1:0;
-       init_unistr2(&q_u->printername, printername, strlen(printername)+1);
+
+       q_u->printername = TALLOC_P( talloc_tos(), UNISTR2 );
+       if (!q_u->printername) {
+               return False;
+       }
+       init_unistr2(q_u->printername, printername, UNI_STR_TERMINATE);
 
        q_u->printer_default.datatype_ptr = 0;
-/*
-       q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
-       init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
-*/
+
        q_u->printer_default.devmode_cont.size=0;
        q_u->printer_default.devmode_cont.devmode_ptr=0;
        q_u->printer_default.devmode_cont.devmode=NULL;
        q_u->printer_default.access_required=access_required;
-       q_u->user_switch=1;
-       q_u->user_ctr.level=1;
-       q_u->user_ctr.ptr=1;
-       q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+10;
-       q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
-       q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
-       q_u->user_ctr.user1.build=1381;
-       q_u->user_ctr.user1.major=2;
-       q_u->user_ctr.user1.minor=0;
-       q_u->user_ctr.user1.processor=0;
-       init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
-       init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
+
+       q_u->user_switch = 1;
+       
+       q_u->user_ctr.level                 = 1;
+       q_u->user_ctr.user.user1            = TALLOC_P( talloc_tos(), SPOOL_USER_1 );
+       if (!q_u->user_ctr.user.user1) {
+               return False;
+       }
+       q_u->user_ctr.user.user1->size      = strlen(clientname) + strlen(user_name) + 10;
+       q_u->user_ctr.user.user1->build     = 1381;
+       q_u->user_ctr.user.user1->major     = 2;
+       q_u->user_ctr.user.user1->minor     = 0;
+       q_u->user_ctr.user.user1->processor = 0;
+
+       q_u->user_ctr.user.user1->client_name = TALLOC_P( talloc_tos(), UNISTR2 );
+       if (!q_u->user_ctr.user.user1->client_name) {
+               return False;
+       }
+       q_u->user_ctr.user.user1->user_name   = TALLOC_P( talloc_tos(), UNISTR2 );
+       if (!q_u->user_ctr.user.user1->user_name) {
+               return False;
+       }
+
+       init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
+       init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
        
        return True;
 }
@@ -947,23 +950,22 @@ BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
  * init a structure.
  ********************************************************************/
 
-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)
+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;
+       if (!ctr || !ctr->printers_2) 
+               return False;
 
        ZERO_STRUCTP(q_u);
 
-       q_u->server_name_ptr = (srv_name!=NULL)?1:0;
-       init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
+       q_u->server_name = TALLOC_P( mem_ctx, UNISTR2 );
+       if (!q_u->server_name) {
+               return False;
+       }
+       init_unistr2(q_u->server_name, srv_name, UNI_FLAGS_NONE);
 
        q_u->level = level;
        
@@ -983,18 +985,29 @@ BOOL make_spoolss_q_addprinterex(
 
        q_u->user_switch=1;
 
-       q_u->user_ctr.level=1;
-       q_u->user_ctr.ptr=1;
-       q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
-       q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
-       q_u->user_ctr.user1.build=1381;
-       q_u->user_ctr.user1.major=2;
-       q_u->user_ctr.user1.minor=0;
-       q_u->user_ctr.user1.processor=0;
-       init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
-       init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
-       q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
-                                q_u->user_ctr.user1.client_name.uni_str_len + 2;
+       q_u->user_ctr.level                 = 1;
+       q_u->user_ctr.user.user1            = TALLOC_P( talloc_tos(), SPOOL_USER_1 );
+       if (!q_u->user_ctr.user.user1) {
+               return False;
+       }
+       q_u->user_ctr.user.user1->build     = 1381;
+       q_u->user_ctr.user.user1->major     = 2; 
+       q_u->user_ctr.user.user1->minor     = 0;
+       q_u->user_ctr.user.user1->processor = 0;
+
+       q_u->user_ctr.user.user1->client_name = TALLOC_P( mem_ctx, UNISTR2 );
+       if (!q_u->user_ctr.user.user1->client_name) {
+               return False;
+       }
+       q_u->user_ctr.user.user1->user_name   = TALLOC_P( mem_ctx, UNISTR2 );
+       if (!q_u->user_ctr.user.user1->user_name) {
+               return False;
+       }
+       init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
+       init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
+
+       q_u->user_ctr.user.user1->size = q_u->user_ctr.user.user1->user_name->uni_str_len +
+                                  q_u->user_ctr.user.user1->client_name->uni_str_len + 2;
        
        return True;
 }
@@ -1003,18 +1016,18 @@ BOOL make_spoolss_q_addprinterex(
 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
 *******************************************************************/
 
-BOOL make_spoolss_printer_info_2(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2, 
+bool make_spoolss_printer_info_2(TALLOC_CTX *ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2, 
                                PRINTER_INFO_2 *info)
 {
 
        SPOOL_PRINTER_INFO_LEVEL_2 *inf;
 
        /* allocate the necessary memory */
-       if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_2*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_2)))) {
+       if (!(inf=TALLOC_P(ctx, SPOOL_PRINTER_INFO_LEVEL_2))) {
                DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
                return False;
        }
-       
+
        inf->servername_ptr     = (info->servername.buffer!=NULL)?1:0;
        inf->printername_ptr    = (info->printername.buffer!=NULL)?1:0;
        inf->sharename_ptr      = (info->sharename.buffer!=NULL)?1:0;
@@ -1035,31 +1048,79 @@ BOOL make_spoolss_printer_info_2(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2
        inf->untiltime          = info->untiltime;
        inf->cjobs              = info->cjobs;
        inf->averageppm = info->averageppm;
-       init_unistr2_from_unistr(&inf->servername,      &info->servername);
-       init_unistr2_from_unistr(&inf->printername,     &info->printername);
-       init_unistr2_from_unistr(&inf->sharename,       &info->sharename);
-       init_unistr2_from_unistr(&inf->portname,        &info->portname);
-       init_unistr2_from_unistr(&inf->drivername,      &info->drivername);
-       init_unistr2_from_unistr(&inf->comment,         &info->comment);
-       init_unistr2_from_unistr(&inf->location,        &info->location);
-       init_unistr2_from_unistr(&inf->sepfile,         &info->sepfile);
-       init_unistr2_from_unistr(&inf->printprocessor,  &info->printprocessor);
-       init_unistr2_from_unistr(&inf->datatype,        &info->datatype);
-       init_unistr2_from_unistr(&inf->parameters,      &info->parameters);
-       init_unistr2_from_unistr(&inf->datatype,        &info->datatype);
+       init_unistr2_from_unistr(inf, &inf->servername, &info->servername);
+       init_unistr2_from_unistr(inf, &inf->printername, &info->printername);
+       init_unistr2_from_unistr(inf, &inf->sharename, &info->sharename);
+       init_unistr2_from_unistr(inf, &inf->portname, &info->portname);
+       init_unistr2_from_unistr(inf, &inf->drivername, &info->drivername);
+       init_unistr2_from_unistr(inf, &inf->comment, &info->comment);
+       init_unistr2_from_unistr(inf, &inf->location, &info->location);
+       init_unistr2_from_unistr(inf, &inf->sepfile, &info->sepfile);
+       init_unistr2_from_unistr(inf, &inf->printprocessor, &info->printprocessor);
+       init_unistr2_from_unistr(inf, &inf->datatype, &info->datatype);
+       init_unistr2_from_unistr(inf, &inf->parameters, &info->parameters);
+       init_unistr2_from_unistr(inf, &inf->datatype, &info->datatype);
 
        *spool_info2 = inf;
 
        return True;
 }
 
+/*******************************************************************
+create a SPOOL_PRINTER_INFO_3 struct from a PRINTER_INFO_3 struct
+*******************************************************************/
+
+bool make_spoolss_printer_info_3(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3 **spool_info3, 
+                               PRINTER_INFO_3 *info)
+{
+
+       SPOOL_PRINTER_INFO_LEVEL_3 *inf;
+
+       /* allocate the necessary memory */
+       if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3))) {
+               DEBUG(0,("make_spoolss_printer_info_3: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_3 sruct!\n"));
+               return False;
+       }
+       
+       inf->secdesc_ptr        = (info->secdesc!=NULL)?1:0;
+
+       *spool_info3 = inf;
+
+       return True;
+}
+
+/*******************************************************************
+create a SPOOL_PRINTER_INFO_7 struct from a PRINTER_INFO_7 struct
+*******************************************************************/
+
+bool make_spoolss_printer_info_7(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7 **spool_info7, 
+                               PRINTER_INFO_7 *info)
+{
+
+       SPOOL_PRINTER_INFO_LEVEL_7 *inf;
+
+       /* allocate the necessary memory */
+       if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7))) {
+               DEBUG(0,("make_spoolss_printer_info_7: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_7 struct!\n"));
+               return False;
+       }
+
+       inf->guid_ptr = (info->guid.buffer!=NULL)?1:0;
+       inf->action = info->action;
+       init_unistr2_from_unistr(inf, &inf->guid, &info->guid);
+
+       *spool_info7 = inf;
+
+       return True;
+}
+
 
 /*******************************************************************
  * read a structure.
  * called from spoolss_q_open_printer_ex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_open_printer(const char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_open_printer(const char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL)
                return False;
@@ -1070,9 +1131,9 @@ BOOL spoolss_io_q_open_printer(const char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_
        if (!prs_align(ps))
                return False;
 
-       if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
+       if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
                return False;
-       if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
+       if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
                return False;
        
        if (!prs_align(ps))
@@ -1090,7 +1151,7 @@ BOOL spoolss_io_q_open_printer(const char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_
  * called from spoolss_open_printer_ex (cli_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_open_printer(const char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_open_printer(const char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
 {
        if (r_u == NULL) return False;
 
@@ -1115,7 +1176,7 @@ BOOL spoolss_io_r_open_printer(const char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_
  * called from spoolss_q_open_printer_ex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_open_printer_ex(const char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_open_printer_ex(const char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL)
                return False;
@@ -1126,9 +1187,9 @@ BOOL spoolss_io_q_open_printer_ex(const char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u
        if (!prs_align(ps))
                return False;
 
-       if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
+       if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
                return False;
-       if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
+       if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
                return False;
        
        if (!prs_align(ps))
@@ -1151,7 +1212,7 @@ BOOL spoolss_io_q_open_printer_ex(const char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u
  * called from spoolss_open_printer_ex (cli_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_open_printer_ex(const char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_open_printer_ex(const char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
 {
        if (r_u == NULL) return False;
 
@@ -1173,7 +1234,37 @@ BOOL spoolss_io_r_open_printer_ex(const char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u
 /*******************************************************************
  * init a structure.
  ********************************************************************/
-BOOL make_spoolss_q_deleteprinterdriver(
+bool make_spoolss_q_deleteprinterdriverex( TALLOC_CTX *mem_ctx,
+                                           SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, 
+                                           const char *server,
+                                           const char* arch, 
+                                           const char* driver,
+                                           int version)
+{
+       DEBUG(5,("make_spoolss_q_deleteprinterdriverex\n"));
+       q_u->server_ptr = (server!=NULL)?1:0;
+       q_u->delete_flags = DPD_DELETE_UNUSED_FILES;
+       /* these must be NULL terminated or else NT4 will
+          complain about invalid parameters --jerry */
+       init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
+
+       if (version >= 0) { 
+               q_u->delete_flags |= DPD_DELETE_SPECIFIC_VERSION;
+               q_u->version = version;
+       }
+
+       return True;
+}
+
+
+/*******************************************************************
+ * init a structure.
+ ********************************************************************/
+bool make_spoolss_q_deleteprinterdriver(
        TALLOC_CTX *mem_ctx,
        SPOOL_Q_DELETEPRINTERDRIVER *q_u, 
        const char *server,
@@ -1187,20 +1278,18 @@ BOOL make_spoolss_q_deleteprinterdriver(
 
        /* 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);
-
+       init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
        
        return True;
 }
 
-
 /*******************************************************************
  * make a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
+bool make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
                                   const POLICY_HND *handle,
                                   const char *valuename, uint32 size)
 {
@@ -1209,7 +1298,7 @@ BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
         DEBUG(5,("make_spoolss_q_getprinterdata\n"));
 
         q_u->handle = *handle;
-       init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
+       init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
         q_u->size = size;
 
         return True;
@@ -1219,7 +1308,7 @@ BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
  * make a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u,
+bool make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u,
                                     const POLICY_HND *handle,
                                     const char *keyname, 
                                     const char *valuename, uint32 size)
@@ -1229,8 +1318,8 @@ BOOL make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u,
         DEBUG(5,("make_spoolss_q_getprinterdataex\n"));
 
         q_u->handle = *handle;
-       init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
-       init_unistr2(&q_u->keyname, keyname, strlen(keyname) + 1);
+       init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
         q_u->size = size;
 
         return True;
@@ -1241,7 +1330,7 @@ BOOL make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u,
  * called from spoolss_q_getprinterdata (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_getprinterdata(const char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_getprinterdata(const char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL)
                return False;
@@ -1270,7 +1359,7 @@ BOOL spoolss_io_q_getprinterdata(const char *desc, SPOOL_Q_GETPRINTERDATA *q_u,
  * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_deleteprinterdata(const char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_deleteprinterdata(const char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL)
                return False;
@@ -1295,7 +1384,7 @@ BOOL spoolss_io_q_deleteprinterdata(const char *desc, SPOOL_Q_DELETEPRINTERDATA
  * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_deleteprinterdata(const char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_deleteprinterdata(const char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
        depth++;
@@ -1310,7 +1399,7 @@ BOOL spoolss_io_r_deleteprinterdata(const char *desc, SPOOL_R_DELETEPRINTERDATA
  * called from spoolss_q_deleteprinterdataex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_deleteprinterdataex(const char *desc, SPOOL_Q_DELETEPRINTERDATAEX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_deleteprinterdataex(const char *desc, SPOOL_Q_DELETEPRINTERDATAEX *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL)
                return False;
@@ -1336,7 +1425,7 @@ BOOL spoolss_io_q_deleteprinterdataex(const char *desc, SPOOL_Q_DELETEPRINTERDAT
  * called from spoolss_r_deleteprinterdataex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_deleteprinterdataex(const char *desc, SPOOL_R_DELETEPRINTERDATAEX *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_deleteprinterdataex(const char *desc, SPOOL_R_DELETEPRINTERDATAEX *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdataex");
        depth++;
@@ -1352,7 +1441,7 @@ BOOL spoolss_io_r_deleteprinterdataex(const char *desc, SPOOL_R_DELETEPRINTERDAT
  * called from spoolss_r_getprinterdata (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
 {
        if (r_u == NULL)
                return False;
@@ -1368,7 +1457,7 @@ BOOL spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u,
                return False;
        
        if (UNMARSHALLING(ps) && r_u->size) {
-               r_u->data = prs_alloc_mem(ps, r_u->size);
+               r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
                if(!r_u->data)
                        return False;
        }
@@ -1391,7 +1480,7 @@ BOOL spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u,
  * make a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
+bool make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
 {
        if (q_u == NULL) return False;
 
@@ -1408,7 +1497,7 @@ BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
  * called from spoolss_abortprinter (cli_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_abortprinter(const char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_abortprinter(const char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1429,7 +1518,7 @@ BOOL spoolss_io_q_abortprinter(const char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_
  * called from spoolss_r_abortprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_abortprinter(const char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_abortprinter(const char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
        depth++;
@@ -1445,7 +1534,7 @@ BOOL spoolss_io_r_abortprinter(const char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_
  * called from spoolss_deleteprinter (cli_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_deleteprinter(const char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_deleteprinter(const char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1467,7 +1556,7 @@ BOOL spoolss_io_q_deleteprinter(const char *desc, SPOOL_Q_DELETEPRINTER *q_u, pr
  * called from spoolss_deleteprinter (cli_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_deleteprinter(const char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_deleteprinter(const char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
        depth++;
@@ -1490,7 +1579,7 @@ BOOL spoolss_io_r_deleteprinter(const char *desc, SPOOL_R_DELETEPRINTER *r_u, pr
  * called from spoolss_deleteprinterdriver (cli_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_deleteprinterdriver(const char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_deleteprinterdriver(const char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1517,7 +1606,7 @@ BOOL spoolss_io_q_deleteprinterdriver(const char *desc, SPOOL_Q_DELETEPRINTERDRI
 /*******************************************************************
  * write a structure.
  ********************************************************************/
-BOOL spoolss_io_r_deleteprinterdriver(const char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_deleteprinterdriver(const char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
 {
        if (r_u == NULL) return False;
 
@@ -1540,7 +1629,7 @@ BOOL spoolss_io_r_deleteprinterdriver(const char *desc, SPOOL_R_DELETEPRINTERDRI
  * called from spoolss_deleteprinterdriver (cli_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_deleteprinterdriverex(const char *desc, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_deleteprinterdriverex(const char *desc, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1575,7 +1664,7 @@ BOOL spoolss_io_q_deleteprinterdriverex(const char *desc, SPOOL_Q_DELETEPRINTERD
 /*******************************************************************
  * write a structure.
  ********************************************************************/
-BOOL spoolss_io_r_deleteprinterdriverex(const char *desc, SPOOL_R_DELETEPRINTERDRIVEREX *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_deleteprinterdriverex(const char *desc, SPOOL_R_DELETEPRINTERDRIVEREX *r_u, prs_struct *ps, int depth)
 {
        if (r_u == NULL) return False;
 
@@ -1599,7 +1688,7 @@ BOOL spoolss_io_r_deleteprinterdriverex(const char *desc, SPOOL_R_DELETEPRINTERD
  * called from spoolss_closeprinter (cli_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_closeprinter(const char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_closeprinter(const char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1621,7 +1710,7 @@ BOOL spoolss_io_q_closeprinter(const char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_
  * called from spoolss_closeprinter (cli_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_closeprinter(const char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_closeprinter(const char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
        depth++;
@@ -1642,7 +1731,7 @@ BOOL spoolss_io_r_closeprinter(const char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_
  * called from spoolss_q_startdocprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_startdocprinter(const char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_startdocprinter(const char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1666,7 +1755,7 @@ BOOL spoolss_io_q_startdocprinter(const char *desc, SPOOL_Q_STARTDOCPRINTER *q_u
  * called from spoolss_r_startdocprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_startdocprinter(const char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_startdocprinter(const char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
        depth++;
@@ -1683,7 +1772,7 @@ BOOL spoolss_io_r_startdocprinter(const char *desc, SPOOL_R_STARTDOCPRINTER *r_u
  * called from spoolss_q_enddocprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_enddocprinter(const char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enddocprinter(const char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1704,7 +1793,7 @@ BOOL spoolss_io_q_enddocprinter(const char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, pr
  * called from spoolss_r_enddocprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_enddocprinter(const char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enddocprinter(const char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
        depth++;
@@ -1719,7 +1808,7 @@ BOOL spoolss_io_r_enddocprinter(const char *desc, SPOOL_R_ENDDOCPRINTER *r_u, pr
  * called from spoolss_q_startpageprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_startpageprinter(const char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_startpageprinter(const char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1740,7 +1829,7 @@ BOOL spoolss_io_q_startpageprinter(const char *desc, SPOOL_Q_STARTPAGEPRINTER *q
  * called from spoolss_r_startpageprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_startpageprinter(const char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_startpageprinter(const char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
        depth++;
@@ -1755,7 +1844,7 @@ BOOL spoolss_io_r_startpageprinter(const char *desc, SPOOL_R_STARTPAGEPRINTER *r
  * called from spoolss_q_endpageprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_endpageprinter(const char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_endpageprinter(const char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1776,7 +1865,7 @@ BOOL spoolss_io_q_endpageprinter(const char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u,
  * called from spoolss_r_endpageprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_endpageprinter(const char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_endpageprinter(const char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
        depth++;
@@ -1791,7 +1880,7 @@ BOOL spoolss_io_r_endpageprinter(const char *desc, SPOOL_R_ENDPAGEPRINTER *r_u,
  * called from spoolss_q_writeprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_writeprinter(const char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_writeprinter(const char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
@@ -1809,7 +1898,7 @@ BOOL spoolss_io_q_writeprinter(const char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_
        if (q_u->buffer_size!=0)
        {
                if (UNMARSHALLING(ps))
-                       q_u->buffer=(uint8 *)prs_alloc_mem(ps,q_u->buffer_size*sizeof(uint8));
+                       q_u->buffer=PRS_ALLOC_MEM(ps, uint8, q_u->buffer_size);
                if(q_u->buffer == NULL)
                        return False;   
                if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
@@ -1828,7 +1917,7 @@ BOOL spoolss_io_q_writeprinter(const char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_
  * called from spoolss_r_writeprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_writeprinter(const char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_writeprinter(const char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
        depth++;
@@ -1845,7 +1934,7 @@ BOOL spoolss_io_r_writeprinter(const char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_
  * called from spoolss_q_rffpcnex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_rffpcnex(const char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_rffpcnex(const char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
        depth++;
@@ -1876,7 +1965,7 @@ BOOL spoolss_io_q_rffpcnex(const char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *
        if (q_u->option_ptr!=0) {
        
                if (UNMARSHALLING(ps))
-                       if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
+                       if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
                                return False;
        
                if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
@@ -1891,7 +1980,7 @@ BOOL spoolss_io_q_rffpcnex(const char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *
  * called from spoolss_r_rffpcnex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_rffpcnex(const char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_rffpcnex(const char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
        depth++;
@@ -1907,7 +1996,7 @@ BOOL spoolss_io_r_rffpcnex(const char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *
  * called from spoolss_q_rfnpcnex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_rfnpcnex(const char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_rfnpcnex(const char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
        depth++;
@@ -1927,7 +2016,7 @@ BOOL spoolss_io_q_rfnpcnex(const char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *
        if (q_u->option_ptr!=0) {
        
                if (UNMARSHALLING(ps))
-                       if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
+                       if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
                                return False;
        
                if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
@@ -1942,7 +2031,7 @@ BOOL spoolss_io_q_rfnpcnex(const char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *
  * called from spoolss_r_rfnpcnex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_rfnpcnex(const char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_rfnpcnex(const char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
        depth++;
@@ -1991,33 +2080,6 @@ static uint32 size_of_nttime(NTTIME *value)
        return (sizeof(*value));
 }
 
-/*******************************************************************
- * return the length of a UNICODE string in number of char, includes:
- * - the leading zero
- * - the relative pointer size
- ********************************************************************/
-
-static uint32 size_of_relative_string(UNISTR *string)
-{
-       uint32 size=0;
-       
-       size=str_len_uni(string);       /* the string length       */
-       size=size+1;                    /* add the trailing zero   */
-       size=size*2;                    /* convert in char         */
-       size=size+4;                    /* add the size of the ptr */   
-
-#if 0  /* JERRY */
-       /* 
-        * Do not include alignment as Win2k does not align relative
-        * strings within a buffer   --jerry 
-        */
-       /* Ensure size is 4 byte multiple (prs_align is being called...). */
-       /* size += ((4 - (size & 3)) & 3); */
-#endif 
-
-       return size;
-}
-
 /*******************************************************************
  * return the length of a uint32 (obvious, but the code is clean)
  ********************************************************************/
@@ -2042,278 +2104,11 @@ static uint32 size_of_systemtime(SYSTEMTIME *systime)
                return (sizeof(SYSTEMTIME) +4);
 }
 
-/*******************************************************************
- * write a UNICODE string and its relative pointer.
- * used by all the RPC structs passing a buffer
- *
- * As I'm a nice guy, I'm forcing myself to explain this code.
- * MS did a good job in the overall spoolss code except in some
- * functions where they are passing the API buffer directly in the
- * RPC request/reply. That's to maintain compatiility at the API level.
- * They could have done it the good way the first time.
- *
- * So what happen is: the strings are written at the buffer's end, 
- * in the reverse order of the original structure. Some pointers to
- * the strings are also in the buffer. Those are relative to the
- * buffer's start.
- *
- * If you don't understand or want to change that function,
- * first get in touch with me: jfm@samba.org
- *
- ********************************************************************/
-
-static BOOL smb_io_relstr(const char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
-{
-       prs_struct *ps=&buffer->prs;
-       
-       if (MARSHALLING(ps)) {
-               uint32 struct_offset = prs_offset(ps);
-               uint32 relative_offset;
-               
-               buffer->string_at_end -= (size_of_relative_string(string) - 4);
-               if(!prs_set_offset(ps, buffer->string_at_end))
-                       return False;
-#if 0  /* JERRY */
-               /*
-                * Win2k does not align strings in a buffer
-                * Tested against WinNT 4.0 SP 6a & 2k SP2  --jerry
-                */
-               if (!prs_align(ps))
-                       return False;
-#endif
-               buffer->string_at_end = prs_offset(ps);
-               
-               /* write the string */
-               if (!smb_io_unistr(desc, string, ps, depth))
-                       return False;
-
-               if(!prs_set_offset(ps, struct_offset))
-                       return False;
-               
-               relative_offset=buffer->string_at_end - buffer->struct_start;
-               /* write its offset */
-               if (!prs_uint32("offset", ps, depth, &relative_offset))
-                       return False;
-       }
-       else {
-               uint32 old_offset;
-               
-               /* read the offset */
-               if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
-                       return False;
-
-               if (buffer->string_at_end == 0)
-                       return True;
-
-               old_offset = prs_offset(ps);
-               if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
-                       return False;
-
-               /* read the string */
-               if (!smb_io_unistr(desc, string, ps, depth))
-                       return False;
-
-               if(!prs_set_offset(ps, old_offset))
-                       return False;
-       }
-       return True;
-}
-
-/*******************************************************************
- * write a array of UNICODE strings and its relative pointer.
- * used by 2 RPC structs
- ********************************************************************/
-
-static BOOL smb_io_relarraystr(const char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
-{
-       UNISTR chaine;
-       
-       prs_struct *ps=&buffer->prs;
-       
-       if (MARSHALLING(ps)) {
-               uint32 struct_offset = prs_offset(ps);
-               uint32 relative_offset;
-               uint16 *p;
-               uint16 *q;
-               uint16 zero=0;
-               p=*string;
-               q=*string;
-
-               /* first write the last 0 */
-               buffer->string_at_end -= 2;
-               if(!prs_set_offset(ps, buffer->string_at_end))
-                       return False;
-
-               if(!prs_uint16("leading zero", ps, depth, &zero))
-                       return False;
-
-               while (p && (*p!=0)) {  
-                       while (*q!=0)
-                               q++;
-
-                       /* Yes this should be malloc not talloc. Don't change. */
-
-                       chaine.buffer = malloc((q-p+1)*sizeof(uint16));
-                       if (chaine.buffer == NULL)
-                               return False;
-
-                       memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
-
-                       buffer->string_at_end -= (q-p+1)*sizeof(uint16);
-
-                       if(!prs_set_offset(ps, buffer->string_at_end)) {
-                               SAFE_FREE(chaine.buffer);
-                               return False;
-                       }
-
-                       /* write the string */
-                       if (!smb_io_unistr(desc, &chaine, ps, depth)) {
-                               SAFE_FREE(chaine.buffer);
-                               return False;
-                       }
-                       q++;
-                       p=q;
-
-                       SAFE_FREE(chaine.buffer);
-               }
-               
-               if(!prs_set_offset(ps, struct_offset))
-                       return False;
-               
-               relative_offset=buffer->string_at_end - buffer->struct_start;
-               /* write its offset */
-               if (!prs_uint32("offset", ps, depth, &relative_offset))
-                       return False;
-
-       } else {
-
-               /* UNMARSHALLING */
-
-               uint32 old_offset;
-               uint16 *chaine2=NULL;
-               int l_chaine=0;
-               int l_chaine2=0;
-               size_t realloc_size = 0;
-
-               *string=NULL;
-                               
-               /* read the offset */
-               if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
-                       return False;
-
-               old_offset = prs_offset(ps);
-               if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
-                       return False;
-       
-               do {
-                       if (!smb_io_unistr(desc, &chaine, ps, depth))
-                               return False;
-                       
-                       l_chaine=str_len_uni(&chaine);
-                       
-                       /* we're going to add two more bytes here in case this
-                          is the last string in the array and we need to add 
-                          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((tc2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL) {
-                                       SAFE_FREE(chaine2);
-                                       return False;
-                               }
-                               else chaine2 = tc2;
-                               memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
-                               l_chaine2+=l_chaine+1;
-                       }
-               
-               } while(l_chaine!=0);
-               
-               /* the end should be bould NULL terminated so add 
-                  the second one here */
-               if (chaine2)
-               {
-                       chaine2[l_chaine2] = '\0';
-                       *string=(uint16 *)talloc_memdup(prs_get_mem_context(ps),chaine2,realloc_size);
-                       SAFE_FREE(chaine2);
-               }
-
-               if(!prs_set_offset(ps, old_offset))
-                       return False;
-       }
-       return True;
-}
-
 /*******************************************************************
  Parse a DEVMODE structure and its relative pointer.
 ********************************************************************/
 
-static BOOL smb_io_relsecdesc(const char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
-{
-       prs_struct *ps= &buffer->prs;
-
-       prs_debug(ps, depth, desc, "smb_io_relsecdesc");
-       depth++;
-
-       if (MARSHALLING(ps)) {
-               uint32 struct_offset = prs_offset(ps);
-               uint32 relative_offset;
-
-               if (! *secdesc) {
-                       relative_offset = 0;
-                       if (!prs_uint32("offset", ps, depth, &relative_offset))
-                               return False;
-                       return True;
-               }
-               
-               if (*secdesc != NULL) {
-                       buffer->string_at_end -= sec_desc_size(*secdesc);
-
-                       if(!prs_set_offset(ps, buffer->string_at_end))
-                               return False;
-                       /* write the secdesc */
-                       if (!sec_io_desc(desc, secdesc, ps, depth))
-                               return False;
-
-                       if(!prs_set_offset(ps, struct_offset))
-                               return False;
-               }
-
-               relative_offset=buffer->string_at_end - buffer->struct_start;
-               /* write its offset */
-
-               if (!prs_uint32("offset", ps, depth, &relative_offset))
-                       return False;
-       } else {
-               uint32 old_offset;
-               
-               /* read the offset */
-               if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
-                       return False;
-
-               old_offset = prs_offset(ps);
-               if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
-                       return False;
-
-               /* read the sd */
-               if (!sec_io_desc(desc, secdesc, ps, depth))
-                       return False;
-
-               if(!prs_set_offset(ps, old_offset))
-                       return False;
-       }
-       return True;
-}
-
-/*******************************************************************
- Parse a DEVMODE structure and its relative pointer.
-********************************************************************/
-
-static BOOL smb_io_reldevmode(const char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
+static bool smb_io_reldevmode(const char *desc, RPC_BUFFER *buffer, int depth, DEVICEMODE **devmode)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2334,7 +2129,12 @@ static BOOL smb_io_reldevmode(const char *desc, NEW_BUFFER *buffer, int depth, D
                }
                
                buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
-               
+
+               /* mz:  we have to align the device mode for VISTA */
+               if (buffer->string_at_end % 4) {
+                       buffer->string_at_end += 4 - (buffer->string_at_end % 4);
+               }
+
                if(!prs_set_offset(ps, buffer->string_at_end))
                        return False;
                
@@ -2366,7 +2166,7 @@ static BOOL smb_io_reldevmode(const char *desc, NEW_BUFFER *buffer, int depth, D
                        return False;
 
                /* read the string */
-               if((*devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE))) == NULL)
+               if((*devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1)) == NULL)
                        return False;
                if (!spoolss_io_devmode(desc, ps, depth, *devmode))
                        return False;
@@ -2381,7 +2181,7 @@ static BOOL smb_io_reldevmode(const char *desc, NEW_BUFFER *buffer, int depth, D
  Parse a PRINTER_INFO_0 structure.
 ********************************************************************/  
 
-BOOL smb_io_printer_info_0(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
+bool smb_io_printer_info_0(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2482,7 +2282,7 @@ BOOL smb_io_printer_info_0(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0
  Parse a PRINTER_INFO_1 structure.
 ********************************************************************/  
 
-BOOL smb_io_printer_info_1(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
+bool smb_io_printer_info_1(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2507,7 +2307,7 @@ BOOL smb_io_printer_info_1(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1
  Parse a PRINTER_INFO_2 structure.
 ********************************************************************/  
 
-BOOL smb_io_printer_info_2(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
+bool smb_io_printer_info_2(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
        uint32 dm_offset, sd_offset, current_offset;
@@ -2563,7 +2363,7 @@ BOOL smb_io_printer_info_2(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2
                return False;
        
        /* parse the sec_desc */
-       if (has_secdesc) {
+       if (info->secdesc) {
                if (!prs_set_offset(ps, sd_offset))
                        return False;
                if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
@@ -2598,8 +2398,9 @@ BOOL smb_io_printer_info_2(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2
  Parse a PRINTER_INFO_3 structure.
 ********************************************************************/  
 
-BOOL smb_io_printer_info_3(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
+bool smb_io_printer_info_3(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
 {
+       uint32 offset = 0;
        prs_struct *ps=&buffer->prs;
 
        prs_debug(ps, depth, desc, "smb_io_printer_info_3");
@@ -2607,8 +2408,41 @@ BOOL smb_io_printer_info_3(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3
        
        buffer->struct_start=prs_offset(ps);
        
-       if (!prs_uint32("flags", ps, depth, &info->flags))
-               return False;
+       if (MARSHALLING(ps)) {
+               /* Ensure the SD is 8 byte aligned in the buffer. */
+               uint32 start = prs_offset(ps); /* Remember the start position. */
+               uint32 off_val = 0;
+
+               /* Write a dummy value. */
+               if (!prs_uint32("offset", ps, depth, &off_val))
+                       return False;
+
+               /* 8 byte align. */
+               if (!prs_align_uint64(ps))
+                       return False;
+
+               /* Remember where we must seek back to write the SD. */
+               offset = prs_offset(ps);
+
+               /* Calculate the real offset for the SD. */
+
+               off_val = offset - start;
+
+               /* Seek back to where we store the SD offset & store. */
+               prs_set_offset(ps, start);
+               if (!prs_uint32("offset", ps, depth, &off_val))
+                       return False;
+
+               /* Return to after the 8 byte align. */
+               prs_set_offset(ps, offset);
+
+       } else {
+               if (!prs_uint32("offset", ps, depth, &offset))
+                       return False;
+               /* Seek within the buffer. */
+               if (!prs_set_offset(ps, offset))
+                       return False;
+       }
        if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
                return False;
 
@@ -2619,7 +2453,7 @@ BOOL smb_io_printer_info_3(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3
  Parse a PRINTER_INFO_4 structure.
 ********************************************************************/  
 
-BOOL smb_io_printer_info_4(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
+bool smb_io_printer_info_4(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2641,7 +2475,7 @@ BOOL smb_io_printer_info_4(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_4
  Parse a PRINTER_INFO_5 structure.
 ********************************************************************/  
 
-BOOL smb_io_printer_info_5(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
+bool smb_io_printer_info_5(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2663,11 +2497,29 @@ BOOL smb_io_printer_info_5(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_5
        return True;
 }
 
+/*******************************************************************
+ Parse a PRINTER_INFO_6 structure.
+********************************************************************/  
+
+bool smb_io_printer_info_6(const char *desc, RPC_BUFFER *buffer,
+                          PRINTER_INFO_6 *info, int depth)
+{
+       prs_struct *ps=&buffer->prs;
+
+       prs_debug(ps, depth, desc, "smb_io_printer_info_6");
+       depth++;        
+       
+       if (!prs_uint32("status", ps, depth, &info->status))
+               return False;
+
+       return True;
+}
+
 /*******************************************************************
  Parse a PRINTER_INFO_7 structure.
 ********************************************************************/  
 
-BOOL smb_io_printer_info_7(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_7 *info, int depth)
+bool smb_io_printer_info_7(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_7 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2687,7 +2539,7 @@ BOOL smb_io_printer_info_7(const char *desc, NEW_BUFFER *buffer, PRINTER_INFO_7
  Parse a PORT_INFO_1 structure.
 ********************************************************************/  
 
-BOOL smb_io_port_info_1(const char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
+bool smb_io_port_info_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2706,7 +2558,7 @@ BOOL smb_io_port_info_1(const char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info,
  Parse a PORT_INFO_2 structure.
 ********************************************************************/  
 
-BOOL smb_io_port_info_2(const char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
+bool smb_io_port_info_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2733,7 +2585,7 @@ BOOL smb_io_port_info_2(const char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info,
  Parse a DRIVER_INFO_1 structure.
 ********************************************************************/
 
-BOOL smb_io_printer_driver_info_1(const char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth) 
+bool smb_io_printer_driver_info_1(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_1 *info, int depth) 
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2752,7 +2604,7 @@ BOOL smb_io_printer_driver_info_1(const char *desc, NEW_BUFFER *buffer, DRIVER_I
  Parse a DRIVER_INFO_2 structure.
 ********************************************************************/
 
-BOOL smb_io_printer_driver_info_2(const char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth) 
+bool smb_io_printer_driver_info_2(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_2 *info, int depth) 
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2781,7 +2633,7 @@ BOOL smb_io_printer_driver_info_2(const char *desc, NEW_BUFFER *buffer, DRIVER_I
  Parse a DRIVER_INFO_3 structure.
 ********************************************************************/
 
-BOOL smb_io_printer_driver_info_3(const char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
+bool smb_io_printer_driver_info_3(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2820,7 +2672,7 @@ BOOL smb_io_printer_driver_info_3(const char *desc, NEW_BUFFER *buffer, DRIVER_I
  Parse a DRIVER_INFO_6 structure.
 ********************************************************************/
 
-BOOL smb_io_printer_driver_info_6(const char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
+bool smb_io_printer_driver_info_6(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2855,9 +2707,7 @@ BOOL smb_io_printer_driver_info_6(const char *desc, NEW_BUFFER *buffer, DRIVER_I
        if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
                return False;
 
-       if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
-               return False;
-       if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
+       if (!prs_uint64("date", ps, depth, &info->driver_date))
                return False;
 
        if (!prs_uint32("padding", ps, depth, &info->padding))
@@ -2885,7 +2735,7 @@ BOOL smb_io_printer_driver_info_6(const char *desc, NEW_BUFFER *buffer, DRIVER_I
  Parse a JOB_INFO_1 structure.
 ********************************************************************/  
 
-BOOL smb_io_job_info_1(const char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
+bool smb_io_job_info_1(const char *desc, RPC_BUFFER *buffer, JOB_INFO_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -2928,7 +2778,7 @@ BOOL smb_io_job_info_1(const char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, i
  Parse a JOB_INFO_2 structure.
 ********************************************************************/  
 
-BOOL smb_io_job_info_2(const char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
+bool smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, int depth)
 {      
        uint32 pipo=0;
        prs_struct *ps=&buffer->prs;
@@ -2995,7 +2845,7 @@ BOOL smb_io_job_info_2(const char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, i
 /*******************************************************************
 ********************************************************************/  
 
-BOOL smb_io_form_1(const char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
+bool smb_io_form_1(const char *desc, RPC_BUFFER *buffer, FORM_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
        
@@ -3026,123 +2876,13 @@ BOOL smb_io_form_1(const char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth
        return True;
 }
 
-/*******************************************************************
- Read/write a BUFFER struct.
-********************************************************************/  
 
-static BOOL spoolss_io_buffer(const char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
-{
-       NEW_BUFFER *buffer = *pp_buffer;
-
-       prs_debug(ps, depth, desc, "spoolss_io_buffer");
-       depth++;
-       
-       if (UNMARSHALLING(ps))
-               buffer = *pp_buffer = (NEW_BUFFER *)prs_alloc_mem(ps, sizeof(NEW_BUFFER));
-
-       if (buffer == NULL)
-               return False;
-
-       if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
-               return False;
-       
-       /* reading */
-       if (UNMARSHALLING(ps)) {
-               buffer->size=0;
-               buffer->string_at_end=0;
-               
-               if (buffer->ptr==0) {
-                       /*
-                        * 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;
-               }
-               
-               if (!prs_uint32("size", ps, depth, &buffer->size))
-                       return False;
-                                       
-               /*
-                * 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))
-                       return False;
-
-               if (!prs_set_offset(&buffer->prs, 0))
-                       return False;
-
-               if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
-                       return False;
-
-               buffer->string_at_end=buffer->size;
-               
-               return True;
-       }
-       else {
-               BOOL ret = False;
-
-               /* writing */
-               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))
-                       goto out;
-
-               if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
-                       goto out;
-
-               ret = True;
-       out:
-
-               /* We have finished with the data in buffer->prs - free it. */
-               prs_mem_free(&buffer->prs);
-
-               return ret;
-       }
-}
-
-/*******************************************************************
- move a BUFFER from the query to the reply.
- As the data pointers in NEW_BUFFER are malloc'ed, not talloc'ed,
- this is ok. This is an OPTIMIZATION and is not strictly neccessary.
- Clears the memory to zero also.
-********************************************************************/  
-
-void spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
-{
-       prs_switch_type(&src->prs, MARSHALL);
-       if(!prs_set_offset(&src->prs, 0))
-               return;
-       prs_force_dynamic(&src->prs);
-       prs_mem_clear(&src->prs);
-       *dest=src;
-}
-
-/*******************************************************************
- Get the size of a BUFFER struct.
-********************************************************************/  
-
-uint32 new_get_buffer_size(NEW_BUFFER *buffer)
-{
-       return (buffer->size);
-}
 
 /*******************************************************************
  Parse a DRIVER_DIRECTORY_1 structure.
 ********************************************************************/  
 
-BOOL smb_io_driverdir_1(const char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
+bool smb_io_driverdir_1(const char *desc, RPC_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -3161,7 +2901,7 @@ BOOL smb_io_driverdir_1(const char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1
  Parse a PORT_INFO_1 structure.
 ********************************************************************/  
 
-BOOL smb_io_port_1(const char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
+bool smb_io_port_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -3180,7 +2920,7 @@ BOOL smb_io_port_1(const char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int
  Parse a PORT_INFO_2 structure.
 ********************************************************************/  
 
-BOOL smb_io_port_2(const char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
+bool smb_io_port_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -3206,7 +2946,7 @@ BOOL smb_io_port_2(const char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int
 /*******************************************************************
 ********************************************************************/  
 
-BOOL smb_io_printprocessor_info_1(const char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
+bool smb_io_printprocessor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -3224,7 +2964,7 @@ BOOL smb_io_printprocessor_info_1(const char *desc, NEW_BUFFER *buffer, PRINTPRO
 /*******************************************************************
 ********************************************************************/  
 
-BOOL smb_io_printprocdatatype_info_1(const char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
+bool smb_io_printprocdatatype_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -3242,7 +2982,7 @@ BOOL smb_io_printprocdatatype_info_1(const char *desc, NEW_BUFFER *buffer, PRINT
 /*******************************************************************
 ********************************************************************/  
 
-BOOL smb_io_printmonitor_info_1(const char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
+bool smb_io_printmonitor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -3260,7 +3000,7 @@ BOOL smb_io_printmonitor_info_1(const char *desc, NEW_BUFFER *buffer, PRINTMONIT
 /*******************************************************************
 ********************************************************************/  
 
-BOOL smb_io_printmonitor_info_2(const char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
+bool smb_io_printmonitor_info_2(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -3363,7 +3103,7 @@ uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
                
        size += 4;
        
-       size += sec_desc_size( info->secdesc );
+       size += ndr_size_security_descriptor( info->secdesc, 0 );
 
        size+=size_of_device_mode( info->devmode );
        
@@ -3434,6 +3174,14 @@ uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
        return size;
 }
 
+/*******************************************************************
+return the size required by a struct in the stream
+********************************************************************/
+
+uint32 spoolss_size_printer_info_6(PRINTER_INFO_6 *info)
+{
+       return sizeof(uint32);
+}
 
 /*******************************************************************
 return the size required by a struct in the stream
@@ -3441,9 +3189,8 @@ return the size required by a struct in the stream
 
 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
 {
-       /* The 4 is for the self relative pointer.. */
-       /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
-       return 4 + (uint32)sec_desc_size( info->secdesc );
+       /* The 8 is for the self relative pointer - 8 byte aligned.. */
+       return 8 + (uint32)ndr_size_security_descriptor( info->secdesc, 0 );
 }
 
 /*******************************************************************
@@ -3779,11 +3526,11 @@ uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u, 
+bool make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u, 
                               const POLICY_HND *hnd,
                               const fstring architecture,
                               uint32 level, uint32 clientmajor, uint32 clientminor,
-                              NEW_BUFFER *buffer, uint32 offered)
+                              RPC_BUFFER *buffer, uint32 offered)
 {      
        if (q_u == NULL)
                return False;
@@ -3807,7 +3554,7 @@ BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
  * called from spoolss_getprinterdriver2 (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
        depth++;
@@ -3827,7 +3574,7 @@ BOOL spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2
        if(!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if(!prs_align(ps))
@@ -3849,7 +3596,7 @@ BOOL spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2
  * called from spoolss_getprinterdriver2 (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
        depth++;
@@ -3857,7 +3604,7 @@ BOOL spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3878,12 +3625,12 @@ BOOL spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_enumprinters(
+bool make_spoolss_q_enumprinters(
        SPOOL_Q_ENUMPRINTERS *q_u, 
        uint32 flags, 
        char *servername, 
        uint32 level, 
-       NEW_BUFFER *buffer, 
+       RPC_BUFFER *buffer, 
        uint32 offered
 )
 {
@@ -3903,9 +3650,9 @@ BOOL make_spoolss_q_enumprinters(
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u, 
+bool make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u, 
                                fstring servername, uint32 level, 
-                               NEW_BUFFER *buffer, uint32 offered)
+                               RPC_BUFFER *buffer, uint32 offered)
 {
        q_u->name_ptr = (servername != NULL) ? 1 : 0;
        init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
@@ -3922,7 +3669,7 @@ BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
  * called from spoolss_enumprinters (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
        depth++;
@@ -3943,7 +3690,7 @@ BOOL spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
 
-       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3958,7 +3705,7 @@ BOOL spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_
  Parse a SPOOL_R_ENUMPRINTERS structure.
  ********************************************************************/
 
-BOOL spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
        depth++;
@@ -3966,7 +3713,7 @@ BOOL spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -3990,7 +3737,7 @@ BOOL spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_
  *
  ********************************************************************/
 
-BOOL spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
 {      
        prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
        depth++;
@@ -3998,7 +3745,7 @@ BOOL spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_stru
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4018,7 +3765,7 @@ BOOL spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_stru
  * called from spoolss_getprinter (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
        depth++;
@@ -4031,7 +3778,7 @@ BOOL spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_stru
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
 
-       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4046,12 +3793,12 @@ BOOL spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_stru
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_getprinter(
+bool make_spoolss_q_getprinter(
        TALLOC_CTX *mem_ctx,
        SPOOL_Q_GETPRINTER *q_u, 
        const POLICY_HND *hnd, 
        uint32 level, 
-       NEW_BUFFER *buffer, 
+       RPC_BUFFER *buffer, 
        uint32 offered
 )
 {
@@ -4071,21 +3818,21 @@ BOOL make_spoolss_q_getprinter(
 /*******************************************************************
  * init a structure.
  ********************************************************************/
-BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u, 
+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)
+       if (!q_u || !info)
                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;
+       q_u->info.info_ptr = 1; /* Info is != NULL, see above */
        switch (level) {
 
          /* There's no such thing as a setprinter level 1 */
@@ -4096,13 +3843,11 @@ BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
                
                make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
 #if 1  /* JERRY TEST */
-               q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF));
+               q_u->secdesc_ctr = SMB_MALLOC_P(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->secdesc_ctr->sd = secdesc;
+               q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
 
                q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
                q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
@@ -4115,6 +3860,22 @@ BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
                q_u->devmode_ctr.devmode = NULL;
 #endif
                break;
+       case 3:
+               secdesc = info->printers_3->secdesc;
+               
+               make_spoolss_printer_info_3 (mem_ctx, &q_u->info.info_3, info->printers_3);
+               
+               q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
+               if (!q_u->secdesc_ctr)
+                       return False;
+               q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
+               q_u->secdesc_ctr->sd = secdesc;
+
+               break;
+       case 7:
+               make_spoolss_printer_info_7 (mem_ctx, &q_u->info.info_7, info->printers_7);
+               break;
+
        default: 
                DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
                        break;
@@ -4130,7 +3891,7 @@ BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_setprinter(const char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_setprinter(const char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
        depth++;
@@ -4148,7 +3909,7 @@ BOOL spoolss_io_r_setprinter(const char *desc, SPOOL_R_SETPRINTER *r_u, prs_stru
  Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
 ********************************************************************/  
 
-BOOL spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
 {
        uint32 ptr_sec_desc = 0;
 
@@ -4162,6 +3923,22 @@ BOOL spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_stru
                return False;
        if(!prs_uint32("level", ps, depth, &q_u->level))
                return False;
+       
+       /* check for supported levels and structures we know about */
+               
+       switch ( q_u->level ) {
+               case 0:
+               case 2:
+               case 3:
+               case 7:
+                       /* supported levels */
+                       break;
+               default:
+                       DEBUG(0,("spoolss_io_q_setprinter: unsupported printer info level [%d]\n", 
+                               q_u->level));
+                       return True;
+       }
+                       
 
        if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
                return False;
@@ -4181,7 +3958,16 @@ BOOL spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_stru
                }
                case 3:
                {
-                       ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
+                       /* FIXME ! Our parsing here is wrong I think,
+                        * but for a level3 it makes no sense for
+                        * ptr_sec_desc to be NULL. JRA. Based on
+                        * a Vista sniff from Martin Zielinski <mz@seh.de>.
+                        */
+                       if (UNMARSHALLING(ps)) {
+                               ptr_sec_desc = 1;
+                       } else {
+                               ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
+                       }
                        break;
                }
        }
@@ -4198,8 +3984,8 @@ BOOL spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_stru
                prs_debug(ps, depth, "", "sec_io_desc_buf");
                if (!prs_uint32("size", ps, depth + 1, &dummy))
                        return False;
-               if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
-                                                                      False;
+               if (!prs_uint32("ptr", ps, depth + 1, &dummy))
+                       return False;
        }
        
        if(!prs_uint32("command", ps, depth, &q_u->command))
@@ -4211,7 +3997,7 @@ BOOL spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_stru
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_fcpn(const char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_fcpn(const char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
        depth++;
@@ -4228,7 +4014,7 @@ BOOL spoolss_io_r_fcpn(const char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_fcpn(const char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_fcpn(const char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
 {
 
        prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
@@ -4247,7 +4033,7 @@ BOOL spoolss_io_q_fcpn(const char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_addjob(const char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_addjob(const char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "");
        depth++;
@@ -4255,7 +4041,7 @@ BOOL spoolss_io_r_addjob(const char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps,
        if(!prs_align(ps))
                return False;
        
-       if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if(!prs_align(ps))
@@ -4273,7 +4059,7 @@ BOOL spoolss_io_r_addjob(const char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_addjob(const char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_addjob(const char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "");
        depth++;
@@ -4286,7 +4072,7 @@ BOOL spoolss_io_q_addjob(const char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps,
        if(!prs_uint32("level", ps, depth, &q_u->level))
                return False;
        
-       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if(!prs_align(ps))
@@ -4301,7 +4087,7 @@ BOOL spoolss_io_q_addjob(const char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
        depth++;
@@ -4309,7 +4095,7 @@ BOOL spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4330,11 +4116,11 @@ BOOL spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *
 /*******************************************************************
 ********************************************************************/  
 
-BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
+bool make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
                                uint32 firstjob,
                                uint32 numofjobs,
                                uint32 level,
-                               NEW_BUFFER *buffer,
+                               RPC_BUFFER *buffer,
                                uint32 offered)
 {
        if (q_u == NULL)
@@ -4353,7 +4139,7 @@ BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
        depth++;
@@ -4371,7 +4157,7 @@ BOOL spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
 
-       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;   
 
        if(!prs_align(ps))
@@ -4386,7 +4172,7 @@ BOOL spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_schedulejob(const char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_schedulejob(const char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
        depth++;
@@ -4403,7 +4189,7 @@ BOOL spoolss_io_r_schedulejob(const char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_st
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_schedulejob(const char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_schedulejob(const char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
        depth++;
@@ -4422,7 +4208,7 @@ BOOL spoolss_io_q_schedulejob(const char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_st
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_setjob(const char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_setjob(const char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
        depth++;
@@ -4439,7 +4225,7 @@ BOOL spoolss_io_r_setjob(const char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_setjob(const char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_setjob(const char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
        depth++;
@@ -4467,7 +4253,7 @@ BOOL spoolss_io_q_setjob(const char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps,
  Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
 ********************************************************************/  
 
-BOOL spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
        depth++;
@@ -4475,7 +4261,7 @@ BOOL spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVER
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4497,11 +4283,11 @@ BOOL spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVER
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
+bool make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
                                 const char *name,
                                 const char *environment,
                                 uint32 level,
-                                NEW_BUFFER *buffer, uint32 offered)
+                                RPC_BUFFER *buffer, uint32 offered)
 {
         init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
         init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
@@ -4517,7 +4303,7 @@ BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
  Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
 ********************************************************************/  
 
-BOOL spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
 {
 
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
@@ -4543,7 +4329,7 @@ BOOL spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVER
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4558,7 +4344,7 @@ BOOL spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVER
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
 {
 
        prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
@@ -4571,7 +4357,7 @@ BOOL spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;   
        
-       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4585,7 +4371,7 @@ BOOL spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
        depth++;
@@ -4593,7 +4379,7 @@ BOOL spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4614,7 +4400,7 @@ BOOL spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_getform(const char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_getform(const char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
 {
 
        prs_debug(ps, depth, desc, "spoolss_io_q_getform");
@@ -4633,7 +4419,7 @@ BOOL spoolss_io_q_getform(const char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;   
        
-       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4647,7 +4433,7 @@ BOOL spoolss_io_q_getform(const char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_getform(const char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_getform(const char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_getform");
        depth++;
@@ -4655,7 +4441,7 @@ BOOL spoolss_io_r_getform(const char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4674,7 +4460,7 @@ BOOL spoolss_io_r_getform(const char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps
  Parse a SPOOL_R_ENUMPORTS structure.
 ********************************************************************/  
 
-BOOL spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
        depth++;
@@ -4682,7 +4468,7 @@ BOOL spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4703,7 +4489,7 @@ BOOL spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "");
        depth++;
@@ -4721,7 +4507,7 @@ BOOL spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -4736,7 +4522,7 @@ BOOL spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct
  Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
 ********************************************************************/  
 
-BOOL spool_io_printer_info_level_1(const char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
+bool spool_io_printer_info_level_1(const char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
 {      
        prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
        depth++;
@@ -4767,7 +4553,7 @@ BOOL spool_io_printer_info_level_1(const char *desc, SPOOL_PRINTER_INFO_LEVEL_1
  Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
 ********************************************************************/  
 
-BOOL spool_io_printer_info_level_3(const char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
+bool spool_io_printer_info_level_3(const char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
 {      
        prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
        depth++;
@@ -4785,7 +4571,7 @@ BOOL spool_io_printer_info_level_3(const char *desc, SPOOL_PRINTER_INFO_LEVEL_3
  Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
 ********************************************************************/  
 
-BOOL spool_io_printer_info_level_2(const char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
+bool spool_io_printer_info_level_2(const char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
 {      
        prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
        depth++;
@@ -4864,7 +4650,7 @@ BOOL spool_io_printer_info_level_2(const char *desc, SPOOL_PRINTER_INFO_LEVEL_2
        return True;
 }
 
-BOOL spool_io_printer_info_level_7(const char *desc, SPOOL_PRINTER_INFO_LEVEL_7 *il, prs_struct *ps, int depth)
+bool spool_io_printer_info_level_7(const char *desc, SPOOL_PRINTER_INFO_LEVEL_7 *il, prs_struct *ps, int depth)
 {      
        prs_debug(ps, depth, desc, "spool_io_printer_info_level_7");
        depth++;
@@ -4885,7 +4671,7 @@ BOOL spool_io_printer_info_level_7(const char *desc, SPOOL_PRINTER_INFO_LEVEL_7
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
+bool spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spool_io_printer_info_level");
        depth++;
@@ -4917,7 +4703,7 @@ BOOL spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il,
                case 1:
                {
                        if (UNMARSHALLING(ps)) {
-                               if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
+                               if ((il->info_1=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_1,1)) == NULL)
                                        return False;
                        }
                        if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
@@ -4930,7 +4716,7 @@ BOOL spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il,
                 */     
                case 2:
                        if (UNMARSHALLING(ps)) {
-                               if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
+                               if ((il->info_2=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_2,1)) == NULL)
                                        return False;
                        }
                        if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
@@ -4940,7 +4726,7 @@ BOOL spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il,
                case 3:
                {
                        if (UNMARSHALLING(ps)) {
-                               if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
+                               if ((il->info_3=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_3,1)) == NULL)
                                        return False;
                        }
                        if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
@@ -4949,7 +4735,7 @@ BOOL spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il,
                }
                case 7:
                        if (UNMARSHALLING(ps))
-                               if ((il->info_7=(SPOOL_PRINTER_INFO_LEVEL_7 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_7))) == NULL)
+                               if ((il->info_7=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_7,1)) == NULL)
                                        return False;
                        if (!spool_io_printer_info_level_7("", il->info_7, ps, depth))
                                return False;
@@ -4962,7 +4748,7 @@ BOOL spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
 {
        uint32 ptr_sec_desc = 0;
 
@@ -4971,9 +4757,10 @@ BOOL spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_
 
        if(!prs_align(ps))
                return False;
-       if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
+
+       if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->server_name))
                return False;
-       if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
+       if (!prs_io_unistr2("servername", ps, depth, q_u->server_name))
                return False;
 
        if(!prs_align(ps))
@@ -5003,7 +4790,7 @@ BOOL spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_
                if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
                        return False;
        } else {
-               uint32 dummy;
+               uint32 dummy = 0;
 
                /* Parse a NULL security descriptor.  This should really
                        happen inside the sec_io_desc_buf() function. */
@@ -5026,7 +4813,7 @@ BOOL spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_addprinterex(const char *desc, SPOOL_R_ADDPRINTEREX *r_u, 
+bool spoolss_io_r_addprinterex(const char *desc, SPOOL_R_ADDPRINTEREX *r_u, 
                               prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
@@ -5044,7 +4831,7 @@ BOOL spoolss_io_r_addprinterex(const char *desc, SPOOL_R_ADDPRINTEREX *r_u,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spool_io_printer_driver_info_level_3(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u, 
+bool spool_io_printer_driver_info_level_3(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u, 
                                           prs_struct *ps, int depth)
 {      
        SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
@@ -5054,7 +4841,7 @@ BOOL spool_io_printer_driver_info_level_3(const char *desc, SPOOL_PRINTER_DRIVER
                
        /* reading */
        if (UNMARSHALLING(ps)) {
-               il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
+               il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_3,1);
                if(il == NULL)
                        return False;
                *q_u=il;
@@ -5122,7 +4909,7 @@ BOOL spool_io_printer_driver_info_level_3(const char *desc, SPOOL_PRINTER_DRIVER
 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
 ********************************************************************/  
 
-BOOL spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u, 
+bool spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u, 
                                           prs_struct *ps, int depth)
 {      
        SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
@@ -5132,7 +4919,7 @@ BOOL spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER
                
        /* reading */
        if (UNMARSHALLING(ps)) {
-               il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
+               il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_6,1);
                if(il == NULL)
                        return False;
                *q_u=il;
@@ -5276,9 +5063,10 @@ BOOL spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER
  dynamically allocate memory
  
 ********************************************************************/  
-static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
+
+static bool uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
 {
-       fstring f, *tar;
+       fstring f;
        int n = 0;
        char *src;
 
@@ -5286,38 +5074,38 @@ static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
                return False;
 
        src = (char *)buf5->buffer;
-       *ar = NULL;
+       *ar = SMB_MALLOC_ARRAY(fstring, 1);
+       if (!*ar) {
+               return False;
+       }
 
        while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
                rpcstr_pull(f, src, sizeof(f)-1, -1, STR_TERMINATE);
                src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
-               tar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
-               if (!tar)
+               *ar = SMB_REALLOC_ARRAY(*ar, fstring, n+2);
+               if (!*ar) {
                        return False;
-               else
-                       *ar = tar;
+               }
                fstrcpy((*ar)[n], f);
                n++;
        }
+
        fstrcpy((*ar)[n], "");
  
        return True;
 }
 
-
-
-
 /*******************************************************************
  read a UNICODE array with null terminated strings 
  and null terminated array 
  and size of array at beginning
 ********************************************************************/  
 
-BOOL smb_io_unibuffer(const char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
+bool smb_io_unibuffer(const char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
 {
        if (buffer==NULL) return False;
 
-       buffer->undoc=0;
+       buffer->offset=0;
        buffer->uni_str_len=buffer->uni_max_len;
        
        if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
@@ -5332,7 +5120,7 @@ BOOL smb_io_unibuffer(const char *desc, UNISTR2 *buffer, prs_struct *ps, int dep
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
+bool spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
        depth++;
@@ -5367,19 +5155,23 @@ BOOL spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_I
  init a SPOOL_Q_ADDPRINTERDRIVER struct
  ******************************************************************/
 
-BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
+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"));
        
-       q_u->server_name_ptr = (srv_name!=NULL)?1:0;
-       init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
+       if (!srv_name || !info) {
+               return False;
+       }
+
+       q_u->server_name_ptr = 1; /* srv_name is != NULL, see above */
+       init_unistr2(&q_u->server_name, srv_name, UNI_STR_TERMINATE);
        
        q_u->level = level;
        
        q_u->info.level = level;
-       q_u->info.ptr = (info!=NULL)?1:0;
+       q_u->info.ptr = 1;      /* Info is != NULL, see above */
        switch (level)
        {
        /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
@@ -5395,19 +5187,16 @@ BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
        return True;
 }
 
-BOOL make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx, 
+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_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))))
+       if (!(inf=TALLOC_ZERO_P(mem_ctx, 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;
@@ -5418,40 +5207,44 @@ BOOL make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
        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)
-       {
-               switch (*ptr)
-               {
-                       case 0:
-                               /* the null_char BOOL is used to help locate
-                                  two '\0's back to back */
-                               if (null_char)
-                                       done = True;
-                               else
-                                       null_char = True;
-                               break;
+       init_unistr2_from_unistr(inf, &inf->name, &info3->name);
+       init_unistr2_from_unistr(inf, &inf->environment, &info3->architecture);
+       init_unistr2_from_unistr(inf, &inf->driverpath, &info3->driverpath);
+       init_unistr2_from_unistr(inf, &inf->datafile, &info3->datafile);
+       init_unistr2_from_unistr(inf, &inf->configfile, &info3->configfile);
+       init_unistr2_from_unistr(inf, &inf->helpfile, &info3->helpfile);
+       init_unistr2_from_unistr(inf, &inf->monitorname, &info3->monitorname);
+       init_unistr2_from_unistr(inf, &inf->defaultdatatype, &info3->defaultdatatype);
+
+       if (info3->dependentfiles) {
+               bool done = False;
+               bool null_char = False;
+               uint16 *ptr = info3->dependentfiles;
+
+               while (!done) {
+                       switch (*ptr) {
+                               case 0:
+                                       /* the null_char bool is used to help locate
+                                          two '\0's back to back */
+                                       if (null_char) {
+                                               done = True;
+                                       } else {
+                                               null_char = True;
+                                       }
+                                       break;
                                        
-                       default:
-                               null_char = False;
-                               ;;
-                               break;                          
+                               default:
+                                       null_char = False;
+                                       break;                          
+                       }
+                       len++;
+                       ptr++;
                }
-               len++;
-               ptr++;
        }
+
        inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
-       inf->dependentfilessize = len;
-       if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
-       {
+       inf->dependentfilessize = (info3->dependentfiles != NULL) ? len : 0;
+       if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles)) {
                SAFE_FREE(inf);
                return False;
        }
@@ -5464,14 +5257,22 @@ BOOL make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
 /*******************************************************************
  make a BUFFER5 struct from a uint16*
  ******************************************************************/
-BOOL make_spoolss_buffer5(TALLOC_CTX *mem_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_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL)
-       {
-               DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
-               return False;
+       if (src) {
+               if (len) {
+                       if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
+                               DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
+                               return False;
+                       }
+               } else {
+                       buf5->buffer = NULL;
+               }
+       } else {
+               buf5->buffer=NULL;
        }
        
        return True;
@@ -5481,7 +5282,7 @@ BOOL make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16
  fill in the prs_struct for a ADDPRINTERDRIVER request PDU
  ********************************************************************/  
 
-BOOL spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
        depth++;
@@ -5508,7 +5309,7 @@ BOOL spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
        depth++;
@@ -5523,7 +5324,7 @@ BOOL spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q
  fill in the prs_struct for a ADDPRINTERDRIVER request PDU
  ********************************************************************/  
 
-BOOL spoolss_io_q_addprinterdriverex(const char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_addprinterdriverex(const char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriverex");
        depth++;
@@ -5555,7 +5356,7 @@ BOOL spoolss_io_q_addprinterdriverex(const char *desc, SPOOL_Q_ADDPRINTERDRIVERE
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_addprinterdriverex(const char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_r_addprinterdriverex(const char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriverex");
        depth++;
@@ -5569,7 +5370,7 @@ BOOL spoolss_io_r_addprinterdriverex(const char *desc, SPOOL_R_ADDPRINTERDRIVERE
 /*******************************************************************
 ********************************************************************/  
 
-BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
+bool uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
                                 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
 {
        NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
@@ -5578,7 +5379,7 @@ BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
        
        if (*asc==NULL)
        {
-               *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
+               *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_3);
                if(*asc == NULL)
                        return False;
                ZERO_STRUCTP(*asc);
@@ -5588,14 +5389,14 @@ BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
 
        d->cversion=uni->cversion;
 
-       unistr2_to_ascii(d->name,            &uni->name,            sizeof(d->name)-1);
-       unistr2_to_ascii(d->environment,     &uni->environment,     sizeof(d->environment)-1);
-       unistr2_to_ascii(d->driverpath,      &uni->driverpath,      sizeof(d->driverpath)-1);
-       unistr2_to_ascii(d->datafile,        &uni->datafile,        sizeof(d->datafile)-1);
-       unistr2_to_ascii(d->configfile,      &uni->configfile,      sizeof(d->configfile)-1);
-       unistr2_to_ascii(d->helpfile,        &uni->helpfile,        sizeof(d->helpfile)-1);
-       unistr2_to_ascii(d->monitorname,     &uni->monitorname,     sizeof(d->monitorname)-1);
-       unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
+       unistr2_to_ascii(d->name,            &uni->name,            sizeof(d->name));
+       unistr2_to_ascii(d->environment,     &uni->environment,     sizeof(d->environment));
+       unistr2_to_ascii(d->driverpath,      &uni->driverpath,      sizeof(d->driverpath));
+       unistr2_to_ascii(d->datafile,        &uni->datafile,        sizeof(d->datafile));
+       unistr2_to_ascii(d->configfile,      &uni->configfile,      sizeof(d->configfile));
+       unistr2_to_ascii(d->helpfile,        &uni->helpfile,        sizeof(d->helpfile));
+       unistr2_to_ascii(d->monitorname,     &uni->monitorname,     sizeof(d->monitorname));
+       unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype));
 
        DEBUGADD(8,( "version:         %d\n", d->cversion));
        DEBUGADD(8,( "name:            %s\n", d->name));
@@ -5616,7 +5417,7 @@ BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
 
 /*******************************************************************
 ********************************************************************/  
-BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
+bool uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
                                 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
 {
        NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
@@ -5625,7 +5426,7 @@ BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
        
        if (*asc==NULL)
        {
-               *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
+               *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_6);
                if(*asc == NULL)
                        return False;
                ZERO_STRUCTP(*asc);
@@ -5635,14 +5436,14 @@ BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
 
        d->version=uni->version;
 
-       unistr2_to_ascii(d->name,            &uni->name,            sizeof(d->name)-1);
-       unistr2_to_ascii(d->environment,     &uni->environment,     sizeof(d->environment)-1);
-       unistr2_to_ascii(d->driverpath,      &uni->driverpath,      sizeof(d->driverpath)-1);
-       unistr2_to_ascii(d->datafile,        &uni->datafile,        sizeof(d->datafile)-1);
-       unistr2_to_ascii(d->configfile,      &uni->configfile,      sizeof(d->configfile)-1);
-       unistr2_to_ascii(d->helpfile,        &uni->helpfile,        sizeof(d->helpfile)-1);
-       unistr2_to_ascii(d->monitorname,     &uni->monitorname,     sizeof(d->monitorname)-1);
-       unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
+       unistr2_to_ascii(d->name,            &uni->name,            sizeof(d->name));
+       unistr2_to_ascii(d->environment,     &uni->environment,     sizeof(d->environment));
+       unistr2_to_ascii(d->driverpath,      &uni->driverpath,      sizeof(d->driverpath));
+       unistr2_to_ascii(d->datafile,        &uni->datafile,        sizeof(d->datafile));
+       unistr2_to_ascii(d->configfile,      &uni->configfile,      sizeof(d->configfile));
+       unistr2_to_ascii(d->helpfile,        &uni->helpfile,        sizeof(d->helpfile));
+       unistr2_to_ascii(d->monitorname,     &uni->monitorname,     sizeof(d->monitorname));
+       unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype));
 
        DEBUGADD(8,( "version:         %d\n", d->version));
        DEBUGADD(8,( "name:            %s\n", d->name));
@@ -5666,33 +5467,11 @@ error:
        return False;
 }
 
-BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
-                              NT_PRINTER_INFO_LEVEL_2  **asc)
+bool uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
+                              NT_PRINTER_INFO_LEVEL_2  *d)
 {
-       NT_PRINTER_INFO_LEVEL_2 *d;
-       time_t time_unix;
-       
        DEBUG(7,("Converting from UNICODE to ASCII\n"));
-       time_unix=time(NULL);
        
-       if (*asc==NULL) {
-               DEBUGADD(8,("allocating memory\n"));
-
-               *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
-               if(*asc == NULL)
-                       return False;
-               ZERO_STRUCTP(*asc);
-               
-               /* we allocate memory iff called from 
-                * addprinter(ex) so we can do one time stuff here.
-                */
-               (*asc)->setuptime=time_unix;
-
-       }       
-       DEBUGADD(8,("start converting\n"));
-
-       d=*asc;
-               
        d->attributes=uni->attributes;
        d->priority=uni->priority;
        d->default_priority=uni->default_priority;
@@ -5701,17 +5480,17 @@ BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
        d->status=uni->status;
        d->cjobs=uni->cjobs;
        
-       unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
-       unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
-       unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
-       unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
-       unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
-       unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
-       unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
-       unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
-       unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
-       unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
-       unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
+       unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername));
+       unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername));
+       unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename));
+       unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname));
+       unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername));
+       unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment));
+       unistr2_to_ascii(d->location, &uni->location, sizeof(d->location));
+       unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile));
+       unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor));
+       unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype));
+       unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters));
 
        return True;
 }
@@ -5720,9 +5499,9 @@ BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
+bool make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
                                 fstring servername, fstring env_name, uint32 level,
-                                NEW_BUFFER *buffer, uint32 offered)
+                                RPC_BUFFER *buffer, uint32 offered)
 {
        init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
        init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
@@ -5738,7 +5517,7 @@ BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
  Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
 ********************************************************************/  
 
-BOOL spoolss_io_q_getprinterdriverdir(const char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_getprinterdriverdir(const char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
        depth++;
@@ -5764,7 +5543,7 @@ BOOL spoolss_io_q_getprinterdriverdir(const char *desc, SPOOL_Q_GETPRINTERDRIVER
        if(!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
                
        if(!prs_align(ps))
@@ -5780,7 +5559,7 @@ BOOL spoolss_io_q_getprinterdriverdir(const char *desc, SPOOL_Q_GETPRINTERDRIVER
  Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
 ********************************************************************/  
 
-BOOL spoolss_io_r_getprinterdriverdir(const char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_getprinterdriverdir(const char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
        depth++;
@@ -5788,7 +5567,7 @@ BOOL spoolss_io_r_getprinterdriverdir(const char *desc, SPOOL_R_GETPRINTERDRIVER
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5806,7 +5585,7 @@ BOOL spoolss_io_r_getprinterdriverdir(const char *desc, SPOOL_R_GETPRINTERDRIVER
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
        depth++;
@@ -5814,7 +5593,7 @@ BOOL spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESS
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5835,7 +5614,7 @@ BOOL spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESS
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
        depth++;
@@ -5862,7 +5641,7 @@ BOOL spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESS
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5877,7 +5656,7 @@ BOOL spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESS
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_addprintprocessor(const char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_addprintprocessor(const char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
        depth++;
@@ -5911,7 +5690,7 @@ BOOL spoolss_io_q_addprintprocessor(const char *desc, SPOOL_Q_ADDPRINTPROCESSOR
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_addprintprocessor(const char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_addprintprocessor(const char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
        depth++;
@@ -5928,7 +5707,7 @@ BOOL spoolss_io_r_addprintprocessor(const char *desc, SPOOL_R_ADDPRINTPROCESSOR
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
        depth++;
@@ -5936,7 +5715,7 @@ BOOL spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROC
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -5957,7 +5736,7 @@ BOOL spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROC
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
        depth++;
@@ -5984,7 +5763,7 @@ BOOL spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROC
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
+       if(!prs_rpcbuffer_p("buffer", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -6000,7 +5779,7 @@ BOOL spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROC
  Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
 ********************************************************************/  
 
-BOOL spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
        depth++;
@@ -6019,7 +5798,7 @@ BOOL spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS
        if (!prs_uint32("level", ps, depth, &q_u->level))
                return False;
                
-       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -6034,7 +5813,7 @@ BOOL spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
        depth++;
@@ -6042,7 +5821,7 @@ BOOL spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -6063,7 +5842,7 @@ BOOL spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
 {      
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
        depth++;
@@ -6074,7 +5853,7 @@ BOOL spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u
                return False;
 
        if (UNMARSHALLING(ps) && r_u->valuesize) {
-               r_u->value = (uint16 *)prs_alloc_mem(ps, r_u->valuesize * 2);
+               r_u->value = PRS_ALLOC_MEM(ps, uint16, r_u->valuesize);
                if (!r_u->value) {
                        DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
                        return False;
@@ -6097,7 +5876,7 @@ BOOL spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u
                return False;
 
        if (UNMARSHALLING(ps) && r_u->datasize) {
-               r_u->data = (uint8 *)prs_alloc_mem(ps, r_u->datasize);
+               r_u->data = PRS_ALLOC_MEM(ps, uint8, r_u->datasize);
                if (!r_u->data) {
                        DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
                        return False;
@@ -6120,7 +5899,7 @@ BOOL spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
        depth++;
@@ -6142,7 +5921,7 @@ BOOL spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u
 /*******************************************************************
 ********************************************************************/  
 
-BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
+bool make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
                const POLICY_HND *hnd,
                uint32 idx, uint32 valuelen, uint32 datalen)
 {
@@ -6157,12 +5936,12 @@ BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
+bool make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
                                      const POLICY_HND *hnd, const char *key,
                                      uint32 size)
 {
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
-       init_unistr2(&q_u->key, key, strlen(key)+1);
+       init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
        q_u->size = size;
 
        return True;
@@ -6170,32 +5949,32 @@ BOOL make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
 
 /*******************************************************************
 ********************************************************************/  
-BOOL make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
+bool make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
                                   char* value, uint32 data_type, char* data, uint32 data_size)
 {
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
        q_u->type = data_type;
-       init_unistr2(&q_u->value, value, strlen(value)+1);
+       init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
 
        q_u->max_len = q_u->real_len = data_size;
-       q_u->data = data;
+       q_u->data = (unsigned char *)data;
        
        return True;
 }
 
 /*******************************************************************
 ********************************************************************/  
-BOOL make_spoolss_q_setprinterdataex(SPOOL_Q_SETPRINTERDATAEX *q_u, const POLICY_HND *hnd,
+bool make_spoolss_q_setprinterdataex(SPOOL_Q_SETPRINTERDATAEX *q_u, const POLICY_HND *hnd,
                                     char *key, char* value, uint32 data_type, char* data, 
                                     uint32 data_size)
 {
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
        q_u->type = data_type;
-       init_unistr2(&q_u->value, value, strlen(value)+1);
-       init_unistr2(&q_u->key, key, strlen(key)+1);
+       init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
 
        q_u->max_len = q_u->real_len = data_size;
-       q_u->data = data;
+       q_u->data = (unsigned char *)data;
        
        return True;
 }
@@ -6203,7 +5982,7 @@ BOOL make_spoolss_q_setprinterdataex(SPOOL_Q_SETPRINTERDATAEX *q_u, const POLICY
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
        depth++;
@@ -6230,14 +6009,14 @@ BOOL spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u,
                case REG_BINARY:
                case REG_DWORD:
                case REG_MULTI_SZ:
-            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 (q_u->max_len) {
+                               if (UNMARSHALLING(ps))
+                                       q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
+                               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;
@@ -6252,7 +6031,7 @@ BOOL spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u,
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
        depth++;
@@ -6267,7 +6046,7 @@ BOOL spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u,
 
 /*******************************************************************
 ********************************************************************/  
-BOOL spoolss_io_q_resetprinter(const char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_resetprinter(const char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_resetprinter");
        depth++;
@@ -6294,7 +6073,7 @@ BOOL spoolss_io_q_resetprinter(const char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_
 
 /*******************************************************************
 ********************************************************************/  
-BOOL spoolss_io_r_resetprinter(const char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_resetprinter(const char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_resetprinter");
        depth++;
@@ -6310,7 +6089,7 @@ BOOL spoolss_io_r_resetprinter(const char *desc, SPOOL_R_RESETPRINTER *r_u, prs_
 /*******************************************************************
 ********************************************************************/  
 
-static BOOL spoolss_io_addform(const char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
+static bool spoolss_io_addform(const char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_addform");
        depth++;
@@ -6346,7 +6125,7 @@ static BOOL spoolss_io_addform(const char *desc, FORM *f, uint32 ptr, prs_struct
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_deleteform(const char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_deleteform(const char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
        depth++;
@@ -6364,7 +6143,7 @@ BOOL spoolss_io_q_deleteform(const char *desc, SPOOL_Q_DELETEFORM *q_u, prs_stru
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_deleteform(const char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_deleteform(const char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
        depth++;
@@ -6380,7 +6159,7 @@ BOOL spoolss_io_r_deleteform(const char *desc, SPOOL_R_DELETEFORM *r_u, prs_stru
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_addform(const char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_addform(const char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
 {
        uint32 useless_ptr=1;
        prs_debug(ps, depth, desc, "spoolss_io_q_addform");
@@ -6409,7 +6188,7 @@ BOOL spoolss_io_q_addform(const char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_addform(const char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_addform(const char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_addform");
        depth++;
@@ -6425,7 +6204,7 @@ BOOL spoolss_io_r_addform(const char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_q_setform(const char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_setform(const char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
 {
        uint32 useless_ptr=1;
        prs_debug(ps, depth, desc, "spoolss_io_q_setform");
@@ -6460,7 +6239,7 @@ BOOL spoolss_io_q_setform(const char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps
 /*******************************************************************
 ********************************************************************/  
 
-BOOL spoolss_io_r_setform(const char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_setform(const char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_setform");
        depth++;
@@ -6477,7 +6256,7 @@ BOOL spoolss_io_r_setform(const char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps
  Parse a SPOOL_R_GETJOB structure.
 ********************************************************************/  
 
-BOOL spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
        depth++;
@@ -6485,7 +6264,7 @@ BOOL spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps,
        if (!prs_align(ps))
                return False;
                
-       if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
 
        if (!prs_align(ps))
@@ -6504,7 +6283,7 @@ BOOL spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps,
  Parse a SPOOL_Q_GETJOB structure.
 ********************************************************************/  
 
-BOOL spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "");
        depth++;
@@ -6519,7 +6298,7 @@ BOOL spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps,
        if(!prs_uint32("level", ps, depth, &q_u->level))
                return False;
        
-       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
 
        if(!prs_align(ps))
@@ -6534,7 +6313,7 @@ BOOL spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps,
 void free_devmode(DEVICEMODE *devmode)
 {
        if (devmode!=NULL) {
-               SAFE_FREE(devmode->private);
+               SAFE_FREE(devmode->dev_private);
                SAFE_FREE(devmode);
        }
 }
@@ -6568,6 +6347,11 @@ void free_printer_info_5(PRINTER_INFO_5 *printer)
        SAFE_FREE(printer);
 }
 
+void free_printer_info_6(PRINTER_INFO_6 *printer)
+{
+       SAFE_FREE(printer);
+}
+
 void free_printer_info_7(PRINTER_INFO_7 *printer)
 {
        SAFE_FREE(printer);
@@ -6583,13 +6367,13 @@ void free_job_info_2(JOB_INFO_2 *job)
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u, 
+bool make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u, 
                               const fstring string, uint32 printer, uint32 type)
 {      
        if (q_u == NULL)
                return False;
 
-       init_unistr2(&q_u->string, string, strlen(string)+1);
+       init_unistr2(&q_u->string, string, UNI_STR_TERMINATE);
 
        q_u->printer=printer;
        q_u->type=type;
@@ -6604,7 +6388,7 @@ BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
  Parse a SPOOL_Q_REPLYOPENPRINTER structure.
 ********************************************************************/  
 
-BOOL spoolss_io_q_replyopenprinter(const char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_replyopenprinter(const char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
        depth++;
@@ -6635,7 +6419,7 @@ BOOL spoolss_io_q_replyopenprinter(const char *desc, SPOOL_Q_REPLYOPENPRINTER *q
  Parse a SPOOL_R_REPLYOPENPRINTER structure.
 ********************************************************************/  
 
-BOOL spoolss_io_r_replyopenprinter(const char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_replyopenprinter(const char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
        depth++;
@@ -6655,7 +6439,7 @@ BOOL spoolss_io_r_replyopenprinter(const char *desc, SPOOL_R_REPLYOPENPRINTER *r
 /*******************************************************************
  * init a structure.
  ********************************************************************/
-BOOL make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd, 
+bool make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd, 
                                        uint32 condition, uint32 change_id)
 {
 
@@ -6675,7 +6459,7 @@ BOOL make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_H
 /*******************************************************************
  Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
 ********************************************************************/
-BOOL spoolss_io_q_routerreplyprinter (const char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_routerreplyprinter (const char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
 {
 
        prs_debug(ps, depth, desc, "spoolss_io_q_routerreplyprinter");
@@ -6696,7 +6480,7 @@ BOOL spoolss_io_q_routerreplyprinter (const char *desc, SPOOL_Q_ROUTERREPLYPRINT
        if (!prs_uint32("change_id", ps, depth, &q_u->change_id))
                return False;
 
-       if (!prs_uint8s(False, "private",  ps, depth, q_u->unknown2, 5))
+       if (!prs_uint8s(False, "dev_private",  ps, depth, q_u->unknown2, 5))
                return False;
 
        return True;
@@ -6705,7 +6489,7 @@ BOOL spoolss_io_q_routerreplyprinter (const char *desc, SPOOL_Q_ROUTERREPLYPRINT
 /*******************************************************************
  Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
 ********************************************************************/
-BOOL spoolss_io_r_routerreplyprinter (const char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_routerreplyprinter (const char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_routerreplyprinter");
        depth++;
@@ -6723,7 +6507,7 @@ BOOL spoolss_io_r_routerreplyprinter (const char *desc, SPOOL_R_ROUTERREPLYPRINT
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
+bool make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
 {      
        if (q_u == NULL)
                return False;
@@ -6737,7 +6521,7 @@ BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HN
  Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
 ********************************************************************/  
 
-BOOL spoolss_io_q_replycloseprinter(const char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_replycloseprinter(const char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
        depth++;
@@ -6755,7 +6539,7 @@ BOOL spoolss_io_q_replycloseprinter(const char *desc, SPOOL_Q_REPLYCLOSEPRINTER
  Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
 ********************************************************************/  
 
-BOOL spoolss_io_r_replycloseprinter(const char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_replycloseprinter(const char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
        depth++;
@@ -6777,7 +6561,7 @@ BOOL spoolss_io_r_replycloseprinter(const char *desc, SPOOL_R_REPLYCLOSEPRINTER
 /*******************************************************************
  Deep copy a SPOOL_NOTIFY_INFO_DATA structure
  ******************************************************************/
-static BOOL copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst, 
+static bool copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst, 
                                SPOOL_NOTIFY_INFO_DATA *src, int n)
 {
        int i;
@@ -6791,7 +6575,7 @@ static BOOL copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
                if (src->size != POINTER) 
                        continue;
                len = src->notify_data.data.length;
-               s = malloc(sizeof(uint16)*len);
+               s = SMB_MALLOC_ARRAY(uint16, len);
                if (s == NULL) {
                        DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
                        return False;
@@ -6807,7 +6591,7 @@ static BOOL copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
 /*******************************************************************
  Deep copy a SPOOL_NOTIFY_INFO structure
  ******************************************************************/
-static BOOL copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
+static bool copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
 {
        if (!dst) {
                DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
@@ -6820,7 +6604,7 @@ static BOOL copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *sr
        
        if (dst->count) 
        {
-               dst->data = malloc(dst->count * sizeof(SPOOL_NOTIFY_INFO_DATA));
+               dst->data = SMB_MALLOC_ARRAY(SPOOL_NOTIFY_INFO_DATA, dst->count);
                
                DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
                        dst->count));
@@ -6842,7 +6626,7 @@ static BOOL copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *sr
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
+bool make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
                                uint32 change_low, uint32 change_high,
                                SPOOL_NOTIFY_INFO *info)
 {      
@@ -6882,7 +6666,7 @@ BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
  Parse a SPOOL_Q_REPLY_RRPCN structure.
 ********************************************************************/  
 
-BOOL spoolss_io_q_reply_rrpcn(const char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_reply_rrpcn(const char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
        depth++;
@@ -6919,7 +6703,7 @@ BOOL spoolss_io_q_reply_rrpcn(const char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_st
  Parse a SPOOL_R_REPLY_RRPCN structure.
 ********************************************************************/  
 
-BOOL spoolss_io_r_reply_rrpcn(const char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_reply_rrpcn(const char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
 {              
        prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
        depth++;
@@ -6941,7 +6725,7 @@ BOOL spoolss_io_r_reply_rrpcn(const char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_st
  * called from spoolss_q_getprinterdataex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_q_getprinterdataex(const char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_getprinterdataex(const char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL)
                return False;
@@ -6974,7 +6758,7 @@ BOOL spoolss_io_q_getprinterdataex(const char *desc, SPOOL_Q_GETPRINTERDATAEX *q
  * called from spoolss_r_getprinterdataex (srv_spoolss.c)
  ********************************************************************/
 
-BOOL spoolss_io_r_getprinterdataex(const char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_getprinterdataex(const char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
 {
        if (r_u == NULL)
                return False;
@@ -6990,7 +6774,7 @@ BOOL spoolss_io_r_getprinterdataex(const char *desc, SPOOL_R_GETPRINTERDATAEX *r
                return False;
        
        if (UNMARSHALLING(ps) && r_u->size) {
-               r_u->data = prs_alloc_mem(ps, r_u->size);
+               r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
                if(!r_u->data)
                        return False;
        }
@@ -7013,7 +6797,7 @@ BOOL spoolss_io_r_getprinterdataex(const char *desc, SPOOL_R_GETPRINTERDATAEX *r
  * read a structure.
  ********************************************************************/  
 
-BOOL spoolss_io_q_setprinterdataex(const char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_setprinterdataex(const char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
        depth++;
@@ -7048,7 +6832,7 @@ BOOL spoolss_io_q_setprinterdataex(const char *desc, SPOOL_Q_SETPRINTERDATAEX *q
                case 0x7:
                        if (q_u->max_len) {
                                if (UNMARSHALLING(ps))
-                                       q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
+                                       q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
                                if(q_u->data == NULL)
                                        return False;
                                if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
@@ -7069,7 +6853,7 @@ BOOL spoolss_io_q_setprinterdataex(const char *desc, SPOOL_Q_SETPRINTERDATAEX *q
  * write a structure.
  ********************************************************************/  
 
-BOOL spoolss_io_r_setprinterdataex(const char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_setprinterdataex(const char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
        depth++;
@@ -7085,14 +6869,14 @@ BOOL spoolss_io_r_setprinterdataex(const char *desc, SPOOL_R_SETPRINTERDATAEX *r
 /*******************************************************************
  * read a structure.
  ********************************************************************/  
-BOOL make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u, 
+bool make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u, 
                                   POLICY_HND *hnd, const char *key, 
                                   uint32 size)
 {
        DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
 
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
-       init_unistr2(&q_u->key, key, strlen(key)+1);
+       init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
        q_u->size = size;
 
        return True;
@@ -7102,7 +6886,7 @@ BOOL make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u,
  * read a structure.
  ********************************************************************/  
 
-BOOL spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
        depth++;
@@ -7128,7 +6912,7 @@ BOOL spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u,
  * write a structure.
  ********************************************************************/  
 
-BOOL spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
        depth++;
@@ -7155,13 +6939,13 @@ BOOL spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u,
  * read a structure.
  ********************************************************************/  
 
-BOOL make_spoolss_q_deleteprinterkey(SPOOL_Q_DELETEPRINTERKEY *q_u, 
+bool make_spoolss_q_deleteprinterkey(SPOOL_Q_DELETEPRINTERKEY *q_u, 
                                     POLICY_HND *hnd, char *keyname)
 {
        DEBUG(5,("make_spoolss_q_deleteprinterkey\n"));
 
        memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
-       init_unistr2(&q_u->keyname, keyname, strlen(keyname)+1);
+       init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
 
        return True;
 }
@@ -7170,7 +6954,7 @@ BOOL make_spoolss_q_deleteprinterkey(SPOOL_Q_DELETEPRINTERKEY *q_u,
  * read a structure.
  ********************************************************************/  
 
-BOOL spoolss_io_q_deleteprinterkey(const char *desc, SPOOL_Q_DELETEPRINTERKEY *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_deleteprinterkey(const char *desc, SPOOL_Q_DELETEPRINTERKEY *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterkey");
        depth++;
@@ -7190,7 +6974,7 @@ BOOL spoolss_io_q_deleteprinterkey(const char *desc, SPOOL_Q_DELETEPRINTERKEY *q
  * write a structure.
  ********************************************************************/  
 
-BOOL spoolss_io_r_deleteprinterkey(const char *desc, SPOOL_R_DELETEPRINTERKEY *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_deleteprinterkey(const char *desc, SPOOL_R_DELETEPRINTERKEY *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterkey");
        depth++;
@@ -7209,7 +6993,7 @@ BOOL spoolss_io_r_deleteprinterkey(const char *desc, SPOOL_R_DELETEPRINTERKEY *r
  * read a structure.
  ********************************************************************/  
 
-BOOL spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
        depth++;
@@ -7234,7 +7018,7 @@ BOOL spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX
 /*******************************************************************
 ********************************************************************/  
 
-static BOOL spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps, 
+static bool spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps, 
                                PRINTER_ENUM_VALUES_CTR *ctr, int depth)
 {
        int     i;
@@ -7242,10 +7026,10 @@ static BOOL spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
                data_offset,
                current_offset;
        const uint32 basic_unit = 20; /* size of static portion of enum_values */
-       
+
        prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
        depth++;        
-       
+
        /* 
         * offset data begins at 20 bytes per structure * size_of_array.
         * Don't forget the uint32 at the beginning 
@@ -7255,18 +7039,36 @@ static BOOL spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
        
        /* first loop to write basic enum_value information */
        
-       if (UNMARSHALLING(ps)) {
-               ctr->values = (PRINTER_ENUM_VALUES *)prs_alloc_mem(
-                       ps, ctr->size_of_array * sizeof(PRINTER_ENUM_VALUES));
+       if (UNMARSHALLING(ps) && ctr->size_of_array) {
+               ctr->values = PRS_ALLOC_MEM(ps, PRINTER_ENUM_VALUES, ctr->size_of_array);
                if (!ctr->values)
                        return False;
        }
 
        for (i=0; i<ctr->size_of_array; i++) {
+               uint32 base_offset, return_offset;
+
+               base_offset = prs_offset(ps);
+
                valuename_offset = current_offset;
                if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
                        return False;
 
+               /* Read or write the value. */
+
+               return_offset = prs_offset(ps);
+
+               if (!prs_set_offset(ps, base_offset + valuename_offset)) {
+                       return False;
+               }
+
+               if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
+                       return False;
+
+               /* And go back. */
+               if (!prs_set_offset(ps, return_offset))
+                       return False;
+
                if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
                        return False;
        
@@ -7281,35 +7083,47 @@ static BOOL spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
                if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
                        return False;
                        
-               current_offset  = data_offset + ctr->values[i].data_len - basic_unit;
-               /* account for 2 byte alignment */
-               current_offset += (current_offset % 2);
-       }
+               /* Read or write the data. */
 
-       /* 
-        * loop #2 for writing the dynamically size objects; pay 
-        * attention to 2-byte alignment here....
-        */
-       
-       for (i=0; i<ctr->size_of_array; i++) {
-       
-               if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
+               return_offset = prs_offset(ps);
+
+               if (!prs_set_offset(ps, base_offset + data_offset)) {
                        return False;
-               
-               if (UNMARSHALLING(ps)) {
-                       ctr->values[i].data = (uint8 *)prs_alloc_mem(
-                               ps, ctr->values[i].data_len);
-                       if (!ctr->values[i].data)
+               }
+
+               if ( ctr->values[i].data_len ) {
+                       if ( UNMARSHALLING(ps) ) {
+                               ctr->values[i].data = PRS_ALLOC_MEM(ps, uint8, ctr->values[i].data_len);
+                               if (!ctr->values[i].data)
+                                       return False;
+                       }
+                       if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
                                return False;
                }
 
-               if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
-                       return False;
-                       
-               if ( !prs_align_uint16(ps) )
+               current_offset  = data_offset + ctr->values[i].data_len - basic_unit;
+               /* account for 2 byte alignment */
+               current_offset += (current_offset % 2);
+
+               /* Remember how far we got. */
+               data_offset = prs_offset(ps);
+
+               /* And go back. */
+               if (!prs_set_offset(ps, return_offset))
                        return False;
+
        }
 
+       /* Go to the last data offset we got to. */
+
+       if (!prs_set_offset(ps, data_offset))
+               return False;
+
+       /* And ensure we're 2 byte aligned. */
+
+       if ( !prs_align_uint16(ps) )
+               return False;
+
        return True;    
 }
 
@@ -7317,7 +7131,7 @@ static BOOL spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
  * write a structure.
  ********************************************************************/  
 
-BOOL spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
 {
        uint32 data_offset, end_offset;
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
@@ -7359,7 +7173,7 @@ BOOL spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX
 
        if (!prs_set_offset(ps, end_offset))
                return False;
-                                                                                                                                                       return True;
+       return True;
 }
 
 /*******************************************************************
@@ -7371,7 +7185,7 @@ BOOL spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX
        [in] unistr2 *name,
        [in] unistr2 *environment,
        [in] uint32 level,
-       [in,out] NEW_BUFFER buffer,
+       [in,out] RPC_BUFFER buffer,
        [in] uint32 offered,
        [out] uint32 needed,
        [out] uint32 returned
@@ -7379,12 +7193,12 @@ BOOL spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX
 
 */
 
-BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, NEW_BUFFER *buffer, uint32 offered)
+bool make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, RPC_BUFFER *buffer, uint32 offered)
 {
        DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
 
-       init_unistr2(&q_u->name, name, strlen(name)+1);
-       init_unistr2(&q_u->environment, environment, strlen(environment)+1);
+       init_unistr2(&q_u->name, name, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->environment, environment, UNI_STR_TERMINATE);
 
        q_u->level = level;
 
@@ -7394,9 +7208,9 @@ BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTOR
        return True;
 }
 
-BOOL spoolss_io_q_getprintprocessordirectory(const char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
+bool spoolss_io_q_getprintprocessordirectory(const char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
 {
-       uint32 ptr;
+       uint32 ptr = 0;
 
        prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
        depth++;
@@ -7430,7 +7244,7 @@ BOOL spoolss_io_q_getprintprocessordirectory(const char *desc, SPOOL_Q_GETPRINTP
        if(!prs_uint32("level",   ps, depth, &q_u->level))
                return False;
 
-       if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
+       if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
                return False;
        
        if(!prs_align(ps))
@@ -7446,7 +7260,7 @@ BOOL spoolss_io_q_getprintprocessordirectory(const char *desc, SPOOL_Q_GETPRINTP
  * write a structure.
  ********************************************************************/  
 
-BOOL spoolss_io_r_getprintprocessordirectory(const char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
+bool spoolss_io_r_getprintprocessordirectory(const char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
        depth++;
@@ -7454,7 +7268,7 @@ BOOL spoolss_io_r_getprintprocessordirectory(const char *desc, SPOOL_R_GETPRINTP
        if(!prs_align(ps))
                return False;
 
-       if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
+       if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
                return False;
        
        if(!prs_align(ps))
@@ -7469,7 +7283,7 @@ BOOL spoolss_io_r_getprintprocessordirectory(const char *desc, SPOOL_R_GETPRINTP
        return True;
 }
 
-BOOL smb_io_printprocessordirectory_1(const char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
+bool smb_io_printprocessordirectory_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
 {
        prs_struct *ps=&buffer->prs;
 
@@ -7488,7 +7302,7 @@ BOOL smb_io_printprocessordirectory_1(const char *desc, NEW_BUFFER *buffer, PRIN
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle, 
+bool make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle, 
                            int level, FORM *form)
 {
        memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
@@ -7503,14 +7317,14 @@ BOOL make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle, 
+bool make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle, 
                            int level, const char *form_name, FORM *form)
 {
        memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
        q_u->level = level;
        q_u->level2 = level;
        memcpy(&q_u->form, form, sizeof(FORM));
-       init_unistr2(&q_u->name, form_name, strlen(form_name) + 1);
+       init_unistr2(&q_u->name, form_name, UNI_STR_TERMINATE);
 
        return True;
 }
@@ -7519,11 +7333,11 @@ BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle, 
+bool make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle, 
                               const char *form)
 {
        memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
-       init_unistr2(&q_u->name, form, strlen(form) + 1);
+       init_unistr2(&q_u->name, form, UNI_STR_TERMINATE);
        return True;
 }
 
@@ -7531,13 +7345,13 @@ BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle, 
+bool make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle, 
                             const char *formname, uint32 level, 
-                           NEW_BUFFER *buffer, uint32 offered)
+                           RPC_BUFFER *buffer, uint32 offered)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
         q_u->level = level;
-        init_unistr2(&q_u->formname, formname, strlen(formname) + 1);
+        init_unistr2(&q_u->formname, formname, UNI_STR_TERMINATE);
         q_u->buffer=buffer;
         q_u->offered=offered;
 
@@ -7548,8 +7362,8 @@ BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle, 
-                             uint32 level, NEW_BUFFER *buffer,
+bool make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle, 
+                             uint32 level, RPC_BUFFER *buffer,
                              uint32 offered)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
@@ -7564,7 +7378,7 @@ BOOL make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle, 
+bool make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle, 
                           uint32 jobid, uint32 level, uint32 command)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
@@ -7583,8 +7397,8 @@ BOOL make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle, 
-                          uint32 jobid, uint32 level, NEW_BUFFER *buffer,
+bool make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle, 
+                          uint32 jobid, uint32 level, RPC_BUFFER *buffer,
                           uint32 offered)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
@@ -7600,7 +7414,7 @@ BOOL make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u, 
+bool make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u, 
                                     POLICY_HND *handle)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
@@ -7612,7 +7426,7 @@ BOOL make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u, 
+bool make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u, 
                                   POLICY_HND *handle)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
@@ -7624,7 +7438,7 @@ BOOL make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u, 
+bool make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u, 
                                    POLICY_HND *handle, uint32 level,
                                    char *docname, char *outputfile,
                                    char *datatype)
@@ -7643,17 +7457,9 @@ BOOL make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
                ctr->docinfo.doc_info_1.p_outputfile = outputfile ? 1 : 0;
                ctr->docinfo.doc_info_1.p_datatype = datatype ? 1 : 0;
 
-               if (docname)
-                       init_unistr2(&ctr->docinfo.doc_info_1.docname, docname,
-                                    strlen(docname) + 1);
-
-               if (outputfile)
-                       init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile,
-                                    strlen(outputfile) + 1);
-
-               if (datatype)
-                       init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype,
-                                    strlen(datatype) + 1);
+               init_unistr2(&ctr->docinfo.doc_info_1.docname, docname, UNI_STR_TERMINATE);
+               init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile, UNI_STR_TERMINATE);
+               init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype, UNI_STR_TERMINATE);
 
                break;
        case 2:
@@ -7672,7 +7478,7 @@ BOOL make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u, 
+bool make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u, 
                                  POLICY_HND *handle)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
@@ -7684,13 +7490,13 @@ BOOL make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u, 
+bool make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u, 
                                 POLICY_HND *handle, uint32 data_size,
                                 char *data)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
        q_u->buffer_size = q_u->buffer_size2 = data_size;
-       q_u->buffer = data;
+       q_u->buffer = (unsigned char *)data;
        return True;
 }
 
@@ -7698,11 +7504,11 @@ BOOL make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u, 
+bool make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u, 
                                 POLICY_HND *handle, char *valuename)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
-       init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
+       init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
 
        return True;
 }
@@ -7711,13 +7517,13 @@ BOOL make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_deleteprinterdataex(SPOOL_Q_DELETEPRINTERDATAEX *q_u, 
+bool make_spoolss_q_deleteprinterdataex(SPOOL_Q_DELETEPRINTERDATAEX *q_u, 
                                        POLICY_HND *handle, char *key,
                                        char *value)
 {
         memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
-       init_unistr2(&q_u->valuename, value, strlen(value) + 1);
-       init_unistr2(&q_u->keyname, key, strlen(key) + 1);
+       init_unistr2(&q_u->valuename, value, UNI_STR_TERMINATE);
+       init_unistr2(&q_u->keyname, key, UNI_STR_TERMINATE);
 
        return True;
 }
@@ -7726,7 +7532,7 @@ BOOL make_spoolss_q_deleteprinterdataex(SPOOL_Q_DELETEPRINTERDATAEX *q_u,
  * init a structure.
  ********************************************************************/
 
-BOOL make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
+bool make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
                             uint32 flags, uint32 options, const char *localmachine,
                             uint32 printerlocal, SPOOL_NOTIFY_OPTION *option)
 {
@@ -7737,8 +7543,7 @@ BOOL make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
 
        q_u->localmachine_ptr = 1;
 
-       init_unistr2(&q_u->localmachine, localmachine, 
-                    strlen(localmachine) + 1);
+       init_unistr2(&q_u->localmachine, localmachine, UNI_STR_TERMINATE);
 
        q_u->printerlocal = printerlocal;
 
@@ -7749,3 +7554,174 @@ BOOL make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
 
        return True;
 }
+
+
+/*******************************************************************
+ ********************************************************************/  
+
+bool spoolss_io_q_xcvdataport(const char *desc, SPOOL_Q_XCVDATAPORT *q_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "spoolss_io_q_xcvdataport");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;   
+
+       if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
+               return False;
+               
+       if(!smb_io_unistr2("", &q_u->dataname, True, ps, depth))
+               return False;
+
+       if (!prs_align(ps))
+               return False;
+
+       if(!prs_rpcbuffer("", ps, depth, &q_u->indata))
+               return False;
+               
+       if (!prs_align(ps))
+               return False;
+
+       if (!prs_uint32("indata_len", ps, depth, &q_u->indata_len))
+               return False;
+       if (!prs_uint32("offered", ps, depth, &q_u->offered))
+               return False;
+       if (!prs_uint32("unknown", ps, depth, &q_u->unknown))
+               return False;
+       
+       return True;
+}
+
+/*******************************************************************
+ ********************************************************************/  
+
+bool spoolss_io_r_xcvdataport(const char *desc, SPOOL_R_XCVDATAPORT *r_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "spoolss_io_r_xcvdataport");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+       if(!prs_rpcbuffer("", ps, depth, &r_u->outdata))
+               return False;
+               
+       if (!prs_align(ps))
+               return False;
+
+       if (!prs_uint32("needed", ps, depth, &r_u->needed))
+               return False;
+       if (!prs_uint32("unknown", ps, depth, &r_u->unknown))
+               return False;
+
+       if(!prs_werror("status", ps, depth, &r_u->status))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ ********************************************************************/  
+
+bool make_monitorui_buf( RPC_BUFFER *buf, const char *dllname )
+{
+       UNISTR string;
+       
+       if ( !buf )
+               return False;
+
+       init_unistr( &string, dllname );
+
+       if ( !prs_unistr( "ui_dll", &buf->prs, 0, &string ) )
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ ********************************************************************/  
+#define PORT_DATA_1_PAD    540
+
+static bool smb_io_port_data_1( const char *desc, RPC_BUFFER *buf, int depth, SPOOL_PORT_DATA_1 *p1 )
+{
+       prs_struct *ps = &buf->prs;
+       uint8 padding[PORT_DATA_1_PAD];
+
+       prs_debug(ps, depth, desc, "smb_io_port_data_1");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;   
+
+       if( !prs_uint16s(True, "portname", ps, depth, p1->portname, MAX_PORTNAME))
+               return False;
+
+       if (!prs_uint32("version", ps, depth, &p1->version))
+               return False;
+       if (!prs_uint32("protocol", ps, depth, &p1->protocol))
+               return False;
+       if (!prs_uint32("size", ps, depth, &p1->size))
+               return False;
+       if (!prs_uint32("reserved", ps, depth, &p1->reserved))
+               return False;
+
+       if( !prs_uint16s(True, "hostaddress", ps, depth, p1->hostaddress, MAX_NETWORK_NAME))
+               return False;
+       if( !prs_uint16s(True, "snmpcommunity", ps, depth, p1->snmpcommunity, MAX_SNMP_COMM_NAME))
+               return False;
+
+       if (!prs_uint32("dblspool", ps, depth, &p1->dblspool))
+               return False;
+               
+       if( !prs_uint16s(True, "queue", ps, depth, p1->queue, MAX_QUEUE_NAME))
+               return False;
+       if( !prs_uint16s(True, "ipaddress", ps, depth, p1->ipaddress, MAX_IPADDR_STRING))
+               return False;
+
+       if( !prs_uint8s(False, "", ps, depth, padding, PORT_DATA_1_PAD))
+               return False;
+               
+       if (!prs_uint32("port", ps, depth, &p1->port))
+               return False;
+       if (!prs_uint32("snmpenabled", ps, depth, &p1->snmpenabled))
+               return False;
+       if (!prs_uint32("snmpdevindex", ps, depth, &p1->snmpdevindex))
+               return False;
+               
+       return True;
+}
+
+/*******************************************************************
+ ********************************************************************/  
+
+bool convert_port_data_1( NT_PORT_DATA_1 *port1, RPC_BUFFER *buf ) 
+{
+       SPOOL_PORT_DATA_1 spdata_1;
+       
+       ZERO_STRUCT( spdata_1 );
+       
+       if ( !smb_io_port_data_1( "port_data_1", buf, 0, &spdata_1 ) )
+               return False;
+               
+       rpcstr_pull(port1->name, spdata_1.portname, sizeof(port1->name), -1, 0);
+       rpcstr_pull(port1->queue, spdata_1.queue, sizeof(port1->queue), -1, 0);
+       rpcstr_pull(port1->hostaddr, spdata_1.hostaddress, sizeof(port1->hostaddr), -1, 0);
+       
+       port1->port = spdata_1.port;
+       
+       switch ( spdata_1.protocol ) {
+       case 1:
+               port1->protocol = PORT_PROTOCOL_DIRECT;
+               break;
+       case 2:
+               port1->protocol = PORT_PROTOCOL_LPR;
+               break;
+       default:
+               DEBUG(3,("convert_port_data_1: unknown protocol [%d]!\n", 
+                       spdata_1.protocol));
+               return False;
+       }
+
+       return True;
+}
+