s3: re-run make samba3-idl.
[tprouty/samba.git] / librpc / gen_ndr / ndr_spoolss.c
index 47b61e55cac93636f918bfe6e2fcc39edc5b0f10..25c9dc49d7499fe9a09cec09dae5110361b2097e 100644 (file)
@@ -57,6 +57,173 @@ _PUBLIC_ void ndr_print_spoolss_Time(struct ndr_print *ndr, const char *name, co
        ndr->depth--;
 }
 
+static size_t ndr_size_spoolss_Time(const struct spoolss_Time *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_Time, ic);
+}
+
+static enum ndr_err_code ndr_push_spoolss_TimeCtr(struct ndr_push *ndr, int ndr_flags, const struct spoolss_TimeCtr *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_spoolss_Time(r->time, ndr->iconv_convenience, ndr->flags)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->time));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->time) {
+                       NDR_CHECK(ndr_push_spoolss_Time(ndr, NDR_SCALARS, r->time));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_TimeCtr(struct ndr_pull *ndr, int ndr_flags, struct spoolss_TimeCtr *r)
+{
+       uint32_t _ptr_time;
+       TALLOC_CTX *_mem_save_time_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->size));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_time));
+               if (_ptr_time) {
+                       NDR_PULL_ALLOC(ndr, r->time);
+               } else {
+                       r->time = NULL;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->time) {
+                       _mem_save_time_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->time, 0);
+                       NDR_CHECK(ndr_pull_spoolss_Time(ndr, NDR_SCALARS, r->time));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_time_0, 0);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_TimeCtr(struct ndr_print *ndr, const char *name, const struct spoolss_TimeCtr *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_TimeCtr");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?ndr_size_spoolss_Time(r->time, ndr->iconv_convenience, ndr->flags):r->size);
+       ndr_print_ptr(ndr, "time", r->time);
+       ndr->depth++;
+       if (r->time) {
+               ndr_print_spoolss_Time(ndr, "time", r->time);
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_ProcessorArchitecture(struct ndr_push *ndr, int ndr_flags, enum spoolss_ProcessorArchitecture r)
+{
+       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_ProcessorArchitecture(struct ndr_pull *ndr, int ndr_flags, enum spoolss_ProcessorArchitecture *r)
+{
+       uint16_t v;
+       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_ProcessorArchitecture(struct ndr_print *ndr, const char *name, enum spoolss_ProcessorArchitecture r)
+{
+       const char *val = NULL;
+
+       switch (r) {
+               case PROCESSOR_ARCHITECTURE_INTEL: val = "PROCESSOR_ARCHITECTURE_INTEL"; break;
+               case PROCESSOR_ARCHITECTURE_IA64: val = "PROCESSOR_ARCHITECTURE_IA64"; break;
+               case PROCESSOR_ARCHITECTURE_AMD64: val = "PROCESSOR_ARCHITECTURE_AMD64"; break;
+       }
+       ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
+static enum ndr_err_code ndr_push_spoolss_ProcessorType(struct ndr_push *ndr, int ndr_flags, enum spoolss_ProcessorType r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_ProcessorType(struct ndr_pull *ndr, int ndr_flags, enum spoolss_ProcessorType *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_ProcessorType(struct ndr_print *ndr, const char *name, enum spoolss_ProcessorType r)
+{
+       const char *val = NULL;
+
+       switch (r) {
+               case PROCESSOR_INTEL_386: val = "PROCESSOR_INTEL_386"; break;
+               case PROCESSOR_INTEL_486: val = "PROCESSOR_INTEL_486"; break;
+               case PROCESSOR_INTEL_PENTIUM: val = "PROCESSOR_INTEL_PENTIUM"; break;
+               case PROCESSOR_INTEL_IA64: val = "PROCESSOR_INTEL_IA64"; break;
+               case PROCESSOR_AMD_X8664: val = "PROCESSOR_AMD_X8664"; break;
+       }
+       ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
+static enum ndr_err_code ndr_push_spoolss_MajorVersion(struct ndr_push *ndr, int ndr_flags, enum spoolss_MajorVersion r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_MajorVersion(struct ndr_pull *ndr, int ndr_flags, enum spoolss_MajorVersion *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_MajorVersion(struct ndr_print *ndr, const char *name, enum spoolss_MajorVersion r)
+{
+       const char *val = NULL;
+
+       switch (r) {
+               case SPOOLSS_MAJOR_VERSION_NT4_95_98_ME: val = "SPOOLSS_MAJOR_VERSION_NT4_95_98_ME"; break;
+               case SPOOLSS_MAJOR_VERSION_2000_2003_XP: val = "SPOOLSS_MAJOR_VERSION_2000_2003_XP"; break;
+               case SPOOLSS_MAJOR_VERSION_2008_VISTA: val = "SPOOLSS_MAJOR_VERSION_2008_VISTA"; break;
+       }
+       ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
+static enum ndr_err_code ndr_push_spoolss_MinorVersion(struct ndr_push *ndr, int ndr_flags, enum spoolss_MinorVersion r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_MinorVersion(struct ndr_pull *ndr, int ndr_flags, enum spoolss_MinorVersion *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_MinorVersion(struct ndr_print *ndr, const char *name, enum spoolss_MinorVersion r)
+{
+       const char *val = NULL;
+
+       switch (r) {
+               case SPOOLSS_MINOR_VERSION_0: val = "SPOOLSS_MINOR_VERSION_0"; break;
+               case SPOOLSS_MINOR_VERSION_XP: val = "SPOOLSS_MINOR_VERSION_XP"; break;
+               case SPOOLSS_MINOR_VERSION_2003_XP64: val = "SPOOLSS_MINOR_VERSION_2003_XP64"; break;
+               case SPOOLSS_MINOR_VERSION_98: val = "SPOOLSS_MINOR_VERSION_98"; break;
+               case SPOOLSS_MINOR_VERSION_ME: val = "SPOOLSS_MINOR_VERSION_ME"; break;
+       }
+       ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
 static enum ndr_err_code ndr_push_spoolss_PrinterInfo0(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrinterInfo0 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
@@ -80,26 +247,26 @@ static enum ndr_err_code ndr_push_spoolss_PrinterInfo0(struct ndr_push *ndr, int
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->global_counter));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->total_pages));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->version));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown10));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown11));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown12));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->free_build));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->spooling));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->max_spooling));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->session_counter));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown14));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->printer_errors));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown16));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown17));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown18));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown19));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->num_error_out_of_paper));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->num_error_not_ready));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->job_error));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->number_of_processors));
+               NDR_CHECK(ndr_push_spoolss_ProcessorType(ndr, NDR_SCALARS, r->processor_type));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->high_part_total_bytes));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->change_id));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown21));
+               NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->last_error));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->status));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown23));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumerate_network_printers));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->c_setprinter));
-               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->unknown25));
-               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->unknown26));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown27));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown28));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown29));
+               NDR_CHECK(ndr_push_spoolss_ProcessorArchitecture(ndr, NDR_SCALARS, r->processor_architecture));
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->processor_level));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->ref_ic));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->reserved2));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->reserved3));
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -163,26 +330,26 @@ static enum ndr_err_code ndr_pull_spoolss_PrinterInfo0(struct ndr_pull *ndr, int
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->global_counter));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->total_pages));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->version));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown10));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown11));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown12));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->free_build));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->spooling));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->max_spooling));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->session_counter));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown14));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->printer_errors));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown16));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown17));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown18));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown19));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->num_error_out_of_paper));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->num_error_not_ready));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->job_error));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->number_of_processors));
+               NDR_CHECK(ndr_pull_spoolss_ProcessorType(ndr, NDR_SCALARS, &r->processor_type));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->high_part_total_bytes));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->change_id));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown21));
+               NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->last_error));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->status));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown23));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumerate_network_printers));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->c_setprinter));
-               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->unknown25));
-               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->unknown26));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown27));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown28));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown29));
+               NDR_CHECK(ndr_pull_spoolss_ProcessorArchitecture(ndr, NDR_SCALARS, &r->processor_architecture));
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->processor_level));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->ref_ic));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->reserved2));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->reserved3));
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -242,26 +409,26 @@ _PUBLIC_ void ndr_print_spoolss_PrinterInfo0(struct ndr_print *ndr, const char *
        ndr_print_uint32(ndr, "global_counter", r->global_counter);
        ndr_print_uint32(ndr, "total_pages", r->total_pages);
        ndr_print_uint32(ndr, "version", r->version);
-       ndr_print_uint32(ndr, "unknown10", r->unknown10);
-       ndr_print_uint32(ndr, "unknown11", r->unknown11);
-       ndr_print_uint32(ndr, "unknown12", r->unknown12);
+       ndr_print_uint32(ndr, "free_build", r->free_build);
+       ndr_print_uint32(ndr, "spooling", r->spooling);
+       ndr_print_uint32(ndr, "max_spooling", r->max_spooling);
        ndr_print_uint32(ndr, "session_counter", r->session_counter);
-       ndr_print_uint32(ndr, "unknown14", r->unknown14);
-       ndr_print_uint32(ndr, "printer_errors", r->printer_errors);
-       ndr_print_uint32(ndr, "unknown16", r->unknown16);
-       ndr_print_uint32(ndr, "unknown17", r->unknown17);
-       ndr_print_uint32(ndr, "unknown18", r->unknown18);
-       ndr_print_uint32(ndr, "unknown19", r->unknown19);
+       ndr_print_uint32(ndr, "num_error_out_of_paper", r->num_error_out_of_paper);
+       ndr_print_uint32(ndr, "num_error_not_ready", r->num_error_not_ready);
+       ndr_print_uint32(ndr, "job_error", r->job_error);
+       ndr_print_uint32(ndr, "number_of_processors", r->number_of_processors);
+       ndr_print_spoolss_ProcessorType(ndr, "processor_type", r->processor_type);
+       ndr_print_uint32(ndr, "high_part_total_bytes", r->high_part_total_bytes);
        ndr_print_uint32(ndr, "change_id", r->change_id);
-       ndr_print_uint32(ndr, "unknown21", r->unknown21);
+       ndr_print_WERROR(ndr, "last_error", r->last_error);
        ndr_print_uint32(ndr, "status", r->status);
-       ndr_print_uint32(ndr, "unknown23", r->unknown23);
+       ndr_print_uint32(ndr, "enumerate_network_printers", r->enumerate_network_printers);
        ndr_print_uint32(ndr, "c_setprinter", r->c_setprinter);
-       ndr_print_uint16(ndr, "unknown25", r->unknown25);
-       ndr_print_uint16(ndr, "unknown26", r->unknown26);
-       ndr_print_uint32(ndr, "unknown27", r->unknown27);
-       ndr_print_uint32(ndr, "unknown28", r->unknown28);
-       ndr_print_uint32(ndr, "unknown29", r->unknown29);
+       ndr_print_spoolss_ProcessorArchitecture(ndr, "processor_architecture", r->processor_architecture);
+       ndr_print_uint16(ndr, "processor_level", r->processor_level);
+       ndr_print_uint32(ndr, "ref_ic", r->ref_ic);
+       ndr_print_uint32(ndr, "reserved2", r->reserved2);
+       ndr_print_uint32(ndr, "reserved3", r->reserved3);
        ndr->depth--;
 }
 
@@ -2911,1848 +3078,4382 @@ _PUBLIC_ void ndr_print_spoolss_PrinterControl(struct ndr_print *ndr, const char
        ndr_print_enum(ndr, name, "ENUM", val, r);
 }
 
-static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_SetPrinterInfo *r)
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo0(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo0 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
-               int level = ndr_push_get_switch_value(ndr, r);
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, level));
-               switch (level) {
-                       case 0: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info0));
-                       break; }
-
-                       case 1: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info1));
-                       break; }
-
-                       case 2: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info2));
-                       break; }
-
-                       case 3: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info3));
-                       break; }
-
-                       case 4: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info4));
-                       break; }
-
-                       case 5: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info5));
-                       break; }
-
-                       case 6: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info6));
-                       break; }
-
-                       case 7: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info7));
-                       break; }
-
-                       case 8: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info8));
-                       break; }
-
-                       case 9: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info9));
-                       break; }
-
-                       default: {
-                       break; }
-
-               }
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->servername));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->printername));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->cjobs));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->total_jobs));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->total_bytes));
+               NDR_CHECK(ndr_push_spoolss_Time(ndr, NDR_SCALARS, &r->time));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->global_counter));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->total_pages));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->version));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->free_build));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->spooling));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->max_spooling));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->session_counter));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->num_error_out_of_paper));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->num_error_not_ready));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->job_error));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->number_of_processors));
+               NDR_CHECK(ndr_push_spoolss_ProcessorType(ndr, NDR_SCALARS, r->processor_type));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->high_part_total_bytes));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->change_id));
+               NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->last_error));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->status));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumerate_network_printers));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->c_setprinter));
+               NDR_CHECK(ndr_push_spoolss_ProcessorArchitecture(ndr, NDR_SCALARS, r->processor_architecture));
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->processor_level));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->ref_ic));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->reserved2));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->reserved3));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               int level = ndr_push_get_switch_value(ndr, r);
-               switch (level) {
-                       case 0:
-                               if (r->info0) {
-                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo0(ndr, NDR_SCALARS|NDR_BUFFERS, r->info0));
-                               }
-                       break;
-
-                       case 1:
-                               if (r->info1) {
-                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo1(ndr, NDR_SCALARS|NDR_BUFFERS, r->info1));
-                               }
-                       break;
-
-                       case 2:
-                               if (r->info2) {
-                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
-                               }
-                       break;
-
-                       case 3:
-                               if (r->info3) {
-                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo3(ndr, NDR_SCALARS|NDR_BUFFERS, r->info3));
-                               }
-                       break;
-
-                       case 4:
-                               if (r->info4) {
-                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo4(ndr, NDR_SCALARS|NDR_BUFFERS, r->info4));
-                               }
-                       break;
-
-                       case 5:
-                               if (r->info5) {
-                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo5(ndr, NDR_SCALARS|NDR_BUFFERS, r->info5));
-                               }
-                       break;
-
-                       case 6:
-                               if (r->info6) {
-                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo6(ndr, NDR_SCALARS, r->info6));
-                               }
-                       break;
-
-                       case 7:
-                               if (r->info7) {
-                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo7(ndr, NDR_SCALARS|NDR_BUFFERS, r->info7));
-                               }
-                       break;
-
-                       case 8:
-                               if (r->info8) {
-                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info8));
-                               }
-                       break;
-
-                       case 9:
-                               if (r->info9) {
-                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info9));
-                               }
-                       break;
-
-                       default:
-                       break;
-
+               if (r->servername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->servername, ndr_charset_length(r->servername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->printername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->printername, ndr_charset_length(r->printername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_SetPrinterInfo *r)
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo0(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo0 *r)
 {
-       int level;
-       uint32_t _level;
-       TALLOC_CTX *_mem_save_info0_0;
-       TALLOC_CTX *_mem_save_info1_0;
-       TALLOC_CTX *_mem_save_info2_0;
-       TALLOC_CTX *_mem_save_info3_0;
-       TALLOC_CTX *_mem_save_info4_0;
-       TALLOC_CTX *_mem_save_info5_0;
-       TALLOC_CTX *_mem_save_info6_0;
-       TALLOC_CTX *_mem_save_info7_0;
-       TALLOC_CTX *_mem_save_info8_0;
-       TALLOC_CTX *_mem_save_info9_0;
-       level = ndr_pull_get_switch_value(ndr, r);
+       uint32_t _ptr_servername;
+       TALLOC_CTX *_mem_save_servername_0;
+       uint32_t _ptr_printername;
+       TALLOC_CTX *_mem_save_printername_0;
        if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &_level));
-               if (_level != level) {
-                       return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u for r", _level);
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_servername));
+               if (_ptr_servername) {
+                       NDR_PULL_ALLOC(ndr, r->servername);
+               } else {
+                       r->servername = NULL;
                }
-               switch (level) {
-                       case 0: {
-                               uint32_t _ptr_info0;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info0));
-                               if (_ptr_info0) {
-                                       NDR_PULL_ALLOC(ndr, r->info0);
-                               } else {
-                                       r->info0 = NULL;
-                               }
-                       break; }
-
-                       case 1: {
-                               uint32_t _ptr_info1;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info1));
-                               if (_ptr_info1) {
-                                       NDR_PULL_ALLOC(ndr, r->info1);
-                               } else {
-                                       r->info1 = NULL;
-                               }
-                       break; }
-
-                       case 2: {
-                               uint32_t _ptr_info2;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info2));
-                               if (_ptr_info2) {
-                                       NDR_PULL_ALLOC(ndr, r->info2);
-                               } else {
-                                       r->info2 = NULL;
-                               }
-                       break; }
-
-                       case 3: {
-                               uint32_t _ptr_info3;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info3));
-                               if (_ptr_info3) {
-                                       NDR_PULL_ALLOC(ndr, r->info3);
-                               } else {
-                                       r->info3 = NULL;
-                               }
-                       break; }
-
-                       case 4: {
-                               uint32_t _ptr_info4;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info4));
-                               if (_ptr_info4) {
-                                       NDR_PULL_ALLOC(ndr, r->info4);
-                               } else {
-                                       r->info4 = NULL;
-                               }
-                       break; }
-
-                       case 5: {
-                               uint32_t _ptr_info5;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info5));
-                               if (_ptr_info5) {
-                                       NDR_PULL_ALLOC(ndr, r->info5);
-                               } else {
-                                       r->info5 = NULL;
-                               }
-                       break; }
-
-                       case 6: {
-                               uint32_t _ptr_info6;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info6));
-                               if (_ptr_info6) {
-                                       NDR_PULL_ALLOC(ndr, r->info6);
-                               } else {
-                                       r->info6 = NULL;
-                               }
-                       break; }
-
-                       case 7: {
-                               uint32_t _ptr_info7;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info7));
-                               if (_ptr_info7) {
-                                       NDR_PULL_ALLOC(ndr, r->info7);
-                               } else {
-                                       r->info7 = NULL;
-                               }
-                       break; }
-
-                       case 8: {
-                               uint32_t _ptr_info8;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info8));
-                               if (_ptr_info8) {
-                                       NDR_PULL_ALLOC(ndr, r->info8);
-                               } else {
-                                       r->info8 = NULL;
-                               }
-                       break; }
-
-                       case 9: {
-                               uint32_t _ptr_info9;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info9));
-                               if (_ptr_info9) {
-                                       NDR_PULL_ALLOC(ndr, r->info9);
-                               } else {
-                                       r->info9 = NULL;
-                               }
-                       break; }
-
-                       default: {
-                       break; }
-
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_printername));
+               if (_ptr_printername) {
+                       NDR_PULL_ALLOC(ndr, r->printername);
+               } else {
+                       r->printername = NULL;
                }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->cjobs));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->total_jobs));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->total_bytes));
+               NDR_CHECK(ndr_pull_spoolss_Time(ndr, NDR_SCALARS, &r->time));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->global_counter));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->total_pages));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->version));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->free_build));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->spooling));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->max_spooling));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->session_counter));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->num_error_out_of_paper));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->num_error_not_ready));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->job_error));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->number_of_processors));
+               NDR_CHECK(ndr_pull_spoolss_ProcessorType(ndr, NDR_SCALARS, &r->processor_type));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->high_part_total_bytes));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->change_id));
+               NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->last_error));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->status));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumerate_network_printers));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->c_setprinter));
+               NDR_CHECK(ndr_pull_spoolss_ProcessorArchitecture(ndr, NDR_SCALARS, &r->processor_architecture));
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->processor_level));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->ref_ic));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->reserved2));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->reserved3));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               switch (level) {
-                       case 0:
-                               if (r->info0) {
-                                       _mem_save_info0_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info0, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo0(ndr, NDR_SCALARS|NDR_BUFFERS, r->info0));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info0_0, 0);
-                               }
-                       break;
-
-                       case 1:
-                               if (r->info1) {
-                                       _mem_save_info1_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info1, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo1(ndr, NDR_SCALARS|NDR_BUFFERS, r->info1));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info1_0, 0);
-                               }
-                       break;
-
-                       case 2:
-                               if (r->info2) {
-                                       _mem_save_info2_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info2, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info2_0, 0);
-                               }
-                       break;
-
-                       case 3:
-                               if (r->info3) {
-                                       _mem_save_info3_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info3, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo3(ndr, NDR_SCALARS|NDR_BUFFERS, r->info3));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info3_0, 0);
-                               }
-                       break;
-
-                       case 4:
-                               if (r->info4) {
-                                       _mem_save_info4_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info4, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo4(ndr, NDR_SCALARS|NDR_BUFFERS, r->info4));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info4_0, 0);
-                               }
-                       break;
-
-                       case 5:
-                               if (r->info5) {
-                                       _mem_save_info5_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info5, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo5(ndr, NDR_SCALARS|NDR_BUFFERS, r->info5));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info5_0, 0);
-                               }
-                       break;
-
-                       case 6:
-                               if (r->info6) {
-                                       _mem_save_info6_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info6, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo6(ndr, NDR_SCALARS, r->info6));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info6_0, 0);
-                               }
-                       break;
-
-                       case 7:
-                               if (r->info7) {
-                                       _mem_save_info7_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info7, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo7(ndr, NDR_SCALARS|NDR_BUFFERS, r->info7));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info7_0, 0);
-                               }
-                       break;
-
-                       case 8:
-                               if (r->info8) {
-                                       _mem_save_info8_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info8, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info8));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info8_0, 0);
-                               }
-                       break;
-
-                       case 9:
-                               if (r->info9) {
-                                       _mem_save_info9_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info9, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info9));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info9_0, 0);
-                               }
-                       break;
-
-                       default:
-                       break;
-
+               if (r->servername) {
+                       _mem_save_servername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->servername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->servername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->servername));
+                       if (ndr_get_array_length(ndr, &r->servername) > ndr_get_array_size(ndr, &r->servername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->servername), ndr_get_array_length(ndr, &r->servername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->servername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->servername, ndr_get_array_length(ndr, &r->servername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_servername_0, 0);
+               }
+               if (r->printername) {
+                       _mem_save_printername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->printername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->printername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->printername));
+                       if (ndr_get_array_length(ndr, &r->printername) > ndr_get_array_size(ndr, &r->printername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->printername), ndr_get_array_length(ndr, &r->printername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->printername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->printername, ndr_get_array_length(ndr, &r->printername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printername_0, 0);
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo(struct ndr_print *ndr, const char *name, const union spoolss_SetPrinterInfo *r)
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo0(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo0 *r)
 {
-       int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_SetPrinterInfo");
-       switch (level) {
-               case 0:
-                       ndr_print_ptr(ndr, "info0", r->info0);
-                       ndr->depth++;
-                       if (r->info0) {
-                               ndr_print_spoolss_PrinterInfo0(ndr, "info0", r->info0);
-                       }
-                       ndr->depth--;
-               break;
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo0");
+       ndr->depth++;
+       ndr_print_ptr(ndr, "servername", r->servername);
+       ndr->depth++;
+       if (r->servername) {
+               ndr_print_string(ndr, "servername", r->servername);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "printername", r->printername);
+       ndr->depth++;
+       if (r->printername) {
+               ndr_print_string(ndr, "printername", r->printername);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "cjobs", r->cjobs);
+       ndr_print_uint32(ndr, "total_jobs", r->total_jobs);
+       ndr_print_uint32(ndr, "total_bytes", r->total_bytes);
+       ndr_print_spoolss_Time(ndr, "time", &r->time);
+       ndr_print_uint32(ndr, "global_counter", r->global_counter);
+       ndr_print_uint32(ndr, "total_pages", r->total_pages);
+       ndr_print_uint32(ndr, "version", r->version);
+       ndr_print_uint32(ndr, "free_build", r->free_build);
+       ndr_print_uint32(ndr, "spooling", r->spooling);
+       ndr_print_uint32(ndr, "max_spooling", r->max_spooling);
+       ndr_print_uint32(ndr, "session_counter", r->session_counter);
+       ndr_print_uint32(ndr, "num_error_out_of_paper", r->num_error_out_of_paper);
+       ndr_print_uint32(ndr, "num_error_not_ready", r->num_error_not_ready);
+       ndr_print_uint32(ndr, "job_error", r->job_error);
+       ndr_print_uint32(ndr, "number_of_processors", r->number_of_processors);
+       ndr_print_spoolss_ProcessorType(ndr, "processor_type", r->processor_type);
+       ndr_print_uint32(ndr, "high_part_total_bytes", r->high_part_total_bytes);
+       ndr_print_uint32(ndr, "change_id", r->change_id);
+       ndr_print_WERROR(ndr, "last_error", r->last_error);
+       ndr_print_uint32(ndr, "status", r->status);
+       ndr_print_uint32(ndr, "enumerate_network_printers", r->enumerate_network_printers);
+       ndr_print_uint32(ndr, "c_setprinter", r->c_setprinter);
+       ndr_print_spoolss_ProcessorArchitecture(ndr, "processor_architecture", r->processor_architecture);
+       ndr_print_uint16(ndr, "processor_level", r->processor_level);
+       ndr_print_uint32(ndr, "ref_ic", r->ref_ic);
+       ndr_print_uint32(ndr, "reserved2", r->reserved2);
+       ndr_print_uint32(ndr, "reserved3", r->reserved3);
+       ndr->depth--;
+}
 
-               case 1:
-                       ndr_print_ptr(ndr, "info1", r->info1);
-                       ndr->depth++;
-                       if (r->info1) {
-                               ndr_print_spoolss_PrinterInfo1(ndr, "info1", r->info1);
-                       }
-                       ndr->depth--;
-               break;
-
-               case 2:
-                       ndr_print_ptr(ndr, "info2", r->info2);
-                       ndr->depth++;
-                       if (r->info2) {
-                               ndr_print_spoolss_PrinterInfo2(ndr, "info2", r->info2);
-                       }
-                       ndr->depth--;
-               break;
-
-               case 3:
-                       ndr_print_ptr(ndr, "info3", r->info3);
-                       ndr->depth++;
-                       if (r->info3) {
-                               ndr_print_spoolss_PrinterInfo3(ndr, "info3", r->info3);
-                       }
-                       ndr->depth--;
-               break;
-
-               case 4:
-                       ndr_print_ptr(ndr, "info4", r->info4);
-                       ndr->depth++;
-                       if (r->info4) {
-                               ndr_print_spoolss_PrinterInfo4(ndr, "info4", r->info4);
-                       }
-                       ndr->depth--;
-               break;
-
-               case 5:
-                       ndr_print_ptr(ndr, "info5", r->info5);
-                       ndr->depth++;
-                       if (r->info5) {
-                               ndr_print_spoolss_PrinterInfo5(ndr, "info5", r->info5);
-                       }
-                       ndr->depth--;
-               break;
-
-               case 6:
-                       ndr_print_ptr(ndr, "info6", r->info6);
-                       ndr->depth++;
-                       if (r->info6) {
-                               ndr_print_spoolss_PrinterInfo6(ndr, "info6", r->info6);
-                       }
-                       ndr->depth--;
-               break;
-
-               case 7:
-                       ndr_print_ptr(ndr, "info7", r->info7);
-                       ndr->depth++;
-                       if (r->info7) {
-                               ndr_print_spoolss_PrinterInfo7(ndr, "info7", r->info7);
-                       }
-                       ndr->depth--;
-               break;
-
-               case 8:
-                       ndr_print_ptr(ndr, "info8", r->info8);
-                       ndr->depth++;
-                       if (r->info8) {
-                               ndr_print_spoolss_DeviceModeInfo(ndr, "info8", r->info8);
-                       }
-                       ndr->depth--;
-               break;
-
-               case 9:
-                       ndr_print_ptr(ndr, "info9", r->info9);
-                       ndr->depth++;
-                       if (r->info9) {
-                               ndr_print_spoolss_DeviceModeInfo(ndr, "info9", r->info9);
-                       }
-                       ndr->depth--;
-               break;
-
-               default:
-               break;
-
-       }
-}
-
-_PUBLIC_ enum ndr_err_code ndr_push_spoolss_StringArray(struct ndr_push *ndr, int ndr_flags, const struct spoolss_StringArray *r)
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo1 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, (ndr_size_spoolss_StringArray(r, ndr->iconv_convenience, ndr->flags) - 4) / 2));
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->string));
-                       ndr->flags = _flags_save_string_array;
-               }
+               NDR_CHECK(ndr_push_spoolss_EnumPrinterFlags(ndr, NDR_SCALARS, r->flags));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->description));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->comment));
        }
        if (ndr_flags & NDR_BUFFERS) {
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_StringArray(struct ndr_pull *ndr, int ndr_flags, struct spoolss_StringArray *r)
-{
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size));
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->string));
-                       ndr->flags = _flags_save_string_array;
+               if (r->name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->name, ndr_charset_length(r->name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_StringArray(struct ndr_print *ndr, const char *name, const struct spoolss_StringArray *r)
-{
-       ndr_print_struct(ndr, name, "spoolss_StringArray");
-       ndr->depth++;
-       ndr_print_uint32(ndr, "_ndr_size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?(ndr_size_spoolss_StringArray(r, ndr->iconv_convenience, ndr->flags) - 4) / 2:r->_ndr_size);
-       ndr_print_string_array(ndr, "string", r->string);
-       ndr->depth--;
-}
-
-_PUBLIC_ size_t ndr_size_spoolss_StringArray(const struct spoolss_StringArray *r, struct smb_iconv_convenience *ic, int flags)
-{
-       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_StringArray, ic);
-}
-
-static enum ndr_err_code ndr_push_spoolss_AddDriverInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo1 *r)
-{
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+               if (r->description) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->description, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->description, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->description, ndr_charset_length(r->description, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->comment) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->comment, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->comment, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->comment, ndr_charset_length(r->comment, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo1 *r)
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo1 *r)
 {
-       uint32_t _ptr_driver_name;
-       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_name;
+       TALLOC_CTX *_mem_save_name_0;
+       uint32_t _ptr_description;
+       TALLOC_CTX *_mem_save_description_0;
+       uint32_t _ptr_comment;
+       TALLOC_CTX *_mem_save_comment_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
-               if (_ptr_driver_name) {
-                       NDR_PULL_ALLOC(ndr, r->driver_name);
+               NDR_CHECK(ndr_pull_spoolss_EnumPrinterFlags(ndr, NDR_SCALARS, &r->flags));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_name));
+               if (_ptr_name) {
+                       NDR_PULL_ALLOC(ndr, r->name);
                } else {
-                       r->driver_name = NULL;
+                       r->name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_description));
+               if (_ptr_description) {
+                       NDR_PULL_ALLOC(ndr, r->description);
+               } else {
+                       r->description = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_comment));
+               if (_ptr_comment) {
+                       NDR_PULL_ALLOC(ndr, r->comment);
+               } else {
+                       r->comment = NULL;
                }
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
-                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
+               if (r->name) {
+                       _mem_save_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->name));
+                       if (ndr_get_array_length(ndr, &r->name) > ndr_get_array_size(ndr, &r->name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->name), ndr_get_array_length(ndr, &r->name));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->name, ndr_get_array_length(ndr, &r->name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, 0);
+               }
+               if (r->description) {
+                       _mem_save_description_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->description, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->description));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->description));
+                       if (ndr_get_array_length(ndr, &r->description) > ndr_get_array_size(ndr, &r->description)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->description), ndr_get_array_length(ndr, &r->description));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->description), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->description, ndr_get_array_length(ndr, &r->description), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_description_0, 0);
+               }
+               if (r->comment) {
+                       _mem_save_comment_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->comment, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->comment));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->comment));
+                       if (ndr_get_array_length(ndr, &r->comment) > ndr_get_array_size(ndr, &r->comment)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->comment), ndr_get_array_length(ndr, &r->comment));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->comment), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->comment, ndr_get_array_length(ndr, &r->comment), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_comment_0, 0);
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_AddDriverInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo1 *r)
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo1 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo1");
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo1");
        ndr->depth++;
-       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr_print_spoolss_EnumPrinterFlags(ndr, "flags", r->flags);
+       ndr_print_ptr(ndr, "name", r->name);
        ndr->depth++;
-       if (r->driver_name) {
-               ndr_print_string(ndr, "driver_name", r->driver_name);
+       if (r->name) {
+               ndr_print_string(ndr, "name", r->name);
        }
        ndr->depth--;
+       ndr_print_ptr(ndr, "description", r->description);
+       ndr->depth++;
+       if (r->description) {
+               ndr_print_string(ndr, "description", r->description);
+       }
        ndr->depth--;
-}
-
-static enum ndr_err_code ndr_push_spoolss_DriverOSVersion(struct ndr_push *ndr, int ndr_flags, enum spoolss_DriverOSVersion r)
-{
-       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
-       return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_spoolss_DriverOSVersion(struct ndr_pull *ndr, int ndr_flags, enum spoolss_DriverOSVersion *r)
-{
-       uint32_t v;
-       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
-       *r = v;
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_DriverOSVersion(struct ndr_print *ndr, const char *name, enum spoolss_DriverOSVersion r)
-{
-       const char *val = NULL;
-
-       switch (r) {
-               case SPOOLSS_DRIVER_VERSION_9X: val = "SPOOLSS_DRIVER_VERSION_9X"; break;
-               case SPOOLSS_DRIVER_VERSION_NT35: val = "SPOOLSS_DRIVER_VERSION_NT35"; break;
-               case SPOOLSS_DRIVER_VERSION_NT4: val = "SPOOLSS_DRIVER_VERSION_NT4"; break;
-               case SPOOLSS_DRIVER_VERSION_200X: val = "SPOOLSS_DRIVER_VERSION_200X"; break;
+       ndr_print_ptr(ndr, "comment", r->comment);
+       ndr->depth++;
+       if (r->comment) {
+               ndr_print_string(ndr, "comment", r->comment);
        }
-       ndr_print_enum(ndr, name, "ENUM", val, r);
+       ndr->depth--;
+       ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_AddDriverInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo2 *r)
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo2 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->architecture));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_path));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->config_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->servername));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->printername));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->sharename));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->portname));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->drivername));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->comment));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->location));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->devmode));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->sepfile));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->printprocessor));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->datatype));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->parameters));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->secdesc));
+               NDR_CHECK(ndr_push_spoolss_PrinterAttributes(ndr, NDR_SCALARS, r->attributes));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->priority));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->defaultpriority));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->starttime));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->untiltime));
+               NDR_CHECK(ndr_push_spoolss_PrinterStatus(ndr, NDR_SCALARS, r->status));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->cjobs));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->averageppm));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+               if (r->servername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->servername, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->servername, ndr_charset_length(r->servername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-               if (r->architecture) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+               if (r->printername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printername, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->architecture, ndr_charset_length(r->architecture, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->printername, ndr_charset_length(r->printername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-               if (r->driver_path) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+               if (r->sharename) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->sharename, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_path, ndr_charset_length(r->driver_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->sharename, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->sharename, ndr_charset_length(r->sharename, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-               if (r->data_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+               if (r->portname) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->portname, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->data_file, ndr_charset_length(r->data_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->portname, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->portname, ndr_charset_length(r->portname, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-               if (r->config_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+               if (r->drivername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->drivername, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->config_file, ndr_charset_length(r->config_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->drivername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->drivername, ndr_charset_length(r->drivername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo2 *r)
-{
-       uint32_t _ptr_driver_name;
-       TALLOC_CTX *_mem_save_driver_name_0;
-       uint32_t _ptr_architecture;
-       TALLOC_CTX *_mem_save_architecture_0;
-       uint32_t _ptr_driver_path;
-       TALLOC_CTX *_mem_save_driver_path_0;
-       uint32_t _ptr_data_file;
-       TALLOC_CTX *_mem_save_data_file_0;
-       uint32_t _ptr_config_file;
-       TALLOC_CTX *_mem_save_config_file_0;
+               if (r->comment) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->comment, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->comment, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->comment, ndr_charset_length(r->comment, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->location) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->location, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->location, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->location, ndr_charset_length(r->location, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->devmode) {
+                       {
+                               struct ndr_push *_ndr_devmode;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_devmode, 0, -1));
+                               NDR_CHECK(ndr_push_spoolss_DeviceMode(_ndr_devmode, NDR_SCALARS, r->devmode));
+                               NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_devmode, 0, -1));
+                       }
+               }
+               if (r->sepfile) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->sepfile, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->sepfile, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->sepfile, ndr_charset_length(r->sepfile, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->printprocessor) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printprocessor, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printprocessor, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->printprocessor, ndr_charset_length(r->printprocessor, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->datatype) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->datatype, ndr_charset_length(r->datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->parameters) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->parameters, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->parameters, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->parameters, ndr_charset_length(r->parameters, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->secdesc) {
+                       {
+                               struct ndr_push *_ndr_secdesc;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_secdesc, 0, -1));
+                               NDR_CHECK(ndr_push_security_descriptor(_ndr_secdesc, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
+                               NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_secdesc, 0, -1));
+                       }
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo2 *r)
+{
+       uint32_t _ptr_servername;
+       TALLOC_CTX *_mem_save_servername_0;
+       uint32_t _ptr_printername;
+       TALLOC_CTX *_mem_save_printername_0;
+       uint32_t _ptr_sharename;
+       TALLOC_CTX *_mem_save_sharename_0;
+       uint32_t _ptr_portname;
+       TALLOC_CTX *_mem_save_portname_0;
+       uint32_t _ptr_drivername;
+       TALLOC_CTX *_mem_save_drivername_0;
+       uint32_t _ptr_comment;
+       TALLOC_CTX *_mem_save_comment_0;
+       uint32_t _ptr_location;
+       TALLOC_CTX *_mem_save_location_0;
+       uint32_t _ptr_devmode;
+       TALLOC_CTX *_mem_save_devmode_0;
+       uint32_t _ptr_sepfile;
+       TALLOC_CTX *_mem_save_sepfile_0;
+       uint32_t _ptr_printprocessor;
+       TALLOC_CTX *_mem_save_printprocessor_0;
+       uint32_t _ptr_datatype;
+       TALLOC_CTX *_mem_save_datatype_0;
+       uint32_t _ptr_parameters;
+       TALLOC_CTX *_mem_save_parameters_0;
+       uint32_t _ptr_secdesc;
+       TALLOC_CTX *_mem_save_secdesc_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
-               if (_ptr_driver_name) {
-                       NDR_PULL_ALLOC(ndr, r->driver_name);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_servername));
+               if (_ptr_servername) {
+                       NDR_PULL_ALLOC(ndr, r->servername);
                } else {
-                       r->driver_name = NULL;
+                       r->servername = NULL;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
-               if (_ptr_architecture) {
-                       NDR_PULL_ALLOC(ndr, r->architecture);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_printername));
+               if (_ptr_printername) {
+                       NDR_PULL_ALLOC(ndr, r->printername);
                } else {
-                       r->architecture = NULL;
+                       r->printername = NULL;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
-               if (_ptr_driver_path) {
-                       NDR_PULL_ALLOC(ndr, r->driver_path);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_sharename));
+               if (_ptr_sharename) {
+                       NDR_PULL_ALLOC(ndr, r->sharename);
                } else {
-                       r->driver_path = NULL;
+                       r->sharename = NULL;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
-               if (_ptr_data_file) {
-                       NDR_PULL_ALLOC(ndr, r->data_file);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_portname));
+               if (_ptr_portname) {
+                       NDR_PULL_ALLOC(ndr, r->portname);
                } else {
-                       r->data_file = NULL;
+                       r->portname = NULL;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
-               if (_ptr_config_file) {
-                       NDR_PULL_ALLOC(ndr, r->config_file);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_drivername));
+               if (_ptr_drivername) {
+                       NDR_PULL_ALLOC(ndr, r->drivername);
                } else {
-                       r->config_file = NULL;
+                       r->drivername = NULL;
                }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_comment));
+               if (_ptr_comment) {
+                       NDR_PULL_ALLOC(ndr, r->comment);
+               } else {
+                       r->comment = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_location));
+               if (_ptr_location) {
+                       NDR_PULL_ALLOC(ndr, r->location);
+               } else {
+                       r->location = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
+               if (_ptr_devmode) {
+                       NDR_PULL_ALLOC(ndr, r->devmode);
+               } else {
+                       r->devmode = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_sepfile));
+               if (_ptr_sepfile) {
+                       NDR_PULL_ALLOC(ndr, r->sepfile);
+               } else {
+                       r->sepfile = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_printprocessor));
+               if (_ptr_printprocessor) {
+                       NDR_PULL_ALLOC(ndr, r->printprocessor);
+               } else {
+                       r->printprocessor = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_datatype));
+               if (_ptr_datatype) {
+                       NDR_PULL_ALLOC(ndr, r->datatype);
+               } else {
+                       r->datatype = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_parameters));
+               if (_ptr_parameters) {
+                       NDR_PULL_ALLOC(ndr, r->parameters);
+               } else {
+                       r->parameters = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
+               if (_ptr_secdesc) {
+                       NDR_PULL_ALLOC(ndr, r->secdesc);
+               } else {
+                       r->secdesc = NULL;
+               }
+               NDR_CHECK(ndr_pull_spoolss_PrinterAttributes(ndr, NDR_SCALARS, &r->attributes));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->priority));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->defaultpriority));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->starttime));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->untiltime));
+               NDR_CHECK(ndr_pull_spoolss_PrinterStatus(ndr, NDR_SCALARS, &r->status));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->cjobs));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->averageppm));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
-                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+               if (r->servername) {
+                       _mem_save_servername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->servername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->servername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->servername));
+                       if (ndr_get_array_length(ndr, &r->servername) > ndr_get_array_size(ndr, &r->servername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->servername), ndr_get_array_length(ndr, &r->servername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->servername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->servername, ndr_get_array_length(ndr, &r->servername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_servername_0, 0);
                }
-               if (r->architecture) {
-                       _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->architecture));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->architecture));
-                       if (ndr_get_array_length(ndr, &r->architecture) > ndr_get_array_size(ndr, &r->architecture)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->architecture), ndr_get_array_length(ndr, &r->architecture));
+               if (r->printername) {
+                       _mem_save_printername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->printername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->printername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->printername));
+                       if (ndr_get_array_length(ndr, &r->printername) > ndr_get_array_size(ndr, &r->printername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->printername), ndr_get_array_length(ndr, &r->printername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->printername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->printername, ndr_get_array_length(ndr, &r->printername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printername_0, 0);
+               }
+               if (r->sharename) {
+                       _mem_save_sharename_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->sharename, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->sharename));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->sharename));
+                       if (ndr_get_array_length(ndr, &r->sharename) > ndr_get_array_size(ndr, &r->sharename)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->sharename), ndr_get_array_length(ndr, &r->sharename));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->sharename), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->sharename, ndr_get_array_length(ndr, &r->sharename), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_sharename_0, 0);
+               }
+               if (r->portname) {
+                       _mem_save_portname_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->portname, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->portname));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->portname));
+                       if (ndr_get_array_length(ndr, &r->portname) > ndr_get_array_size(ndr, &r->portname)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->portname), ndr_get_array_length(ndr, &r->portname));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->portname), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->portname, ndr_get_array_length(ndr, &r->portname), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_portname_0, 0);
+               }
+               if (r->drivername) {
+                       _mem_save_drivername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->drivername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->drivername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->drivername));
+                       if (ndr_get_array_length(ndr, &r->drivername) > ndr_get_array_size(ndr, &r->drivername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->drivername), ndr_get_array_length(ndr, &r->drivername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->drivername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->drivername, ndr_get_array_length(ndr, &r->drivername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_drivername_0, 0);
+               }
+               if (r->comment) {
+                       _mem_save_comment_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->comment, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->comment));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->comment));
+                       if (ndr_get_array_length(ndr, &r->comment) > ndr_get_array_size(ndr, &r->comment)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->comment), ndr_get_array_length(ndr, &r->comment));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->comment), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->comment, ndr_get_array_length(ndr, &r->comment), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_comment_0, 0);
+               }
+               if (r->location) {
+                       _mem_save_location_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->location, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->location));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->location));
+                       if (ndr_get_array_length(ndr, &r->location) > ndr_get_array_size(ndr, &r->location)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->location), ndr_get_array_length(ndr, &r->location));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->location), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->location, ndr_get_array_length(ndr, &r->location), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_location_0, 0);
+               }
+               if (r->devmode) {
+                       _mem_save_devmode_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->devmode, 0);
+                       {
+                               struct ndr_pull *_ndr_devmode;
+                               NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_devmode, 0, -1));
+                               NDR_CHECK(ndr_pull_spoolss_DeviceMode(_ndr_devmode, NDR_SCALARS, r->devmode));
+                               NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_devmode, 0, -1));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->architecture, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
                }
-               if (r->driver_path) {
-                       _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_path));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_path));
-                       if (ndr_get_array_length(ndr, &r->driver_path) > ndr_get_array_size(ndr, &r->driver_path)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_path), ndr_get_array_length(ndr, &r->driver_path));
+               if (r->sepfile) {
+                       _mem_save_sepfile_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->sepfile, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->sepfile));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->sepfile));
+                       if (ndr_get_array_length(ndr, &r->sepfile) > ndr_get_array_size(ndr, &r->sepfile)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->sepfile), ndr_get_array_length(ndr, &r->sepfile));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->sepfile), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->sepfile, ndr_get_array_length(ndr, &r->sepfile), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_sepfile_0, 0);
+               }
+               if (r->printprocessor) {
+                       _mem_save_printprocessor_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->printprocessor, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->printprocessor));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->printprocessor));
+                       if (ndr_get_array_length(ndr, &r->printprocessor) > ndr_get_array_size(ndr, &r->printprocessor)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->printprocessor), ndr_get_array_length(ndr, &r->printprocessor));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->printprocessor), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->printprocessor, ndr_get_array_length(ndr, &r->printprocessor), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printprocessor_0, 0);
+               }
+               if (r->datatype) {
+                       _mem_save_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->datatype, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->datatype));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->datatype));
+                       if (ndr_get_array_length(ndr, &r->datatype) > ndr_get_array_size(ndr, &r->datatype)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->datatype), ndr_get_array_length(ndr, &r->datatype));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_path, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->datatype), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->datatype, ndr_get_array_length(ndr, &r->datatype), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_datatype_0, 0);
                }
-               if (r->data_file) {
-                       _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->data_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->data_file));
-                       if (ndr_get_array_length(ndr, &r->data_file) > ndr_get_array_size(ndr, &r->data_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->data_file), ndr_get_array_length(ndr, &r->data_file));
+               if (r->parameters) {
+                       _mem_save_parameters_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->parameters, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->parameters));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->parameters));
+                       if (ndr_get_array_length(ndr, &r->parameters) > ndr_get_array_size(ndr, &r->parameters)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->parameters), ndr_get_array_length(ndr, &r->parameters));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->data_file, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->parameters), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->parameters, ndr_get_array_length(ndr, &r->parameters), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_parameters_0, 0);
                }
-               if (r->config_file) {
-                       _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->config_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->config_file));
-                       if (ndr_get_array_length(ndr, &r->config_file) > ndr_get_array_size(ndr, &r->config_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->config_file), ndr_get_array_length(ndr, &r->config_file));
+               if (r->secdesc) {
+                       _mem_save_secdesc_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->secdesc, 0);
+                       {
+                               struct ndr_pull *_ndr_secdesc;
+                               NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_secdesc, 0, -1));
+                               NDR_CHECK(ndr_pull_security_descriptor(_ndr_secdesc, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
+                               NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_secdesc, 0, -1));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->config_file, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_AddDriverInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo2 *r)
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo2 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo2");
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo2");
        ndr->depth++;
-       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
-       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr_print_ptr(ndr, "servername", r->servername);
        ndr->depth++;
-       if (r->driver_name) {
-               ndr_print_string(ndr, "driver_name", r->driver_name);
+       if (r->servername) {
+               ndr_print_string(ndr, "servername", r->servername);
        }
        ndr->depth--;
-       ndr_print_ptr(ndr, "architecture", r->architecture);
+       ndr_print_ptr(ndr, "printername", r->printername);
        ndr->depth++;
-       if (r->architecture) {
-               ndr_print_string(ndr, "architecture", r->architecture);
+       if (r->printername) {
+               ndr_print_string(ndr, "printername", r->printername);
        }
        ndr->depth--;
-       ndr_print_ptr(ndr, "driver_path", r->driver_path);
+       ndr_print_ptr(ndr, "sharename", r->sharename);
        ndr->depth++;
-       if (r->driver_path) {
-               ndr_print_string(ndr, "driver_path", r->driver_path);
+       if (r->sharename) {
+               ndr_print_string(ndr, "sharename", r->sharename);
        }
        ndr->depth--;
-       ndr_print_ptr(ndr, "data_file", r->data_file);
+       ndr_print_ptr(ndr, "portname", r->portname);
        ndr->depth++;
-       if (r->data_file) {
-               ndr_print_string(ndr, "data_file", r->data_file);
+       if (r->portname) {
+               ndr_print_string(ndr, "portname", r->portname);
        }
        ndr->depth--;
-       ndr_print_ptr(ndr, "config_file", r->config_file);
+       ndr_print_ptr(ndr, "drivername", r->drivername);
        ndr->depth++;
-       if (r->config_file) {
-               ndr_print_string(ndr, "config_file", r->config_file);
+       if (r->drivername) {
+               ndr_print_string(ndr, "drivername", r->drivername);
        }
        ndr->depth--;
+       ndr_print_ptr(ndr, "comment", r->comment);
+       ndr->depth++;
+       if (r->comment) {
+               ndr_print_string(ndr, "comment", r->comment);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "location", r->location);
+       ndr->depth++;
+       if (r->location) {
+               ndr_print_string(ndr, "location", r->location);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "devmode", r->devmode);
+       ndr->depth++;
+       if (r->devmode) {
+               ndr_print_spoolss_DeviceMode(ndr, "devmode", r->devmode);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "sepfile", r->sepfile);
+       ndr->depth++;
+       if (r->sepfile) {
+               ndr_print_string(ndr, "sepfile", r->sepfile);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "printprocessor", r->printprocessor);
+       ndr->depth++;
+       if (r->printprocessor) {
+               ndr_print_string(ndr, "printprocessor", r->printprocessor);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "datatype", r->datatype);
+       ndr->depth++;
+       if (r->datatype) {
+               ndr_print_string(ndr, "datatype", r->datatype);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "parameters", r->parameters);
+       ndr->depth++;
+       if (r->parameters) {
+               ndr_print_string(ndr, "parameters", r->parameters);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "secdesc", r->secdesc);
+       ndr->depth++;
+       if (r->secdesc) {
+               ndr_print_security_descriptor(ndr, "secdesc", r->secdesc);
+       }
+       ndr->depth--;
+       ndr_print_spoolss_PrinterAttributes(ndr, "attributes", r->attributes);
+       ndr_print_uint32(ndr, "priority", r->priority);
+       ndr_print_uint32(ndr, "defaultpriority", r->defaultpriority);
+       ndr_print_uint32(ndr, "starttime", r->starttime);
+       ndr_print_uint32(ndr, "untiltime", r->untiltime);
+       ndr_print_spoolss_PrinterStatus(ndr, "status", r->status);
+       ndr_print_uint32(ndr, "cjobs", r->cjobs);
+       ndr_print_uint32(ndr, "averageppm", r->averageppm);
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_AddDriverInfo3(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo3 *r)
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo3(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo3 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->architecture));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_path));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->config_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->help_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->monitor_name));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->default_datatype));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->dependent_files));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sec_desc_ptr));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo3 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sec_desc_ptr));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo3(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo3 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo3");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "sec_desc_ptr", r->sec_desc_ptr);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo4(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo4 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->printername));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->servername));
+               NDR_CHECK(ndr_push_spoolss_PrinterAttributes(ndr, NDR_SCALARS, r->attributes));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->printername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printername, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->printername, ndr_charset_length(r->printername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-               if (r->architecture) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+               if (r->servername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->servername, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->architecture, ndr_charset_length(r->architecture, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->servername, ndr_charset_length(r->servername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-               if (r->driver_path) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_path, ndr_charset_length(r->driver_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo4(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo4 *r)
+{
+       uint32_t _ptr_printername;
+       TALLOC_CTX *_mem_save_printername_0;
+       uint32_t _ptr_servername;
+       TALLOC_CTX *_mem_save_servername_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_printername));
+               if (_ptr_printername) {
+                       NDR_PULL_ALLOC(ndr, r->printername);
+               } else {
+                       r->printername = NULL;
                }
-               if (r->data_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->data_file, ndr_charset_length(r->data_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_servername));
+               if (_ptr_servername) {
+                       NDR_PULL_ALLOC(ndr, r->servername);
+               } else {
+                       r->servername = NULL;
                }
-               if (r->config_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->config_file, ndr_charset_length(r->config_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_spoolss_PrinterAttributes(ndr, NDR_SCALARS, &r->attributes));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->printername) {
+                       _mem_save_printername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->printername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->printername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->printername));
+                       if (ndr_get_array_length(ndr, &r->printername) > ndr_get_array_size(ndr, &r->printername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->printername), ndr_get_array_length(ndr, &r->printername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->printername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->printername, ndr_get_array_length(ndr, &r->printername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printername_0, 0);
                }
-               if (r->help_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->help_file, ndr_charset_length(r->help_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               if (r->servername) {
+                       _mem_save_servername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->servername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->servername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->servername));
+                       if (ndr_get_array_length(ndr, &r->servername) > ndr_get_array_size(ndr, &r->servername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->servername), ndr_get_array_length(ndr, &r->servername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->servername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->servername, ndr_get_array_length(ndr, &r->servername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_servername_0, 0);
                }
-               if (r->monitor_name) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo4(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo4 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo4");
+       ndr->depth++;
+       ndr_print_ptr(ndr, "printername", r->printername);
+       ndr->depth++;
+       if (r->printername) {
+               ndr_print_string(ndr, "printername", r->printername);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "servername", r->servername);
+       ndr->depth++;
+       if (r->servername) {
+               ndr_print_string(ndr, "servername", r->servername);
+       }
+       ndr->depth--;
+       ndr_print_spoolss_PrinterAttributes(ndr, "attributes", r->attributes);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo5(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo5 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->printername));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->portname));
+               NDR_CHECK(ndr_push_spoolss_PrinterAttributes(ndr, NDR_SCALARS, r->attributes));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->device_not_selected_timeout));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->transmission_retry_timeout));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->printername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printername, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->monitor_name, ndr_charset_length(r->monitor_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->printername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->printername, ndr_charset_length(r->printername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-               if (r->default_datatype) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+               if (r->portname) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->portname, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->default_datatype, ndr_charset_length(r->default_datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->dependent_files) {
-                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->portname, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->portname, ndr_charset_length(r->portname, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo3 *r)
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo5(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo5 *r)
 {
-       uint32_t _ptr_driver_name;
-       TALLOC_CTX *_mem_save_driver_name_0;
-       uint32_t _ptr_architecture;
-       TALLOC_CTX *_mem_save_architecture_0;
-       uint32_t _ptr_driver_path;
-       TALLOC_CTX *_mem_save_driver_path_0;
-       uint32_t _ptr_data_file;
-       TALLOC_CTX *_mem_save_data_file_0;
-       uint32_t _ptr_config_file;
-       TALLOC_CTX *_mem_save_config_file_0;
-       uint32_t _ptr_help_file;
-       TALLOC_CTX *_mem_save_help_file_0;
-       uint32_t _ptr_monitor_name;
-       TALLOC_CTX *_mem_save_monitor_name_0;
-       uint32_t _ptr_default_datatype;
-       TALLOC_CTX *_mem_save_default_datatype_0;
-       uint32_t _ptr_dependent_files;
-       TALLOC_CTX *_mem_save_dependent_files_0;
+       uint32_t _ptr_printername;
+       TALLOC_CTX *_mem_save_printername_0;
+       uint32_t _ptr_portname;
+       TALLOC_CTX *_mem_save_portname_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
-               if (_ptr_driver_name) {
-                       NDR_PULL_ALLOC(ndr, r->driver_name);
-               } else {
-                       r->driver_name = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
-               if (_ptr_architecture) {
-                       NDR_PULL_ALLOC(ndr, r->architecture);
-               } else {
-                       r->architecture = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
-               if (_ptr_driver_path) {
-                       NDR_PULL_ALLOC(ndr, r->driver_path);
-               } else {
-                       r->driver_path = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
-               if (_ptr_data_file) {
-                       NDR_PULL_ALLOC(ndr, r->data_file);
-               } else {
-                       r->data_file = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
-               if (_ptr_config_file) {
-                       NDR_PULL_ALLOC(ndr, r->config_file);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_printername));
+               if (_ptr_printername) {
+                       NDR_PULL_ALLOC(ndr, r->printername);
                } else {
-                       r->config_file = NULL;
+                       r->printername = NULL;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
-               if (_ptr_help_file) {
-                       NDR_PULL_ALLOC(ndr, r->help_file);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_portname));
+               if (_ptr_portname) {
+                       NDR_PULL_ALLOC(ndr, r->portname);
                } else {
-                       r->help_file = NULL;
+                       r->portname = NULL;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
-               if (_ptr_monitor_name) {
-                       NDR_PULL_ALLOC(ndr, r->monitor_name);
-               } else {
-                       r->monitor_name = NULL;
+               NDR_CHECK(ndr_pull_spoolss_PrinterAttributes(ndr, NDR_SCALARS, &r->attributes));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->device_not_selected_timeout));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->transmission_retry_timeout));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->printername) {
+                       _mem_save_printername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->printername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->printername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->printername));
+                       if (ndr_get_array_length(ndr, &r->printername) > ndr_get_array_size(ndr, &r->printername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->printername), ndr_get_array_length(ndr, &r->printername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->printername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->printername, ndr_get_array_length(ndr, &r->printername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printername_0, 0);
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
-               if (_ptr_default_datatype) {
-                       NDR_PULL_ALLOC(ndr, r->default_datatype);
-               } else {
-                       r->default_datatype = NULL;
-               }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_dependent_files));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
-               if (_ptr_dependent_files) {
-                       NDR_PULL_ALLOC(ndr, r->dependent_files);
-               } else {
-                       r->dependent_files = NULL;
-               }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
-                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
-               }
-               if (r->architecture) {
-                       _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->architecture));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->architecture));
-                       if (ndr_get_array_length(ndr, &r->architecture) > ndr_get_array_size(ndr, &r->architecture)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->architecture), ndr_get_array_length(ndr, &r->architecture));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->architecture, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
-               }
-               if (r->driver_path) {
-                       _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_path));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_path));
-                       if (ndr_get_array_length(ndr, &r->driver_path) > ndr_get_array_size(ndr, &r->driver_path)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_path), ndr_get_array_length(ndr, &r->driver_path));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_path, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
-               }
-               if (r->data_file) {
-                       _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->data_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->data_file));
-                       if (ndr_get_array_length(ndr, &r->data_file) > ndr_get_array_size(ndr, &r->data_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->data_file), ndr_get_array_length(ndr, &r->data_file));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->data_file, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
-               }
-               if (r->config_file) {
-                       _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->config_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->config_file));
-                       if (ndr_get_array_length(ndr, &r->config_file) > ndr_get_array_size(ndr, &r->config_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->config_file), ndr_get_array_length(ndr, &r->config_file));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->config_file, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
-               }
-               if (r->help_file) {
-                       _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->help_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->help_file));
-                       if (ndr_get_array_length(ndr, &r->help_file) > ndr_get_array_size(ndr, &r->help_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->help_file), ndr_get_array_length(ndr, &r->help_file));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->help_file, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
-               }
-               if (r->monitor_name) {
-                       _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->monitor_name));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->monitor_name));
-                       if (ndr_get_array_length(ndr, &r->monitor_name) > ndr_get_array_size(ndr, &r->monitor_name)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->monitor_name), ndr_get_array_length(ndr, &r->monitor_name));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->monitor_name, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
-               }
-               if (r->default_datatype) {
-                       _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->default_datatype));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->default_datatype));
-                       if (ndr_get_array_length(ndr, &r->default_datatype) > ndr_get_array_size(ndr, &r->default_datatype)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->default_datatype), ndr_get_array_length(ndr, &r->default_datatype));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->default_datatype, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
-               }
-               if (r->dependent_files) {
-                       _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
-                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+               if (r->portname) {
+                       _mem_save_portname_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->portname, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->portname));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->portname));
+                       if (ndr_get_array_length(ndr, &r->portname) > ndr_get_array_size(ndr, &r->portname)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->portname), ndr_get_array_length(ndr, &r->portname));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->portname), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->portname, ndr_get_array_length(ndr, &r->portname), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_portname_0, 0);
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_AddDriverInfo3(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo3 *r)
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo5(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo5 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo3");
-       ndr->depth++;
-       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
-       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo5");
        ndr->depth++;
-       if (r->driver_name) {
-               ndr_print_string(ndr, "driver_name", r->driver_name);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "architecture", r->architecture);
+       ndr_print_ptr(ndr, "printername", r->printername);
        ndr->depth++;
-       if (r->architecture) {
-               ndr_print_string(ndr, "architecture", r->architecture);
+       if (r->printername) {
+               ndr_print_string(ndr, "printername", r->printername);
        }
        ndr->depth--;
-       ndr_print_ptr(ndr, "driver_path", r->driver_path);
+       ndr_print_ptr(ndr, "portname", r->portname);
        ndr->depth++;
-       if (r->driver_path) {
-               ndr_print_string(ndr, "driver_path", r->driver_path);
+       if (r->portname) {
+               ndr_print_string(ndr, "portname", r->portname);
        }
        ndr->depth--;
-       ndr_print_ptr(ndr, "data_file", r->data_file);
-       ndr->depth++;
-       if (r->data_file) {
-               ndr_print_string(ndr, "data_file", r->data_file);
-       }
+       ndr_print_spoolss_PrinterAttributes(ndr, "attributes", r->attributes);
+       ndr_print_uint32(ndr, "device_not_selected_timeout", r->device_not_selected_timeout);
+       ndr_print_uint32(ndr, "transmission_retry_timeout", r->transmission_retry_timeout);
        ndr->depth--;
-       ndr_print_ptr(ndr, "config_file", r->config_file);
-       ndr->depth++;
-       if (r->config_file) {
-               ndr_print_string(ndr, "config_file", r->config_file);
+}
+
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo6(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo6 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_spoolss_PrinterStatus(ndr, NDR_SCALARS, r->status));
        }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "help_file", r->help_file);
-       ndr->depth++;
-       if (r->help_file) {
-               ndr_print_string(ndr, "help_file", r->help_file);
+       if (ndr_flags & NDR_BUFFERS) {
        }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
-       ndr->depth++;
-       if (r->monitor_name) {
-               ndr_print_string(ndr, "monitor_name", r->monitor_name);
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo6(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo6 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_spoolss_PrinterStatus(ndr, NDR_SCALARS, &r->status));
        }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
-       ndr->depth++;
-       if (r->default_datatype) {
-               ndr_print_string(ndr, "default_datatype", r->default_datatype);
+       if (ndr_flags & NDR_BUFFERS) {
        }
-       ndr->depth--;
-       ndr_print_uint32(ndr, "_ndr_size_dependent_files", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_dependent_files);
-       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo6(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo6 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo6");
        ndr->depth++;
-       if (r->dependent_files) {
-               ndr_print_spoolss_StringArray(ndr, "dependent_files", r->dependent_files);
-       }
-       ndr->depth--;
+       ndr_print_spoolss_PrinterStatus(ndr, "status", r->status);
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_AddDriverInfo4(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo4 *r)
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo7(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo7 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->architecture));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_path));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->config_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->help_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->monitor_name));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->default_datatype));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->dependent_files));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->previous_names));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->guid));
+               NDR_CHECK(ndr_push_spoolss_DsPrintAction(ndr, NDR_SCALARS, r->action));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->architecture) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->architecture, ndr_charset_length(r->architecture, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->driver_path) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_path, ndr_charset_length(r->driver_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->data_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->data_file, ndr_charset_length(r->data_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->config_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->config_file, ndr_charset_length(r->config_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->help_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->help_file, ndr_charset_length(r->help_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->monitor_name) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->monitor_name, ndr_charset_length(r->monitor_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->default_datatype) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+               if (r->guid) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->guid, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->default_datatype, ndr_charset_length(r->default_datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->dependent_files) {
-                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
-               }
-               if (r->previous_names) {
-                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->guid, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->guid, ndr_charset_length(r->guid, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo4(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo4 *r)
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo7(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo7 *r)
 {
-       uint32_t _ptr_driver_name;
-       TALLOC_CTX *_mem_save_driver_name_0;
-       uint32_t _ptr_architecture;
-       TALLOC_CTX *_mem_save_architecture_0;
-       uint32_t _ptr_driver_path;
-       TALLOC_CTX *_mem_save_driver_path_0;
-       uint32_t _ptr_data_file;
-       TALLOC_CTX *_mem_save_data_file_0;
-       uint32_t _ptr_config_file;
-       TALLOC_CTX *_mem_save_config_file_0;
-       uint32_t _ptr_help_file;
-       TALLOC_CTX *_mem_save_help_file_0;
-       uint32_t _ptr_monitor_name;
-       TALLOC_CTX *_mem_save_monitor_name_0;
-       uint32_t _ptr_default_datatype;
-       TALLOC_CTX *_mem_save_default_datatype_0;
-       uint32_t _ptr_dependent_files;
-       TALLOC_CTX *_mem_save_dependent_files_0;
-       uint32_t _ptr_previous_names;
-       TALLOC_CTX *_mem_save_previous_names_0;
+       uint32_t _ptr_guid;
+       TALLOC_CTX *_mem_save_guid_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
-               if (_ptr_driver_name) {
-                       NDR_PULL_ALLOC(ndr, r->driver_name);
-               } else {
-                       r->driver_name = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
-               if (_ptr_architecture) {
-                       NDR_PULL_ALLOC(ndr, r->architecture);
-               } else {
-                       r->architecture = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
-               if (_ptr_driver_path) {
-                       NDR_PULL_ALLOC(ndr, r->driver_path);
-               } else {
-                       r->driver_path = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
-               if (_ptr_data_file) {
-                       NDR_PULL_ALLOC(ndr, r->data_file);
-               } else {
-                       r->data_file = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
-               if (_ptr_config_file) {
-                       NDR_PULL_ALLOC(ndr, r->config_file);
-               } else {
-                       r->config_file = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
-               if (_ptr_help_file) {
-                       NDR_PULL_ALLOC(ndr, r->help_file);
-               } else {
-                       r->help_file = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
-               if (_ptr_monitor_name) {
-                       NDR_PULL_ALLOC(ndr, r->monitor_name);
-               } else {
-                       r->monitor_name = NULL;
-               }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
-               if (_ptr_default_datatype) {
-                       NDR_PULL_ALLOC(ndr, r->default_datatype);
-               } else {
-                       r->default_datatype = NULL;
-               }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_dependent_files));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
-               if (_ptr_dependent_files) {
-                       NDR_PULL_ALLOC(ndr, r->dependent_files);
-               } else {
-                       r->dependent_files = NULL;
-               }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_previous_names));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
-               if (_ptr_previous_names) {
-                       NDR_PULL_ALLOC(ndr, r->previous_names);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_guid));
+               if (_ptr_guid) {
+                       NDR_PULL_ALLOC(ndr, r->guid);
                } else {
-                       r->previous_names = NULL;
+                       r->guid = NULL;
                }
+               NDR_CHECK(ndr_pull_spoolss_DsPrintAction(ndr, NDR_SCALARS, &r->action));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
-                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
-               }
-               if (r->architecture) {
-                       _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->architecture));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->architecture));
-                       if (ndr_get_array_length(ndr, &r->architecture) > ndr_get_array_size(ndr, &r->architecture)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->architecture), ndr_get_array_length(ndr, &r->architecture));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->architecture, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
-               }
-               if (r->driver_path) {
-                       _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_path));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_path));
-                       if (ndr_get_array_length(ndr, &r->driver_path) > ndr_get_array_size(ndr, &r->driver_path)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_path), ndr_get_array_length(ndr, &r->driver_path));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_path, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
-               }
-               if (r->data_file) {
-                       _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->data_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->data_file));
-                       if (ndr_get_array_length(ndr, &r->data_file) > ndr_get_array_size(ndr, &r->data_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->data_file), ndr_get_array_length(ndr, &r->data_file));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->data_file, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
-               }
-               if (r->config_file) {
-                       _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->config_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->config_file));
-                       if (ndr_get_array_length(ndr, &r->config_file) > ndr_get_array_size(ndr, &r->config_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->config_file), ndr_get_array_length(ndr, &r->config_file));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->config_file, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
-               }
-               if (r->help_file) {
-                       _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->help_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->help_file));
-                       if (ndr_get_array_length(ndr, &r->help_file) > ndr_get_array_size(ndr, &r->help_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->help_file), ndr_get_array_length(ndr, &r->help_file));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->help_file, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
-               }
-               if (r->monitor_name) {
-                       _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->monitor_name));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->monitor_name));
-                       if (ndr_get_array_length(ndr, &r->monitor_name) > ndr_get_array_size(ndr, &r->monitor_name)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->monitor_name), ndr_get_array_length(ndr, &r->monitor_name));
-                       }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->monitor_name, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
-               }
-               if (r->default_datatype) {
-                       _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->default_datatype));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->default_datatype));
-                       if (ndr_get_array_length(ndr, &r->default_datatype) > ndr_get_array_size(ndr, &r->default_datatype)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->default_datatype), ndr_get_array_length(ndr, &r->default_datatype));
+               if (r->guid) {
+                       _mem_save_guid_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->guid, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->guid));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->guid));
+                       if (ndr_get_array_length(ndr, &r->guid) > ndr_get_array_size(ndr, &r->guid)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->guid), ndr_get_array_length(ndr, &r->guid));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->default_datatype, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
-               }
-               if (r->dependent_files) {
-                       _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
-                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
-               }
-               if (r->previous_names) {
-                       _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
-                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->guid), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->guid, ndr_get_array_length(ndr, &r->guid), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_guid_0, 0);
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_AddDriverInfo4(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo4 *r)
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo7(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo7 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo4");
-       ndr->depth++;
-       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
-       ndr_print_ptr(ndr, "driver_name", r->driver_name);
-       ndr->depth++;
-       if (r->driver_name) {
-               ndr_print_string(ndr, "driver_name", r->driver_name);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "architecture", r->architecture);
-       ndr->depth++;
-       if (r->architecture) {
-               ndr_print_string(ndr, "architecture", r->architecture);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "driver_path", r->driver_path);
-       ndr->depth++;
-       if (r->driver_path) {
-               ndr_print_string(ndr, "driver_path", r->driver_path);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "data_file", r->data_file);
-       ndr->depth++;
-       if (r->data_file) {
-               ndr_print_string(ndr, "data_file", r->data_file);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "config_file", r->config_file);
-       ndr->depth++;
-       if (r->config_file) {
-               ndr_print_string(ndr, "config_file", r->config_file);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "help_file", r->help_file);
-       ndr->depth++;
-       if (r->help_file) {
-               ndr_print_string(ndr, "help_file", r->help_file);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
-       ndr->depth++;
-       if (r->monitor_name) {
-               ndr_print_string(ndr, "monitor_name", r->monitor_name);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
-       ndr->depth++;
-       if (r->default_datatype) {
-               ndr_print_string(ndr, "default_datatype", r->default_datatype);
-       }
-       ndr->depth--;
-       ndr_print_uint32(ndr, "_ndr_size_dependent_files", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_dependent_files);
-       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo7");
        ndr->depth++;
-       if (r->dependent_files) {
-               ndr_print_spoolss_StringArray(ndr, "dependent_files", r->dependent_files);
-       }
-       ndr->depth--;
-       ndr_print_uint32(ndr, "_ndr_size_previous_names", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_previous_names);
-       ndr_print_ptr(ndr, "previous_names", r->previous_names);
+       ndr_print_ptr(ndr, "guid", r->guid);
        ndr->depth++;
-       if (r->previous_names) {
-               ndr_print_spoolss_StringArray(ndr, "previous_names", r->previous_names);
+       if (r->guid) {
+               ndr_print_string(ndr, "guid", r->guid);
        }
        ndr->depth--;
+       ndr_print_spoolss_DsPrintAction(ndr, "action", r->action);
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_AddDriverInfo6(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo6 *r)
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_SetPrinterInfo *r)
 {
        if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_push_align(ndr, 8));
-               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->architecture));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_path));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->config_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->help_file));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->monitor_name));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->default_datatype));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->dependent_files));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->previous_names));
-               NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->driver_data));
-               NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, r->driver_version));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->manufacturer_name));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->manufacturer_url));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->hardware_id));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->provider));
+               int level = ndr_push_get_switch_value(ndr, r);
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, level));
+               switch (level) {
+                       case 0: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info0));
+                       break; }
+
+                       case 1: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info1));
+                       break; }
+
+                       case 2: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info2));
+                       break; }
+
+                       case 3: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info3));
+                       break; }
+
+                       case 4: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info4));
+                       break; }
+
+                       case 5: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info5));
+                       break; }
+
+                       case 6: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info6));
+                       break; }
+
+                       case 7: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info7));
+                       break; }
+
+                       case 8: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info8));
+                       break; }
+
+                       case 9: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info9));
+                       break; }
+
+                       default: {
+                       break; }
+
+               }
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->architecture) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->architecture, ndr_charset_length(r->architecture, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->driver_path) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_path, ndr_charset_length(r->driver_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->data_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->data_file, ndr_charset_length(r->data_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->config_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->config_file, ndr_charset_length(r->config_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->help_file) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->help_file, ndr_charset_length(r->help_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->monitor_name) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->monitor_name, ndr_charset_length(r->monitor_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->default_datatype) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->default_datatype, ndr_charset_length(r->default_datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->dependent_files) {
-                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
-               }
-               if (r->previous_names) {
-                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
-               }
-               if (r->manufacturer_name) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_name, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->manufacturer_name, ndr_charset_length(r->manufacturer_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->manufacturer_url) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_url, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_url, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->manufacturer_url, ndr_charset_length(r->manufacturer_url, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->hardware_id) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->hardware_id, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->hardware_id, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->hardware_id, ndr_charset_length(r->hardware_id, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               }
-               if (r->provider) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->provider, CH_UTF16)));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->provider, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->provider, ndr_charset_length(r->provider, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               int level = ndr_push_get_switch_value(ndr, r);
+               switch (level) {
+                       case 0:
+                               if (r->info0) {
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo0(ndr, NDR_SCALARS|NDR_BUFFERS, r->info0));
+                               }
+                       break;
+
+                       case 1:
+                               if (r->info1) {
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo1(ndr, NDR_SCALARS|NDR_BUFFERS, r->info1));
+                               }
+                       break;
+
+                       case 2:
+                               if (r->info2) {
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
+                               }
+                       break;
+
+                       case 3:
+                               if (r->info3) {
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo3(ndr, NDR_SCALARS, r->info3));
+                               }
+                       break;
+
+                       case 4:
+                               if (r->info4) {
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo4(ndr, NDR_SCALARS|NDR_BUFFERS, r->info4));
+                               }
+                       break;
+
+                       case 5:
+                               if (r->info5) {
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo5(ndr, NDR_SCALARS|NDR_BUFFERS, r->info5));
+                               }
+                       break;
+
+                       case 6:
+                               if (r->info6) {
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo6(ndr, NDR_SCALARS, r->info6));
+                               }
+                       break;
+
+                       case 7:
+                               if (r->info7) {
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo7(ndr, NDR_SCALARS|NDR_BUFFERS, r->info7));
+                               }
+                       break;
+
+                       case 8:
+                               if (r->info8) {
+                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info8));
+                               }
+                       break;
+
+                       case 9:
+                               if (r->info9) {
+                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info9));
+                               }
+                       break;
+
+                       default:
+                       break;
+
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo6(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo6 *r)
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_SetPrinterInfo *r)
 {
-       uint32_t _ptr_driver_name;
-       TALLOC_CTX *_mem_save_driver_name_0;
-       uint32_t _ptr_architecture;
-       TALLOC_CTX *_mem_save_architecture_0;
-       uint32_t _ptr_driver_path;
-       TALLOC_CTX *_mem_save_driver_path_0;
-       uint32_t _ptr_data_file;
-       TALLOC_CTX *_mem_save_data_file_0;
-       uint32_t _ptr_config_file;
-       TALLOC_CTX *_mem_save_config_file_0;
-       uint32_t _ptr_help_file;
-       TALLOC_CTX *_mem_save_help_file_0;
-       uint32_t _ptr_monitor_name;
-       TALLOC_CTX *_mem_save_monitor_name_0;
-       uint32_t _ptr_default_datatype;
-       TALLOC_CTX *_mem_save_default_datatype_0;
-       uint32_t _ptr_dependent_files;
-       TALLOC_CTX *_mem_save_dependent_files_0;
-       uint32_t _ptr_previous_names;
-       TALLOC_CTX *_mem_save_previous_names_0;
-       uint32_t _ptr_manufacturer_name;
-       TALLOC_CTX *_mem_save_manufacturer_name_0;
-       uint32_t _ptr_manufacturer_url;
-       TALLOC_CTX *_mem_save_manufacturer_url_0;
-       uint32_t _ptr_hardware_id;
-       TALLOC_CTX *_mem_save_hardware_id_0;
-       uint32_t _ptr_provider;
-       TALLOC_CTX *_mem_save_provider_0;
+       int level;
+       uint32_t _level;
+       TALLOC_CTX *_mem_save_info0_0;
+       TALLOC_CTX *_mem_save_info1_0;
+       TALLOC_CTX *_mem_save_info2_0;
+       TALLOC_CTX *_mem_save_info3_0;
+       TALLOC_CTX *_mem_save_info4_0;
+       TALLOC_CTX *_mem_save_info5_0;
+       TALLOC_CTX *_mem_save_info6_0;
+       TALLOC_CTX *_mem_save_info7_0;
+       TALLOC_CTX *_mem_save_info8_0;
+       TALLOC_CTX *_mem_save_info9_0;
+       level = ndr_pull_get_switch_value(ndr, r);
        if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_align(ndr, 8));
-               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
-               if (_ptr_driver_name) {
-                       NDR_PULL_ALLOC(ndr, r->driver_name);
-               } else {
-                       r->driver_name = NULL;
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &_level));
+               if (_level != level) {
+                       return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u for r", _level);
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
-               if (_ptr_architecture) {
-                       NDR_PULL_ALLOC(ndr, r->architecture);
+               switch (level) {
+                       case 0: {
+                               uint32_t _ptr_info0;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info0));
+                               if (_ptr_info0) {
+                                       NDR_PULL_ALLOC(ndr, r->info0);
+                               } else {
+                                       r->info0 = NULL;
+                               }
+                       break; }
+
+                       case 1: {
+                               uint32_t _ptr_info1;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info1));
+                               if (_ptr_info1) {
+                                       NDR_PULL_ALLOC(ndr, r->info1);
+                               } else {
+                                       r->info1 = NULL;
+                               }
+                       break; }
+
+                       case 2: {
+                               uint32_t _ptr_info2;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info2));
+                               if (_ptr_info2) {
+                                       NDR_PULL_ALLOC(ndr, r->info2);
+                               } else {
+                                       r->info2 = NULL;
+                               }
+                       break; }
+
+                       case 3: {
+                               uint32_t _ptr_info3;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info3));
+                               if (_ptr_info3) {
+                                       NDR_PULL_ALLOC(ndr, r->info3);
+                               } else {
+                                       r->info3 = NULL;
+                               }
+                       break; }
+
+                       case 4: {
+                               uint32_t _ptr_info4;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info4));
+                               if (_ptr_info4) {
+                                       NDR_PULL_ALLOC(ndr, r->info4);
+                               } else {
+                                       r->info4 = NULL;
+                               }
+                       break; }
+
+                       case 5: {
+                               uint32_t _ptr_info5;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info5));
+                               if (_ptr_info5) {
+                                       NDR_PULL_ALLOC(ndr, r->info5);
+                               } else {
+                                       r->info5 = NULL;
+                               }
+                       break; }
+
+                       case 6: {
+                               uint32_t _ptr_info6;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info6));
+                               if (_ptr_info6) {
+                                       NDR_PULL_ALLOC(ndr, r->info6);
+                               } else {
+                                       r->info6 = NULL;
+                               }
+                       break; }
+
+                       case 7: {
+                               uint32_t _ptr_info7;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info7));
+                               if (_ptr_info7) {
+                                       NDR_PULL_ALLOC(ndr, r->info7);
+                               } else {
+                                       r->info7 = NULL;
+                               }
+                       break; }
+
+                       case 8: {
+                               uint32_t _ptr_info8;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info8));
+                               if (_ptr_info8) {
+                                       NDR_PULL_ALLOC(ndr, r->info8);
+                               } else {
+                                       r->info8 = NULL;
+                               }
+                       break; }
+
+                       case 9: {
+                               uint32_t _ptr_info9;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info9));
+                               if (_ptr_info9) {
+                                       NDR_PULL_ALLOC(ndr, r->info9);
+                               } else {
+                                       r->info9 = NULL;
+                               }
+                       break; }
+
+                       default: {
+                       break; }
+
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               switch (level) {
+                       case 0:
+                               if (r->info0) {
+                                       _mem_save_info0_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info0, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo0(ndr, NDR_SCALARS|NDR_BUFFERS, r->info0));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info0_0, 0);
+                               }
+                       break;
+
+                       case 1:
+                               if (r->info1) {
+                                       _mem_save_info1_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info1, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo1(ndr, NDR_SCALARS|NDR_BUFFERS, r->info1));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info1_0, 0);
+                               }
+                       break;
+
+                       case 2:
+                               if (r->info2) {
+                                       _mem_save_info2_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info2, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info2_0, 0);
+                               }
+                       break;
+
+                       case 3:
+                               if (r->info3) {
+                                       _mem_save_info3_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info3, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo3(ndr, NDR_SCALARS, r->info3));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info3_0, 0);
+                               }
+                       break;
+
+                       case 4:
+                               if (r->info4) {
+                                       _mem_save_info4_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info4, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo4(ndr, NDR_SCALARS|NDR_BUFFERS, r->info4));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info4_0, 0);
+                               }
+                       break;
+
+                       case 5:
+                               if (r->info5) {
+                                       _mem_save_info5_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info5, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo5(ndr, NDR_SCALARS|NDR_BUFFERS, r->info5));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info5_0, 0);
+                               }
+                       break;
+
+                       case 6:
+                               if (r->info6) {
+                                       _mem_save_info6_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info6, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo6(ndr, NDR_SCALARS, r->info6));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info6_0, 0);
+                               }
+                       break;
+
+                       case 7:
+                               if (r->info7) {
+                                       _mem_save_info7_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info7, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo7(ndr, NDR_SCALARS|NDR_BUFFERS, r->info7));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info7_0, 0);
+                               }
+                       break;
+
+                       case 8:
+                               if (r->info8) {
+                                       _mem_save_info8_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info8, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info8));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info8_0, 0);
+                               }
+                       break;
+
+                       case 9:
+                               if (r->info9) {
+                                       _mem_save_info9_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info9, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info9));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info9_0, 0);
+                               }
+                       break;
+
+                       default:
+                       break;
+
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo(struct ndr_print *ndr, const char *name, const union spoolss_SetPrinterInfo *r)
+{
+       int level;
+       level = ndr_print_get_switch_value(ndr, r);
+       ndr_print_union(ndr, name, level, "spoolss_SetPrinterInfo");
+       switch (level) {
+               case 0:
+                       ndr_print_ptr(ndr, "info0", r->info0);
+                       ndr->depth++;
+                       if (r->info0) {
+                               ndr_print_spoolss_SetPrinterInfo0(ndr, "info0", r->info0);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 1:
+                       ndr_print_ptr(ndr, "info1", r->info1);
+                       ndr->depth++;
+                       if (r->info1) {
+                               ndr_print_spoolss_SetPrinterInfo1(ndr, "info1", r->info1);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 2:
+                       ndr_print_ptr(ndr, "info2", r->info2);
+                       ndr->depth++;
+                       if (r->info2) {
+                               ndr_print_spoolss_SetPrinterInfo2(ndr, "info2", r->info2);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 3:
+                       ndr_print_ptr(ndr, "info3", r->info3);
+                       ndr->depth++;
+                       if (r->info3) {
+                               ndr_print_spoolss_SetPrinterInfo3(ndr, "info3", r->info3);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 4:
+                       ndr_print_ptr(ndr, "info4", r->info4);
+                       ndr->depth++;
+                       if (r->info4) {
+                               ndr_print_spoolss_SetPrinterInfo4(ndr, "info4", r->info4);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 5:
+                       ndr_print_ptr(ndr, "info5", r->info5);
+                       ndr->depth++;
+                       if (r->info5) {
+                               ndr_print_spoolss_SetPrinterInfo5(ndr, "info5", r->info5);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 6:
+                       ndr_print_ptr(ndr, "info6", r->info6);
+                       ndr->depth++;
+                       if (r->info6) {
+                               ndr_print_spoolss_SetPrinterInfo6(ndr, "info6", r->info6);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 7:
+                       ndr_print_ptr(ndr, "info7", r->info7);
+                       ndr->depth++;
+                       if (r->info7) {
+                               ndr_print_spoolss_SetPrinterInfo7(ndr, "info7", r->info7);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 8:
+                       ndr_print_ptr(ndr, "info8", r->info8);
+                       ndr->depth++;
+                       if (r->info8) {
+                               ndr_print_spoolss_DeviceModeInfo(ndr, "info8", r->info8);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 9:
+                       ndr_print_ptr(ndr, "info9", r->info9);
+                       ndr->depth++;
+                       if (r->info9) {
+                               ndr_print_spoolss_DeviceModeInfo(ndr, "info9", r->info9);
+                       }
+                       ndr->depth--;
+               break;
+
+               default:
+               break;
+
+       }
+}
+
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfoCtr(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfoCtr *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->level));
+               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->info, r->level));
+               NDR_CHECK(ndr_push_spoolss_SetPrinterInfo(ndr, NDR_SCALARS, &r->info));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               NDR_CHECK(ndr_push_spoolss_SetPrinterInfo(ndr, NDR_BUFFERS, &r->info));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfoCtr(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfoCtr *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->level));
+               NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->info, r->level));
+               NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo(ndr, NDR_SCALARS, &r->info));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo(ndr, NDR_BUFFERS, &r->info));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfoCtr(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfoCtr *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfoCtr");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "level", r->level);
+       ndr_print_set_switch_value(ndr, &r->info, r->level);
+       ndr_print_spoolss_SetPrinterInfo(ndr, "info", &r->info);
+       ndr->depth--;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_StringArray(struct ndr_push *ndr, int ndr_flags, const struct spoolss_StringArray *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, (ndr_size_spoolss_StringArray(r, ndr->iconv_convenience, ndr->flags) - 4) / 2));
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->string));
+                       ndr->flags = _flags_save_string_array;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_StringArray(struct ndr_pull *ndr, int ndr_flags, struct spoolss_StringArray *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size));
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->string));
+                       ndr->flags = _flags_save_string_array;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_StringArray(struct ndr_print *ndr, const char *name, const struct spoolss_StringArray *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_StringArray");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "_ndr_size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?(ndr_size_spoolss_StringArray(r, ndr->iconv_convenience, ndr->flags) - 4) / 2:r->_ndr_size);
+       ndr_print_string_array(ndr, "string", r->string);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_AddDriverInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo1 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+               if (_ptr_driver_name) {
+                       NDR_PULL_ALLOC(ndr, r->driver_name);
+               } else {
+                       r->driver_name = NULL;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
+                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AddDriverInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo1 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo1");
+       ndr->depth++;
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverOSVersion(struct ndr_push *ndr, int ndr_flags, enum spoolss_DriverOSVersion r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverOSVersion(struct ndr_pull *ndr, int ndr_flags, enum spoolss_DriverOSVersion *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_DriverOSVersion(struct ndr_print *ndr, const char *name, enum spoolss_DriverOSVersion r)
+{
+       const char *val = NULL;
+
+       switch (r) {
+               case SPOOLSS_DRIVER_VERSION_9X: val = "SPOOLSS_DRIVER_VERSION_9X"; break;
+               case SPOOLSS_DRIVER_VERSION_NT35: val = "SPOOLSS_DRIVER_VERSION_NT35"; break;
+               case SPOOLSS_DRIVER_VERSION_NT4: val = "SPOOLSS_DRIVER_VERSION_NT4"; break;
+               case SPOOLSS_DRIVER_VERSION_200X: val = "SPOOLSS_DRIVER_VERSION_200X"; break;
+       }
+       ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
+static enum ndr_err_code ndr_push_spoolss_AddDriverInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo2 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->architecture));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_path));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->config_file));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->architecture) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->architecture, ndr_charset_length(r->architecture, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->driver_path) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_path, ndr_charset_length(r->driver_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->data_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->data_file, ndr_charset_length(r->data_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->config_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->config_file, ndr_charset_length(r->config_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo2 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_architecture;
+       TALLOC_CTX *_mem_save_architecture_0;
+       uint32_t _ptr_driver_path;
+       TALLOC_CTX *_mem_save_driver_path_0;
+       uint32_t _ptr_data_file;
+       TALLOC_CTX *_mem_save_data_file_0;
+       uint32_t _ptr_config_file;
+       TALLOC_CTX *_mem_save_config_file_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+               if (_ptr_driver_name) {
+                       NDR_PULL_ALLOC(ndr, r->driver_name);
+               } else {
+                       r->driver_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
+               if (_ptr_architecture) {
+                       NDR_PULL_ALLOC(ndr, r->architecture);
+               } else {
+                       r->architecture = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
+               if (_ptr_driver_path) {
+                       NDR_PULL_ALLOC(ndr, r->driver_path);
+               } else {
+                       r->driver_path = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
+               if (_ptr_data_file) {
+                       NDR_PULL_ALLOC(ndr, r->data_file);
+               } else {
+                       r->data_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
+               if (_ptr_config_file) {
+                       NDR_PULL_ALLOC(ndr, r->config_file);
+               } else {
+                       r->config_file = NULL;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
+                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+               }
+               if (r->architecture) {
+                       _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->architecture));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->architecture));
+                       if (ndr_get_array_length(ndr, &r->architecture) > ndr_get_array_size(ndr, &r->architecture)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->architecture), ndr_get_array_length(ndr, &r->architecture));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->architecture, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+               }
+               if (r->driver_path) {
+                       _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_path));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_path));
+                       if (ndr_get_array_length(ndr, &r->driver_path) > ndr_get_array_size(ndr, &r->driver_path)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_path), ndr_get_array_length(ndr, &r->driver_path));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_path, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+               }
+               if (r->data_file) {
+                       _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->data_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->data_file));
+                       if (ndr_get_array_length(ndr, &r->data_file) > ndr_get_array_size(ndr, &r->data_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->data_file), ndr_get_array_length(ndr, &r->data_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->data_file, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+               }
+               if (r->config_file) {
+                       _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->config_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->config_file));
+                       if (ndr_get_array_length(ndr, &r->config_file) > ndr_get_array_size(ndr, &r->config_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->config_file), ndr_get_array_length(ndr, &r->config_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->config_file, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AddDriverInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo2 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo2");
+       ndr->depth++;
+       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "architecture", r->architecture);
+       ndr->depth++;
+       if (r->architecture) {
+               ndr_print_string(ndr, "architecture", r->architecture);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "driver_path", r->driver_path);
+       ndr->depth++;
+       if (r->driver_path) {
+               ndr_print_string(ndr, "driver_path", r->driver_path);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "data_file", r->data_file);
+       ndr->depth++;
+       if (r->data_file) {
+               ndr_print_string(ndr, "data_file", r->data_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "config_file", r->config_file);
+       ndr->depth++;
+       if (r->config_file) {
+               ndr_print_string(ndr, "config_file", r->config_file);
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_AddDriverInfo3(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo3 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->architecture));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_path));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->config_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->help_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->monitor_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->default_datatype));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->dependent_files));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->architecture) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->architecture, ndr_charset_length(r->architecture, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->driver_path) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_path, ndr_charset_length(r->driver_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->data_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->data_file, ndr_charset_length(r->data_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->config_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->config_file, ndr_charset_length(r->config_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->help_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->help_file, ndr_charset_length(r->help_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->monitor_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->monitor_name, ndr_charset_length(r->monitor_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->default_datatype) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->default_datatype, ndr_charset_length(r->default_datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->dependent_files) {
+                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo3 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_architecture;
+       TALLOC_CTX *_mem_save_architecture_0;
+       uint32_t _ptr_driver_path;
+       TALLOC_CTX *_mem_save_driver_path_0;
+       uint32_t _ptr_data_file;
+       TALLOC_CTX *_mem_save_data_file_0;
+       uint32_t _ptr_config_file;
+       TALLOC_CTX *_mem_save_config_file_0;
+       uint32_t _ptr_help_file;
+       TALLOC_CTX *_mem_save_help_file_0;
+       uint32_t _ptr_monitor_name;
+       TALLOC_CTX *_mem_save_monitor_name_0;
+       uint32_t _ptr_default_datatype;
+       TALLOC_CTX *_mem_save_default_datatype_0;
+       uint32_t _ptr_dependent_files;
+       TALLOC_CTX *_mem_save_dependent_files_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+               if (_ptr_driver_name) {
+                       NDR_PULL_ALLOC(ndr, r->driver_name);
+               } else {
+                       r->driver_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
+               if (_ptr_architecture) {
+                       NDR_PULL_ALLOC(ndr, r->architecture);
+               } else {
+                       r->architecture = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
+               if (_ptr_driver_path) {
+                       NDR_PULL_ALLOC(ndr, r->driver_path);
+               } else {
+                       r->driver_path = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
+               if (_ptr_data_file) {
+                       NDR_PULL_ALLOC(ndr, r->data_file);
+               } else {
+                       r->data_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
+               if (_ptr_config_file) {
+                       NDR_PULL_ALLOC(ndr, r->config_file);
+               } else {
+                       r->config_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
+               if (_ptr_help_file) {
+                       NDR_PULL_ALLOC(ndr, r->help_file);
+               } else {
+                       r->help_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
+               if (_ptr_monitor_name) {
+                       NDR_PULL_ALLOC(ndr, r->monitor_name);
+               } else {
+                       r->monitor_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
+               if (_ptr_default_datatype) {
+                       NDR_PULL_ALLOC(ndr, r->default_datatype);
+               } else {
+                       r->default_datatype = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_dependent_files));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
+               if (_ptr_dependent_files) {
+                       NDR_PULL_ALLOC(ndr, r->dependent_files);
+               } else {
+                       r->dependent_files = NULL;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
+                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+               }
+               if (r->architecture) {
+                       _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->architecture));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->architecture));
+                       if (ndr_get_array_length(ndr, &r->architecture) > ndr_get_array_size(ndr, &r->architecture)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->architecture), ndr_get_array_length(ndr, &r->architecture));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->architecture, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+               }
+               if (r->driver_path) {
+                       _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_path));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_path));
+                       if (ndr_get_array_length(ndr, &r->driver_path) > ndr_get_array_size(ndr, &r->driver_path)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_path), ndr_get_array_length(ndr, &r->driver_path));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_path, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+               }
+               if (r->data_file) {
+                       _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->data_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->data_file));
+                       if (ndr_get_array_length(ndr, &r->data_file) > ndr_get_array_size(ndr, &r->data_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->data_file), ndr_get_array_length(ndr, &r->data_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->data_file, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+               }
+               if (r->config_file) {
+                       _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->config_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->config_file));
+                       if (ndr_get_array_length(ndr, &r->config_file) > ndr_get_array_size(ndr, &r->config_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->config_file), ndr_get_array_length(ndr, &r->config_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->config_file, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+               }
+               if (r->help_file) {
+                       _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->help_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->help_file));
+                       if (ndr_get_array_length(ndr, &r->help_file) > ndr_get_array_size(ndr, &r->help_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->help_file), ndr_get_array_length(ndr, &r->help_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->help_file, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+               }
+               if (r->monitor_name) {
+                       _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->monitor_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->monitor_name));
+                       if (ndr_get_array_length(ndr, &r->monitor_name) > ndr_get_array_size(ndr, &r->monitor_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->monitor_name), ndr_get_array_length(ndr, &r->monitor_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->monitor_name, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+               }
+               if (r->default_datatype) {
+                       _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->default_datatype));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->default_datatype));
+                       if (ndr_get_array_length(ndr, &r->default_datatype) > ndr_get_array_size(ndr, &r->default_datatype)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->default_datatype), ndr_get_array_length(ndr, &r->default_datatype));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->default_datatype, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+               }
+               if (r->dependent_files) {
+                       _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
+                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AddDriverInfo3(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo3 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo3");
+       ndr->depth++;
+       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "architecture", r->architecture);
+       ndr->depth++;
+       if (r->architecture) {
+               ndr_print_string(ndr, "architecture", r->architecture);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "driver_path", r->driver_path);
+       ndr->depth++;
+       if (r->driver_path) {
+               ndr_print_string(ndr, "driver_path", r->driver_path);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "data_file", r->data_file);
+       ndr->depth++;
+       if (r->data_file) {
+               ndr_print_string(ndr, "data_file", r->data_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "config_file", r->config_file);
+       ndr->depth++;
+       if (r->config_file) {
+               ndr_print_string(ndr, "config_file", r->config_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "help_file", r->help_file);
+       ndr->depth++;
+       if (r->help_file) {
+               ndr_print_string(ndr, "help_file", r->help_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
+       ndr->depth++;
+       if (r->monitor_name) {
+               ndr_print_string(ndr, "monitor_name", r->monitor_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
+       ndr->depth++;
+       if (r->default_datatype) {
+               ndr_print_string(ndr, "default_datatype", r->default_datatype);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "_ndr_size_dependent_files", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_dependent_files);
+       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       ndr->depth++;
+       if (r->dependent_files) {
+               ndr_print_spoolss_StringArray(ndr, "dependent_files", r->dependent_files);
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_AddDriverInfo4(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo4 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->architecture));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_path));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->config_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->help_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->monitor_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->default_datatype));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->dependent_files));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->previous_names));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->architecture) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->architecture, ndr_charset_length(r->architecture, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->driver_path) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_path, ndr_charset_length(r->driver_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->data_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->data_file, ndr_charset_length(r->data_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->config_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->config_file, ndr_charset_length(r->config_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->help_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->help_file, ndr_charset_length(r->help_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->monitor_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->monitor_name, ndr_charset_length(r->monitor_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->default_datatype) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->default_datatype, ndr_charset_length(r->default_datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->dependent_files) {
+                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
+               }
+               if (r->previous_names) {
+                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo4(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo4 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_architecture;
+       TALLOC_CTX *_mem_save_architecture_0;
+       uint32_t _ptr_driver_path;
+       TALLOC_CTX *_mem_save_driver_path_0;
+       uint32_t _ptr_data_file;
+       TALLOC_CTX *_mem_save_data_file_0;
+       uint32_t _ptr_config_file;
+       TALLOC_CTX *_mem_save_config_file_0;
+       uint32_t _ptr_help_file;
+       TALLOC_CTX *_mem_save_help_file_0;
+       uint32_t _ptr_monitor_name;
+       TALLOC_CTX *_mem_save_monitor_name_0;
+       uint32_t _ptr_default_datatype;
+       TALLOC_CTX *_mem_save_default_datatype_0;
+       uint32_t _ptr_dependent_files;
+       TALLOC_CTX *_mem_save_dependent_files_0;
+       uint32_t _ptr_previous_names;
+       TALLOC_CTX *_mem_save_previous_names_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+               if (_ptr_driver_name) {
+                       NDR_PULL_ALLOC(ndr, r->driver_name);
+               } else {
+                       r->driver_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
+               if (_ptr_architecture) {
+                       NDR_PULL_ALLOC(ndr, r->architecture);
+               } else {
+                       r->architecture = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
+               if (_ptr_driver_path) {
+                       NDR_PULL_ALLOC(ndr, r->driver_path);
+               } else {
+                       r->driver_path = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
+               if (_ptr_data_file) {
+                       NDR_PULL_ALLOC(ndr, r->data_file);
+               } else {
+                       r->data_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
+               if (_ptr_config_file) {
+                       NDR_PULL_ALLOC(ndr, r->config_file);
+               } else {
+                       r->config_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
+               if (_ptr_help_file) {
+                       NDR_PULL_ALLOC(ndr, r->help_file);
+               } else {
+                       r->help_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
+               if (_ptr_monitor_name) {
+                       NDR_PULL_ALLOC(ndr, r->monitor_name);
+               } else {
+                       r->monitor_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
+               if (_ptr_default_datatype) {
+                       NDR_PULL_ALLOC(ndr, r->default_datatype);
+               } else {
+                       r->default_datatype = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_dependent_files));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
+               if (_ptr_dependent_files) {
+                       NDR_PULL_ALLOC(ndr, r->dependent_files);
+               } else {
+                       r->dependent_files = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_previous_names));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
+               if (_ptr_previous_names) {
+                       NDR_PULL_ALLOC(ndr, r->previous_names);
+               } else {
+                       r->previous_names = NULL;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
+                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+               }
+               if (r->architecture) {
+                       _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->architecture));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->architecture));
+                       if (ndr_get_array_length(ndr, &r->architecture) > ndr_get_array_size(ndr, &r->architecture)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->architecture), ndr_get_array_length(ndr, &r->architecture));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->architecture, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+               }
+               if (r->driver_path) {
+                       _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_path));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_path));
+                       if (ndr_get_array_length(ndr, &r->driver_path) > ndr_get_array_size(ndr, &r->driver_path)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_path), ndr_get_array_length(ndr, &r->driver_path));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_path, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+               }
+               if (r->data_file) {
+                       _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->data_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->data_file));
+                       if (ndr_get_array_length(ndr, &r->data_file) > ndr_get_array_size(ndr, &r->data_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->data_file), ndr_get_array_length(ndr, &r->data_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->data_file, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+               }
+               if (r->config_file) {
+                       _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->config_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->config_file));
+                       if (ndr_get_array_length(ndr, &r->config_file) > ndr_get_array_size(ndr, &r->config_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->config_file), ndr_get_array_length(ndr, &r->config_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->config_file, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+               }
+               if (r->help_file) {
+                       _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->help_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->help_file));
+                       if (ndr_get_array_length(ndr, &r->help_file) > ndr_get_array_size(ndr, &r->help_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->help_file), ndr_get_array_length(ndr, &r->help_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->help_file, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+               }
+               if (r->monitor_name) {
+                       _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->monitor_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->monitor_name));
+                       if (ndr_get_array_length(ndr, &r->monitor_name) > ndr_get_array_size(ndr, &r->monitor_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->monitor_name), ndr_get_array_length(ndr, &r->monitor_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->monitor_name, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+               }
+               if (r->default_datatype) {
+                       _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->default_datatype));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->default_datatype));
+                       if (ndr_get_array_length(ndr, &r->default_datatype) > ndr_get_array_size(ndr, &r->default_datatype)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->default_datatype), ndr_get_array_length(ndr, &r->default_datatype));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->default_datatype, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+               }
+               if (r->dependent_files) {
+                       _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
+                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+               }
+               if (r->previous_names) {
+                       _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
+                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AddDriverInfo4(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo4 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo4");
+       ndr->depth++;
+       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "architecture", r->architecture);
+       ndr->depth++;
+       if (r->architecture) {
+               ndr_print_string(ndr, "architecture", r->architecture);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "driver_path", r->driver_path);
+       ndr->depth++;
+       if (r->driver_path) {
+               ndr_print_string(ndr, "driver_path", r->driver_path);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "data_file", r->data_file);
+       ndr->depth++;
+       if (r->data_file) {
+               ndr_print_string(ndr, "data_file", r->data_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "config_file", r->config_file);
+       ndr->depth++;
+       if (r->config_file) {
+               ndr_print_string(ndr, "config_file", r->config_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "help_file", r->help_file);
+       ndr->depth++;
+       if (r->help_file) {
+               ndr_print_string(ndr, "help_file", r->help_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
+       ndr->depth++;
+       if (r->monitor_name) {
+               ndr_print_string(ndr, "monitor_name", r->monitor_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
+       ndr->depth++;
+       if (r->default_datatype) {
+               ndr_print_string(ndr, "default_datatype", r->default_datatype);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "_ndr_size_dependent_files", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_dependent_files);
+       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       ndr->depth++;
+       if (r->dependent_files) {
+               ndr_print_spoolss_StringArray(ndr, "dependent_files", r->dependent_files);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "_ndr_size_previous_names", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_previous_names);
+       ndr_print_ptr(ndr, "previous_names", r->previous_names);
+       ndr->depth++;
+       if (r->previous_names) {
+               ndr_print_spoolss_StringArray(ndr, "previous_names", r->previous_names);
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_AddDriverInfo6(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo6 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 8));
+               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->architecture));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_path));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->config_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->help_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->monitor_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->default_datatype));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->dependent_files));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->previous_names));
+               NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->driver_date));
+               NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, r->driver_version));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->manufacturer_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->manufacturer_url));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->hardware_id));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->provider));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->architecture) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->architecture, ndr_charset_length(r->architecture, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->driver_path) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_path, ndr_charset_length(r->driver_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->data_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->data_file, ndr_charset_length(r->data_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->config_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->config_file, ndr_charset_length(r->config_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->help_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->help_file, ndr_charset_length(r->help_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->monitor_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->monitor_name, ndr_charset_length(r->monitor_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->default_datatype) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->default_datatype, ndr_charset_length(r->default_datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->dependent_files) {
+                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
+               }
+               if (r->previous_names) {
+                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
+               }
+               if (r->manufacturer_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->manufacturer_name, ndr_charset_length(r->manufacturer_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->manufacturer_url) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_url, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_url, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->manufacturer_url, ndr_charset_length(r->manufacturer_url, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->hardware_id) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->hardware_id, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->hardware_id, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->hardware_id, ndr_charset_length(r->hardware_id, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->provider) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->provider, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->provider, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->provider, ndr_charset_length(r->provider, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo6(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo6 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_architecture;
+       TALLOC_CTX *_mem_save_architecture_0;
+       uint32_t _ptr_driver_path;
+       TALLOC_CTX *_mem_save_driver_path_0;
+       uint32_t _ptr_data_file;
+       TALLOC_CTX *_mem_save_data_file_0;
+       uint32_t _ptr_config_file;
+       TALLOC_CTX *_mem_save_config_file_0;
+       uint32_t _ptr_help_file;
+       TALLOC_CTX *_mem_save_help_file_0;
+       uint32_t _ptr_monitor_name;
+       TALLOC_CTX *_mem_save_monitor_name_0;
+       uint32_t _ptr_default_datatype;
+       TALLOC_CTX *_mem_save_default_datatype_0;
+       uint32_t _ptr_dependent_files;
+       TALLOC_CTX *_mem_save_dependent_files_0;
+       uint32_t _ptr_previous_names;
+       TALLOC_CTX *_mem_save_previous_names_0;
+       uint32_t _ptr_manufacturer_name;
+       TALLOC_CTX *_mem_save_manufacturer_name_0;
+       uint32_t _ptr_manufacturer_url;
+       TALLOC_CTX *_mem_save_manufacturer_url_0;
+       uint32_t _ptr_hardware_id;
+       TALLOC_CTX *_mem_save_hardware_id_0;
+       uint32_t _ptr_provider;
+       TALLOC_CTX *_mem_save_provider_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 8));
+               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+               if (_ptr_driver_name) {
+                       NDR_PULL_ALLOC(ndr, r->driver_name);
+               } else {
+                       r->driver_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
+               if (_ptr_architecture) {
+                       NDR_PULL_ALLOC(ndr, r->architecture);
+               } else {
+                       r->architecture = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
+               if (_ptr_driver_path) {
+                       NDR_PULL_ALLOC(ndr, r->driver_path);
+               } else {
+                       r->driver_path = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
+               if (_ptr_data_file) {
+                       NDR_PULL_ALLOC(ndr, r->data_file);
+               } else {
+                       r->data_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
+               if (_ptr_config_file) {
+                       NDR_PULL_ALLOC(ndr, r->config_file);
+               } else {
+                       r->config_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
+               if (_ptr_help_file) {
+                       NDR_PULL_ALLOC(ndr, r->help_file);
+               } else {
+                       r->help_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
+               if (_ptr_monitor_name) {
+                       NDR_PULL_ALLOC(ndr, r->monitor_name);
+               } else {
+                       r->monitor_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
+               if (_ptr_default_datatype) {
+                       NDR_PULL_ALLOC(ndr, r->default_datatype);
+               } else {
+                       r->default_datatype = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_dependent_files));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
+               if (_ptr_dependent_files) {
+                       NDR_PULL_ALLOC(ndr, r->dependent_files);
+               } else {
+                       r->dependent_files = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_previous_names));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
+               if (_ptr_previous_names) {
+                       NDR_PULL_ALLOC(ndr, r->previous_names);
+               } else {
+                       r->previous_names = NULL;
+               }
+               NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->driver_date));
+               NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &r->driver_version));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_name));
+               if (_ptr_manufacturer_name) {
+                       NDR_PULL_ALLOC(ndr, r->manufacturer_name);
+               } else {
+                       r->manufacturer_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_url));
+               if (_ptr_manufacturer_url) {
+                       NDR_PULL_ALLOC(ndr, r->manufacturer_url);
+               } else {
+                       r->manufacturer_url = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_hardware_id));
+               if (_ptr_hardware_id) {
+                       NDR_PULL_ALLOC(ndr, r->hardware_id);
+               } else {
+                       r->hardware_id = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_provider));
+               if (_ptr_provider) {
+                       NDR_PULL_ALLOC(ndr, r->provider);
+               } else {
+                       r->provider = NULL;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
+                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+               }
+               if (r->architecture) {
+                       _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->architecture));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->architecture));
+                       if (ndr_get_array_length(ndr, &r->architecture) > ndr_get_array_size(ndr, &r->architecture)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->architecture), ndr_get_array_length(ndr, &r->architecture));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->architecture, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+               }
+               if (r->driver_path) {
+                       _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_path));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_path));
+                       if (ndr_get_array_length(ndr, &r->driver_path) > ndr_get_array_size(ndr, &r->driver_path)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_path), ndr_get_array_length(ndr, &r->driver_path));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_path, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+               }
+               if (r->data_file) {
+                       _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->data_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->data_file));
+                       if (ndr_get_array_length(ndr, &r->data_file) > ndr_get_array_size(ndr, &r->data_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->data_file), ndr_get_array_length(ndr, &r->data_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->data_file, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+               }
+               if (r->config_file) {
+                       _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->config_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->config_file));
+                       if (ndr_get_array_length(ndr, &r->config_file) > ndr_get_array_size(ndr, &r->config_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->config_file), ndr_get_array_length(ndr, &r->config_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->config_file, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+               }
+               if (r->help_file) {
+                       _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->help_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->help_file));
+                       if (ndr_get_array_length(ndr, &r->help_file) > ndr_get_array_size(ndr, &r->help_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->help_file), ndr_get_array_length(ndr, &r->help_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->help_file, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+               }
+               if (r->monitor_name) {
+                       _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->monitor_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->monitor_name));
+                       if (ndr_get_array_length(ndr, &r->monitor_name) > ndr_get_array_size(ndr, &r->monitor_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->monitor_name), ndr_get_array_length(ndr, &r->monitor_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->monitor_name, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+               }
+               if (r->default_datatype) {
+                       _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->default_datatype));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->default_datatype));
+                       if (ndr_get_array_length(ndr, &r->default_datatype) > ndr_get_array_size(ndr, &r->default_datatype)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->default_datatype), ndr_get_array_length(ndr, &r->default_datatype));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->default_datatype, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+               }
+               if (r->dependent_files) {
+                       _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
+                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+               }
+               if (r->previous_names) {
+                       _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
+                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
+               }
+               if (r->manufacturer_name) {
+                       _mem_save_manufacturer_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->manufacturer_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->manufacturer_name));
+                       if (ndr_get_array_length(ndr, &r->manufacturer_name) > ndr_get_array_size(ndr, &r->manufacturer_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->manufacturer_name), ndr_get_array_length(ndr, &r->manufacturer_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->manufacturer_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->manufacturer_name, ndr_get_array_length(ndr, &r->manufacturer_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_name_0, 0);
+               }
+               if (r->manufacturer_url) {
+                       _mem_save_manufacturer_url_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_url, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->manufacturer_url));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->manufacturer_url));
+                       if (ndr_get_array_length(ndr, &r->manufacturer_url) > ndr_get_array_size(ndr, &r->manufacturer_url)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->manufacturer_url), ndr_get_array_length(ndr, &r->manufacturer_url));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->manufacturer_url), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->manufacturer_url, ndr_get_array_length(ndr, &r->manufacturer_url), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_url_0, 0);
+               }
+               if (r->hardware_id) {
+                       _mem_save_hardware_id_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->hardware_id, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->hardware_id));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->hardware_id));
+                       if (ndr_get_array_length(ndr, &r->hardware_id) > ndr_get_array_size(ndr, &r->hardware_id)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->hardware_id), ndr_get_array_length(ndr, &r->hardware_id));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->hardware_id), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->hardware_id, ndr_get_array_length(ndr, &r->hardware_id), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_hardware_id_0, 0);
+               }
+               if (r->provider) {
+                       _mem_save_provider_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->provider, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->provider));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->provider));
+                       if (ndr_get_array_length(ndr, &r->provider) > ndr_get_array_size(ndr, &r->provider)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->provider), ndr_get_array_length(ndr, &r->provider));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->provider), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->provider, ndr_get_array_length(ndr, &r->provider), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_provider_0, 0);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AddDriverInfo6(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo6 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo6");
+       ndr->depth++;
+       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "architecture", r->architecture);
+       ndr->depth++;
+       if (r->architecture) {
+               ndr_print_string(ndr, "architecture", r->architecture);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "driver_path", r->driver_path);
+       ndr->depth++;
+       if (r->driver_path) {
+               ndr_print_string(ndr, "driver_path", r->driver_path);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "data_file", r->data_file);
+       ndr->depth++;
+       if (r->data_file) {
+               ndr_print_string(ndr, "data_file", r->data_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "config_file", r->config_file);
+       ndr->depth++;
+       if (r->config_file) {
+               ndr_print_string(ndr, "config_file", r->config_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "help_file", r->help_file);
+       ndr->depth++;
+       if (r->help_file) {
+               ndr_print_string(ndr, "help_file", r->help_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
+       ndr->depth++;
+       if (r->monitor_name) {
+               ndr_print_string(ndr, "monitor_name", r->monitor_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
+       ndr->depth++;
+       if (r->default_datatype) {
+               ndr_print_string(ndr, "default_datatype", r->default_datatype);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "_ndr_size_dependent_files", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_dependent_files);
+       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       ndr->depth++;
+       if (r->dependent_files) {
+               ndr_print_spoolss_StringArray(ndr, "dependent_files", r->dependent_files);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "_ndr_size_previous_names", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_previous_names);
+       ndr_print_ptr(ndr, "previous_names", r->previous_names);
+       ndr->depth++;
+       if (r->previous_names) {
+               ndr_print_spoolss_StringArray(ndr, "previous_names", r->previous_names);
+       }
+       ndr->depth--;
+       ndr_print_NTTIME(ndr, "driver_date", r->driver_date);
+       ndr_print_hyper(ndr, "driver_version", r->driver_version);
+       ndr_print_ptr(ndr, "manufacturer_name", r->manufacturer_name);
+       ndr->depth++;
+       if (r->manufacturer_name) {
+               ndr_print_string(ndr, "manufacturer_name", r->manufacturer_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "manufacturer_url", r->manufacturer_url);
+       ndr->depth++;
+       if (r->manufacturer_url) {
+               ndr_print_string(ndr, "manufacturer_url", r->manufacturer_url);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "hardware_id", r->hardware_id);
+       ndr->depth++;
+       if (r->hardware_id) {
+               ndr_print_string(ndr, "hardware_id", r->hardware_id);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "provider", r->provider);
+       ndr->depth++;
+       if (r->provider) {
+               ndr_print_string(ndr, "provider", r->provider);
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_AddDriverInfo8(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo8 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 8));
+               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->architecture));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->driver_path));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->config_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->help_file));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->monitor_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->default_datatype));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->dependent_files));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->previous_names));
+               NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->driver_date));
+               NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, r->driver_version));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->manufacturer_name));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->manufacturer_url));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->hardware_id));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->provider));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->print_processor));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->vendor_setup));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->color_profiles, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->color_profiles));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->inf_path));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->printer_driver_attributes));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ((ndr_size_spoolss_StringArray(r->core_driver_dependencies, ndr->iconv_convenience, ndr->flags) - 4) / 2)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->core_driver_dependencies));
+               NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->min_inbox_driver_ver_date));
+               NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, r->min_inbox_driver_ver_version));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_name, ndr_charset_length(r->driver_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->architecture) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->architecture, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->architecture, ndr_charset_length(r->architecture, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->driver_path) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->driver_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->driver_path, ndr_charset_length(r->driver_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->data_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->data_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->data_file, ndr_charset_length(r->data_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->config_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->config_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->config_file, ndr_charset_length(r->config_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->help_file) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->help_file, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->help_file, ndr_charset_length(r->help_file, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->monitor_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->monitor_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->monitor_name, ndr_charset_length(r->monitor_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->default_datatype) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->default_datatype, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->default_datatype, ndr_charset_length(r->default_datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->dependent_files) {
+                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
+               }
+               if (r->previous_names) {
+                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
+               }
+               if (r->manufacturer_name) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_name, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->manufacturer_name, ndr_charset_length(r->manufacturer_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->manufacturer_url) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_url, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->manufacturer_url, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->manufacturer_url, ndr_charset_length(r->manufacturer_url, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->hardware_id) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->hardware_id, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->hardware_id, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->hardware_id, ndr_charset_length(r->hardware_id, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->provider) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->provider, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->provider, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->provider, ndr_charset_length(r->provider, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->print_processor) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->print_processor, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->print_processor, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->print_processor, ndr_charset_length(r->print_processor, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->vendor_setup) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->vendor_setup, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->vendor_setup, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->vendor_setup, ndr_charset_length(r->vendor_setup, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->color_profiles) {
+                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->color_profiles));
+               }
+               if (r->inf_path) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->inf_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->inf_path, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->inf_path, ndr_charset_length(r->inf_path, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->core_driver_dependencies) {
+                       NDR_CHECK(ndr_push_spoolss_StringArray(ndr, NDR_SCALARS, r->core_driver_dependencies));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo8(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfo8 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_architecture;
+       TALLOC_CTX *_mem_save_architecture_0;
+       uint32_t _ptr_driver_path;
+       TALLOC_CTX *_mem_save_driver_path_0;
+       uint32_t _ptr_data_file;
+       TALLOC_CTX *_mem_save_data_file_0;
+       uint32_t _ptr_config_file;
+       TALLOC_CTX *_mem_save_config_file_0;
+       uint32_t _ptr_help_file;
+       TALLOC_CTX *_mem_save_help_file_0;
+       uint32_t _ptr_monitor_name;
+       TALLOC_CTX *_mem_save_monitor_name_0;
+       uint32_t _ptr_default_datatype;
+       TALLOC_CTX *_mem_save_default_datatype_0;
+       uint32_t _ptr_dependent_files;
+       TALLOC_CTX *_mem_save_dependent_files_0;
+       uint32_t _ptr_previous_names;
+       TALLOC_CTX *_mem_save_previous_names_0;
+       uint32_t _ptr_manufacturer_name;
+       TALLOC_CTX *_mem_save_manufacturer_name_0;
+       uint32_t _ptr_manufacturer_url;
+       TALLOC_CTX *_mem_save_manufacturer_url_0;
+       uint32_t _ptr_hardware_id;
+       TALLOC_CTX *_mem_save_hardware_id_0;
+       uint32_t _ptr_provider;
+       TALLOC_CTX *_mem_save_provider_0;
+       uint32_t _ptr_print_processor;
+       TALLOC_CTX *_mem_save_print_processor_0;
+       uint32_t _ptr_vendor_setup;
+       TALLOC_CTX *_mem_save_vendor_setup_0;
+       uint32_t _ptr_color_profiles;
+       TALLOC_CTX *_mem_save_color_profiles_0;
+       uint32_t _ptr_inf_path;
+       TALLOC_CTX *_mem_save_inf_path_0;
+       uint32_t _ptr_core_driver_dependencies;
+       TALLOC_CTX *_mem_save_core_driver_dependencies_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 8));
+               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+               if (_ptr_driver_name) {
+                       NDR_PULL_ALLOC(ndr, r->driver_name);
+               } else {
+                       r->driver_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
+               if (_ptr_architecture) {
+                       NDR_PULL_ALLOC(ndr, r->architecture);
                } else {
                        r->architecture = NULL;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
-               if (_ptr_driver_path) {
-                       NDR_PULL_ALLOC(ndr, r->driver_path);
-               } else {
-                       r->driver_path = NULL;
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
+               if (_ptr_driver_path) {
+                       NDR_PULL_ALLOC(ndr, r->driver_path);
+               } else {
+                       r->driver_path = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
+               if (_ptr_data_file) {
+                       NDR_PULL_ALLOC(ndr, r->data_file);
+               } else {
+                       r->data_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
+               if (_ptr_config_file) {
+                       NDR_PULL_ALLOC(ndr, r->config_file);
+               } else {
+                       r->config_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
+               if (_ptr_help_file) {
+                       NDR_PULL_ALLOC(ndr, r->help_file);
+               } else {
+                       r->help_file = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
+               if (_ptr_monitor_name) {
+                       NDR_PULL_ALLOC(ndr, r->monitor_name);
+               } else {
+                       r->monitor_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
+               if (_ptr_default_datatype) {
+                       NDR_PULL_ALLOC(ndr, r->default_datatype);
+               } else {
+                       r->default_datatype = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_dependent_files));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
+               if (_ptr_dependent_files) {
+                       NDR_PULL_ALLOC(ndr, r->dependent_files);
+               } else {
+                       r->dependent_files = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_previous_names));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
+               if (_ptr_previous_names) {
+                       NDR_PULL_ALLOC(ndr, r->previous_names);
+               } else {
+                       r->previous_names = NULL;
+               }
+               NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->driver_date));
+               NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &r->driver_version));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_name));
+               if (_ptr_manufacturer_name) {
+                       NDR_PULL_ALLOC(ndr, r->manufacturer_name);
+               } else {
+                       r->manufacturer_name = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_url));
+               if (_ptr_manufacturer_url) {
+                       NDR_PULL_ALLOC(ndr, r->manufacturer_url);
+               } else {
+                       r->manufacturer_url = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_hardware_id));
+               if (_ptr_hardware_id) {
+                       NDR_PULL_ALLOC(ndr, r->hardware_id);
+               } else {
+                       r->hardware_id = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_provider));
+               if (_ptr_provider) {
+                       NDR_PULL_ALLOC(ndr, r->provider);
+               } else {
+                       r->provider = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_print_processor));
+               if (_ptr_print_processor) {
+                       NDR_PULL_ALLOC(ndr, r->print_processor);
+               } else {
+                       r->print_processor = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_vendor_setup));
+               if (_ptr_vendor_setup) {
+                       NDR_PULL_ALLOC(ndr, r->vendor_setup);
+               } else {
+                       r->vendor_setup = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_color_profiles));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_color_profiles));
+               if (_ptr_color_profiles) {
+                       NDR_PULL_ALLOC(ndr, r->color_profiles);
+               } else {
+                       r->color_profiles = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_inf_path));
+               if (_ptr_inf_path) {
+                       NDR_PULL_ALLOC(ndr, r->inf_path);
+               } else {
+                       r->inf_path = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->printer_driver_attributes));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_core_driver_dependencies));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_core_driver_dependencies));
+               if (_ptr_core_driver_dependencies) {
+                       NDR_PULL_ALLOC(ndr, r->core_driver_dependencies);
+               } else {
+                       r->core_driver_dependencies = NULL;
+               }
+               NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->min_inbox_driver_ver_date));
+               NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &r->min_inbox_driver_ver_version));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->driver_name) {
+                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
+                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+               }
+               if (r->architecture) {
+                       _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->architecture));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->architecture));
+                       if (ndr_get_array_length(ndr, &r->architecture) > ndr_get_array_size(ndr, &r->architecture)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->architecture), ndr_get_array_length(ndr, &r->architecture));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->architecture, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+               }
+               if (r->driver_path) {
+                       _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_path));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_path));
+                       if (ndr_get_array_length(ndr, &r->driver_path) > ndr_get_array_size(ndr, &r->driver_path)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_path), ndr_get_array_length(ndr, &r->driver_path));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_path, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+               }
+               if (r->data_file) {
+                       _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->data_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->data_file));
+                       if (ndr_get_array_length(ndr, &r->data_file) > ndr_get_array_size(ndr, &r->data_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->data_file), ndr_get_array_length(ndr, &r->data_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->data_file, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+               }
+               if (r->config_file) {
+                       _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->config_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->config_file));
+                       if (ndr_get_array_length(ndr, &r->config_file) > ndr_get_array_size(ndr, &r->config_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->config_file), ndr_get_array_length(ndr, &r->config_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->config_file, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+               }
+               if (r->help_file) {
+                       _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->help_file));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->help_file));
+                       if (ndr_get_array_length(ndr, &r->help_file) > ndr_get_array_size(ndr, &r->help_file)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->help_file), ndr_get_array_length(ndr, &r->help_file));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->help_file, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+               }
+               if (r->monitor_name) {
+                       _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->monitor_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->monitor_name));
+                       if (ndr_get_array_length(ndr, &r->monitor_name) > ndr_get_array_size(ndr, &r->monitor_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->monitor_name), ndr_get_array_length(ndr, &r->monitor_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->monitor_name, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+               }
+               if (r->default_datatype) {
+                       _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->default_datatype));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->default_datatype));
+                       if (ndr_get_array_length(ndr, &r->default_datatype) > ndr_get_array_size(ndr, &r->default_datatype)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->default_datatype), ndr_get_array_length(ndr, &r->default_datatype));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->default_datatype, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+               }
+               if (r->dependent_files) {
+                       _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
+                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+               }
+               if (r->previous_names) {
+                       _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
+                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
+               }
+               if (r->manufacturer_name) {
+                       _mem_save_manufacturer_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_name, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->manufacturer_name));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->manufacturer_name));
+                       if (ndr_get_array_length(ndr, &r->manufacturer_name) > ndr_get_array_size(ndr, &r->manufacturer_name)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->manufacturer_name), ndr_get_array_length(ndr, &r->manufacturer_name));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->manufacturer_name), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->manufacturer_name, ndr_get_array_length(ndr, &r->manufacturer_name), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_name_0, 0);
+               }
+               if (r->manufacturer_url) {
+                       _mem_save_manufacturer_url_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_url, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->manufacturer_url));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->manufacturer_url));
+                       if (ndr_get_array_length(ndr, &r->manufacturer_url) > ndr_get_array_size(ndr, &r->manufacturer_url)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->manufacturer_url), ndr_get_array_length(ndr, &r->manufacturer_url));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->manufacturer_url), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->manufacturer_url, ndr_get_array_length(ndr, &r->manufacturer_url), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_url_0, 0);
+               }
+               if (r->hardware_id) {
+                       _mem_save_hardware_id_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->hardware_id, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->hardware_id));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->hardware_id));
+                       if (ndr_get_array_length(ndr, &r->hardware_id) > ndr_get_array_size(ndr, &r->hardware_id)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->hardware_id), ndr_get_array_length(ndr, &r->hardware_id));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->hardware_id), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->hardware_id, ndr_get_array_length(ndr, &r->hardware_id), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_hardware_id_0, 0);
+               }
+               if (r->provider) {
+                       _mem_save_provider_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->provider, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->provider));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->provider));
+                       if (ndr_get_array_length(ndr, &r->provider) > ndr_get_array_size(ndr, &r->provider)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->provider), ndr_get_array_length(ndr, &r->provider));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->provider), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->provider, ndr_get_array_length(ndr, &r->provider), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_provider_0, 0);
+               }
+               if (r->print_processor) {
+                       _mem_save_print_processor_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->print_processor, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->print_processor));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->print_processor));
+                       if (ndr_get_array_length(ndr, &r->print_processor) > ndr_get_array_size(ndr, &r->print_processor)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->print_processor), ndr_get_array_length(ndr, &r->print_processor));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->print_processor), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->print_processor, ndr_get_array_length(ndr, &r->print_processor), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_print_processor_0, 0);
+               }
+               if (r->vendor_setup) {
+                       _mem_save_vendor_setup_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->vendor_setup, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->vendor_setup));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->vendor_setup));
+                       if (ndr_get_array_length(ndr, &r->vendor_setup) > ndr_get_array_size(ndr, &r->vendor_setup)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->vendor_setup), ndr_get_array_length(ndr, &r->vendor_setup));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->vendor_setup), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->vendor_setup, ndr_get_array_length(ndr, &r->vendor_setup), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_vendor_setup_0, 0);
+               }
+               if (r->color_profiles) {
+                       _mem_save_color_profiles_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->color_profiles, 0);
+                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->color_profiles));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_color_profiles_0, 0);
+               }
+               if (r->inf_path) {
+                       _mem_save_inf_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->inf_path, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->inf_path));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->inf_path));
+                       if (ndr_get_array_length(ndr, &r->inf_path) > ndr_get_array_size(ndr, &r->inf_path)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->inf_path), ndr_get_array_length(ndr, &r->inf_path));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->inf_path), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->inf_path, ndr_get_array_length(ndr, &r->inf_path), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_inf_path_0, 0);
+               }
+               if (r->core_driver_dependencies) {
+                       _mem_save_core_driver_dependencies_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->core_driver_dependencies, 0);
+                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->core_driver_dependencies));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_core_driver_dependencies_0, 0);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AddDriverInfo8(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo8 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo8");
+       ndr->depth++;
+       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "architecture", r->architecture);
+       ndr->depth++;
+       if (r->architecture) {
+               ndr_print_string(ndr, "architecture", r->architecture);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "driver_path", r->driver_path);
+       ndr->depth++;
+       if (r->driver_path) {
+               ndr_print_string(ndr, "driver_path", r->driver_path);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "data_file", r->data_file);
+       ndr->depth++;
+       if (r->data_file) {
+               ndr_print_string(ndr, "data_file", r->data_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "config_file", r->config_file);
+       ndr->depth++;
+       if (r->config_file) {
+               ndr_print_string(ndr, "config_file", r->config_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "help_file", r->help_file);
+       ndr->depth++;
+       if (r->help_file) {
+               ndr_print_string(ndr, "help_file", r->help_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
+       ndr->depth++;
+       if (r->monitor_name) {
+               ndr_print_string(ndr, "monitor_name", r->monitor_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
+       ndr->depth++;
+       if (r->default_datatype) {
+               ndr_print_string(ndr, "default_datatype", r->default_datatype);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "_ndr_size_dependent_files", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_dependent_files);
+       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       ndr->depth++;
+       if (r->dependent_files) {
+               ndr_print_spoolss_StringArray(ndr, "dependent_files", r->dependent_files);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "_ndr_size_previous_names", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_previous_names);
+       ndr_print_ptr(ndr, "previous_names", r->previous_names);
+       ndr->depth++;
+       if (r->previous_names) {
+               ndr_print_spoolss_StringArray(ndr, "previous_names", r->previous_names);
+       }
+       ndr->depth--;
+       ndr_print_NTTIME(ndr, "driver_date", r->driver_date);
+       ndr_print_hyper(ndr, "driver_version", r->driver_version);
+       ndr_print_ptr(ndr, "manufacturer_name", r->manufacturer_name);
+       ndr->depth++;
+       if (r->manufacturer_name) {
+               ndr_print_string(ndr, "manufacturer_name", r->manufacturer_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "manufacturer_url", r->manufacturer_url);
+       ndr->depth++;
+       if (r->manufacturer_url) {
+               ndr_print_string(ndr, "manufacturer_url", r->manufacturer_url);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "hardware_id", r->hardware_id);
+       ndr->depth++;
+       if (r->hardware_id) {
+               ndr_print_string(ndr, "hardware_id", r->hardware_id);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "provider", r->provider);
+       ndr->depth++;
+       if (r->provider) {
+               ndr_print_string(ndr, "provider", r->provider);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "print_processor", r->print_processor);
+       ndr->depth++;
+       if (r->print_processor) {
+               ndr_print_string(ndr, "print_processor", r->print_processor);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "vendor_setup", r->vendor_setup);
+       ndr->depth++;
+       if (r->vendor_setup) {
+               ndr_print_string(ndr, "vendor_setup", r->vendor_setup);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "_ndr_size_color_profiles", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->color_profiles, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_color_profiles);
+       ndr_print_ptr(ndr, "color_profiles", r->color_profiles);
+       ndr->depth++;
+       if (r->color_profiles) {
+               ndr_print_spoolss_StringArray(ndr, "color_profiles", r->color_profiles);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "inf_path", r->inf_path);
+       ndr->depth++;
+       if (r->inf_path) {
+               ndr_print_string(ndr, "inf_path", r->inf_path);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "printer_driver_attributes", r->printer_driver_attributes);
+       ndr_print_uint32(ndr, "_ndr_size_core_driver_dependencies", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->core_driver_dependencies, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_core_driver_dependencies);
+       ndr_print_ptr(ndr, "core_driver_dependencies", r->core_driver_dependencies);
+       ndr->depth++;
+       if (r->core_driver_dependencies) {
+               ndr_print_spoolss_StringArray(ndr, "core_driver_dependencies", r->core_driver_dependencies);
+       }
+       ndr->depth--;
+       ndr_print_NTTIME(ndr, "min_inbox_driver_ver_date", r->min_inbox_driver_ver_date);
+       ndr_print_hyper(ndr, "min_inbox_driver_ver_version", r->min_inbox_driver_ver_version);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_AddDriverInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_AddDriverInfo *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               int level = ndr_push_get_switch_value(ndr, r);
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, level));
+               switch (level) {
+                       case 1: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info1));
+                       break; }
+
+                       case 2: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info2));
+                       break; }
+
+                       case 3: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info3));
+                       break; }
+
+                       case 4: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info4));
+                       break; }
+
+                       case 6: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info6));
+                       break; }
+
+                       case 8: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info8));
+                       break; }
+
+                       default:
+                               return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               int level = ndr_push_get_switch_value(ndr, r);
+               switch (level) {
+                       case 1:
+                               if (r->info1) {
+                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo1(ndr, NDR_SCALARS|NDR_BUFFERS, r->info1));
+                               }
+                       break;
+
+                       case 2:
+                               if (r->info2) {
+                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
+                               }
+                       break;
+
+                       case 3:
+                               if (r->info3) {
+                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo3(ndr, NDR_SCALARS|NDR_BUFFERS, r->info3));
+                               }
+                       break;
+
+                       case 4:
+                               if (r->info4) {
+                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo4(ndr, NDR_SCALARS|NDR_BUFFERS, r->info4));
+                               }
+                       break;
+
+                       case 6:
+                               if (r->info6) {
+                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo6(ndr, NDR_SCALARS|NDR_BUFFERS, r->info6));
+                               }
+                       break;
+
+                       case 8:
+                               if (r->info8) {
+                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo8(ndr, NDR_SCALARS|NDR_BUFFERS, r->info8));
+                               }
+                       break;
+
+                       default:
+                               return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
-               if (_ptr_data_file) {
-                       NDR_PULL_ALLOC(ndr, r->data_file);
-               } else {
-                       r->data_file = NULL;
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_AddDriverInfo *r)
+{
+       int level;
+       uint32_t _level;
+       TALLOC_CTX *_mem_save_info1_0;
+       TALLOC_CTX *_mem_save_info2_0;
+       TALLOC_CTX *_mem_save_info3_0;
+       TALLOC_CTX *_mem_save_info4_0;
+       TALLOC_CTX *_mem_save_info6_0;
+       TALLOC_CTX *_mem_save_info8_0;
+       level = ndr_pull_get_switch_value(ndr, r);
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &_level));
+               if (_level != level) {
+                       return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u for r", _level);
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
-               if (_ptr_config_file) {
-                       NDR_PULL_ALLOC(ndr, r->config_file);
-               } else {
-                       r->config_file = NULL;
+               switch (level) {
+                       case 1: {
+                               uint32_t _ptr_info1;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info1));
+                               if (_ptr_info1) {
+                                       NDR_PULL_ALLOC(ndr, r->info1);
+                               } else {
+                                       r->info1 = NULL;
+                               }
+                       break; }
+
+                       case 2: {
+                               uint32_t _ptr_info2;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info2));
+                               if (_ptr_info2) {
+                                       NDR_PULL_ALLOC(ndr, r->info2);
+                               } else {
+                                       r->info2 = NULL;
+                               }
+                       break; }
+
+                       case 3: {
+                               uint32_t _ptr_info3;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info3));
+                               if (_ptr_info3) {
+                                       NDR_PULL_ALLOC(ndr, r->info3);
+                               } else {
+                                       r->info3 = NULL;
+                               }
+                       break; }
+
+                       case 4: {
+                               uint32_t _ptr_info4;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info4));
+                               if (_ptr_info4) {
+                                       NDR_PULL_ALLOC(ndr, r->info4);
+                               } else {
+                                       r->info4 = NULL;
+                               }
+                       break; }
+
+                       case 6: {
+                               uint32_t _ptr_info6;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info6));
+                               if (_ptr_info6) {
+                                       NDR_PULL_ALLOC(ndr, r->info6);
+                               } else {
+                                       r->info6 = NULL;
+                               }
+                       break; }
+
+                       case 8: {
+                               uint32_t _ptr_info8;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info8));
+                               if (_ptr_info8) {
+                                       NDR_PULL_ALLOC(ndr, r->info8);
+                               } else {
+                                       r->info8 = NULL;
+                               }
+                       break; }
+
+                       default:
+                               return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
-               if (_ptr_help_file) {
-                       NDR_PULL_ALLOC(ndr, r->help_file);
-               } else {
-                       r->help_file = NULL;
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               switch (level) {
+                       case 1:
+                               if (r->info1) {
+                                       _mem_save_info1_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info1, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo1(ndr, NDR_SCALARS|NDR_BUFFERS, r->info1));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info1_0, 0);
+                               }
+                       break;
+
+                       case 2:
+                               if (r->info2) {
+                                       _mem_save_info2_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info2, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info2_0, 0);
+                               }
+                       break;
+
+                       case 3:
+                               if (r->info3) {
+                                       _mem_save_info3_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info3, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo3(ndr, NDR_SCALARS|NDR_BUFFERS, r->info3));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info3_0, 0);
+                               }
+                       break;
+
+                       case 4:
+                               if (r->info4) {
+                                       _mem_save_info4_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info4, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo4(ndr, NDR_SCALARS|NDR_BUFFERS, r->info4));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info4_0, 0);
+                               }
+                       break;
+
+                       case 6:
+                               if (r->info6) {
+                                       _mem_save_info6_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info6, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo6(ndr, NDR_SCALARS|NDR_BUFFERS, r->info6));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info6_0, 0);
+                               }
+                       break;
+
+                       case 8:
+                               if (r->info8) {
+                                       _mem_save_info8_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info8, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo8(ndr, NDR_SCALARS|NDR_BUFFERS, r->info8));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info8_0, 0);
+                               }
+                       break;
+
+                       default:
+                               return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AddDriverInfo(struct ndr_print *ndr, const char *name, const union spoolss_AddDriverInfo *r)
+{
+       int level;
+       level = ndr_print_get_switch_value(ndr, r);
+       ndr_print_union(ndr, name, level, "spoolss_AddDriverInfo");
+       switch (level) {
+               case 1:
+                       ndr_print_ptr(ndr, "info1", r->info1);
+                       ndr->depth++;
+                       if (r->info1) {
+                               ndr_print_spoolss_AddDriverInfo1(ndr, "info1", r->info1);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 2:
+                       ndr_print_ptr(ndr, "info2", r->info2);
+                       ndr->depth++;
+                       if (r->info2) {
+                               ndr_print_spoolss_AddDriverInfo2(ndr, "info2", r->info2);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 3:
+                       ndr_print_ptr(ndr, "info3", r->info3);
+                       ndr->depth++;
+                       if (r->info3) {
+                               ndr_print_spoolss_AddDriverInfo3(ndr, "info3", r->info3);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 4:
+                       ndr_print_ptr(ndr, "info4", r->info4);
+                       ndr->depth++;
+                       if (r->info4) {
+                               ndr_print_spoolss_AddDriverInfo4(ndr, "info4", r->info4);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 6:
+                       ndr_print_ptr(ndr, "info6", r->info6);
+                       ndr->depth++;
+                       if (r->info6) {
+                               ndr_print_spoolss_AddDriverInfo6(ndr, "info6", r->info6);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 8:
+                       ndr_print_ptr(ndr, "info8", r->info8);
+                       ndr->depth++;
+                       if (r->info8) {
+                               ndr_print_spoolss_AddDriverInfo8(ndr, "info8", r->info8);
+                       }
+                       ndr->depth--;
+               break;
+
+               default:
+                       ndr_print_bad_level(ndr, name, level);
+       }
+}
+
+static enum ndr_err_code ndr_push_spoolss_AddDriverInfoCtr(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfoCtr *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->level));
+               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->info, r->level));
+               NDR_CHECK(ndr_push_spoolss_AddDriverInfo(ndr, NDR_SCALARS, &r->info));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               NDR_CHECK(ndr_push_spoolss_AddDriverInfo(ndr, NDR_BUFFERS, &r->info));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AddDriverInfoCtr(struct ndr_pull *ndr, int ndr_flags, struct spoolss_AddDriverInfoCtr *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->level));
+               NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->info, r->level));
+               NDR_CHECK(ndr_pull_spoolss_AddDriverInfo(ndr, NDR_SCALARS, &r->info));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               NDR_CHECK(ndr_pull_spoolss_AddDriverInfo(ndr, NDR_BUFFERS, &r->info));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AddDriverInfoCtr(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfoCtr *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_AddDriverInfoCtr");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "level", r->level);
+       ndr_print_set_switch_value(ndr, &r->info, r->level);
+       ndr_print_spoolss_AddDriverInfo(ndr, "info", &r->info);
+       ndr->depth--;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
+                       ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
-               if (_ptr_monitor_name) {
-                       NDR_PULL_ALLOC(ndr, r->monitor_name);
-               } else {
-                       r->monitor_name = NULL;
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->driver_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                       }
+                       ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
-               if (_ptr_default_datatype) {
-                       NDR_PULL_ALLOC(ndr, r->default_datatype);
-               } else {
-                       r->default_datatype = NULL;
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo1 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+                       if (_ptr_driver_name) {
+                               NDR_PULL_ALLOC(ndr, r->driver_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
+                       } else {
+                               r->driver_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_dependent_files));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
-               if (_ptr_dependent_files) {
-                       NDR_PULL_ALLOC(ndr, r->dependent_files);
-               } else {
-                       r->dependent_files = NULL;
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
+                               _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size_previous_names));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
-               if (_ptr_previous_names) {
-                       NDR_PULL_ALLOC(ndr, r->previous_names);
-               } else {
-                       r->previous_names = NULL;
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_DriverInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo1 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_DriverInfo1");
+       ndr->depth++;
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
+_PUBLIC_ size_t ndr_size_spoolss_DriverInfo1(const struct spoolss_DriverInfo1 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo1, ic);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo2 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
+                       ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->driver_data));
-               NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &r->driver_version));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_name));
-               if (_ptr_manufacturer_name) {
-                       NDR_PULL_ALLOC(ndr, r->manufacturer_name);
-               } else {
-                       r->manufacturer_name = NULL;
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->architecture));
+                       ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_url));
-               if (_ptr_manufacturer_url) {
-                       NDR_PULL_ALLOC(ndr, r->manufacturer_url);
-               } else {
-                       r->manufacturer_url = NULL;
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_path));
+                       ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_hardware_id));
-               if (_ptr_hardware_id) {
-                       NDR_PULL_ALLOC(ndr, r->hardware_id);
-               } else {
-                       r->hardware_id = NULL;
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->data_file));
+                       ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_provider));
-               if (_ptr_provider) {
-                       NDR_PULL_ALLOC(ndr, r->provider);
-               } else {
-                       r->provider = NULL;
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->config_file));
+                       ndr->flags = _flags_save_string;
                }
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->driver_name) {
-                       _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_name));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_name));
-                       if (ndr_get_array_length(ndr, &r->driver_name) > ndr_get_array_size(ndr, &r->driver_name)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_name), ndr_get_array_length(ndr, &r->driver_name));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->driver_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_name, ndr_get_array_length(ndr, &r->driver_name), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->architecture) {
-                       _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->architecture));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->architecture));
-                       if (ndr_get_array_length(ndr, &r->architecture) > ndr_get_array_size(ndr, &r->architecture)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->architecture), ndr_get_array_length(ndr, &r->architecture));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->architecture) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->architecture));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->architecture, ndr_get_array_length(ndr, &r->architecture), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->driver_path) {
-                       _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->driver_path));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->driver_path));
-                       if (ndr_get_array_length(ndr, &r->driver_path) > ndr_get_array_size(ndr, &r->driver_path)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->driver_path), ndr_get_array_length(ndr, &r->driver_path));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_path) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->driver_path));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_path));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->driver_path, ndr_get_array_length(ndr, &r->driver_path), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->data_file) {
-                       _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->data_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->data_file));
-                       if (ndr_get_array_length(ndr, &r->data_file) > ndr_get_array_size(ndr, &r->data_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->data_file), ndr_get_array_length(ndr, &r->data_file));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->data_file) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->data_file));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_file));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->data_file, ndr_get_array_length(ndr, &r->data_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->config_file) {
-                       _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->config_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->config_file));
-                       if (ndr_get_array_length(ndr, &r->config_file) > ndr_get_array_size(ndr, &r->config_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->config_file), ndr_get_array_length(ndr, &r->config_file));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->config_file) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->config_file));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->config_file));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->config_file, ndr_get_array_length(ndr, &r->config_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->help_file) {
-                       _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->help_file));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->help_file));
-                       if (ndr_get_array_length(ndr, &r->help_file) > ndr_get_array_size(ndr, &r->help_file)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->help_file), ndr_get_array_length(ndr, &r->help_file));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo2 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_architecture;
+       TALLOC_CTX *_mem_save_architecture_0;
+       uint32_t _ptr_driver_path;
+       TALLOC_CTX *_mem_save_driver_path_0;
+       uint32_t _ptr_data_file;
+       TALLOC_CTX *_mem_save_data_file_0;
+       uint32_t _ptr_config_file;
+       TALLOC_CTX *_mem_save_config_file_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+                       if (_ptr_driver_name) {
+                               NDR_PULL_ALLOC(ndr, r->driver_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
+                       } else {
+                               r->driver_name = NULL;
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->help_file, ndr_get_array_length(ndr, &r->help_file), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->monitor_name) {
-                       _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->monitor_name));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->monitor_name));
-                       if (ndr_get_array_length(ndr, &r->monitor_name) > ndr_get_array_size(ndr, &r->monitor_name)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->monitor_name), ndr_get_array_length(ndr, &r->monitor_name));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
+                       if (_ptr_architecture) {
+                               NDR_PULL_ALLOC(ndr, r->architecture);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->architecture, _ptr_architecture));
+                       } else {
+                               r->architecture = NULL;
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->monitor_name, ndr_get_array_length(ndr, &r->monitor_name), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->default_datatype) {
-                       _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->default_datatype));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->default_datatype));
-                       if (ndr_get_array_length(ndr, &r->default_datatype) > ndr_get_array_size(ndr, &r->default_datatype)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->default_datatype), ndr_get_array_length(ndr, &r->default_datatype));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
+                       if (_ptr_driver_path) {
+                               NDR_PULL_ALLOC(ndr, r->driver_path);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_path, _ptr_driver_path));
+                       } else {
+                               r->driver_path = NULL;
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->default_datatype, ndr_get_array_length(ndr, &r->default_datatype), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->dependent_files) {
-                       _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
-                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->dependent_files));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
+                       if (_ptr_data_file) {
+                               NDR_PULL_ALLOC(ndr, r->data_file);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->data_file, _ptr_data_file));
+                       } else {
+                               r->data_file = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
                }
-               if (r->previous_names) {
-                       _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
-                       NDR_CHECK(ndr_pull_spoolss_StringArray(ndr, NDR_SCALARS, r->previous_names));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
+                       if (_ptr_config_file) {
+                               NDR_PULL_ALLOC(ndr, r->config_file);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->config_file, _ptr_config_file));
+                       } else {
+                               r->config_file = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
                }
-               if (r->manufacturer_name) {
-                       _mem_save_manufacturer_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_name, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->manufacturer_name));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->manufacturer_name));
-                       if (ndr_get_array_length(ndr, &r->manufacturer_name) > ndr_get_array_size(ndr, &r->manufacturer_name)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->manufacturer_name), ndr_get_array_length(ndr, &r->manufacturer_name));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
+                               _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->manufacturer_name), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->manufacturer_name, ndr_get_array_length(ndr, &r->manufacturer_name), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_name_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->manufacturer_url) {
-                       _mem_save_manufacturer_url_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_url, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->manufacturer_url));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->manufacturer_url));
-                       if (ndr_get_array_length(ndr, &r->manufacturer_url) > ndr_get_array_size(ndr, &r->manufacturer_url)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->manufacturer_url), ndr_get_array_length(ndr, &r->manufacturer_url));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->architecture) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->architecture));
+                               _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->manufacturer_url), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->manufacturer_url, ndr_get_array_length(ndr, &r->manufacturer_url), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_url_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->hardware_id) {
-                       _mem_save_hardware_id_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->hardware_id, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->hardware_id));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->hardware_id));
-                       if (ndr_get_array_length(ndr, &r->hardware_id) > ndr_get_array_size(ndr, &r->hardware_id)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->hardware_id), ndr_get_array_length(ndr, &r->hardware_id));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_path) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_path));
+                               _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->data_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->data_file));
+                               _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->hardware_id), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->hardware_id, ndr_get_array_length(ndr, &r->hardware_id), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_hardware_id_0, 0);
+                       ndr->flags = _flags_save_string;
                }
-               if (r->provider) {
-                       _mem_save_provider_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->provider, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->provider));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->provider));
-                       if (ndr_get_array_length(ndr, &r->provider) > ndr_get_array_size(ndr, &r->provider)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->provider), ndr_get_array_length(ndr, &r->provider));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->config_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->config_file));
+                               _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->provider), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->provider, ndr_get_array_length(ndr, &r->provider), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_provider_0, 0);
+                       ndr->flags = _flags_save_string;
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_AddDriverInfo6(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo6 *r)
+_PUBLIC_ void ndr_print_spoolss_DriverInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo2 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_AddDriverInfo6");
+       ndr_print_struct(ndr, name, "spoolss_DriverInfo2");
        ndr->depth++;
        ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
        ndr_print_ptr(ndr, "driver_name", r->driver_name);
@@ -4785,395 +7486,500 @@ _PUBLIC_ void ndr_print_spoolss_AddDriverInfo6(struct ndr_print *ndr, const char
                ndr_print_string(ndr, "config_file", r->config_file);
        }
        ndr->depth--;
-       ndr_print_ptr(ndr, "help_file", r->help_file);
-       ndr->depth++;
-       if (r->help_file) {
-               ndr_print_string(ndr, "help_file", r->help_file);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
-       ndr->depth++;
-       if (r->monitor_name) {
-               ndr_print_string(ndr, "monitor_name", r->monitor_name);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
-       ndr->depth++;
-       if (r->default_datatype) {
-               ndr_print_string(ndr, "default_datatype", r->default_datatype);
-       }
-       ndr->depth--;
-       ndr_print_uint32(ndr, "_ndr_size_dependent_files", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->dependent_files, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_dependent_files);
-       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
-       ndr->depth++;
-       if (r->dependent_files) {
-               ndr_print_spoolss_StringArray(ndr, "dependent_files", r->dependent_files);
-       }
-       ndr->depth--;
-       ndr_print_uint32(ndr, "_ndr_size_previous_names", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?((ndr_size_spoolss_StringArray(r->previous_names, ndr->iconv_convenience, ndr->flags) - 4) / 2):r->_ndr_size_previous_names);
-       ndr_print_ptr(ndr, "previous_names", r->previous_names);
-       ndr->depth++;
-       if (r->previous_names) {
-               ndr_print_spoolss_StringArray(ndr, "previous_names", r->previous_names);
-       }
-       ndr->depth--;
-       ndr_print_NTTIME(ndr, "driver_data", r->driver_data);
-       ndr_print_hyper(ndr, "driver_version", r->driver_version);
-       ndr_print_ptr(ndr, "manufacturer_name", r->manufacturer_name);
-       ndr->depth++;
-       if (r->manufacturer_name) {
-               ndr_print_string(ndr, "manufacturer_name", r->manufacturer_name);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "manufacturer_url", r->manufacturer_url);
-       ndr->depth++;
-       if (r->manufacturer_url) {
-               ndr_print_string(ndr, "manufacturer_url", r->manufacturer_url);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "hardware_id", r->hardware_id);
-       ndr->depth++;
-       if (r->hardware_id) {
-               ndr_print_string(ndr, "hardware_id", r->hardware_id);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "provider", r->provider);
-       ndr->depth++;
-       if (r->provider) {
-               ndr_print_string(ndr, "provider", r->provider);
-       }
-       ndr->depth--;
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_AddDriverInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_AddDriverInfo *r)
+_PUBLIC_ size_t ndr_size_spoolss_DriverInfo2(const struct spoolss_DriverInfo2 *r, struct smb_iconv_convenience *ic, int flags)
 {
-       if (ndr_flags & NDR_SCALARS) {
-               int level = ndr_push_get_switch_value(ndr, r);
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, level));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info1));
-                       break; }
-
-                       case 2: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info2));
-                       break; }
-
-                       case 3: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info3));
-                       break; }
-
-                       case 4: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info4));
-                       break; }
-
-                       case 6: {
-                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info6));
-                       break; }
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo2, ic);
+}
 
-                       default:
-                               return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo3 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->architecture));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_path));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->data_file));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->config_file));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->help_file));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->dependent_files));
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->monitor_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->default_datatype));
+                       ndr->flags = _flags_save_string;
                }
        }
        if (ndr_flags & NDR_BUFFERS) {
-               int level = ndr_push_get_switch_value(ndr, r);
-               switch (level) {
-                       case 1:
-                               if (r->info1) {
-                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo1(ndr, NDR_SCALARS|NDR_BUFFERS, r->info1));
-                               }
-                       break;
-
-                       case 2:
-                               if (r->info2) {
-                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
-                               }
-                       break;
-
-                       case 3:
-                               if (r->info3) {
-                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo3(ndr, NDR_SCALARS|NDR_BUFFERS, r->info3));
-                               }
-                       break;
-
-                       case 4:
-                               if (r->info4) {
-                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo4(ndr, NDR_SCALARS|NDR_BUFFERS, r->info4));
-                               }
-                       break;
-
-                       case 6:
-                               if (r->info6) {
-                                       NDR_CHECK(ndr_push_spoolss_AddDriverInfo6(ndr, NDR_SCALARS|NDR_BUFFERS, r->info6));
-                               }
-                       break;
-
-                       default:
-                               return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->driver_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->architecture) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->architecture));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_path) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->driver_path));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_path));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->data_file) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->data_file));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_file));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->config_file) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->config_file));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->config_file));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->help_file) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->help_file));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->help_file));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->dependent_files) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->dependent_files));
+                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->monitor_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->monitor_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->default_datatype) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->default_datatype));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->default_datatype));
+                       }
+                       ndr->flags = _flags_save_string;
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_AddDriverInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_AddDriverInfo *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo3 *r)
 {
-       int level;
-       uint32_t _level;
-       TALLOC_CTX *_mem_save_info1_0;
-       TALLOC_CTX *_mem_save_info2_0;
-       TALLOC_CTX *_mem_save_info3_0;
-       TALLOC_CTX *_mem_save_info4_0;
-       TALLOC_CTX *_mem_save_info6_0;
-       level = ndr_pull_get_switch_value(ndr, r);
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_architecture;
+       TALLOC_CTX *_mem_save_architecture_0;
+       uint32_t _ptr_driver_path;
+       TALLOC_CTX *_mem_save_driver_path_0;
+       uint32_t _ptr_data_file;
+       TALLOC_CTX *_mem_save_data_file_0;
+       uint32_t _ptr_config_file;
+       TALLOC_CTX *_mem_save_config_file_0;
+       uint32_t _ptr_help_file;
+       TALLOC_CTX *_mem_save_help_file_0;
+       uint32_t _ptr_dependent_files;
+       TALLOC_CTX *_mem_save_dependent_files_0;
+       uint32_t _ptr_monitor_name;
+       TALLOC_CTX *_mem_save_monitor_name_0;
+       uint32_t _ptr_default_datatype;
+       TALLOC_CTX *_mem_save_default_datatype_0;
        if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &_level));
-               if (_level != level) {
-                       return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u for r", _level);
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+                       if (_ptr_driver_name) {
+                               NDR_PULL_ALLOC(ndr, r->driver_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
+                       } else {
+                               r->driver_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
                }
-               switch (level) {
-                       case 1: {
-                               uint32_t _ptr_info1;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info1));
-                               if (_ptr_info1) {
-                                       NDR_PULL_ALLOC(ndr, r->info1);
-                               } else {
-                                       r->info1 = NULL;
-                               }
-                       break; }
-
-                       case 2: {
-                               uint32_t _ptr_info2;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info2));
-                               if (_ptr_info2) {
-                                       NDR_PULL_ALLOC(ndr, r->info2);
-                               } else {
-                                       r->info2 = NULL;
-                               }
-                       break; }
-
-                       case 3: {
-                               uint32_t _ptr_info3;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info3));
-                               if (_ptr_info3) {
-                                       NDR_PULL_ALLOC(ndr, r->info3);
-                               } else {
-                                       r->info3 = NULL;
-                               }
-                       break; }
-
-                       case 4: {
-                               uint32_t _ptr_info4;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info4));
-                               if (_ptr_info4) {
-                                       NDR_PULL_ALLOC(ndr, r->info4);
-                               } else {
-                                       r->info4 = NULL;
-                               }
-                       break; }
-
-                       case 6: {
-                               uint32_t _ptr_info6;
-                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info6));
-                               if (_ptr_info6) {
-                                       NDR_PULL_ALLOC(ndr, r->info6);
-                               } else {
-                                       r->info6 = NULL;
-                               }
-                       break; }
-
-                       default:
-                               return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
+                       if (_ptr_architecture) {
+                               NDR_PULL_ALLOC(ndr, r->architecture);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->architecture, _ptr_architecture));
+                       } else {
+                               r->architecture = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               switch (level) {
-                       case 1:
-                               if (r->info1) {
-                                       _mem_save_info1_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info1, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo1(ndr, NDR_SCALARS|NDR_BUFFERS, r->info1));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info1_0, 0);
-                               }
-                       break;
-
-                       case 2:
-                               if (r->info2) {
-                                       _mem_save_info2_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info2, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info2_0, 0);
-                               }
-                       break;
-
-                       case 3:
-                               if (r->info3) {
-                                       _mem_save_info3_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info3, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo3(ndr, NDR_SCALARS|NDR_BUFFERS, r->info3));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info3_0, 0);
-                               }
-                       break;
-
-                       case 4:
-                               if (r->info4) {
-                                       _mem_save_info4_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info4, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo4(ndr, NDR_SCALARS|NDR_BUFFERS, r->info4));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info4_0, 0);
-                               }
-                       break;
-
-                       case 6:
-                               if (r->info6) {
-                                       _mem_save_info6_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                                       NDR_PULL_SET_MEM_CTX(ndr, r->info6, 0);
-                                       NDR_CHECK(ndr_pull_spoolss_AddDriverInfo6(ndr, NDR_SCALARS|NDR_BUFFERS, r->info6));
-                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info6_0, 0);
-                               }
-                       break;
-
-                       default:
-                               return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
+                       if (_ptr_driver_path) {
+                               NDR_PULL_ALLOC(ndr, r->driver_path);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_path, _ptr_driver_path));
+                       } else {
+                               r->driver_path = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
+                       if (_ptr_data_file) {
+                               NDR_PULL_ALLOC(ndr, r->data_file);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->data_file, _ptr_data_file));
+                       } else {
+                               r->data_file = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
+                       if (_ptr_config_file) {
+                               NDR_PULL_ALLOC(ndr, r->config_file);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->config_file, _ptr_config_file));
+                       } else {
+                               r->config_file = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
+                       if (_ptr_help_file) {
+                               NDR_PULL_ALLOC(ndr, r->help_file);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->help_file, _ptr_help_file));
+                       } else {
+                               r->help_file = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
+                       if (_ptr_dependent_files) {
+                               NDR_PULL_ALLOC(ndr, r->dependent_files);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dependent_files, _ptr_dependent_files));
+                       } else {
+                               r->dependent_files = NULL;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
+                       if (_ptr_monitor_name) {
+                               NDR_PULL_ALLOC(ndr, r->monitor_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->monitor_name, _ptr_monitor_name));
+                       } else {
+                               r->monitor_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
+                       if (_ptr_default_datatype) {
+                               NDR_PULL_ALLOC(ndr, r->default_datatype);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->default_datatype, _ptr_default_datatype));
+                       } else {
+                               r->default_datatype = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
                }
        }
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_AddDriverInfo(struct ndr_print *ndr, const char *name, const union spoolss_AddDriverInfo *r)
-{
-       int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_AddDriverInfo");
-       switch (level) {
-               case 1:
-                       ndr_print_ptr(ndr, "info1", r->info1);
-                       ndr->depth++;
-                       if (r->info1) {
-                               ndr_print_spoolss_AddDriverInfo1(ndr, "info1", r->info1);
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
+                               _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->depth--;
-               break;
-
-               case 2:
-                       ndr_print_ptr(ndr, "info2", r->info2);
-                       ndr->depth++;
-                       if (r->info2) {
-                               ndr_print_spoolss_AddDriverInfo2(ndr, "info2", r->info2);
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->architecture) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->architecture));
+                               _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->depth--;
-               break;
-
-               case 3:
-                       ndr_print_ptr(ndr, "info3", r->info3);
-                       ndr->depth++;
-                       if (r->info3) {
-                               ndr_print_spoolss_AddDriverInfo3(ndr, "info3", r->info3);
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_path) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_path));
+                               _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->depth--;
-               break;
-
-               case 4:
-                       ndr_print_ptr(ndr, "info4", r->info4);
-                       ndr->depth++;
-                       if (r->info4) {
-                               ndr_print_spoolss_AddDriverInfo4(ndr, "info4", r->info4);
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->data_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->data_file));
+                               _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->depth--;
-               break;
-
-               case 6:
-                       ndr_print_ptr(ndr, "info6", r->info6);
-                       ndr->depth++;
-                       if (r->info6) {
-                               ndr_print_spoolss_AddDriverInfo6(ndr, "info6", r->info6);
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->config_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->config_file));
+                               _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->depth--;
-               break;
-
-               default:
-                       ndr_print_bad_level(ndr, name, level);
-       }
-}
-
-static enum ndr_err_code ndr_push_spoolss_DriverInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo1 *r)
-{
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_push_align(ndr, 4));
+                       ndr->flags = _flags_save_string;
+               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
+                       if (r->help_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->help_file));
+                               _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->help_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
                        ndr->flags = _flags_save_string;
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->dependent_files) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dependent_files));
+                               _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
+                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->driver_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->driver_name));
-                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                       if (r->monitor_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->monitor_name));
+                               _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_spoolss_DriverInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo1 *r)
-{
-       uint32_t _ptr_driver_name;
-       TALLOC_CTX *_mem_save_driver_name_0;
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_align(ndr, 4));
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
-                       if (_ptr_driver_name) {
-                               NDR_PULL_ALLOC(ndr, r->driver_name);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
-                       } else {
-                               r->driver_name = NULL;
+                       if (r->default_datatype) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->default_datatype));
+                               _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
        }
-       if (ndr_flags & NDR_BUFFERS) {
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->driver_name) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
-                               _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
-                               ndr->offset = _relative_save_offset;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_DriverInfo3(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo3 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_DriverInfo3");
+       ndr->depth++;
+       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "architecture", r->architecture);
+       ndr->depth++;
+       if (r->architecture) {
+               ndr_print_string(ndr, "architecture", r->architecture);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "driver_path", r->driver_path);
+       ndr->depth++;
+       if (r->driver_path) {
+               ndr_print_string(ndr, "driver_path", r->driver_path);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "data_file", r->data_file);
+       ndr->depth++;
+       if (r->data_file) {
+               ndr_print_string(ndr, "data_file", r->data_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "config_file", r->config_file);
+       ndr->depth++;
+       if (r->config_file) {
+               ndr_print_string(ndr, "config_file", r->config_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "help_file", r->help_file);
+       ndr->depth++;
+       if (r->help_file) {
+               ndr_print_string(ndr, "help_file", r->help_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       ndr->depth++;
+       if (r->dependent_files) {
+               ndr_print_string_array(ndr, "dependent_files", r->dependent_files);
        }
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_DriverInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo1 *r)
-{
-       ndr_print_struct(ndr, name, "spoolss_DriverInfo1");
+       ndr->depth--;
+       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
        ndr->depth++;
-       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       if (r->monitor_name) {
+               ndr_print_string(ndr, "monitor_name", r->monitor_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
        ndr->depth++;
-       if (r->driver_name) {
-               ndr_print_string(ndr, "driver_name", r->driver_name);
+       if (r->default_datatype) {
+               ndr_print_string(ndr, "default_datatype", r->default_datatype);
        }
        ndr->depth--;
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_DriverInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo2 *r)
+_PUBLIC_ size_t ndr_size_spoolss_DriverInfo3(const struct spoolss_DriverInfo3 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo3, ic);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo4 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -5208,6 +8014,36 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo2(struct ndr_push *ndr, int
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->config_file));
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->help_file));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->dependent_files));
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->monitor_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->default_datatype));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->previous_names));
+                       ndr->flags = _flags_save_string_array;
+               }
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -5255,11 +8091,56 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo2(struct ndr_push *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->help_file) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->help_file));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->help_file));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->dependent_files) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->dependent_files));
+                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->monitor_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->monitor_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->default_datatype) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->default_datatype));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->default_datatype));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->previous_names) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->previous_names));
+                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->previous_names));
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo2 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo4 *r)
 {
        uint32_t _ptr_driver_name;
        TALLOC_CTX *_mem_save_driver_name_0;
@@ -5271,6 +8152,16 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, int
        TALLOC_CTX *_mem_save_data_file_0;
        uint32_t _ptr_config_file;
        TALLOC_CTX *_mem_save_config_file_0;
+       uint32_t _ptr_help_file;
+       TALLOC_CTX *_mem_save_help_file_0;
+       uint32_t _ptr_dependent_files;
+       TALLOC_CTX *_mem_save_dependent_files_0;
+       uint32_t _ptr_monitor_name;
+       TALLOC_CTX *_mem_save_monitor_name_0;
+       uint32_t _ptr_default_datatype;
+       TALLOC_CTX *_mem_save_default_datatype_0;
+       uint32_t _ptr_previous_names;
+       TALLOC_CTX *_mem_save_previous_names_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
                NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
@@ -5334,6 +8225,66 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
+                       if (_ptr_help_file) {
+                               NDR_PULL_ALLOC(ndr, r->help_file);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->help_file, _ptr_help_file));
+                       } else {
+                               r->help_file = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
+                       if (_ptr_dependent_files) {
+                               NDR_PULL_ALLOC(ndr, r->dependent_files);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dependent_files, _ptr_dependent_files));
+                       } else {
+                               r->dependent_files = NULL;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
+                       if (_ptr_monitor_name) {
+                               NDR_PULL_ALLOC(ndr, r->monitor_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->monitor_name, _ptr_monitor_name));
+                       } else {
+                               r->monitor_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
+                       if (_ptr_default_datatype) {
+                               NDR_PULL_ALLOC(ndr, r->default_datatype);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->default_datatype, _ptr_default_datatype));
+                       } else {
+                               r->default_datatype = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
+                       if (_ptr_previous_names) {
+                               NDR_PULL_ALLOC(ndr, r->previous_names);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->previous_names, _ptr_previous_names));
+                       } else {
+                               r->previous_names = NULL;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -5384,40 +8335,115 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, int
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->data_file) {
+                       if (r->data_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->data_file));
+                               _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->config_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->config_file));
+                               _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->help_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->help_file));
+                               _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->help_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->dependent_files) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dependent_files));
+                               _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
+                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->monitor_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->monitor_name));
+                               _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->default_datatype) {
                                uint32_t _relative_save_offset;
                                _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->data_file));
-                               _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->default_datatype));
+                               _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
-                       uint32_t _flags_save_string = ndr->flags;
+                       uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->config_file) {
+                       if (r->previous_names) {
                                uint32_t _relative_save_offset;
                                _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->config_file));
-                               _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->previous_names));
+                               _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
+                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->previous_names));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
-                       ndr->flags = _flags_save_string;
+                       ndr->flags = _flags_save_string_array;
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_DriverInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo2 *r)
+_PUBLIC_ void ndr_print_spoolss_DriverInfo4(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo4 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_DriverInfo2");
+       ndr_print_struct(ndr, name, "spoolss_DriverInfo4");
        ndr->depth++;
        ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
        ndr_print_ptr(ndr, "driver_name", r->driver_name);
@@ -5450,10 +8476,45 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo2(struct ndr_print *ndr, const char *n
                ndr_print_string(ndr, "config_file", r->config_file);
        }
        ndr->depth--;
+       ndr_print_ptr(ndr, "help_file", r->help_file);
+       ndr->depth++;
+       if (r->help_file) {
+               ndr_print_string(ndr, "help_file", r->help_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       ndr->depth++;
+       if (r->dependent_files) {
+               ndr_print_string_array(ndr, "dependent_files", r->dependent_files);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
+       ndr->depth++;
+       if (r->monitor_name) {
+               ndr_print_string(ndr, "monitor_name", r->monitor_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
+       ndr->depth++;
+       if (r->default_datatype) {
+               ndr_print_string(ndr, "default_datatype", r->default_datatype);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "previous_names", r->previous_names);
+       ndr->depth++;
+       if (r->previous_names) {
+               ndr_print_string_array(ndr, "previous_names", r->previous_names);
+       }
+       ndr->depth--;
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo3 *r)
+_PUBLIC_ size_t ndr_size_spoolss_DriverInfo4(const struct spoolss_DriverInfo4 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo4, ic);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo5(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo5 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -5488,30 +8549,9 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, int
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->config_file));
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->help_file));
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->dependent_files));
-                       ndr->flags = _flags_save_string_array;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->monitor_name));
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->default_datatype));
-                       ndr->flags = _flags_save_string;
-               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->driver_attributes));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->config_version));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->driver_version));
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -5559,47 +8599,11 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->help_file) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->help_file));
-                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->help_file));
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->dependent_files) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->dependent_files));
-                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->monitor_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->monitor_name));
-                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->default_datatype) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->default_datatype));
-                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->default_datatype));
-                       }
-                       ndr->flags = _flags_save_string;
-               }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo3 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo5 *r)
 {
        uint32_t _ptr_driver_name;
        TALLOC_CTX *_mem_save_driver_name_0;
@@ -5611,14 +8615,6 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, int
        TALLOC_CTX *_mem_save_data_file_0;
        uint32_t _ptr_config_file;
        TALLOC_CTX *_mem_save_config_file_0;
-       uint32_t _ptr_help_file;
-       TALLOC_CTX *_mem_save_help_file_0;
-       uint32_t _ptr_dependent_files;
-       TALLOC_CTX *_mem_save_dependent_files_0;
-       uint32_t _ptr_monitor_name;
-       TALLOC_CTX *_mem_save_monitor_name_0;
-       uint32_t _ptr_default_datatype;
-       TALLOC_CTX *_mem_save_default_datatype_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
                NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
@@ -5682,54 +8678,9 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
-                       if (_ptr_help_file) {
-                               NDR_PULL_ALLOC(ndr, r->help_file);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->help_file, _ptr_help_file));
-                       } else {
-                               r->help_file = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
-                       if (_ptr_dependent_files) {
-                               NDR_PULL_ALLOC(ndr, r->dependent_files);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dependent_files, _ptr_dependent_files));
-                       } else {
-                               r->dependent_files = NULL;
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
-                       if (_ptr_monitor_name) {
-                               NDR_PULL_ALLOC(ndr, r->monitor_name);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->monitor_name, _ptr_monitor_name));
-                       } else {
-                               r->monitor_name = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
-                       if (_ptr_default_datatype) {
-                               NDR_PULL_ALLOC(ndr, r->default_datatype);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->default_datatype, _ptr_default_datatype));
-                       } else {
-                               r->default_datatype = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->driver_attributes));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->config_version));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->driver_version));
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -5771,83 +8722,23 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, int
                                NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_path));
                                _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
-                               ndr->offset = _relative_save_offset;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->data_file) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->data_file));
-                               _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
-                               ndr->offset = _relative_save_offset;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->config_file) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->config_file));
-                               _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
-                               ndr->offset = _relative_save_offset;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->help_file) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->help_file));
-                               _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->help_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
-                               ndr->offset = _relative_save_offset;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->dependent_files) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dependent_files));
-                               _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
-                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
-                       ndr->flags = _flags_save_string_array;
+                       ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->monitor_name) {
+                       if (r->data_file) {
                                uint32_t _relative_save_offset;
                                _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->monitor_name));
-                               _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->data_file));
+                               _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -5855,14 +8746,14 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, int
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->default_datatype) {
+                       if (r->config_file) {
                                uint32_t _relative_save_offset;
                                _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->default_datatype));
-                               _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->config_file));
+                               _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -5871,9 +8762,9 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, int
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_DriverInfo3(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo3 *r)
+_PUBLIC_ void ndr_print_spoolss_DriverInfo5(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo5 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_DriverInfo3");
+       ndr_print_struct(ndr, name, "spoolss_DriverInfo5");
        ndr->depth++;
        ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
        ndr_print_ptr(ndr, "driver_name", r->driver_name);
@@ -5906,37 +8797,21 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo3(struct ndr_print *ndr, const char *n
                ndr_print_string(ndr, "config_file", r->config_file);
        }
        ndr->depth--;
-       ndr_print_ptr(ndr, "help_file", r->help_file);
-       ndr->depth++;
-       if (r->help_file) {
-               ndr_print_string(ndr, "help_file", r->help_file);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
-       ndr->depth++;
-       if (r->dependent_files) {
-               ndr_print_string_array(ndr, "dependent_files", r->dependent_files);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
-       ndr->depth++;
-       if (r->monitor_name) {
-               ndr_print_string(ndr, "monitor_name", r->monitor_name);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
-       ndr->depth++;
-       if (r->default_datatype) {
-               ndr_print_string(ndr, "default_datatype", r->default_datatype);
-       }
-       ndr->depth--;
+       ndr_print_uint32(ndr, "driver_attributes", r->driver_attributes);
+       ndr_print_uint32(ndr, "config_version", r->config_version);
+       ndr_print_uint32(ndr, "driver_version", r->driver_version);
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo4 *r)
+_PUBLIC_ size_t ndr_size_spoolss_DriverInfo5(const struct spoolss_DriverInfo5 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo5, ic);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo6 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_align(ndr, 8));
                NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
                {
                        uint32_t _flags_save_string = ndr->flags;
@@ -5998,6 +8873,32 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, int
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->previous_names));
                        ndr->flags = _flags_save_string_array;
                }
+               NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->driver_date));
+               NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, r->driver_version));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->manufacturer_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->manufacturer_url));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->hardware_id));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->provider));
+                       ndr->flags = _flags_save_string;
+               }
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -6085,579 +8986,417 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, int
                        uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->previous_names) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->previous_names));
-                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->previous_names));
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo4 *r)
-{
-       uint32_t _ptr_driver_name;
-       TALLOC_CTX *_mem_save_driver_name_0;
-       uint32_t _ptr_architecture;
-       TALLOC_CTX *_mem_save_architecture_0;
-       uint32_t _ptr_driver_path;
-       TALLOC_CTX *_mem_save_driver_path_0;
-       uint32_t _ptr_data_file;
-       TALLOC_CTX *_mem_save_data_file_0;
-       uint32_t _ptr_config_file;
-       TALLOC_CTX *_mem_save_config_file_0;
-       uint32_t _ptr_help_file;
-       TALLOC_CTX *_mem_save_help_file_0;
-       uint32_t _ptr_dependent_files;
-       TALLOC_CTX *_mem_save_dependent_files_0;
-       uint32_t _ptr_monitor_name;
-       TALLOC_CTX *_mem_save_monitor_name_0;
-       uint32_t _ptr_default_datatype;
-       TALLOC_CTX *_mem_save_default_datatype_0;
-       uint32_t _ptr_previous_names;
-       TALLOC_CTX *_mem_save_previous_names_0;
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
-                       if (_ptr_driver_name) {
-                               NDR_PULL_ALLOC(ndr, r->driver_name);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
-                       } else {
-                               r->driver_name = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
-                       if (_ptr_architecture) {
-                               NDR_PULL_ALLOC(ndr, r->architecture);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->architecture, _ptr_architecture));
-                       } else {
-                               r->architecture = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
-                       if (_ptr_driver_path) {
-                               NDR_PULL_ALLOC(ndr, r->driver_path);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_path, _ptr_driver_path));
-                       } else {
-                               r->driver_path = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
-                       if (_ptr_data_file) {
-                               NDR_PULL_ALLOC(ndr, r->data_file);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->data_file, _ptr_data_file));
-                       } else {
-                               r->data_file = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
-                       if (_ptr_config_file) {
-                               NDR_PULL_ALLOC(ndr, r->config_file);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->config_file, _ptr_config_file));
-                       } else {
-                               r->config_file = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
-                       if (_ptr_help_file) {
-                               NDR_PULL_ALLOC(ndr, r->help_file);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->help_file, _ptr_help_file));
-                       } else {
-                               r->help_file = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
-                       if (_ptr_dependent_files) {
-                               NDR_PULL_ALLOC(ndr, r->dependent_files);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dependent_files, _ptr_dependent_files));
-                       } else {
-                               r->dependent_files = NULL;
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
-                       if (_ptr_monitor_name) {
-                               NDR_PULL_ALLOC(ndr, r->monitor_name);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->monitor_name, _ptr_monitor_name));
-                       } else {
-                               r->monitor_name = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
-                       if (_ptr_default_datatype) {
-                               NDR_PULL_ALLOC(ndr, r->default_datatype);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->default_datatype, _ptr_default_datatype));
-                       } else {
-                               r->default_datatype = NULL;
-                       }
-                       ndr->flags = _flags_save_string;
-               }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
-                       if (_ptr_previous_names) {
-                               NDR_PULL_ALLOC(ndr, r->previous_names);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->previous_names, _ptr_previous_names));
-                       } else {
-                               r->previous_names = NULL;
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               {
-                       uint32_t _flags_save_string = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->driver_name) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
-                               _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
-                               ndr->offset = _relative_save_offset;
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->previous_names));
+                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->previous_names));
                        }
-                       ndr->flags = _flags_save_string;
+                       ndr->flags = _flags_save_string_array;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->architecture) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->architecture));
-                               _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
-                               ndr->offset = _relative_save_offset;
+                       if (r->manufacturer_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->manufacturer_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_name));
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->driver_path) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_path));
-                               _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
-                               ndr->offset = _relative_save_offset;
+                       if (r->manufacturer_url) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->manufacturer_url));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_url));
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->data_file) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->data_file));
-                               _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
-                               ndr->offset = _relative_save_offset;
+                       if (r->hardware_id) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->hardware_id));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->hardware_id));
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->config_file) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->config_file));
-                               _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
-                               ndr->offset = _relative_save_offset;
+                       if (r->provider) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->provider));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->provider));
                        }
                        ndr->flags = _flags_save_string;
                }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo6 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_architecture;
+       TALLOC_CTX *_mem_save_architecture_0;
+       uint32_t _ptr_driver_path;
+       TALLOC_CTX *_mem_save_driver_path_0;
+       uint32_t _ptr_data_file;
+       TALLOC_CTX *_mem_save_data_file_0;
+       uint32_t _ptr_config_file;
+       TALLOC_CTX *_mem_save_config_file_0;
+       uint32_t _ptr_help_file;
+       TALLOC_CTX *_mem_save_help_file_0;
+       uint32_t _ptr_dependent_files;
+       TALLOC_CTX *_mem_save_dependent_files_0;
+       uint32_t _ptr_monitor_name;
+       TALLOC_CTX *_mem_save_monitor_name_0;
+       uint32_t _ptr_default_datatype;
+       TALLOC_CTX *_mem_save_default_datatype_0;
+       uint32_t _ptr_previous_names;
+       TALLOC_CTX *_mem_save_previous_names_0;
+       uint32_t _ptr_manufacturer_name;
+       TALLOC_CTX *_mem_save_manufacturer_name_0;
+       uint32_t _ptr_manufacturer_url;
+       TALLOC_CTX *_mem_save_manufacturer_url_0;
+       uint32_t _ptr_hardware_id;
+       TALLOC_CTX *_mem_save_hardware_id_0;
+       uint32_t _ptr_provider;
+       TALLOC_CTX *_mem_save_provider_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 8));
+               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->help_file) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->help_file));
-                               _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->help_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
-                               ndr->offset = _relative_save_offset;
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+                       if (_ptr_driver_name) {
+                               NDR_PULL_ALLOC(ndr, r->driver_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
+                       } else {
+                               r->driver_name = NULL;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
-                       uint32_t _flags_save_string_array = ndr->flags;
+                       uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->dependent_files) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dependent_files));
-                               _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
-                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
-                               ndr->offset = _relative_save_offset;
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
+                       if (_ptr_architecture) {
+                               NDR_PULL_ALLOC(ndr, r->architecture);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->architecture, _ptr_architecture));
+                       } else {
+                               r->architecture = NULL;
                        }
-                       ndr->flags = _flags_save_string_array;
+                       ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->monitor_name) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->monitor_name));
-                               _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
-                               ndr->offset = _relative_save_offset;
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
+                       if (_ptr_driver_path) {
+                               NDR_PULL_ALLOC(ndr, r->driver_path);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_path, _ptr_driver_path));
+                       } else {
+                               r->driver_path = NULL;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->default_datatype) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->default_datatype));
-                               _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
-                               ndr->offset = _relative_save_offset;
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
+                       if (_ptr_data_file) {
+                               NDR_PULL_ALLOC(ndr, r->data_file);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->data_file, _ptr_data_file));
+                       } else {
+                               r->data_file = NULL;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
-                       uint32_t _flags_save_string_array = ndr->flags;
+                       uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->previous_names) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->previous_names));
-                               _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
-                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->previous_names));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
-                               ndr->offset = _relative_save_offset;
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
+                       if (_ptr_config_file) {
+                               NDR_PULL_ALLOC(ndr, r->config_file);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->config_file, _ptr_config_file));
+                       } else {
+                               r->config_file = NULL;
                        }
-                       ndr->flags = _flags_save_string_array;
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_help_file));
+                       if (_ptr_help_file) {
+                               NDR_PULL_ALLOC(ndr, r->help_file);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->help_file, _ptr_help_file));
+                       } else {
+                               r->help_file = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
                }
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_DriverInfo4(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo4 *r)
-{
-       ndr_print_struct(ndr, name, "spoolss_DriverInfo4");
-       ndr->depth++;
-       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
-       ndr_print_ptr(ndr, "driver_name", r->driver_name);
-       ndr->depth++;
-       if (r->driver_name) {
-               ndr_print_string(ndr, "driver_name", r->driver_name);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "architecture", r->architecture);
-       ndr->depth++;
-       if (r->architecture) {
-               ndr_print_string(ndr, "architecture", r->architecture);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "driver_path", r->driver_path);
-       ndr->depth++;
-       if (r->driver_path) {
-               ndr_print_string(ndr, "driver_path", r->driver_path);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "data_file", r->data_file);
-       ndr->depth++;
-       if (r->data_file) {
-               ndr_print_string(ndr, "data_file", r->data_file);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "config_file", r->config_file);
-       ndr->depth++;
-       if (r->config_file) {
-               ndr_print_string(ndr, "config_file", r->config_file);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "help_file", r->help_file);
-       ndr->depth++;
-       if (r->help_file) {
-               ndr_print_string(ndr, "help_file", r->help_file);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
-       ndr->depth++;
-       if (r->dependent_files) {
-               ndr_print_string_array(ndr, "dependent_files", r->dependent_files);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
-       ndr->depth++;
-       if (r->monitor_name) {
-               ndr_print_string(ndr, "monitor_name", r->monitor_name);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
-       ndr->depth++;
-       if (r->default_datatype) {
-               ndr_print_string(ndr, "default_datatype", r->default_datatype);
-       }
-       ndr->depth--;
-       ndr_print_ptr(ndr, "previous_names", r->previous_names);
-       ndr->depth++;
-       if (r->previous_names) {
-               ndr_print_string_array(ndr, "previous_names", r->previous_names);
-       }
-       ndr->depth--;
-       ndr->depth--;
-}
-
-static enum ndr_err_code ndr_push_spoolss_DriverInfo5(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo5 *r)
-{
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
                {
-                       uint32_t _flags_save_string = ndr->flags;
+                       uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
-                       ndr->flags = _flags_save_string;
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
+                       if (_ptr_dependent_files) {
+                               NDR_PULL_ALLOC(ndr, r->dependent_files);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dependent_files, _ptr_dependent_files));
+                       } else {
+                               r->dependent_files = NULL;
+                       }
+                       ndr->flags = _flags_save_string_array;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->architecture));
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_monitor_name));
+                       if (_ptr_monitor_name) {
+                               NDR_PULL_ALLOC(ndr, r->monitor_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->monitor_name, _ptr_monitor_name));
+                       } else {
+                               r->monitor_name = NULL;
+                       }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_path));
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_default_datatype));
+                       if (_ptr_default_datatype) {
+                               NDR_PULL_ALLOC(ndr, r->default_datatype);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->default_datatype, _ptr_default_datatype));
+                       } else {
+                               r->default_datatype = NULL;
+                       }
                        ndr->flags = _flags_save_string;
                }
                {
-                       uint32_t _flags_save_string = ndr->flags;
+                       uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->data_file));
-                       ndr->flags = _flags_save_string;
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_previous_names));
+                       if (_ptr_previous_names) {
+                               NDR_PULL_ALLOC(ndr, r->previous_names);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->previous_names, _ptr_previous_names));
+                       } else {
+                               r->previous_names = NULL;
+                       }
+                       ndr->flags = _flags_save_string_array;
                }
+               NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->driver_date));
+               NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &r->driver_version));
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->config_file));
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_name));
+                       if (_ptr_manufacturer_name) {
+                               NDR_PULL_ALLOC(ndr, r->manufacturer_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->manufacturer_name, _ptr_manufacturer_name));
+                       } else {
+                               r->manufacturer_name = NULL;
+                       }
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->driver_attributes));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->config_version));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->driver_version));
-       }
-       if (ndr_flags & NDR_BUFFERS) {
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->driver_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->driver_name));
-                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_manufacturer_url));
+                       if (_ptr_manufacturer_url) {
+                               NDR_PULL_ALLOC(ndr, r->manufacturer_url);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->manufacturer_url, _ptr_manufacturer_url));
+                       } else {
+                               r->manufacturer_url = NULL;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->architecture) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->architecture));
-                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_hardware_id));
+                       if (_ptr_hardware_id) {
+                               NDR_PULL_ALLOC(ndr, r->hardware_id);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->hardware_id, _ptr_hardware_id));
+                       } else {
+                               r->hardware_id = NULL;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->driver_path) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->driver_path));
-                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_path));
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_provider));
+                       if (_ptr_provider) {
+                               NDR_PULL_ALLOC(ndr, r->provider);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->provider, _ptr_provider));
+                       } else {
+                               r->provider = NULL;
                        }
                        ndr->flags = _flags_save_string;
                }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->data_file) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->data_file));
-                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_file));
+                       if (r->driver_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
+                               _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->config_file) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->config_file));
-                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->config_file));
+                       if (r->architecture) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->architecture));
+                               _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo5 *r)
-{
-       uint32_t _ptr_driver_name;
-       TALLOC_CTX *_mem_save_driver_name_0;
-       uint32_t _ptr_architecture;
-       TALLOC_CTX *_mem_save_architecture_0;
-       uint32_t _ptr_driver_path;
-       TALLOC_CTX *_mem_save_driver_path_0;
-       uint32_t _ptr_data_file;
-       TALLOC_CTX *_mem_save_data_file_0;
-       uint32_t _ptr_config_file;
-       TALLOC_CTX *_mem_save_config_file_0;
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
-                       if (_ptr_driver_name) {
-                               NDR_PULL_ALLOC(ndr, r->driver_name);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
-                       } else {
-                               r->driver_name = NULL;
+                       if (r->driver_path) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_path));
+                               _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_architecture));
-                       if (_ptr_architecture) {
-                               NDR_PULL_ALLOC(ndr, r->architecture);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->architecture, _ptr_architecture));
-                       } else {
-                               r->architecture = NULL;
+                       if (r->data_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->data_file));
+                               _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_path));
-                       if (_ptr_driver_path) {
-                               NDR_PULL_ALLOC(ndr, r->driver_path);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_path, _ptr_driver_path));
-                       } else {
-                               r->driver_path = NULL;
+                       if (r->config_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->config_file));
+                               _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_file));
-                       if (_ptr_data_file) {
-                               NDR_PULL_ALLOC(ndr, r->data_file);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->data_file, _ptr_data_file));
-                       } else {
-                               r->data_file = NULL;
+                       if (r->help_file) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->help_file));
+                               _mem_save_help_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->help_file));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->dependent_files) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dependent_files));
+                               _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
+                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_config_file));
-                       if (_ptr_config_file) {
-                               NDR_PULL_ALLOC(ndr, r->config_file);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->config_file, _ptr_config_file));
-                       } else {
-                               r->config_file = NULL;
+                       if (r->monitor_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->monitor_name));
+                               _mem_save_monitor_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->driver_attributes));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->config_version));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->driver_version));
-       }
-       if (ndr_flags & NDR_BUFFERS) {
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->driver_name) {
+                       if (r->default_datatype) {
                                uint32_t _relative_save_offset;
                                _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
-                               _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->default_datatype));
+                               _mem_save_default_datatype_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
                {
-                       uint32_t _flags_save_string = ndr->flags;
+                       uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->architecture) {
+                       if (r->previous_names) {
                                uint32_t _relative_save_offset;
                                _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->architecture));
-                               _mem_save_architecture_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->previous_names));
+                               _mem_save_previous_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
+                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->previous_names));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->manufacturer_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->manufacturer_name));
+                               _mem_save_manufacturer_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_name_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -6665,14 +9404,14 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, int
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->driver_path) {
+                       if (r->manufacturer_url) {
                                uint32_t _relative_save_offset;
                                _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_path));
-                               _mem_save_driver_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->manufacturer_url));
+                               _mem_save_manufacturer_url_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_url, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_url));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_url_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -6680,14 +9419,14 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, int
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->data_file) {
+                       if (r->hardware_id) {
                                uint32_t _relative_save_offset;
                                _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->data_file));
-                               _mem_save_data_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->hardware_id));
+                               _mem_save_hardware_id_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->hardware_id, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->hardware_id));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_hardware_id_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -6695,14 +9434,14 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, int
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->config_file) {
+                       if (r->provider) {
                                uint32_t _relative_save_offset;
                                _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->config_file));
-                               _mem_save_config_file_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
-                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->provider));
+                               _mem_save_provider_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->provider, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->provider));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_provider_0, 0);
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -6711,9 +9450,9 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, int
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_DriverInfo5(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo5 *r)
+_PUBLIC_ void ndr_print_spoolss_DriverInfo6(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo6 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_DriverInfo5");
+       ndr_print_struct(ndr, name, "spoolss_DriverInfo6");
        ndr->depth++;
        ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
        ndr_print_ptr(ndr, "driver_name", r->driver_name);
@@ -6746,13 +9485,71 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo5(struct ndr_print *ndr, const char *n
                ndr_print_string(ndr, "config_file", r->config_file);
        }
        ndr->depth--;
-       ndr_print_uint32(ndr, "driver_attributes", r->driver_attributes);
-       ndr_print_uint32(ndr, "config_version", r->config_version);
-       ndr_print_uint32(ndr, "driver_version", r->driver_version);
+       ndr_print_ptr(ndr, "help_file", r->help_file);
+       ndr->depth++;
+       if (r->help_file) {
+               ndr_print_string(ndr, "help_file", r->help_file);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       ndr->depth++;
+       if (r->dependent_files) {
+               ndr_print_string_array(ndr, "dependent_files", r->dependent_files);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
+       ndr->depth++;
+       if (r->monitor_name) {
+               ndr_print_string(ndr, "monitor_name", r->monitor_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
+       ndr->depth++;
+       if (r->default_datatype) {
+               ndr_print_string(ndr, "default_datatype", r->default_datatype);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "previous_names", r->previous_names);
+       ndr->depth++;
+       if (r->previous_names) {
+               ndr_print_string_array(ndr, "previous_names", r->previous_names);
+       }
+       ndr->depth--;
+       ndr_print_NTTIME(ndr, "driver_date", r->driver_date);
+       ndr_print_hyper(ndr, "driver_version", r->driver_version);
+       ndr_print_ptr(ndr, "manufacturer_name", r->manufacturer_name);
+       ndr->depth++;
+       if (r->manufacturer_name) {
+               ndr_print_string(ndr, "manufacturer_name", r->manufacturer_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "manufacturer_url", r->manufacturer_url);
+       ndr->depth++;
+       if (r->manufacturer_url) {
+               ndr_print_string(ndr, "manufacturer_url", r->manufacturer_url);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "hardware_id", r->hardware_id);
+       ndr->depth++;
+       if (r->hardware_id) {
+               ndr_print_string(ndr, "hardware_id", r->hardware_id);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "provider", r->provider);
+       ndr->depth++;
+       if (r->provider) {
+               ndr_print_string(ndr, "provider", r->provider);
+       }
+       ndr->depth--;
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo6 *r)
+_PUBLIC_ size_t ndr_size_spoolss_DriverInfo6(const struct spoolss_DriverInfo6 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo6, ic);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo8 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 8));
@@ -6793,12 +9590,6 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, int
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->help_file));
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->dependent_files));
-                       ndr->flags = _flags_save_string_array;
-               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -6811,13 +9602,19 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, int
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->default_datatype));
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->dependent_files));
+                       ndr->flags = _flags_save_string_array;
+               }
                {
                        uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->previous_names));
                        ndr->flags = _flags_save_string_array;
                }
-               NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->driver_data));
+               NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->driver_date));
                NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, r->driver_version));
                {
                        uint32_t _flags_save_string = ndr->flags;
@@ -6843,6 +9640,39 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, int
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->provider));
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->print_processor));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->vendor_setup));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->color_profiles));
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->inf_path));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->printer_driver_attributes));
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->core_driver_dependencies));
+                       ndr->flags = _flags_save_string_array;
+               }
+               NDR_CHECK(ndr_push_NTTIME(ndr, NDR_SCALARS, r->min_inbox_driver_ver_date));
+               NDR_CHECK(ndr_push_hyper(ndr, NDR_SCALARS, r->min_inbox_driver_ver_version));
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -6899,15 +9729,6 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->dependent_files) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->dependent_files));
-                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -6926,6 +9747,15 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->dependent_files) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->dependent_files));
+                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
                {
                        uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -6971,11 +9801,56 @@ static enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->print_processor) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->print_processor));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->print_processor));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->vendor_setup) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->vendor_setup));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->vendor_setup));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->color_profiles) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->color_profiles));
+                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->color_profiles));
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->inf_path) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->inf_path));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->inf_path));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->core_driver_dependencies) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->core_driver_dependencies));
+                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->core_driver_dependencies));
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo6 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo8 *r)
 {
        uint32_t _ptr_driver_name;
        TALLOC_CTX *_mem_save_driver_name_0;
@@ -6989,12 +9864,12 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int
        TALLOC_CTX *_mem_save_config_file_0;
        uint32_t _ptr_help_file;
        TALLOC_CTX *_mem_save_help_file_0;
-       uint32_t _ptr_dependent_files;
-       TALLOC_CTX *_mem_save_dependent_files_0;
        uint32_t _ptr_monitor_name;
        TALLOC_CTX *_mem_save_monitor_name_0;
        uint32_t _ptr_default_datatype;
        TALLOC_CTX *_mem_save_default_datatype_0;
+       uint32_t _ptr_dependent_files;
+       TALLOC_CTX *_mem_save_dependent_files_0;
        uint32_t _ptr_previous_names;
        TALLOC_CTX *_mem_save_previous_names_0;
        uint32_t _ptr_manufacturer_name;
@@ -7005,6 +9880,16 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int
        TALLOC_CTX *_mem_save_hardware_id_0;
        uint32_t _ptr_provider;
        TALLOC_CTX *_mem_save_provider_0;
+       uint32_t _ptr_print_processor;
+       TALLOC_CTX *_mem_save_print_processor_0;
+       uint32_t _ptr_vendor_setup;
+       TALLOC_CTX *_mem_save_vendor_setup_0;
+       uint32_t _ptr_color_profiles;
+       TALLOC_CTX *_mem_save_color_profiles_0;
+       uint32_t _ptr_inf_path;
+       TALLOC_CTX *_mem_save_inf_path_0;
+       uint32_t _ptr_core_driver_dependencies;
+       TALLOC_CTX *_mem_save_core_driver_dependencies_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 8));
                NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
@@ -7080,18 +9965,6 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
-                       if (_ptr_dependent_files) {
-                               NDR_PULL_ALLOC(ndr, r->dependent_files);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dependent_files, _ptr_dependent_files));
-                       } else {
-                               r->dependent_files = NULL;
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -7116,6 +9989,18 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
+                       if (_ptr_dependent_files) {
+                               NDR_PULL_ALLOC(ndr, r->dependent_files);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dependent_files, _ptr_dependent_files));
+                       } else {
+                               r->dependent_files = NULL;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
                {
                        uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -7128,7 +10013,7 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int
                        }
                        ndr->flags = _flags_save_string_array;
                }
-               NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->driver_data));
+               NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->driver_date));
                NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &r->driver_version));
                {
                        uint32_t _flags_save_string = ndr->flags;
@@ -7174,10 +10059,73 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int
                                NDR_PULL_ALLOC(ndr, r->provider);
                                NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->provider, _ptr_provider));
                        } else {
-                               r->provider = NULL;
+                               r->provider = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_print_processor));
+                       if (_ptr_print_processor) {
+                               NDR_PULL_ALLOC(ndr, r->print_processor);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->print_processor, _ptr_print_processor));
+                       } else {
+                               r->print_processor = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_vendor_setup));
+                       if (_ptr_vendor_setup) {
+                               NDR_PULL_ALLOC(ndr, r->vendor_setup);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->vendor_setup, _ptr_vendor_setup));
+                       } else {
+                               r->vendor_setup = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_color_profiles));
+                       if (_ptr_color_profiles) {
+                               NDR_PULL_ALLOC(ndr, r->color_profiles);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->color_profiles, _ptr_color_profiles));
+                       } else {
+                               r->color_profiles = NULL;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_inf_path));
+                       if (_ptr_inf_path) {
+                               NDR_PULL_ALLOC(ndr, r->inf_path);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->inf_path, _ptr_inf_path));
+                       } else {
+                               r->inf_path = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->printer_driver_attributes));
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_core_driver_dependencies));
+                       if (_ptr_core_driver_dependencies) {
+                               NDR_PULL_ALLOC(ndr, r->core_driver_dependencies);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->core_driver_dependencies, _ptr_core_driver_dependencies));
+                       } else {
+                               r->core_driver_dependencies = NULL;
                        }
-                       ndr->flags = _flags_save_string;
+                       ndr->flags = _flags_save_string_array;
                }
+               NDR_CHECK(ndr_pull_NTTIME(ndr, NDR_SCALARS, &r->min_inbox_driver_ver_date));
+               NDR_CHECK(ndr_pull_hyper(ndr, NDR_SCALARS, &r->min_inbox_driver_ver_version));
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -7270,21 +10218,6 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->dependent_files) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dependent_files));
-                               _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
-                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
-                               ndr->offset = _relative_save_offset;
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -7315,6 +10248,21 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->dependent_files) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dependent_files));
+                               _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
+                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
                {
                        uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -7390,13 +10338,88 @@ static enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->print_processor) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->print_processor));
+                               _mem_save_print_processor_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->print_processor, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->print_processor));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_print_processor_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->vendor_setup) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->vendor_setup));
+                               _mem_save_vendor_setup_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->vendor_setup, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->vendor_setup));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_vendor_setup_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->color_profiles) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->color_profiles));
+                               _mem_save_color_profiles_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->color_profiles, 0);
+                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->color_profiles));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_color_profiles_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->inf_path) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->inf_path));
+                               _mem_save_inf_path_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->inf_path, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->inf_path));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_inf_path_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->core_driver_dependencies) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->core_driver_dependencies));
+                               _mem_save_core_driver_dependencies_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->core_driver_dependencies, 0);
+                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->core_driver_dependencies));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_core_driver_dependencies_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_DriverInfo6(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo6 *r)
+_PUBLIC_ void ndr_print_spoolss_DriverInfo8(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo8 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_DriverInfo6");
+       ndr_print_struct(ndr, name, "spoolss_DriverInfo8");
        ndr->depth++;
        ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
        ndr_print_ptr(ndr, "driver_name", r->driver_name);
@@ -7435,12 +10458,242 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo6(struct ndr_print *ndr, const char *n
                ndr_print_string(ndr, "help_file", r->help_file);
        }
        ndr->depth--;
+       ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
+       ndr->depth++;
+       if (r->monitor_name) {
+               ndr_print_string(ndr, "monitor_name", r->monitor_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "default_datatype", r->default_datatype);
+       ndr->depth++;
+       if (r->default_datatype) {
+               ndr_print_string(ndr, "default_datatype", r->default_datatype);
+       }
+       ndr->depth--;
        ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
        ndr->depth++;
        if (r->dependent_files) {
                ndr_print_string_array(ndr, "dependent_files", r->dependent_files);
        }
        ndr->depth--;
+       ndr_print_ptr(ndr, "previous_names", r->previous_names);
+       ndr->depth++;
+       if (r->previous_names) {
+               ndr_print_string_array(ndr, "previous_names", r->previous_names);
+       }
+       ndr->depth--;
+       ndr_print_NTTIME(ndr, "driver_date", r->driver_date);
+       ndr_print_hyper(ndr, "driver_version", r->driver_version);
+       ndr_print_ptr(ndr, "manufacturer_name", r->manufacturer_name);
+       ndr->depth++;
+       if (r->manufacturer_name) {
+               ndr_print_string(ndr, "manufacturer_name", r->manufacturer_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "manufacturer_url", r->manufacturer_url);
+       ndr->depth++;
+       if (r->manufacturer_url) {
+               ndr_print_string(ndr, "manufacturer_url", r->manufacturer_url);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "hardware_id", r->hardware_id);
+       ndr->depth++;
+       if (r->hardware_id) {
+               ndr_print_string(ndr, "hardware_id", r->hardware_id);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "provider", r->provider);
+       ndr->depth++;
+       if (r->provider) {
+               ndr_print_string(ndr, "provider", r->provider);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "print_processor", r->print_processor);
+       ndr->depth++;
+       if (r->print_processor) {
+               ndr_print_string(ndr, "print_processor", r->print_processor);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "vendor_setup", r->vendor_setup);
+       ndr->depth++;
+       if (r->vendor_setup) {
+               ndr_print_string(ndr, "vendor_setup", r->vendor_setup);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "color_profiles", r->color_profiles);
+       ndr->depth++;
+       if (r->color_profiles) {
+               ndr_print_string_array(ndr, "color_profiles", r->color_profiles);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "inf_path", r->inf_path);
+       ndr->depth++;
+       if (r->inf_path) {
+               ndr_print_string(ndr, "inf_path", r->inf_path);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "printer_driver_attributes", r->printer_driver_attributes);
+       ndr_print_ptr(ndr, "core_driver_dependencies", r->core_driver_dependencies);
+       ndr->depth++;
+       if (r->core_driver_dependencies) {
+               ndr_print_string_array(ndr, "core_driver_dependencies", r->core_driver_dependencies);
+       }
+       ndr->depth--;
+       ndr_print_NTTIME(ndr, "min_inbox_driver_ver_date", r->min_inbox_driver_ver_date);
+       ndr_print_hyper(ndr, "min_inbox_driver_ver_version", r->min_inbox_driver_ver_version);
+       ndr->depth--;
+}
+
+_PUBLIC_ size_t ndr_size_spoolss_DriverInfo8(const struct spoolss_DriverInfo8 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo8, ic);
+}
+
+static enum ndr_err_code ndr_push_spoolss_DriverFileType(struct ndr_push *ndr, int ndr_flags, enum spoolss_DriverFileType r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_DriverFileType(struct ndr_pull *ndr, int ndr_flags, enum spoolss_DriverFileType *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_DriverFileType(struct ndr_print *ndr, const char *name, enum spoolss_DriverFileType r)
+{
+       const char *val = NULL;
+
+       switch (r) {
+               case SPOOLSS_DRIVER_FILE_TYPE_RENDERING: val = "SPOOLSS_DRIVER_FILE_TYPE_RENDERING"; break;
+               case SPOOLSS_DRIVER_FILE_TYPE_CONFIGURATION: val = "SPOOLSS_DRIVER_FILE_TYPE_CONFIGURATION"; break;
+               case SPOOLSS_DRIVER_FILE_TYPE_DATA: val = "SPOOLSS_DRIVER_FILE_TYPE_DATA"; break;
+               case SPOOLSS_DRIVER_FILE_TYPE_HELP: val = "SPOOLSS_DRIVER_FILE_TYPE_HELP"; break;
+               case SPOOLSS_DRIVER_FILE_TYPE_OTHER: val = "SPOOLSS_DRIVER_FILE_TYPE_OTHER"; break;
+       }
+       ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverFileInfo(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverFileInfo *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->file_name));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_spoolss_DriverFileType(ndr, NDR_SCALARS, r->file_type));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->file_version));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->file_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->file_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->file_name));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverFileInfo(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverFileInfo *r)
+{
+       uint32_t _ptr_file_name;
+       TALLOC_CTX *_mem_save_file_name_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_file_name));
+                       if (_ptr_file_name) {
+                               NDR_PULL_ALLOC(ndr, r->file_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->file_name, _ptr_file_name));
+                       } else {
+                               r->file_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_spoolss_DriverFileType(ndr, NDR_SCALARS, &r->file_type));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->file_version));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->file_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->file_name));
+                               _mem_save_file_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->file_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->file_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_file_name_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_DriverFileInfo(struct ndr_print *ndr, const char *name, const struct spoolss_DriverFileInfo *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_DriverFileInfo");
+       ndr->depth++;
+       ndr_print_ptr(ndr, "file_name", r->file_name);
+       ndr->depth++;
+       if (r->file_name) {
+               ndr_print_string(ndr, "file_name", r->file_name);
+       }
+       ndr->depth--;
+       ndr_print_spoolss_DriverFileType(ndr, "file_type", r->file_type);
+       ndr_print_uint32(ndr, "file_version", r->file_version);
+       ndr->depth--;
+}
+
+_PUBLIC_ void ndr_print_spoolss_DriverInfo101(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo101 *r)
+{
+       uint32_t cntr_file_info_1;
+       ndr_print_struct(ndr, name, "spoolss_DriverInfo101");
+       ndr->depth++;
+       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "architecture", r->architecture);
+       ndr->depth++;
+       if (r->architecture) {
+               ndr_print_string(ndr, "architecture", r->architecture);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "file_info", r->file_info);
+       ndr->depth++;
+       if (r->file_info) {
+               ndr->print(ndr, "%s: ARRAY(%d)", "file_info", (int)r->file_count);
+               ndr->depth++;
+               for (cntr_file_info_1=0;cntr_file_info_1<r->file_count;cntr_file_info_1++) {
+                       char *idx_1=NULL;
+                       if (asprintf(&idx_1, "[%d]", cntr_file_info_1) != -1) {
+                               ndr_print_spoolss_DriverFileInfo(ndr, "file_info", &r->file_info[cntr_file_info_1]);
+                               free(idx_1);
+                       }
+               }
+               ndr->depth--;
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "file_count", r->file_count);
        ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
        ndr->depth++;
        if (r->monitor_name) {
@@ -7459,7 +10712,7 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo6(struct ndr_print *ndr, const char *n
                ndr_print_string_array(ndr, "previous_names", r->previous_names);
        }
        ndr->depth--;
-       ndr_print_NTTIME(ndr, "driver_data", r->driver_data);
+       ndr_print_NTTIME(ndr, "driver_date", r->driver_date);
        ndr_print_hyper(ndr, "driver_version", r->driver_version);
        ndr_print_ptr(ndr, "manufacturer_name", r->manufacturer_name);
        ndr->depth++;
@@ -7488,6 +10741,11 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo6(struct ndr_print *ndr, const char *n
        ndr->depth--;
 }
 
+_PUBLIC_ size_t ndr_size_spoolss_DriverInfo101(const struct spoolss_DriverInfo101 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo101, ic);
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_DriverInfo *r)
 {
        uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);
@@ -7521,13 +10779,25 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo(struct ndr_push *ndr, int
                        case 5: {
                                NDR_CHECK(ndr_push_align(ndr, 4));
                                NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo5(ndr, NDR_SCALARS, &r->info5));
+                               NDR_CHECK(ndr_push_spoolss_DriverInfo5(ndr, NDR_SCALARS, &r->info5));
+                       break; }
+
+                       case 6: {
+                               NDR_CHECK(ndr_push_align(ndr, 8));
+                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_push_spoolss_DriverInfo6(ndr, NDR_SCALARS, &r->info6));
+                       break; }
+
+                       case 8: {
+                               NDR_CHECK(ndr_push_align(ndr, 8));
+                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_push_spoolss_DriverInfo8(ndr, NDR_SCALARS, &r->info8));
                        break; }
 
-                       case 6: {
+                       case 101: {
                                NDR_CHECK(ndr_push_align(ndr, 8));
                                NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo6(ndr, NDR_SCALARS, &r->info6));
+                               NDR_CHECK(ndr_push_spoolss_DriverInfo101(ndr, NDR_SCALARS, &r->info101));
                        break; }
 
                        default: {
@@ -7563,6 +10833,14 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo(struct ndr_push *ndr, int
                                NDR_CHECK(ndr_push_spoolss_DriverInfo6(ndr, NDR_BUFFERS, &r->info6));
                        break;
 
+                       case 8:
+                               NDR_CHECK(ndr_push_spoolss_DriverInfo8(ndr, NDR_BUFFERS, &r->info8));
+                       break;
+
+                       case 101:
+                               NDR_CHECK(ndr_push_spoolss_DriverInfo101(ndr, NDR_BUFFERS, &r->info101));
+                       break;
+
                        default:
                        break;
 
@@ -7615,6 +10893,18 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo(struct ndr_pull *ndr, int
                                NDR_CHECK(ndr_pull_spoolss_DriverInfo6(ndr, NDR_SCALARS, &r->info6));
                        break; }
 
+                       case 8: {
+                               NDR_CHECK(ndr_pull_align(ndr, 8));
+                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_pull_spoolss_DriverInfo8(ndr, NDR_SCALARS, &r->info8));
+                       break; }
+
+                       case 101: {
+                               NDR_CHECK(ndr_pull_align(ndr, 8));
+                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_pull_spoolss_DriverInfo101(ndr, NDR_SCALARS, &r->info101));
+                       break; }
+
                        default: {
                        break; }
 
@@ -7647,6 +10937,14 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo(struct ndr_pull *ndr, int
                                NDR_CHECK(ndr_pull_spoolss_DriverInfo6(ndr, NDR_BUFFERS, &r->info6));
                        break;
 
+                       case 8:
+                               NDR_CHECK(ndr_pull_spoolss_DriverInfo8(ndr, NDR_BUFFERS, &r->info8));
+                       break;
+
+                       case 101:
+                               NDR_CHECK(ndr_pull_spoolss_DriverInfo101(ndr, NDR_BUFFERS, &r->info101));
+                       break;
+
                        default:
                        break;
 
@@ -7686,13 +10984,21 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo(struct ndr_print *ndr, const char *na
                        ndr_print_spoolss_DriverInfo6(ndr, "info6", &r->info6);
                break;
 
+               case 8:
+                       ndr_print_spoolss_DriverInfo8(ndr, "info8", &r->info8);
+               break;
+
+               case 101:
+                       ndr_print_spoolss_DriverInfo101(ndr, "info101", &r->info101);
+               break;
+
                default:
                break;
 
        }
 }
 
-static enum ndr_err_code ndr_push_spoolss_DriverDirectoryInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverDirectoryInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverDirectoryInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverDirectoryInfo1 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -7708,7 +11014,7 @@ static enum ndr_err_code ndr_push_spoolss_DriverDirectoryInfo1(struct ndr_push *
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_DriverDirectoryInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverDirectoryInfo1 *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverDirectoryInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverDirectoryInfo1 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
@@ -7732,6 +11038,11 @@ _PUBLIC_ void ndr_print_spoolss_DriverDirectoryInfo1(struct ndr_print *ndr, cons
        ndr->depth--;
 }
 
+_PUBLIC_ size_t ndr_size_spoolss_DriverDirectoryInfo1(const struct spoolss_DriverDirectoryInfo1 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverDirectoryInfo1, ic);
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverDirectoryInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_DriverDirectoryInfo *r)
 {
        uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);
@@ -7987,6 +11298,138 @@ _PUBLIC_ void ndr_print_spoolss_PrintProcessorInfo(struct ndr_print *ndr, const
        }
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcessorDirectoryInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrintProcessorDirectoryInfo1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->directory_name));
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcessorDirectoryInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrintProcessorDirectoryInfo1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->directory_name));
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_PrintProcessorDirectoryInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_PrintProcessorDirectoryInfo1 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_PrintProcessorDirectoryInfo1");
+       ndr->depth++;
+       ndr_print_string(ndr, "directory_name", r->directory_name);
+       ndr->depth--;
+}
+
+_PUBLIC_ size_t ndr_size_spoolss_PrintProcessorDirectoryInfo1(const struct spoolss_PrintProcessorDirectoryInfo1 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_PrintProcessorDirectoryInfo1, ic);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcessorDirectoryInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PrintProcessorDirectoryInfo *r)
+{
+       uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);
+       if (ndr_flags & NDR_SCALARS) {
+               int level = ndr_push_get_switch_value(ndr, r);
+               switch (level) {
+                       case 1: {
+                               NDR_CHECK(ndr_push_align(ndr, 4));
+                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_push_spoolss_PrintProcessorDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
+                       break; }
+
+                       default: {
+                       break; }
+
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               int level = ndr_push_get_switch_value(ndr, r);
+               NDR_CHECK(ndr_push_setup_relative_base_offset2(ndr, r));
+               switch (level) {
+                       case 1:
+                       break;
+
+                       default:
+                       break;
+
+               }
+       }
+       ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcessorDirectoryInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_PrintProcessorDirectoryInfo *r)
+{
+       uint32_t _save_relative_base_offset = ndr_pull_get_relative_base_offset(ndr);
+       int level;
+       level = ndr_pull_get_switch_value(ndr, r);
+       if (ndr_flags & NDR_SCALARS) {
+               switch (level) {
+                       case 1: {
+                               NDR_CHECK(ndr_pull_align(ndr, 4));
+                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_pull_spoolss_PrintProcessorDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
+                       break; }
+
+                       default: {
+                       break; }
+
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+               switch (level) {
+                       case 1:
+                       break;
+
+                       default:
+                       break;
+
+               }
+       }
+       ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_PrintProcessorDirectoryInfo(struct ndr_print *ndr, const char *name, const union spoolss_PrintProcessorDirectoryInfo *r)
+{
+       int level;
+       level = ndr_print_get_switch_value(ndr, r);
+       ndr_print_union(ndr, name, level, "spoolss_PrintProcessorDirectoryInfo");
+       switch (level) {
+               case 1:
+                       ndr_print_spoolss_PrintProcessorDirectoryInfo1(ndr, "info1", &r->info1);
+               break;
+
+               default:
+               break;
+
+       }
+}
+
+_PUBLIC_ size_t ndr_size_spoolss_PrintProcessorDirectoryInfo(const union spoolss_PrintProcessorDirectoryInfo *r, uint32_t level, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_PrintProcessorDirectoryInfo, ic);
+}
+
 static enum ndr_err_code ndr_push_spoolss_DocumentInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DocumentInfo1 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
@@ -8678,32 +12121,142 @@ static enum ndr_err_code ndr_push_spoolss_FormArea(struct ndr_push *ndr, int ndr
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_FormArea(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormArea *r)
+static enum ndr_err_code ndr_pull_spoolss_FormArea(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormArea *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->left));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->top));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->right));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->bottom));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_FormArea(struct ndr_print *ndr, const char *name, const struct spoolss_FormArea *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_FormArea");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "left", r->left);
+       ndr_print_uint32(ndr, "top", r->top);
+       ndr_print_uint32(ndr, "right", r->right);
+       ndr_print_uint32(ndr, "bottom", r->bottom);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_FormInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_FormInfo1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_spoolss_FormFlags(ndr, NDR_SCALARS, r->flags));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->form_name));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_spoolss_FormSize(ndr, NDR_SCALARS, &r->size));
+               NDR_CHECK(ndr_push_spoolss_FormArea(ndr, NDR_SCALARS, &r->area));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->form_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->form_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->form_name));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_FormInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormInfo1 *r)
+{
+       uint32_t _ptr_form_name;
+       TALLOC_CTX *_mem_save_form_name_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_spoolss_FormFlags(ndr, NDR_SCALARS, &r->flags));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_form_name));
+                       if (_ptr_form_name) {
+                               NDR_PULL_ALLOC(ndr, r->form_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->form_name, _ptr_form_name));
+                       } else {
+                               r->form_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_spoolss_FormSize(ndr, NDR_SCALARS, &r->size));
+               NDR_CHECK(ndr_pull_spoolss_FormArea(ndr, NDR_SCALARS, &r->area));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->form_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->form_name));
+                               _mem_save_form_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->form_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->form_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_form_name_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_FormInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_FormInfo1 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_FormInfo1");
+       ndr->depth++;
+       ndr_print_spoolss_FormFlags(ndr, "flags", r->flags);
+       ndr_print_ptr(ndr, "form_name", r->form_name);
+       ndr->depth++;
+       if (r->form_name) {
+               ndr_print_string(ndr, "form_name", r->form_name);
+       }
+       ndr->depth--;
+       ndr_print_spoolss_FormSize(ndr, "size", &r->size);
+       ndr_print_spoolss_FormArea(ndr, "area", &r->area);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_FormStringType(struct ndr_push *ndr, int ndr_flags, uint32_t r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_FormStringType(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
 {
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->left));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->top));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->right));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->bottom));
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-       }
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_FormArea(struct ndr_print *ndr, const char *name, const struct spoolss_FormArea *r)
+_PUBLIC_ void ndr_print_spoolss_FormStringType(struct ndr_print *ndr, const char *name, uint32_t r)
 {
-       ndr_print_struct(ndr, name, "spoolss_FormArea");
+       ndr_print_uint32(ndr, name, r);
        ndr->depth++;
-       ndr_print_uint32(ndr, "left", r->left);
-       ndr_print_uint32(ndr, "top", r->top);
-       ndr_print_uint32(ndr, "right", r->right);
-       ndr_print_uint32(ndr, "bottom", r->bottom);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SPOOLSS_FORM_STRING_TYPE_NONE", SPOOLSS_FORM_STRING_TYPE_NONE, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SPOOLSS_FORM_STRING_TYPE_MUI_DLL", SPOOLSS_FORM_STRING_TYPE_MUI_DLL, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SPOOLSS_FORM_STRING_TYPE_LANG_PAIR", SPOOLSS_FORM_STRING_TYPE_LANG_PAIR, r);
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_FormInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_FormInfo1 *r)
+static enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_FormInfo2 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -8716,6 +12269,27 @@ static enum ndr_err_code ndr_push_spoolss_FormInfo1(struct ndr_push *ndr, int nd
                }
                NDR_CHECK(ndr_push_spoolss_FormSize(ndr, NDR_SCALARS, &r->size));
                NDR_CHECK(ndr_push_spoolss_FormArea(ndr, NDR_SCALARS, &r->area));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->keyword));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_spoolss_FormStringType(ndr, NDR_SCALARS, r->string_type));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->mui_dll));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->ressource_id));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->display_name));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->lang_id));
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -8727,14 +12301,47 @@ static enum ndr_err_code ndr_push_spoolss_FormInfo1(struct ndr_push *ndr, int nd
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->keyword) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->keyword));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->keyword));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->mui_dll) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->mui_dll));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->mui_dll));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->display_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->display_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->display_name));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_FormInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormInfo1 *r)
+static enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_FormInfo2 *r)
 {
        uint32_t _ptr_form_name;
        TALLOC_CTX *_mem_save_form_name_0;
+       uint32_t _ptr_keyword;
+       TALLOC_CTX *_mem_save_keyword_0;
+       uint32_t _ptr_mui_dll;
+       TALLOC_CTX *_mem_save_mui_dll_0;
+       uint32_t _ptr_display_name;
+       TALLOC_CTX *_mem_save_display_name_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
                NDR_CHECK(ndr_pull_spoolss_FormFlags(ndr, NDR_SCALARS, &r->flags));
@@ -8752,6 +12359,45 @@ static enum ndr_err_code ndr_pull_spoolss_FormInfo1(struct ndr_pull *ndr, int nd
                }
                NDR_CHECK(ndr_pull_spoolss_FormSize(ndr, NDR_SCALARS, &r->size));
                NDR_CHECK(ndr_pull_spoolss_FormArea(ndr, NDR_SCALARS, &r->area));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_keyword));
+                       if (_ptr_keyword) {
+                               NDR_PULL_ALLOC(ndr, r->keyword);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->keyword, _ptr_keyword));
+                       } else {
+                               r->keyword = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_spoolss_FormStringType(ndr, NDR_SCALARS, &r->string_type));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_mui_dll));
+                       if (_ptr_mui_dll) {
+                               NDR_PULL_ALLOC(ndr, r->mui_dll);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->mui_dll, _ptr_mui_dll));
+                       } else {
+                               r->mui_dll = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->ressource_id));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_display_name));
+                       if (_ptr_display_name) {
+                               NDR_PULL_ALLOC(ndr, r->display_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->display_name, _ptr_display_name));
+                       } else {
+                               r->display_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->lang_id));
        }
        if (ndr_flags & NDR_BUFFERS) {
                {
@@ -8769,13 +12415,58 @@ static enum ndr_err_code ndr_pull_spoolss_FormInfo1(struct ndr_pull *ndr, int nd
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->keyword) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->keyword));
+                               _mem_save_keyword_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->keyword, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->keyword));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_keyword_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->mui_dll) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->mui_dll));
+                               _mem_save_mui_dll_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->mui_dll, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->mui_dll));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_mui_dll_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->display_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->display_name));
+                               _mem_save_display_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->display_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->display_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_display_name_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_FormInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_FormInfo1 *r)
+_PUBLIC_ void ndr_print_spoolss_FormInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_FormInfo2 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_FormInfo1");
+       ndr_print_struct(ndr, name, "spoolss_FormInfo2");
        ndr->depth++;
        ndr_print_spoolss_FormFlags(ndr, "flags", r->flags);
        ndr_print_ptr(ndr, "form_name", r->form_name);
@@ -8786,6 +12477,27 @@ _PUBLIC_ void ndr_print_spoolss_FormInfo1(struct ndr_print *ndr, const char *nam
        ndr->depth--;
        ndr_print_spoolss_FormSize(ndr, "size", &r->size);
        ndr_print_spoolss_FormArea(ndr, "area", &r->area);
+       ndr_print_ptr(ndr, "keyword", r->keyword);
+       ndr->depth++;
+       if (r->keyword) {
+               ndr_print_string(ndr, "keyword", r->keyword);
+       }
+       ndr->depth--;
+       ndr_print_spoolss_FormStringType(ndr, "string_type", r->string_type);
+       ndr_print_ptr(ndr, "mui_dll", r->mui_dll);
+       ndr->depth++;
+       if (r->mui_dll) {
+               ndr_print_string(ndr, "mui_dll", r->mui_dll);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "ressource_id", r->ressource_id);
+       ndr_print_ptr(ndr, "display_name", r->display_name);
+       ndr->depth++;
+       if (r->display_name) {
+               ndr_print_string(ndr, "display_name", r->display_name);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "lang_id", r->lang_id);
        ndr->depth--;
 }
 
@@ -8801,6 +12513,12 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo(struct ndr_push *ndr, int n
                                NDR_CHECK(ndr_push_spoolss_FormInfo1(ndr, NDR_SCALARS, &r->info1));
                        break; }
 
+                       case 2: {
+                               NDR_CHECK(ndr_push_align(ndr, 4));
+                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_push_spoolss_FormInfo2(ndr, NDR_SCALARS, &r->info2));
+                       break; }
+
                        default: {
                        break; }
 
@@ -8814,6 +12532,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo(struct ndr_push *ndr, int n
                                NDR_CHECK(ndr_push_spoolss_FormInfo1(ndr, NDR_BUFFERS, &r->info1));
                        break;
 
+                       case 2:
+                               NDR_CHECK(ndr_push_spoolss_FormInfo2(ndr, NDR_BUFFERS, &r->info2));
+                       break;
+
                        default:
                        break;
 
@@ -8836,6 +12558,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo(struct ndr_pull *ndr, int n
                                NDR_CHECK(ndr_pull_spoolss_FormInfo1(ndr, NDR_SCALARS, &r->info1));
                        break; }
 
+                       case 2: {
+                               NDR_CHECK(ndr_pull_align(ndr, 4));
+                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_pull_spoolss_FormInfo2(ndr, NDR_SCALARS, &r->info2));
+                       break; }
+
                        default: {
                        break; }
 
@@ -8848,6 +12576,10 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo(struct ndr_pull *ndr, int n
                                NDR_CHECK(ndr_pull_spoolss_FormInfo1(ndr, NDR_BUFFERS, &r->info1));
                        break;
 
+                       case 2:
+                               NDR_CHECK(ndr_pull_spoolss_FormInfo2(ndr, NDR_BUFFERS, &r->info2));
+                       break;
+
                        default:
                        break;
 
@@ -8867,6 +12599,10 @@ _PUBLIC_ void ndr_print_spoolss_FormInfo(struct ndr_print *ndr, const char *name
                        ndr_print_spoolss_FormInfo1(ndr, "info1", &r->info1);
                break;
 
+               case 2:
+                       ndr_print_spoolss_FormInfo2(ndr, "info2", &r->info2);
+               break;
+
                default:
                break;
 
@@ -9845,6 +13581,7 @@ _PUBLIC_ void ndr_print_spoolss_PrinterChangeFlags(struct ndr_print *ndr, const
        ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_CHANGE_DELETE_PORT", PRINTER_CHANGE_DELETE_PORT, r);
        ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_CHANGE_ADD_PRINT_PROCESSOR", PRINTER_CHANGE_ADD_PRINT_PROCESSOR, r);
        ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_CHANGE_DELETE_PRINT_PROCESSOR", PRINTER_CHANGE_DELETE_PRINT_PROCESSOR, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_CHANGE_SERVER", PRINTER_CHANGE_SERVER, r);
        ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_CHANGE_ADD_PRINTER_DRIVER", PRINTER_CHANGE_ADD_PRINTER_DRIVER, r);
        ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_CHANGE_SET_PRINTER_DRIVER", PRINTER_CHANGE_SET_PRINTER_DRIVER, r);
        ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_CHANGE_DELETE_PRINTER_DRIVER", PRINTER_CHANGE_DELETE_PRINTER_DRIVER, r);
@@ -9926,7 +13663,7 @@ _PUBLIC_ void ndr_print_spoolss_NotifyType(struct ndr_print *ndr, const char *na
        ndr_print_enum(ndr, name, "ENUM", val, r);
 }
 
-static enum ndr_err_code ndr_push_spoolss_NotifyOptionsArray(struct ndr_push *ndr, int ndr_flags, const struct spoolss_NotifyOptionsArray *r)
+static enum ndr_err_code ndr_push_spoolss_NotifyOptionType(struct ndr_push *ndr, int ndr_flags, const struct spoolss_NotifyOptionType *r)
 {
        uint32_t cntr_fields_1;
        if (ndr_flags & NDR_SCALARS) {
@@ -9949,7 +13686,7 @@ static enum ndr_err_code ndr_push_spoolss_NotifyOptionsArray(struct ndr_push *nd
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_NotifyOptionsArray(struct ndr_pull *ndr, int ndr_flags, struct spoolss_NotifyOptionsArray *r)
+static enum ndr_err_code ndr_pull_spoolss_NotifyOptionType(struct ndr_pull *ndr, int ndr_flags, struct spoolss_NotifyOptionType *r)
 {
        uint32_t _ptr_fields;
        uint32_t cntr_fields_1;
@@ -9990,10 +13727,10 @@ static enum ndr_err_code ndr_pull_spoolss_NotifyOptionsArray(struct ndr_pull *nd
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_NotifyOptionsArray(struct ndr_print *ndr, const char *name, const struct spoolss_NotifyOptionsArray *r)
+_PUBLIC_ void ndr_print_spoolss_NotifyOptionType(struct ndr_print *ndr, const char *name, const struct spoolss_NotifyOptionType *r)
 {
        uint32_t cntr_fields_1;
-       ndr_print_struct(ndr, name, "spoolss_NotifyOptionsArray");
+       ndr_print_struct(ndr, name, "spoolss_NotifyOptionType");
        ndr->depth++;
        ndr_print_spoolss_NotifyType(ndr, "type", r->type);
        ndr_print_uint16(ndr, "u1", r->u1);
@@ -10018,89 +13755,111 @@ _PUBLIC_ void ndr_print_spoolss_NotifyOptionsArray(struct ndr_print *ndr, const
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_NotifyOptionsContainer(struct ndr_push *ndr, int ndr_flags, const struct spoolss_NotifyOptionsContainer *r)
+static enum ndr_err_code ndr_push_spoolssNotifyOptionFlags(struct ndr_push *ndr, int ndr_flags, uint32_t r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolssNotifyOptionFlags(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolssNotifyOptionFlags(struct ndr_print *ndr, const char *name, uint32_t r)
+{
+       ndr_print_uint32(ndr, name, r);
+       ndr->depth++;
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_NOTIFY_OPTIONS_REFRESH", PRINTER_NOTIFY_OPTIONS_REFRESH, r);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_NotifyOption(struct ndr_push *ndr, int ndr_flags, const struct spoolss_NotifyOption *r)
 {
-       uint32_t cntr_options_1;
+       uint32_t cntr_types_1;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->version));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->flags));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 2));
+               NDR_CHECK(ndr_push_spoolssNotifyOptionFlags(ndr, NDR_SCALARS, r->flags));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->options));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->types));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->options) {
+               if (r->types) {
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
-                       for (cntr_options_1 = 0; cntr_options_1 < r->count; cntr_options_1++) {
-                               NDR_CHECK(ndr_push_spoolss_NotifyOptionsArray(ndr, NDR_SCALARS, &r->options[cntr_options_1]));
+                       for (cntr_types_1 = 0; cntr_types_1 < r->count; cntr_types_1++) {
+                               NDR_CHECK(ndr_push_spoolss_NotifyOptionType(ndr, NDR_SCALARS, &r->types[cntr_types_1]));
                        }
-                       for (cntr_options_1 = 0; cntr_options_1 < r->count; cntr_options_1++) {
-                               NDR_CHECK(ndr_push_spoolss_NotifyOptionsArray(ndr, NDR_BUFFERS, &r->options[cntr_options_1]));
+                       for (cntr_types_1 = 0; cntr_types_1 < r->count; cntr_types_1++) {
+                               NDR_CHECK(ndr_push_spoolss_NotifyOptionType(ndr, NDR_BUFFERS, &r->types[cntr_types_1]));
                        }
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_NotifyOptionsContainer(struct ndr_pull *ndr, int ndr_flags, struct spoolss_NotifyOptionsContainer *r)
+static enum ndr_err_code ndr_pull_spoolss_NotifyOption(struct ndr_pull *ndr, int ndr_flags, struct spoolss_NotifyOption *r)
 {
-       uint32_t _ptr_options;
-       uint32_t cntr_options_1;
-       TALLOC_CTX *_mem_save_options_0;
-       TALLOC_CTX *_mem_save_options_1;
+       uint32_t _ptr_types;
+       uint32_t cntr_types_1;
+       TALLOC_CTX *_mem_save_types_0;
+       TALLOC_CTX *_mem_save_types_1;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->version));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->flags));
+               NDR_CHECK(ndr_pull_spoolssNotifyOptionFlags(ndr, NDR_SCALARS, &r->flags));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_options));
-               if (_ptr_options) {
-                       NDR_PULL_ALLOC(ndr, r->options);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_types));
+               if (_ptr_types) {
+                       NDR_PULL_ALLOC(ndr, r->types);
                } else {
-                       r->options = NULL;
+                       r->types = NULL;
                }
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->options) {
-                       _mem_save_options_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->options, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->options));
-                       NDR_PULL_ALLOC_N(ndr, r->options, ndr_get_array_size(ndr, &r->options));
-                       _mem_save_options_1 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->options, 0);
-                       for (cntr_options_1 = 0; cntr_options_1 < r->count; cntr_options_1++) {
-                               NDR_CHECK(ndr_pull_spoolss_NotifyOptionsArray(ndr, NDR_SCALARS, &r->options[cntr_options_1]));
-                       }
-                       for (cntr_options_1 = 0; cntr_options_1 < r->count; cntr_options_1++) {
-                               NDR_CHECK(ndr_pull_spoolss_NotifyOptionsArray(ndr, NDR_BUFFERS, &r->options[cntr_options_1]));
-                       }
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_options_1, 0);
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_options_0, 0);
+               if (r->types) {
+                       _mem_save_types_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->types, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->types));
+                       NDR_PULL_ALLOC_N(ndr, r->types, ndr_get_array_size(ndr, &r->types));
+                       _mem_save_types_1 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->types, 0);
+                       for (cntr_types_1 = 0; cntr_types_1 < r->count; cntr_types_1++) {
+                               NDR_CHECK(ndr_pull_spoolss_NotifyOptionType(ndr, NDR_SCALARS, &r->types[cntr_types_1]));
+                       }
+                       for (cntr_types_1 = 0; cntr_types_1 < r->count; cntr_types_1++) {
+                               NDR_CHECK(ndr_pull_spoolss_NotifyOptionType(ndr, NDR_BUFFERS, &r->types[cntr_types_1]));
+                       }
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_types_1, 0);
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_types_0, 0);
                }
-               if (r->options) {
-                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->options, r->count));
+               if (r->types) {
+                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->types, r->count));
                }
        }
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_NotifyOptionsContainer(struct ndr_print *ndr, const char *name, const struct spoolss_NotifyOptionsContainer *r)
+_PUBLIC_ void ndr_print_spoolss_NotifyOption(struct ndr_print *ndr, const char *name, const struct spoolss_NotifyOption *r)
 {
-       uint32_t cntr_options_1;
-       ndr_print_struct(ndr, name, "spoolss_NotifyOptionsContainer");
+       uint32_t cntr_types_1;
+       ndr_print_struct(ndr, name, "spoolss_NotifyOption");
        ndr->depth++;
-       ndr_print_uint32(ndr, "version", r->version);
-       ndr_print_uint32(ndr, "flags", r->flags);
+       ndr_print_uint32(ndr, "version", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?2:r->version);
+       ndr_print_spoolssNotifyOptionFlags(ndr, "flags", r->flags);
        ndr_print_uint32(ndr, "count", r->count);
-       ndr_print_ptr(ndr, "options", r->options);
+       ndr_print_ptr(ndr, "types", r->types);
        ndr->depth++;
-       if (r->options) {
-               ndr->print(ndr, "%s: ARRAY(%d)", "options", (int)r->count);
+       if (r->types) {
+               ndr->print(ndr, "%s: ARRAY(%d)", "types", (int)r->count);
                ndr->depth++;
-               for (cntr_options_1=0;cntr_options_1<r->count;cntr_options_1++) {
+               for (cntr_types_1=0;cntr_types_1<r->count;cntr_types_1++) {
                        char *idx_1=NULL;
-                       if (asprintf(&idx_1, "[%d]", cntr_options_1) != -1) {
-                               ndr_print_spoolss_NotifyOptionsArray(ndr, "options", &r->options[cntr_options_1]);
+                       if (asprintf(&idx_1, "[%d]", cntr_types_1) != -1) {
+                               ndr_print_spoolss_NotifyOptionType(ndr, "types", &r->types[cntr_types_1]);
                                free(idx_1);
                        }
                }
@@ -10110,7 +13869,7 @@ _PUBLIC_ void ndr_print_spoolss_NotifyOptionsContainer(struct ndr_print *ndr, co
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_NotifyUTF16String(struct ndr_push *ndr, int ndr_flags, const struct spoolss_NotifyUTF16String *r)
+static enum ndr_err_code ndr_push_spoolss_NotifyString(struct ndr_push *ndr, int ndr_flags, const struct spoolss_NotifyString *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
@@ -10126,7 +13885,7 @@ static enum ndr_err_code ndr_push_spoolss_NotifyUTF16String(struct ndr_push *ndr
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_NotifyUTF16String(struct ndr_pull *ndr, int ndr_flags, struct spoolss_NotifyUTF16String *r)
+static enum ndr_err_code ndr_pull_spoolss_NotifyString(struct ndr_pull *ndr, int ndr_flags, struct spoolss_NotifyString *r)
 {
        uint32_t _ptr_string;
        TALLOC_CTX *_mem_save_string_0;
@@ -10155,177 +13914,46 @@ static enum ndr_err_code ndr_pull_spoolss_NotifyUTF16String(struct ndr_pull *ndr
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_NotifyUTF16String(struct ndr_print *ndr, const char *name, const struct spoolss_NotifyUTF16String *r)
-{
-       ndr_print_struct(ndr, name, "spoolss_NotifyUTF16String");
-       ndr->depth++;
-       ndr_print_uint32(ndr, "size", r->size);
-       ndr_print_ptr(ndr, "string", r->string);
-       ndr->depth++;
-       if (r->string) {
-               ndr_print_string(ndr, "string", r->string);
-       }
-       ndr->depth--;
-       ndr->depth--;
-}
-
-static enum ndr_err_code ndr_push_spoolss_NotifyDOSString(struct ndr_push *ndr, int ndr_flags, const struct spoolss_NotifyDOSString *r)
-{
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->size));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->string));
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               if (r->string) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->size));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->string, r->size, sizeof(uint8_t), CH_DOS));
-               }
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_spoolss_NotifyDOSString(struct ndr_pull *ndr, int ndr_flags, struct spoolss_NotifyDOSString *r)
-{
-       uint32_t _ptr_string;
-       TALLOC_CTX *_mem_save_string_0;
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->size));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_string));
-               if (_ptr_string) {
-                       NDR_PULL_ALLOC(ndr, r->string);
-               } else {
-                       r->string = NULL;
-               }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               if (r->string) {
-                       _mem_save_string_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->string, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->string));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->string, ndr_get_array_size(ndr, &r->string), sizeof(uint8_t), CH_DOS));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_string_0, 0);
-               }
-               if (r->string) {
-                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->string, r->size));
-               }
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_NotifyDOSString(struct ndr_print *ndr, const char *name, const struct spoolss_NotifyDOSString *r)
+_PUBLIC_ void ndr_print_spoolss_NotifyString(struct ndr_print *ndr, const char *name, const struct spoolss_NotifyString *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_NotifyDOSString");
+       ndr_print_struct(ndr, name, "spoolss_NotifyString");
        ndr->depth++;
        ndr_print_uint32(ndr, "size", r->size);
-       ndr_print_ptr(ndr, "string", r->string);
-       ndr->depth++;
-       if (r->string) {
-               ndr_print_string(ndr, "string", r->string);
-       }
-       ndr->depth--;
-       ndr->depth--;
-}
-
-static enum ndr_err_code ndr_push_spoolss_NotifyBlobData(struct ndr_push *ndr, int ndr_flags, const struct spoolss_NotifyBlobData *r)
-{
-       uint32_t cntr_data_0;
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_push_align(ndr, 2));
-               for (cntr_data_0 = 0; cntr_data_0 < 8; cntr_data_0++) {
-                       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->data[cntr_data_0]));
-               }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-static enum ndr_err_code ndr_pull_spoolss_NotifyBlobData(struct ndr_pull *ndr, int ndr_flags, struct spoolss_NotifyBlobData *r)
-{
-       uint32_t cntr_data_0;
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_align(ndr, 2));
-               for (cntr_data_0 = 0; cntr_data_0 < 8; cntr_data_0++) {
-                       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->data[cntr_data_0]));
-               }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-       }
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_NotifyBlobData(struct ndr_print *ndr, const char *name, const struct spoolss_NotifyBlobData *r)
-{
-       uint32_t cntr_data_0;
-       ndr_print_struct(ndr, name, "spoolss_NotifyBlobData");
-       ndr->depth++;
-       ndr->print(ndr, "%s: ARRAY(%d)", "data", (int)8);
+       ndr_print_ptr(ndr, "string", r->string);
        ndr->depth++;
-       for (cntr_data_0=0;cntr_data_0<8;cntr_data_0++) {
-               char *idx_0=NULL;
-               if (asprintf(&idx_0, "[%d]", cntr_data_0) != -1) {
-                       ndr_print_uint16(ndr, "data", r->data[cntr_data_0]);
-                       free(idx_0);
-               }
+       if (r->string) {
+               ndr_print_string(ndr, "string", r->string);
        }
        ndr->depth--;
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_NotifyBlob(struct ndr_push *ndr, int ndr_flags, const struct spoolss_NotifyBlob *r)
+static enum ndr_err_code ndr_push_spoolss_NotifyTable(struct ndr_push *ndr, int ndr_flags, enum spoolss_NotifyTable r)
 {
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->len));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->data));
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               if (r->data) {
-                       NDR_CHECK(ndr_push_spoolss_NotifyBlobData(ndr, NDR_SCALARS, r->data));
-               }
-       }
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_NotifyBlob(struct ndr_pull *ndr, int ndr_flags, struct spoolss_NotifyBlob *r)
+static enum ndr_err_code ndr_pull_spoolss_NotifyTable(struct ndr_pull *ndr, int ndr_flags, enum spoolss_NotifyTable *r)
 {
-       uint32_t _ptr_data;
-       TALLOC_CTX *_mem_save_data_0;
-       if (ndr_flags & NDR_SCALARS) {
-               NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->len));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data));
-               if (_ptr_data) {
-                       NDR_PULL_ALLOC(ndr, r->data);
-               } else {
-                       r->data = NULL;
-               }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               if (r->data) {
-                       _mem_save_data_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->data, 0);
-                       NDR_CHECK(ndr_pull_spoolss_NotifyBlobData(ndr, NDR_SCALARS, r->data));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_0, 0);
-               }
-       }
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_NotifyBlob(struct ndr_print *ndr, const char *name, const struct spoolss_NotifyBlob *r)
+_PUBLIC_ void ndr_print_spoolss_NotifyTable(struct ndr_print *ndr, const char *name, enum spoolss_NotifyTable r)
 {
-       ndr_print_struct(ndr, name, "spoolss_NotifyBlob");
-       ndr->depth++;
-       ndr_print_uint32(ndr, "len", r->len);
-       ndr_print_ptr(ndr, "data", r->data);
-       ndr->depth++;
-       if (r->data) {
-               ndr_print_spoolss_NotifyBlobData(ndr, "data", r->data);
+       const char *val = NULL;
+
+       switch (r) {
+               case NOTIFY_TABLE_DWORD: val = "NOTIFY_TABLE_DWORD"; break;
+               case NOTIFY_TABLE_STRING: val = "NOTIFY_TABLE_STRING"; break;
+               case NOTIFY_TABLE_DEVMODE: val = "NOTIFY_TABLE_DEVMODE"; break;
+               case NOTIFY_TABLE_TIME: val = "NOTIFY_TABLE_TIME"; break;
+               case NOTIFY_TABLE_SECURITYDESCRIPTOR: val = "NOTIFY_TABLE_SECURITYDESCRIPTOR"; break;
        }
-       ndr->depth--;
-       ndr->depth--;
+       ndr_print_enum(ndr, name, "ENUM", val, r);
 }
 
 static enum ndr_err_code ndr_push_spoolss_NotifyData(struct ndr_push *ndr, int ndr_flags, const union spoolss_NotifyData *r)
@@ -10335,23 +13963,26 @@ static enum ndr_err_code ndr_push_spoolss_NotifyData(struct ndr_push *ndr, int n
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, level));
                switch (level) {
                        case 1: {
-                               NDR_CHECK(ndr_push_dlong(ndr, NDR_SCALARS, r->integer));
+                               uint32_t cntr_integer_0;
+                               for (cntr_integer_0 = 0; cntr_integer_0 < 2; cntr_integer_0++) {
+                                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->integer[cntr_integer_0]));
+                               }
                        break; }
 
                        case 2: {
-                               NDR_CHECK(ndr_push_spoolss_NotifyUTF16String(ndr, NDR_SCALARS, &r->utf16_string));
+                               NDR_CHECK(ndr_push_spoolss_NotifyString(ndr, NDR_SCALARS, &r->string));
                        break; }
 
                        case 3: {
-                               NDR_CHECK(ndr_push_spoolss_NotifyDOSString(ndr, NDR_SCALARS, &r->ascii_string));
+                               NDR_CHECK(ndr_push_spoolss_DevmodeContainer(ndr, NDR_SCALARS, &r->devmode));
                        break; }
 
                        case 4: {
-                               NDR_CHECK(ndr_push_spoolss_NotifyBlob(ndr, NDR_SCALARS, &r->blob));
+                               NDR_CHECK(ndr_push_spoolss_TimeCtr(ndr, NDR_SCALARS, &r->time));
                        break; }
 
                        case 5: {
-                               NDR_CHECK(ndr_push_spoolss_NotifyDOSString(ndr, NDR_SCALARS, &r->ascii_string));
+                               NDR_CHECK(ndr_push_sec_desc_buf(ndr, NDR_SCALARS, &r->sd));
                        break; }
 
                        default:
@@ -10365,19 +13996,19 @@ static enum ndr_err_code ndr_push_spoolss_NotifyData(struct ndr_push *ndr, int n
                        break;
 
                        case 2:
-                               NDR_CHECK(ndr_push_spoolss_NotifyUTF16String(ndr, NDR_BUFFERS, &r->utf16_string));
+                               NDR_CHECK(ndr_push_spoolss_NotifyString(ndr, NDR_BUFFERS, &r->string));
                        break;
 
                        case 3:
-                               NDR_CHECK(ndr_push_spoolss_NotifyDOSString(ndr, NDR_BUFFERS, &r->ascii_string));
+                               NDR_CHECK(ndr_push_spoolss_DevmodeContainer(ndr, NDR_BUFFERS, &r->devmode));
                        break;
 
                        case 4:
-                               NDR_CHECK(ndr_push_spoolss_NotifyBlob(ndr, NDR_BUFFERS, &r->blob));
+                               NDR_CHECK(ndr_push_spoolss_TimeCtr(ndr, NDR_BUFFERS, &r->time));
                        break;
 
                        case 5:
-                               NDR_CHECK(ndr_push_spoolss_NotifyDOSString(ndr, NDR_BUFFERS, &r->ascii_string));
+                               NDR_CHECK(ndr_push_sec_desc_buf(ndr, NDR_BUFFERS, &r->sd));
                        break;
 
                        default:
@@ -10399,23 +14030,26 @@ static enum ndr_err_code ndr_pull_spoolss_NotifyData(struct ndr_pull *ndr, int n
                }
                switch (level) {
                        case 1: {
-                               NDR_CHECK(ndr_pull_dlong(ndr, NDR_SCALARS, &r->integer));
+                               uint32_t cntr_integer_0;
+                               for (cntr_integer_0 = 0; cntr_integer_0 < 2; cntr_integer_0++) {
+                                       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->integer[cntr_integer_0]));
+                               }
                        break; }
 
                        case 2: {
-                               NDR_CHECK(ndr_pull_spoolss_NotifyUTF16String(ndr, NDR_SCALARS, &r->utf16_string));
+                               NDR_CHECK(ndr_pull_spoolss_NotifyString(ndr, NDR_SCALARS, &r->string));
                        break; }
 
                        case 3: {
-                               NDR_CHECK(ndr_pull_spoolss_NotifyDOSString(ndr, NDR_SCALARS, &r->ascii_string));
+                               NDR_CHECK(ndr_pull_spoolss_DevmodeContainer(ndr, NDR_SCALARS, &r->devmode));
                        break; }
 
                        case 4: {
-                               NDR_CHECK(ndr_pull_spoolss_NotifyBlob(ndr, NDR_SCALARS, &r->blob));
+                               NDR_CHECK(ndr_pull_spoolss_TimeCtr(ndr, NDR_SCALARS, &r->time));
                        break; }
 
                        case 5: {
-                               NDR_CHECK(ndr_pull_spoolss_NotifyDOSString(ndr, NDR_SCALARS, &r->ascii_string));
+                               NDR_CHECK(ndr_pull_sec_desc_buf(ndr, NDR_SCALARS, &r->sd));
                        break; }
 
                        default:
@@ -10428,19 +14062,19 @@ static enum ndr_err_code ndr_pull_spoolss_NotifyData(struct ndr_pull *ndr, int n
                        break;
 
                        case 2:
-                               NDR_CHECK(ndr_pull_spoolss_NotifyUTF16String(ndr, NDR_BUFFERS, &r->utf16_string));
+                               NDR_CHECK(ndr_pull_spoolss_NotifyString(ndr, NDR_BUFFERS, &r->string));
                        break;
 
                        case 3:
-                               NDR_CHECK(ndr_pull_spoolss_NotifyDOSString(ndr, NDR_BUFFERS, &r->ascii_string));
+                               NDR_CHECK(ndr_pull_spoolss_DevmodeContainer(ndr, NDR_BUFFERS, &r->devmode));
                        break;
 
                        case 4:
-                               NDR_CHECK(ndr_pull_spoolss_NotifyBlob(ndr, NDR_BUFFERS, &r->blob));
+                               NDR_CHECK(ndr_pull_spoolss_TimeCtr(ndr, NDR_BUFFERS, &r->time));
                        break;
 
                        case 5:
-                               NDR_CHECK(ndr_pull_spoolss_NotifyDOSString(ndr, NDR_BUFFERS, &r->ascii_string));
+                               NDR_CHECK(ndr_pull_sec_desc_buf(ndr, NDR_BUFFERS, &r->sd));
                        break;
 
                        default:
@@ -10453,27 +14087,37 @@ static enum ndr_err_code ndr_pull_spoolss_NotifyData(struct ndr_pull *ndr, int n
 _PUBLIC_ void ndr_print_spoolss_NotifyData(struct ndr_print *ndr, const char *name, const union spoolss_NotifyData *r)
 {
        int level;
+       uint32_t cntr_integer_0;
        level = ndr_print_get_switch_value(ndr, r);
        ndr_print_union(ndr, name, level, "spoolss_NotifyData");
        switch (level) {
                case 1:
-                       ndr_print_dlong(ndr, "integer", r->integer);
+                       ndr->print(ndr, "%s: ARRAY(%d)", "integer", (int)2);
+                       ndr->depth++;
+                       for (cntr_integer_0=0;cntr_integer_0<2;cntr_integer_0++) {
+                               char *idx_0=NULL;
+                               if (asprintf(&idx_0, "[%d]", cntr_integer_0) != -1) {
+                                       ndr_print_uint32(ndr, "integer", r->integer[cntr_integer_0]);
+                                       free(idx_0);
+                               }
+                       }
+                       ndr->depth--;
                break;
 
                case 2:
-                       ndr_print_spoolss_NotifyUTF16String(ndr, "utf16_string", &r->utf16_string);
+                       ndr_print_spoolss_NotifyString(ndr, "string", &r->string);
                break;
 
                case 3:
-                       ndr_print_spoolss_NotifyDOSString(ndr, "ascii_string", &r->ascii_string);
+                       ndr_print_spoolss_DevmodeContainer(ndr, "devmode", &r->devmode);
                break;
 
                case 4:
-                       ndr_print_spoolss_NotifyBlob(ndr, "blob", &r->blob);
+                       ndr_print_spoolss_TimeCtr(ndr, "time", &r->time);
                break;
 
                case 5:
-                       ndr_print_spoolss_NotifyDOSString(ndr, "ascii_string", &r->ascii_string);
+                       ndr_print_sec_desc_buf(ndr, "sd", &r->sd);
                break;
 
                default:
@@ -10487,7 +14131,7 @@ static enum ndr_err_code ndr_push_spoolss_Notify(struct ndr_push *ndr, int ndr_f
                NDR_CHECK(ndr_push_align(ndr, 4));
                NDR_CHECK(ndr_push_spoolss_NotifyType(ndr, NDR_SCALARS, r->type));
                NDR_CHECK(ndr_push_spoolss_Field(ndr, NDR_SCALARS, r->field));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->variable_type));
+               NDR_CHECK(ndr_push_spoolss_NotifyTable(ndr, NDR_SCALARS, r->variable_type));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->job_id));
                NDR_CHECK(ndr_push_set_switch_value(ndr, &r->data, r->variable_type));
                NDR_CHECK(ndr_push_spoolss_NotifyData(ndr, NDR_SCALARS, &r->data));
@@ -10504,7 +14148,7 @@ static enum ndr_err_code ndr_pull_spoolss_Notify(struct ndr_pull *ndr, int ndr_f
                NDR_CHECK(ndr_pull_align(ndr, 4));
                NDR_CHECK(ndr_pull_spoolss_NotifyType(ndr, NDR_SCALARS, &r->type));
                NDR_CHECK(ndr_pull_spoolss_Field(ndr, NDR_SCALARS, &r->field));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->variable_type));
+               NDR_CHECK(ndr_pull_spoolss_NotifyTable(ndr, NDR_SCALARS, &r->variable_type));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->job_id));
                NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->data, r->variable_type));
                NDR_CHECK(ndr_pull_spoolss_NotifyData(ndr, NDR_SCALARS, &r->data));
@@ -10521,7 +14165,7 @@ _PUBLIC_ void ndr_print_spoolss_Notify(struct ndr_print *ndr, const char *name,
        ndr->depth++;
        ndr_print_spoolss_NotifyType(ndr, "type", r->type);
        ndr_print_spoolss_Field(ndr, "field", r->field);
-       ndr_print_uint32(ndr, "variable_type", r->variable_type);
+       ndr_print_spoolss_NotifyTable(ndr, "variable_type", r->variable_type);
        ndr_print_uint32(ndr, "job_id", r->job_id);
        ndr_print_set_switch_value(ndr, &r->data, r->variable_type);
        ndr_print_spoolss_NotifyData(ndr, "data", &r->data);
@@ -10534,7 +14178,7 @@ static enum ndr_err_code ndr_push_spoolss_NotifyInfo(struct ndr_push *ndr, int n
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
                NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->version));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 2));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->flags));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
                for (cntr_notifies_0 = 0; cntr_notifies_0 < r->count; cntr_notifies_0++) {
@@ -10586,7 +14230,7 @@ _PUBLIC_ void ndr_print_spoolss_NotifyInfo(struct ndr_print *ndr, const char *na
        uint32_t cntr_notifies_0;
        ndr_print_struct(ndr, name, "spoolss_NotifyInfo");
        ndr->depth++;
-       ndr_print_uint32(ndr, "version", r->version);
+       ndr_print_uint32(ndr, "version", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?2:r->version);
        ndr_print_uint32(ndr, "flags", r->flags);
        ndr_print_uint32(ndr, "count", r->count);
        ndr->print(ndr, "%s: ARRAY(%d)", "notifies", (int)r->count);
@@ -10598,21 +14242,280 @@ _PUBLIC_ void ndr_print_spoolss_NotifyInfo(struct ndr_print *ndr, const char *na
                        free(idx_0);
                }
        }
-       ndr->depth--;
+       ndr->depth--;
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_ReplyPrinterInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_ReplyPrinterInfo *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               int level = ndr_push_get_switch_value(ndr, r);
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, level));
+               switch (level) {
+                       case 0: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->info0));
+                       break; }
+
+                       default:
+                               return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               int level = ndr_push_get_switch_value(ndr, r);
+               switch (level) {
+                       case 0:
+                               if (r->info0) {
+                                       NDR_CHECK(ndr_push_spoolss_NotifyInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info0));
+                               }
+                       break;
+
+                       default:
+                               return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_ReplyPrinterInfo(struct ndr_pull *ndr, int ndr_flags, union spoolss_ReplyPrinterInfo *r)
+{
+       int level;
+       uint32_t _level;
+       TALLOC_CTX *_mem_save_info0_0;
+       level = ndr_pull_get_switch_value(ndr, r);
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &_level));
+               if (_level != level) {
+                       return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u for r", _level);
+               }
+               switch (level) {
+                       case 0: {
+                               uint32_t _ptr_info0;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info0));
+                               if (_ptr_info0) {
+                                       NDR_PULL_ALLOC(ndr, r->info0);
+                               } else {
+                                       r->info0 = NULL;
+                               }
+                       break; }
+
+                       default:
+                               return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               switch (level) {
+                       case 0:
+                               if (r->info0) {
+                                       _mem_save_info0_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->info0, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_NotifyInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info0));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info0_0, 0);
+                               }
+                       break;
+
+                       default:
+                               return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_ReplyPrinterInfo(struct ndr_print *ndr, const char *name, const union spoolss_ReplyPrinterInfo *r)
+{
+       int level;
+       level = ndr_print_get_switch_value(ndr, r);
+       ndr_print_union(ndr, name, level, "spoolss_ReplyPrinterInfo");
+       switch (level) {
+               case 0:
+                       ndr_print_ptr(ndr, "info0", r->info0);
+                       ndr->depth++;
+                       if (r->info0) {
+                               ndr_print_spoolss_NotifyInfo(ndr, "info0", r->info0);
+                       }
+                       ndr->depth--;
+               break;
+
+               default:
+                       ndr_print_bad_level(ndr, name, level);
+       }
+}
+
+static enum ndr_err_code ndr_push_spoolss_PrinterNotifyFlags(struct ndr_push *ndr, int ndr_flags, uint32_t r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_PrinterNotifyFlags(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_PrinterNotifyFlags(struct ndr_print *ndr, const char *name, uint32_t r)
+{
+       ndr_print_uint32(ndr, name, r);
+       ndr->depth++;
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_NOTIFY_INFO_DISCARDED", PRINTER_NOTIFY_INFO_DISCARDED, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_NOTIFY_INFO_DISCARDNOTED", PRINTER_NOTIFY_INFO_DISCARDNOTED, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_NOTIFY_INFO_COLOR_MISMATCH", PRINTER_NOTIFY_INFO_COLOR_MISMATCH, r);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_UserLevel1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_UserLevel1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->size));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->client));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->user));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->build));
+               NDR_CHECK(ndr_push_spoolss_MajorVersion(ndr, NDR_SCALARS, r->major));
+               NDR_CHECK(ndr_push_spoolss_MinorVersion(ndr, NDR_SCALARS, r->minor));
+               NDR_CHECK(ndr_push_spoolss_ProcessorArchitecture(ndr, NDR_SCALARS, r->processor));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->client) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->client, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->client, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->client, ndr_charset_length(r->client, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->user) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->user, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->user, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->user, ndr_charset_length(r->user, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_UserLevel1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_UserLevel1 *r)
+{
+       uint32_t _ptr_client;
+       TALLOC_CTX *_mem_save_client_0;
+       uint32_t _ptr_user;
+       TALLOC_CTX *_mem_save_user_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->size));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_client));
+               if (_ptr_client) {
+                       NDR_PULL_ALLOC(ndr, r->client);
+               } else {
+                       r->client = NULL;
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_user));
+               if (_ptr_user) {
+                       NDR_PULL_ALLOC(ndr, r->user);
+               } else {
+                       r->user = NULL;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->build));
+               NDR_CHECK(ndr_pull_spoolss_MajorVersion(ndr, NDR_SCALARS, &r->major));
+               NDR_CHECK(ndr_pull_spoolss_MinorVersion(ndr, NDR_SCALARS, &r->minor));
+               NDR_CHECK(ndr_pull_spoolss_ProcessorArchitecture(ndr, NDR_SCALARS, &r->processor));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->client) {
+                       _mem_save_client_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->client, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->client));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->client));
+                       if (ndr_get_array_length(ndr, &r->client) > ndr_get_array_size(ndr, &r->client)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->client), ndr_get_array_length(ndr, &r->client));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->client), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->client, ndr_get_array_length(ndr, &r->client), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_client_0, 0);
+               }
+               if (r->user) {
+                       _mem_save_user_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->user, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->user));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->user));
+                       if (ndr_get_array_length(ndr, &r->user) > ndr_get_array_size(ndr, &r->user)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->user), ndr_get_array_length(ndr, &r->user));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->user), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->user, ndr_get_array_length(ndr, &r->user), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user_0, 0);
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_UserLevel1(struct ndr_print *ndr, const char *name, const struct spoolss_UserLevel1 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_UserLevel1");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "size", r->size);
+       ndr_print_ptr(ndr, "client", r->client);
+       ndr->depth++;
+       if (r->client) {
+               ndr_print_string(ndr, "client", r->client);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "user", r->user);
+       ndr->depth++;
+       if (r->user) {
+               ndr_print_string(ndr, "user", r->user);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "build", r->build);
+       ndr_print_spoolss_MajorVersion(ndr, "major", r->major);
+       ndr_print_spoolss_MinorVersion(ndr, "minor", r->minor);
+       ndr_print_spoolss_ProcessorArchitecture(ndr, "processor", r->processor);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_UserLevel2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_UserLevel2 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->not_used));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_UserLevel2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_UserLevel2 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->not_used));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_UserLevel2(struct ndr_print *ndr, const char *name, const struct spoolss_UserLevel2 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_UserLevel2");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "not_used", r->not_used);
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_UserLevel1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_UserLevel1 *r)
+static enum ndr_err_code ndr_push_spoolss_UserLevel3(struct ndr_push *ndr, int ndr_flags, const struct spoolss_UserLevel3 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->size));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->flags));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->size2));
                NDR_CHECK(ndr_push_unique_ptr(ndr, r->client));
                NDR_CHECK(ndr_push_unique_ptr(ndr, r->user));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->build));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->major));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->minor));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->processor));
+               NDR_CHECK(ndr_push_spoolss_MajorVersion(ndr, NDR_SCALARS, r->major));
+               NDR_CHECK(ndr_push_spoolss_MinorVersion(ndr, NDR_SCALARS, r->minor));
+               NDR_CHECK(ndr_push_spoolss_ProcessorArchitecture(ndr, NDR_SCALARS, r->processor));
+               NDR_CHECK(ndr_push_udlong(ndr, NDR_SCALARS, r->reserved));
        }
        if (ndr_flags & NDR_BUFFERS) {
                if (r->client) {
@@ -10631,7 +14534,7 @@ static enum ndr_err_code ndr_push_spoolss_UserLevel1(struct ndr_push *ndr, int n
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_UserLevel1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_UserLevel1 *r)
+static enum ndr_err_code ndr_pull_spoolss_UserLevel3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_UserLevel3 *r)
 {
        uint32_t _ptr_client;
        TALLOC_CTX *_mem_save_client_0;
@@ -10640,6 +14543,8 @@ static enum ndr_err_code ndr_pull_spoolss_UserLevel1(struct ndr_pull *ndr, int n
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->size));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->flags));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->size2));
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_client));
                if (_ptr_client) {
                        NDR_PULL_ALLOC(ndr, r->client);
@@ -10653,9 +14558,10 @@ static enum ndr_err_code ndr_pull_spoolss_UserLevel1(struct ndr_pull *ndr, int n
                        r->user = NULL;
                }
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->build));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->major));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->minor));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->processor));
+               NDR_CHECK(ndr_pull_spoolss_MajorVersion(ndr, NDR_SCALARS, &r->major));
+               NDR_CHECK(ndr_pull_spoolss_MinorVersion(ndr, NDR_SCALARS, &r->minor));
+               NDR_CHECK(ndr_pull_spoolss_ProcessorArchitecture(ndr, NDR_SCALARS, &r->processor));
+               NDR_CHECK(ndr_pull_udlong(ndr, NDR_SCALARS, &r->reserved));
        }
        if (ndr_flags & NDR_BUFFERS) {
                if (r->client) {
@@ -10686,11 +14592,13 @@ static enum ndr_err_code ndr_pull_spoolss_UserLevel1(struct ndr_pull *ndr, int n
        return NDR_ERR_SUCCESS;
 }
 
-_PUBLIC_ void ndr_print_spoolss_UserLevel1(struct ndr_print *ndr, const char *name, const struct spoolss_UserLevel1 *r)
+_PUBLIC_ void ndr_print_spoolss_UserLevel3(struct ndr_print *ndr, const char *name, const struct spoolss_UserLevel3 *r)
 {
-       ndr_print_struct(ndr, name, "spoolss_UserLevel1");
+       ndr_print_struct(ndr, name, "spoolss_UserLevel3");
        ndr->depth++;
        ndr_print_uint32(ndr, "size", r->size);
+       ndr_print_uint32(ndr, "flags", r->flags);
+       ndr_print_uint32(ndr, "size2", r->size2);
        ndr_print_ptr(ndr, "client", r->client);
        ndr->depth++;
        if (r->client) {
@@ -10704,9 +14612,10 @@ _PUBLIC_ void ndr_print_spoolss_UserLevel1(struct ndr_print *ndr, const char *na
        }
        ndr->depth--;
        ndr_print_uint32(ndr, "build", r->build);
-       ndr_print_uint32(ndr, "major", r->major);
-       ndr_print_uint32(ndr, "minor", r->minor);
-       ndr_print_uint32(ndr, "processor", r->processor);
+       ndr_print_spoolss_MajorVersion(ndr, "major", r->major);
+       ndr_print_spoolss_MinorVersion(ndr, "minor", r->minor);
+       ndr_print_spoolss_ProcessorArchitecture(ndr, "processor", r->processor);
+       ndr_print_udlong(ndr, "reserved", r->reserved);
        ndr->depth--;
 }
 
@@ -10720,6 +14629,14 @@ static enum ndr_err_code ndr_push_spoolss_UserLevel(struct ndr_push *ndr, int nd
                                NDR_CHECK(ndr_push_unique_ptr(ndr, r->level1));
                        break; }
 
+                       case 2: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->level2));
+                       break; }
+
+                       case 3: {
+                               NDR_CHECK(ndr_push_unique_ptr(ndr, r->level3));
+                       break; }
+
                        default:
                                return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
                }
@@ -10733,6 +14650,18 @@ static enum ndr_err_code ndr_push_spoolss_UserLevel(struct ndr_push *ndr, int nd
                                }
                        break;
 
+                       case 2:
+                               if (r->level2) {
+                                       NDR_CHECK(ndr_push_spoolss_UserLevel2(ndr, NDR_SCALARS, r->level2));
+                               }
+                       break;
+
+                       case 3:
+                               if (r->level3) {
+                                       NDR_CHECK(ndr_push_spoolss_UserLevel3(ndr, NDR_SCALARS|NDR_BUFFERS, r->level3));
+                               }
+                       break;
+
                        default:
                                return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
                }
@@ -10745,6 +14674,8 @@ static enum ndr_err_code ndr_pull_spoolss_UserLevel(struct ndr_pull *ndr, int nd
        int level;
        uint32_t _level;
        TALLOC_CTX *_mem_save_level1_0;
+       TALLOC_CTX *_mem_save_level2_0;
+       TALLOC_CTX *_mem_save_level3_0;
        level = ndr_pull_get_switch_value(ndr, r);
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &_level));
@@ -10762,6 +14693,26 @@ static enum ndr_err_code ndr_pull_spoolss_UserLevel(struct ndr_pull *ndr, int nd
                                }
                        break; }
 
+                       case 2: {
+                               uint32_t _ptr_level2;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_level2));
+                               if (_ptr_level2) {
+                                       NDR_PULL_ALLOC(ndr, r->level2);
+                               } else {
+                                       r->level2 = NULL;
+                               }
+                       break; }
+
+                       case 3: {
+                               uint32_t _ptr_level3;
+                               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_level3));
+                               if (_ptr_level3) {
+                                       NDR_PULL_ALLOC(ndr, r->level3);
+                               } else {
+                                       r->level3 = NULL;
+                               }
+                       break; }
+
                        default:
                                return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
                }
@@ -10777,6 +14728,24 @@ static enum ndr_err_code ndr_pull_spoolss_UserLevel(struct ndr_pull *ndr, int nd
                                }
                        break;
 
+                       case 2:
+                               if (r->level2) {
+                                       _mem_save_level2_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->level2, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_UserLevel2(ndr, NDR_SCALARS, r->level2));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_level2_0, 0);
+                               }
+                       break;
+
+                       case 3:
+                               if (r->level3) {
+                                       _mem_save_level3_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                                       NDR_PULL_SET_MEM_CTX(ndr, r->level3, 0);
+                                       NDR_CHECK(ndr_pull_spoolss_UserLevel3(ndr, NDR_SCALARS|NDR_BUFFERS, r->level3));
+                                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_level3_0, 0);
+                               }
+                       break;
+
                        default:
                                return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
                }
@@ -10799,11 +14768,93 @@ _PUBLIC_ void ndr_print_spoolss_UserLevel(struct ndr_print *ndr, const char *nam
                        ndr->depth--;
                break;
 
+               case 2:
+                       ndr_print_ptr(ndr, "level2", r->level2);
+                       ndr->depth++;
+                       if (r->level2) {
+                               ndr_print_spoolss_UserLevel2(ndr, "level2", r->level2);
+                       }
+                       ndr->depth--;
+               break;
+
+               case 3:
+                       ndr_print_ptr(ndr, "level3", r->level3);
+                       ndr->depth++;
+                       if (r->level3) {
+                               ndr_print_spoolss_UserLevel3(ndr, "level3", r->level3);
+                       }
+                       ndr->depth--;
+               break;
+
                default:
                        ndr_print_bad_level(ndr, name, level);
        }
 }
 
+static enum ndr_err_code ndr_push_spoolss_UserLevelCtr(struct ndr_push *ndr, int ndr_flags, const struct spoolss_UserLevelCtr *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->level));
+               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->user_info, r->level));
+               NDR_CHECK(ndr_push_spoolss_UserLevel(ndr, NDR_SCALARS, &r->user_info));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               NDR_CHECK(ndr_push_spoolss_UserLevel(ndr, NDR_BUFFERS, &r->user_info));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_UserLevelCtr(struct ndr_pull *ndr, int ndr_flags, struct spoolss_UserLevelCtr *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->level));
+               NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->user_info, r->level));
+               NDR_CHECK(ndr_pull_spoolss_UserLevel(ndr, NDR_SCALARS, &r->user_info));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               NDR_CHECK(ndr_pull_spoolss_UserLevel(ndr, NDR_BUFFERS, &r->user_info));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_UserLevelCtr(struct ndr_print *ndr, const char *name, const struct spoolss_UserLevelCtr *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_UserLevelCtr");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "level", r->level);
+       ndr_print_set_switch_value(ndr, &r->user_info, r->level);
+       ndr_print_spoolss_UserLevel(ndr, "user_info", &r->user_info);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_AccessRights(struct ndr_push *ndr, int ndr_flags, uint32_t r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_AccessRights(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_AccessRights(struct ndr_print *ndr, const char *name, uint32_t r)
+{
+       ndr_print_uint32(ndr, name, r);
+       ndr->depth++;
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SERVER_ACCESS_ADMINISTER", SERVER_ACCESS_ADMINISTER, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "SERVER_ACCESS_ENUMERATE", SERVER_ACCESS_ENUMERATE, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_ACCESS_ADMINISTER", PRINTER_ACCESS_ADMINISTER, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "PRINTER_ACCESS_USE", PRINTER_ACCESS_USE, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "JOB_ACCESS_ADMINISTER", JOB_ACCESS_ADMINISTER, r);
+       ndr->depth--;
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DeleteDriverFlags(struct ndr_push *ndr, int ndr_flags, uint32_t r)
 {
        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
@@ -10828,6 +14879,212 @@ _PUBLIC_ void ndr_print_spoolss_DeleteDriverFlags(struct ndr_print *ndr, const c
        ndr->depth--;
 }
 
+static enum ndr_err_code ndr_push_spoolss_PortProtocol(struct ndr_push *ndr, int ndr_flags, enum spoolss_PortProtocol r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_PortProtocol(struct ndr_pull *ndr, int ndr_flags, enum spoolss_PortProtocol *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_PortProtocol(struct ndr_print *ndr, const char *name, enum spoolss_PortProtocol r)
+{
+       const char *val = NULL;
+
+       switch (r) {
+               case PROTOCOL_RAWTCP_TYPE: val = "PROTOCOL_RAWTCP_TYPE"; break;
+               case PROTOCOL_LPR_TYPE: val = "PROTOCOL_LPR_TYPE"; break;
+       }
+       ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortData1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortData1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->portname, 64, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0x00000001));
+               NDR_CHECK(ndr_push_spoolss_PortProtocol(ndr, NDR_SCALARS, r->protocol));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, sizeof(r)));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->reserved));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->hostaddress, 49, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->snmpcommunity, 33, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->dblspool));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->queue, 33, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->ip_address, 16, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->hardware_address, 13, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->device_type, 257, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->port_number));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->snmp_enabled));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->snmp_dev_index));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortData1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortData1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->portname, 64, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->version));
+               NDR_CHECK(ndr_pull_spoolss_PortProtocol(ndr, NDR_SCALARS, &r->protocol));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->size));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->reserved));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->hostaddress, 49, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->snmpcommunity, 33, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->dblspool));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->queue, 33, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->ip_address, 16, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->hardware_address, 13, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->device_type, 257, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->port_number));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->snmp_enabled));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->snmp_dev_index));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_PortData1(struct ndr_print *ndr, const char *name, const struct spoolss_PortData1 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_PortData1");
+       ndr->depth++;
+       ndr_print_string(ndr, "portname", r->portname);
+       ndr_print_uint32(ndr, "version", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?0x00000001:r->version);
+       ndr_print_spoolss_PortProtocol(ndr, "protocol", r->protocol);
+       ndr_print_uint32(ndr, "size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?sizeof(r):r->size);
+       ndr_print_uint32(ndr, "reserved", r->reserved);
+       ndr_print_string(ndr, "hostaddress", r->hostaddress);
+       ndr_print_string(ndr, "snmpcommunity", r->snmpcommunity);
+       ndr_print_uint32(ndr, "dblspool", r->dblspool);
+       ndr_print_string(ndr, "queue", r->queue);
+       ndr_print_string(ndr, "ip_address", r->ip_address);
+       ndr_print_string(ndr, "hardware_address", r->hardware_address);
+       ndr_print_string(ndr, "device_type", r->device_type);
+       ndr_print_uint32(ndr, "port_number", r->port_number);
+       ndr_print_uint32(ndr, "snmp_enabled", r->snmp_enabled);
+       ndr_print_uint32(ndr, "snmp_dev_index", r->snmp_dev_index);
+       ndr->depth--;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortData2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PortData2 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->portname, 64, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0x00000002));
+               NDR_CHECK(ndr_push_spoolss_PortProtocol(ndr, NDR_SCALARS, r->protocol));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, sizeof(r)));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->reserved));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->hostaddress, 128, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->snmpcommunity, 33, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->dblspool));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->queue, 33, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->device_type, 257, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->port_number));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->snmp_enabled));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->snmp_dev_index));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->port_monitor_mib_index));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortData2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PortData2 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->portname, 64, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->version));
+               NDR_CHECK(ndr_pull_spoolss_PortProtocol(ndr, NDR_SCALARS, &r->protocol));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->size));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->reserved));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->hostaddress, 128, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->snmpcommunity, 33, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->dblspool));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->queue, 33, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->device_type, 257, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->port_number));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->snmp_enabled));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->snmp_dev_index));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->port_monitor_mib_index));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_PortData2(struct ndr_print *ndr, const char *name, const struct spoolss_PortData2 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_PortData2");
+       ndr->depth++;
+       ndr_print_string(ndr, "portname", r->portname);
+       ndr_print_uint32(ndr, "version", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?0x00000002:r->version);
+       ndr_print_spoolss_PortProtocol(ndr, "protocol", r->protocol);
+       ndr_print_uint32(ndr, "size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?sizeof(r):r->size);
+       ndr_print_uint32(ndr, "reserved", r->reserved);
+       ndr_print_string(ndr, "hostaddress", r->hostaddress);
+       ndr_print_string(ndr, "snmpcommunity", r->snmpcommunity);
+       ndr_print_uint32(ndr, "dblspool", r->dblspool);
+       ndr_print_string(ndr, "queue", r->queue);
+       ndr_print_string(ndr, "device_type", r->device_type);
+       ndr_print_uint32(ndr, "port_number", r->port_number);
+       ndr_print_uint32(ndr, "snmp_enabled", r->snmp_enabled);
+       ndr_print_uint32(ndr, "snmp_dev_index", r->snmp_dev_index);
+       ndr_print_uint32(ndr, "port_monitor_mib_index", r->port_monitor_mib_index);
+       ndr->depth--;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorUi(struct ndr_push *ndr, int ndr_flags, const struct spoolss_MonitorUi *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->dll_name));
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorUi(struct ndr_pull *ndr, int ndr_flags, struct spoolss_MonitorUi *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->dll_name));
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_MonitorUi(struct ndr_print *ndr, const char *name, const struct spoolss_MonitorUi *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_MonitorUi");
+       ndr->depth++;
+       ndr_print_string(ndr, "dll_name", r->dll_name);
+       ndr->depth--;
+}
+
 static enum ndr_err_code ndr_push_spoolss_AddPrinterDriverExFlags(struct ndr_push *ndr, int ndr_flags, uint32_t r)
 {
        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
@@ -10884,7 +15141,10 @@ _PUBLIC_ enum ndr_err_code ndr_push__spoolss_EnumPrinters(struct ndr_push *ndr,
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.count));
+               if (r->out.count == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -10899,6 +15159,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrinters(struct ndr_pull *ndr,
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
        TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_count_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -10937,6 +15198,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrinters(struct ndr_pull *ndr,
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
                NDR_PULL_ALLOC(ndr, r->out.needed);
                ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.count);
+               ZERO_STRUCTP(r->out.count);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -10958,7 +15221,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrinters(struct ndr_pull *ndr,
                NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.count));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.count);
+               }
+               _mem_save_count_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.count, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.count));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -11040,12 +15309,16 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinters(struct ndr_print *ndr, const char *
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumPrinters");
                ndr->depth++;
+               ndr_print_ptr(ndr, "count", r->out.count);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "count", *r->out.count);
+               ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
                if (r->out.info) {
-                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)r->out.count);
+                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<r->out.count;cntr_info_1++) {
+                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
                                char *idx_1=NULL;
                                if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
                                        ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
@@ -11060,7 +15333,6 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinters(struct ndr_print *ndr, const char *
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
                ndr->depth--;
-               ndr_print_uint32(ndr, "count", r->out.count);
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -11085,7 +15357,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_OpenPrinter(struct ndr_push *ndr, in
                        NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.datatype, ndr_charset_length(r->in.datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
                NDR_CHECK(ndr_push_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.devmode_ctr));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.access_mask));
+               NDR_CHECK(ndr_push_spoolss_AccessRights(ndr, NDR_SCALARS, r->in.access_mask));
        }
        if (flags & NDR_OUT) {
                if (r->out.handle == NULL) {
@@ -11144,7 +15416,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_OpenPrinter(struct ndr_pull *ndr, in
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_datatype_0, 0);
                }
                NDR_CHECK(ndr_pull_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.devmode_ctr));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.access_mask));
+               NDR_CHECK(ndr_pull_spoolss_AccessRights(ndr, NDR_SCALARS, &r->in.access_mask));
                NDR_PULL_ALLOC(ndr, r->out.handle);
                ZERO_STRUCTP(r->out.handle);
        }
@@ -11184,7 +15456,7 @@ _PUBLIC_ void ndr_print_spoolss_OpenPrinter(struct ndr_print *ndr, const char *n
                }
                ndr->depth--;
                ndr_print_spoolss_DevmodeContainer(ndr, "devmode_ctr", &r->in.devmode_ctr);
-               ndr_print_uint32(ndr, "access_mask", r->in.access_mask);
+               ndr_print_spoolss_AccessRights(ndr, "access_mask", r->in.access_mask);
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
@@ -11459,7 +15731,10 @@ _PUBLIC_ enum ndr_err_code ndr_push__spoolss_EnumJobs(struct ndr_push *ndr, int
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.count));
+               if (r->out.count == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -11473,6 +15748,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumJobs(struct ndr_pull *ndr, int
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
        TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_count_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -11501,6 +15777,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumJobs(struct ndr_pull *ndr, int
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
                NDR_PULL_ALLOC(ndr, r->out.needed);
                ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.count);
+               ZERO_STRUCTP(r->out.count);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -11522,7 +15800,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumJobs(struct ndr_pull *ndr, int
                NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.count));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.count);
+               }
+               _mem_save_count_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.count, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.count));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -11603,12 +15887,16 @@ _PUBLIC_ void ndr_print_spoolss_EnumJobs(struct ndr_print *ndr, const char *name
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumJobs");
                ndr->depth++;
+               ndr_print_ptr(ndr, "count", r->out.count);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "count", *r->out.count);
+               ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
                if (r->out.info) {
-                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)r->out.count);
+                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<r->out.count;cntr_info_1++) {
+                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
                                char *idx_1=NULL;
                                if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
                                        ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
@@ -11623,7 +15911,6 @@ _PUBLIC_ void ndr_print_spoolss_EnumJobs(struct ndr_print *ndr, const char *name
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
                ndr->depth--;
-               ndr_print_uint32(ndr, "count", r->out.count);
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -11735,11 +16022,18 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinter(struct ndr_push *ndr, int f
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS, r->in.handle));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.level));
-               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->in.info, r->in.level));
-               NDR_CHECK(ndr_push_spoolss_SetPrinterInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
-               NDR_CHECK(ndr_push_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.devmode_ctr));
-               NDR_CHECK(ndr_push_sec_desc_buf(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.secdesc_ctr));
+               if (r->in.info_ctr == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_spoolss_SetPrinterInfoCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info_ctr));
+               if (r->in.devmode_ctr == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.devmode_ctr));
+               if (r->in.secdesc_ctr == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_sec_desc_buf(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.secdesc_ctr));
                NDR_CHECK(ndr_push_spoolss_PrinterControl(ndr, NDR_SCALARS, r->in.command));
        }
        if (flags & NDR_OUT) {
@@ -11751,6 +16045,9 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinter(struct ndr_push *ndr, int f
 static enum ndr_err_code ndr_pull_spoolss_SetPrinter(struct ndr_pull *ndr, int flags, struct spoolss_SetPrinter *r)
 {
        TALLOC_CTX *_mem_save_handle_0;
+       TALLOC_CTX *_mem_save_info_ctr_0;
+       TALLOC_CTX *_mem_save_devmode_ctr_0;
+       TALLOC_CTX *_mem_save_secdesc_ctr_0;
        if (flags & NDR_IN) {
                if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
                        NDR_PULL_ALLOC(ndr, r->in.handle);
@@ -11759,11 +16056,27 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinter(struct ndr_pull *ndr, int f
                NDR_PULL_SET_MEM_CTX(ndr, r->in.handle, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS, r->in.handle));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_handle_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.level));
-               NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->in.info, r->in.level));
-               NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
-               NDR_CHECK(ndr_pull_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.devmode_ctr));
-               NDR_CHECK(ndr_pull_sec_desc_buf(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.secdesc_ctr));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.info_ctr);
+               }
+               _mem_save_info_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.info_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_spoolss_SetPrinterInfoCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_ctr_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.devmode_ctr);
+               }
+               _mem_save_devmode_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.devmode_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.devmode_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_ctr_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.secdesc_ctr);
+               }
+               _mem_save_secdesc_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.secdesc_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_sec_desc_buf(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.secdesc_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_ctr_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_spoolss_PrinterControl(ndr, NDR_SCALARS, &r->in.command));
        }
        if (flags & NDR_OUT) {
@@ -11786,11 +16099,18 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinter(struct ndr_print *ndr, const char *na
                ndr->depth++;
                ndr_print_policy_handle(ndr, "handle", r->in.handle);
                ndr->depth--;
-               ndr_print_uint32(ndr, "level", r->in.level);
-               ndr_print_set_switch_value(ndr, &r->in.info, r->in.level);
-               ndr_print_spoolss_SetPrinterInfo(ndr, "info", &r->in.info);
-               ndr_print_spoolss_DevmodeContainer(ndr, "devmode_ctr", &r->in.devmode_ctr);
-               ndr_print_sec_desc_buf(ndr, "secdesc_ctr", &r->in.secdesc_ctr);
+               ndr_print_ptr(ndr, "info_ctr", r->in.info_ctr);
+               ndr->depth++;
+               ndr_print_spoolss_SetPrinterInfoCtr(ndr, "info_ctr", r->in.info_ctr);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "devmode_ctr", r->in.devmode_ctr);
+               ndr->depth++;
+               ndr_print_spoolss_DevmodeContainer(ndr, "devmode_ctr", r->in.devmode_ctr);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "secdesc_ctr", r->in.secdesc_ctr);
+               ndr->depth++;
+               ndr_print_sec_desc_buf(ndr, "secdesc_ctr", r->in.secdesc_ctr);
+               ndr->depth--;
                ndr_print_spoolss_PrinterControl(ndr, "command", r->in.command);
                ndr->depth--;
        }
@@ -11950,16 +16270,17 @@ _PUBLIC_ void ndr_print_spoolss_GetPrinter(struct ndr_print *ndr, const char *na
 static enum ndr_err_code ndr_push_spoolss_AddPrinterDriver(struct ndr_push *ndr, int flags, const struct spoolss_AddPrinterDriver *r)
 {
        if (flags & NDR_IN) {
-               if (r->in.servername == NULL) {
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.servername));
+               if (r->in.servername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.servername, ndr_charset_length(r->in.servername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->in.info_ctr == NULL) {
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
-               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.servername, ndr_charset_length(r->in.servername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.level));
-               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->in.info, r->in.level));
-               NDR_CHECK(ndr_push_spoolss_AddDriverInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
+               NDR_CHECK(ndr_push_spoolss_AddDriverInfoCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info_ctr));
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
@@ -11969,17 +16290,35 @@ static enum ndr_err_code ndr_push_spoolss_AddPrinterDriver(struct ndr_push *ndr,
 
 static enum ndr_err_code ndr_pull_spoolss_AddPrinterDriver(struct ndr_pull *ndr, int flags, struct spoolss_AddPrinterDriver *r)
 {
+       uint32_t _ptr_servername;
+       TALLOC_CTX *_mem_save_servername_0;
+       TALLOC_CTX *_mem_save_info_ctr_0;
        if (flags & NDR_IN) {
-               NDR_CHECK(ndr_pull_array_size(ndr, &r->in.servername));
-               NDR_CHECK(ndr_pull_array_length(ndr, &r->in.servername));
-               if (ndr_get_array_length(ndr, &r->in.servername) > ndr_get_array_size(ndr, &r->in.servername)) {
-                       return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.servername), ndr_get_array_length(ndr, &r->in.servername));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_servername));
+               if (_ptr_servername) {
+                       NDR_PULL_ALLOC(ndr, r->in.servername);
+               } else {
+                       r->in.servername = NULL;
                }
-               NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t)));
-               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.servername, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t), CH_UTF16));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.level));
-               NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->in.info, r->in.level));
-               NDR_CHECK(ndr_pull_spoolss_AddDriverInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
+               if (r->in.servername) {
+                       _mem_save_servername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.servername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.servername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->in.servername));
+                       if (ndr_get_array_length(ndr, &r->in.servername) > ndr_get_array_size(ndr, &r->in.servername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.servername), ndr_get_array_length(ndr, &r->in.servername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.servername, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_servername_0, 0);
+               }
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.info_ctr);
+               }
+               _mem_save_info_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.info_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_spoolss_AddDriverInfoCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_ctr_0, LIBNDR_FLAG_REF_ALLOC);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
@@ -11999,11 +16338,14 @@ _PUBLIC_ void ndr_print_spoolss_AddPrinterDriver(struct ndr_print *ndr, const ch
                ndr->depth++;
                ndr_print_ptr(ndr, "servername", r->in.servername);
                ndr->depth++;
-               ndr_print_string(ndr, "servername", r->in.servername);
+               if (r->in.servername) {
+                       ndr_print_string(ndr, "servername", r->in.servername);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "info_ctr", r->in.info_ctr);
+               ndr->depth++;
+               ndr_print_spoolss_AddDriverInfoCtr(ndr, "info_ctr", r->in.info_ctr);
                ndr->depth--;
-               ndr_print_uint32(ndr, "level", r->in.level);
-               ndr_print_set_switch_value(ndr, &r->in.info, r->in.level);
-               ndr_print_spoolss_AddDriverInfo(ndr, "info", &r->in.info);
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
@@ -12048,7 +16390,10 @@ _PUBLIC_ enum ndr_err_code ndr_push__spoolss_EnumPrinterDrivers(struct ndr_push
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.count));
+               if (r->out.count == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -12065,6 +16410,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrinterDrivers(struct ndr_pull
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
        TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_count_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -12120,6 +16466,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrinterDrivers(struct ndr_pull
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
                NDR_PULL_ALLOC(ndr, r->out.needed);
                ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.count);
+               ZERO_STRUCTP(r->out.count);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -12141,7 +16489,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrinterDrivers(struct ndr_pull
                NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.count));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.count);
+               }
+               _mem_save_count_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.count, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.count));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -12228,12 +16582,16 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterDrivers(struct ndr_print *ndr, const
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumPrinterDrivers");
                ndr->depth++;
+               ndr_print_ptr(ndr, "count", r->out.count);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "count", *r->out.count);
+               ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
                if (r->out.info) {
-                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)r->out.count);
+                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<r->out.count;cntr_info_1++) {
+                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
                                char *idx_1=NULL;
                                if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
                                        ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
@@ -12248,7 +16606,6 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterDrivers(struct ndr_print *ndr, const
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
                ndr->depth--;
-               ndr_print_uint32(ndr, "count", r->out.count);
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -12731,7 +17088,10 @@ _PUBLIC_ enum ndr_err_code ndr_push__spoolss_EnumPrintProcessors(struct ndr_push
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.count));
+               if (r->out.count == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -12748,6 +17108,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrintProcessors(struct ndr_pull
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
        TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_count_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -12803,6 +17164,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrintProcessors(struct ndr_pull
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
                NDR_PULL_ALLOC(ndr, r->out.needed);
                ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.count);
+               ZERO_STRUCTP(r->out.count);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -12824,7 +17187,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPrintProcessors(struct ndr_pull
                NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.count));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.count);
+               }
+               _mem_save_count_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.count, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.count));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -12911,12 +17280,16 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrintProcessors(struct ndr_print *ndr, const
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumPrintProcessors");
                ndr->depth++;
+               ndr_print_ptr(ndr, "count", r->out.count);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "count", *r->out.count);
+               ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
                if (r->out.info) {
-                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)r->out.count);
+                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<r->out.count;cntr_info_1++) {
+                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
                                char *idx_1=NULL;
                                if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
                                        ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
@@ -12931,7 +17304,6 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrintProcessors(struct ndr_print *ndr, const
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
                ndr->depth--;
-               ndr_print_uint32(ndr, "count", r->out.count);
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -12941,8 +17313,42 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrintProcessors(struct ndr_print *ndr, const
 static enum ndr_err_code ndr_push_spoolss_GetPrintProcessorDirectory(struct ndr_push *ndr, int flags, const struct spoolss_GetPrintProcessorDirectory *r)
 {
        if (flags & NDR_IN) {
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.server));
+               if (r->in.server) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.server, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.server, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.server, ndr_charset_length(r->in.server, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.environment));
+               if (r->in.environment) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.environment, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.environment, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.environment, ndr_charset_length(r->in.environment, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.level));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.buffer));
+               if (r->in.buffer) {
+                       NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, *r->in.buffer));
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
        }
        if (flags & NDR_OUT) {
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.info));
+               if (r->out.info) {
+                       {
+                               struct ndr_push *_ndr_info;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info, 4, r->in.offered));
+                               NDR_CHECK(ndr_push_set_switch_value(_ndr_info, r->out.info, r->in.level));
+                               NDR_CHECK(ndr_push_spoolss_PrintProcessorDirectoryInfo(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->out.info));
+                               NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
+                       }
+               }
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -12950,9 +17356,97 @@ static enum ndr_err_code ndr_push_spoolss_GetPrintProcessorDirectory(struct ndr_
 
 static enum ndr_err_code ndr_pull_spoolss_GetPrintProcessorDirectory(struct ndr_pull *ndr, int flags, struct spoolss_GetPrintProcessorDirectory *r)
 {
+       uint32_t _ptr_server;
+       uint32_t _ptr_environment;
+       uint32_t _ptr_buffer;
+       uint32_t _ptr_info;
+       TALLOC_CTX *_mem_save_server_0;
+       TALLOC_CTX *_mem_save_environment_0;
+       TALLOC_CTX *_mem_save_buffer_0;
+       TALLOC_CTX *_mem_save_info_0;
+       TALLOC_CTX *_mem_save_needed_0;
        if (flags & NDR_IN) {
+               ZERO_STRUCT(r->out);
+
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_server));
+               if (_ptr_server) {
+                       NDR_PULL_ALLOC(ndr, r->in.server);
+               } else {
+                       r->in.server = NULL;
+               }
+               if (r->in.server) {
+                       _mem_save_server_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.server, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.server));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->in.server));
+                       if (ndr_get_array_length(ndr, &r->in.server) > ndr_get_array_size(ndr, &r->in.server)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.server), ndr_get_array_length(ndr, &r->in.server));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.server), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.server, ndr_get_array_length(ndr, &r->in.server), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_server_0, 0);
+               }
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_environment));
+               if (_ptr_environment) {
+                       NDR_PULL_ALLOC(ndr, r->in.environment);
+               } else {
+                       r->in.environment = NULL;
+               }
+               if (r->in.environment) {
+                       _mem_save_environment_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.environment, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.environment));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->in.environment));
+                       if (ndr_get_array_length(ndr, &r->in.environment) > ndr_get_array_size(ndr, &r->in.environment)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.environment), ndr_get_array_length(ndr, &r->in.environment));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.environment), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.environment, ndr_get_array_length(ndr, &r->in.environment), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_environment_0, 0);
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.level));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_buffer));
+               if (_ptr_buffer) {
+                       NDR_PULL_ALLOC(ndr, r->in.buffer);
+               } else {
+                       r->in.buffer = NULL;
+               }
+               if (r->in.buffer) {
+                       _mem_save_buffer_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.buffer, 0);
+                       NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, r->in.buffer));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_buffer_0, 0);
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
        }
        if (flags & NDR_OUT) {
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
+               if (_ptr_info) {
+                       NDR_PULL_ALLOC(ndr, r->out.info);
+               } else {
+                       r->out.info = NULL;
+               }
+               if (r->out.info) {
+                       _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
+                       {
+                               struct ndr_pull *_ndr_info;
+                               NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info, 4, r->in.offered));
+                               NDR_CHECK(ndr_pull_set_switch_value(_ndr_info, r->out.info, r->in.level));
+                               NDR_CHECK(ndr_pull_spoolss_PrintProcessorDirectoryInfo(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->out.info));
+                               NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
+                       }
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
+               }
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -12968,11 +17462,42 @@ _PUBLIC_ void ndr_print_spoolss_GetPrintProcessorDirectory(struct ndr_print *ndr
        if (flags & NDR_IN) {
                ndr_print_struct(ndr, "in", "spoolss_GetPrintProcessorDirectory");
                ndr->depth++;
+               ndr_print_ptr(ndr, "server", r->in.server);
+               ndr->depth++;
+               if (r->in.server) {
+                       ndr_print_string(ndr, "server", r->in.server);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "environment", r->in.environment);
+               ndr->depth++;
+               if (r->in.environment) {
+                       ndr_print_string(ndr, "environment", r->in.environment);
+               }
+               ndr->depth--;
+               ndr_print_uint32(ndr, "level", r->in.level);
+               ndr_print_ptr(ndr, "buffer", r->in.buffer);
+               ndr->depth++;
+               if (r->in.buffer) {
+                       ndr_print_DATA_BLOB(ndr, "buffer", *r->in.buffer);
+               }
+               ndr->depth--;
+               ndr_print_uint32(ndr, "offered", r->in.offered);
+               ndr->depth--;
+       }
+       if (flags & NDR_OUT) {
+               ndr_print_struct(ndr, "out", "spoolss_GetPrintProcessorDirectory");
+               ndr->depth++;
+               ndr_print_ptr(ndr, "info", r->out.info);
+               ndr->depth++;
+               if (r->out.info) {
+                       ndr_print_set_switch_value(ndr, r->out.info, r->in.level);
+                       ndr_print_spoolss_PrintProcessorDirectoryInfo(ndr, "info", r->out.info);
+               }
                ndr->depth--;
-       }
-       if (flags & NDR_OUT) {
-               ndr_print_struct(ndr, "out", "spoolss_GetPrintProcessorDirectory");
+               ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -14422,7 +18947,10 @@ _PUBLIC_ enum ndr_err_code ndr_push__spoolss_EnumForms(struct ndr_push *ndr, int
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.count));
+               if (r->out.count == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -14436,6 +18964,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumForms(struct ndr_pull *ndr, int
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
        TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_count_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -14462,6 +18991,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumForms(struct ndr_pull *ndr, int
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
                NDR_PULL_ALLOC(ndr, r->out.needed);
                ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.count);
+               ZERO_STRUCTP(r->out.count);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -14483,7 +19014,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumForms(struct ndr_pull *ndr, int
                NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.count));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.count);
+               }
+               _mem_save_count_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.count, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.count));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -14562,12 +19099,16 @@ _PUBLIC_ void ndr_print_spoolss_EnumForms(struct ndr_print *ndr, const char *nam
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumForms");
                ndr->depth++;
+               ndr_print_ptr(ndr, "count", r->out.count);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "count", *r->out.count);
+               ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
                if (r->out.info) {
-                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)r->out.count);
+                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<r->out.count;cntr_info_1++) {
+                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
                                char *idx_1=NULL;
                                if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
                                        ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
@@ -14582,7 +19123,6 @@ _PUBLIC_ void ndr_print_spoolss_EnumForms(struct ndr_print *ndr, const char *nam
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
                ndr->depth--;
-               ndr_print_uint32(ndr, "count", r->out.count);
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -14615,7 +19155,10 @@ _PUBLIC_ enum ndr_err_code ndr_push__spoolss_EnumPorts(struct ndr_push *ndr, int
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.count));
+               if (r->out.count == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -14630,6 +19173,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPorts(struct ndr_pull *ndr, int
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
        TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_count_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -14667,6 +19211,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPorts(struct ndr_pull *ndr, int
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
                NDR_PULL_ALLOC(ndr, r->out.needed);
                ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.count);
+               ZERO_STRUCTP(r->out.count);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -14688,7 +19234,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumPorts(struct ndr_pull *ndr, int
                NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.count));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.count);
+               }
+               _mem_save_count_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.count, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.count));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -14769,12 +19321,16 @@ _PUBLIC_ void ndr_print_spoolss_EnumPorts(struct ndr_print *ndr, const char *nam
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumPorts");
                ndr->depth++;
+               ndr_print_ptr(ndr, "count", r->out.count);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "count", *r->out.count);
+               ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
                if (r->out.info) {
-                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)r->out.count);
+                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<r->out.count;cntr_info_1++) {
+                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
                                char *idx_1=NULL;
                                if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
                                        ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
@@ -14789,7 +19345,6 @@ _PUBLIC_ void ndr_print_spoolss_EnumPorts(struct ndr_print *ndr, const char *nam
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
                ndr->depth--;
-               ndr_print_uint32(ndr, "count", r->out.count);
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -14822,7 +19377,10 @@ _PUBLIC_ enum ndr_err_code ndr_push__spoolss_EnumMonitors(struct ndr_push *ndr,
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.count));
+               if (r->out.count == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -14837,6 +19395,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumMonitors(struct ndr_pull *ndr,
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
        TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_count_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -14874,6 +19433,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumMonitors(struct ndr_pull *ndr,
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
                NDR_PULL_ALLOC(ndr, r->out.needed);
                ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.count);
+               ZERO_STRUCTP(r->out.count);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -14895,7 +19456,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull__spoolss_EnumMonitors(struct ndr_pull *ndr,
                NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.count));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.count);
+               }
+               _mem_save_count_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.count, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.count));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -14976,12 +19543,16 @@ _PUBLIC_ void ndr_print_spoolss_EnumMonitors(struct ndr_print *ndr, const char *
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumMonitors");
                ndr->depth++;
+               ndr_print_ptr(ndr, "count", r->out.count);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "count", *r->out.count);
+               ndr->depth--;
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
                if (r->out.info) {
-                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)r->out.count);
+                       ndr->print(ndr, "%s: ARRAY(%d)", "info", (int)*r->out.count);
                        ndr->depth++;
-                       for (cntr_info_1=0;cntr_info_1<r->out.count;cntr_info_1++) {
+                       for (cntr_info_1=0;cntr_info_1<*r->out.count;cntr_info_1++) {
                                char *idx_1=NULL;
                                if (asprintf(&idx_1, "[%d]", cntr_info_1) != -1) {
                                        ndr_print_set_switch_value(ndr, &r->out.info[cntr_info_1], r->in.level);
@@ -14996,7 +19567,6 @@ _PUBLIC_ void ndr_print_spoolss_EnumMonitors(struct ndr_print *ndr, const char *
                ndr->depth++;
                ndr_print_uint32(ndr, "needed", *r->out.needed);
                ndr->depth--;
-               ndr_print_uint32(ndr, "count", r->out.count);
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -15669,6 +20239,21 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrintProcDataTypes(struct ndr_print *ndr, co
 static enum ndr_err_code ndr_push_spoolss_ResetPrinter(struct ndr_push *ndr, int flags, const struct spoolss_ResetPrinter *r)
 {
        if (flags & NDR_IN) {
+               if (r->in.handle == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS, r->in.handle));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.data_type));
+               if (r->in.data_type) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.data_type, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.data_type, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.data_type, ndr_charset_length(r->in.data_type, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->in.devmode_ctr == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.devmode_ctr));
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
@@ -15678,7 +20263,43 @@ static enum ndr_err_code ndr_push_spoolss_ResetPrinter(struct ndr_push *ndr, int
 
 static enum ndr_err_code ndr_pull_spoolss_ResetPrinter(struct ndr_pull *ndr, int flags, struct spoolss_ResetPrinter *r)
 {
+       uint32_t _ptr_data_type;
+       TALLOC_CTX *_mem_save_handle_0;
+       TALLOC_CTX *_mem_save_data_type_0;
+       TALLOC_CTX *_mem_save_devmode_ctr_0;
        if (flags & NDR_IN) {
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.handle);
+               }
+               _mem_save_handle_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.handle, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS, r->in.handle));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_handle_0, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data_type));
+               if (_ptr_data_type) {
+                       NDR_PULL_ALLOC(ndr, r->in.data_type);
+               } else {
+                       r->in.data_type = NULL;
+               }
+               if (r->in.data_type) {
+                       _mem_save_data_type_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.data_type, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.data_type));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->in.data_type));
+                       if (ndr_get_array_length(ndr, &r->in.data_type) > ndr_get_array_size(ndr, &r->in.data_type)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.data_type), ndr_get_array_length(ndr, &r->in.data_type));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.data_type), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.data_type, ndr_get_array_length(ndr, &r->in.data_type), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_type_0, 0);
+               }
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.devmode_ctr);
+               }
+               _mem_save_devmode_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.devmode_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.devmode_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_ctr_0, LIBNDR_FLAG_REF_ALLOC);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
@@ -15696,6 +20317,20 @@ _PUBLIC_ void ndr_print_spoolss_ResetPrinter(struct ndr_print *ndr, const char *
        if (flags & NDR_IN) {
                ndr_print_struct(ndr, "in", "spoolss_ResetPrinter");
                ndr->depth++;
+               ndr_print_ptr(ndr, "handle", r->in.handle);
+               ndr->depth++;
+               ndr_print_policy_handle(ndr, "handle", r->in.handle);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "data_type", r->in.data_type);
+               ndr->depth++;
+               if (r->in.data_type) {
+                       ndr_print_string(ndr, "data_type", r->in.data_type);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "devmode_ctr", r->in.devmode_ctr);
+               ndr->depth++;
+               ndr_print_spoolss_DevmodeContainer(ndr, "devmode_ctr", r->in.devmode_ctr);
+               ndr->depth--;
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
@@ -15733,7 +20368,13 @@ static enum ndr_err_code ndr_push_spoolss_GetPrinterDriver2(struct ndr_push *ndr
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.info));
                if (r->out.info) {
-                       NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, *r->out.info));
+                       {
+                               struct ndr_push *_ndr_info;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info, 4, r->in.offered));
+                               NDR_CHECK(ndr_push_set_switch_value(_ndr_info, r->out.info, r->in.level));
+                               NDR_CHECK(ndr_push_spoolss_DriverInfo(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->out.info));
+                               NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
+                       }
                }
                if (r->out.needed == NULL) {
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
@@ -15825,7 +20466,13 @@ static enum ndr_err_code ndr_pull_spoolss_GetPrinterDriver2(struct ndr_pull *ndr
                if (r->out.info) {
                        _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
                        NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
-                       NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, r->out.info));
+                       {
+                               struct ndr_pull *_ndr_info;
+                               NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info, 4, r->in.offered));
+                               NDR_CHECK(ndr_pull_set_switch_value(_ndr_info, r->out.info, r->in.level));
+                               NDR_CHECK(ndr_pull_spoolss_DriverInfo(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->out.info));
+                               NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
+                       }
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
                }
                if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
@@ -15892,7 +20539,8 @@ _PUBLIC_ void ndr_print_spoolss_GetPrinterDriver2(struct ndr_print *ndr, const c
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
                if (r->out.info) {
-                       ndr_print_DATA_BLOB(ndr, "info", *r->out.info);
+                       ndr_print_set_switch_value(ndr, r->out.info, r->in.level);
+                       ndr_print_spoolss_DriverInfo(ndr, "info", r->out.info);
                }
                ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
@@ -16551,19 +21199,19 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_RemoteFindFirstPrinterChangeNotifyEx
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS, r->in.handle));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.flags));
+               NDR_CHECK(ndr_push_spoolss_PrinterChangeFlags(ndr, NDR_SCALARS, r->in.flags));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.options));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.str));
-               if (r->in.str) {
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.str, CH_UTF16)));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.local_machine));
+               if (r->in.local_machine) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.local_machine, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.str, CH_UTF16)));
-                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.str, ndr_charset_length(r->in.str, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.local_machine, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.local_machine, ndr_charset_length(r->in.local_machine, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.printer_local));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.t1));
-               if (r->in.t1) {
-                       NDR_CHECK(ndr_push_spoolss_NotifyOptionsContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.t1));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.notify_options));
+               if (r->in.notify_options) {
+                       NDR_CHECK(ndr_push_spoolss_NotifyOption(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.notify_options));
                }
        }
        if (flags & NDR_OUT) {
@@ -16574,11 +21222,11 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_RemoteFindFirstPrinterChangeNotifyEx
 
 _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct ndr_pull *ndr, int flags, struct spoolss_RemoteFindFirstPrinterChangeNotifyEx *r)
 {
-       uint32_t _ptr_str;
-       uint32_t _ptr_t1;
+       uint32_t _ptr_local_machine;
+       uint32_t _ptr_notify_options;
        TALLOC_CTX *_mem_save_handle_0;
-       TALLOC_CTX *_mem_save_str_0;
-       TALLOC_CTX *_mem_save_t1_0;
+       TALLOC_CTX *_mem_save_local_machine_0;
+       TALLOC_CTX *_mem_save_notify_options_0;
        if (flags & NDR_IN) {
                if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
                        NDR_PULL_ALLOC(ndr, r->in.handle);
@@ -16587,38 +21235,38 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_RemoteFindFirstPrinterChangeNotifyEx
                NDR_PULL_SET_MEM_CTX(ndr, r->in.handle, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS, r->in.handle));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_handle_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.flags));
+               NDR_CHECK(ndr_pull_spoolss_PrinterChangeFlags(ndr, NDR_SCALARS, &r->in.flags));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.options));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_str));
-               if (_ptr_str) {
-                       NDR_PULL_ALLOC(ndr, r->in.str);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_local_machine));
+               if (_ptr_local_machine) {
+                       NDR_PULL_ALLOC(ndr, r->in.local_machine);
                } else {
-                       r->in.str = NULL;
+                       r->in.local_machine = NULL;
                }
-               if (r->in.str) {
-                       _mem_save_str_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->in.str, 0);
-                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.str));
-                       NDR_CHECK(ndr_pull_array_length(ndr, &r->in.str));
-                       if (ndr_get_array_length(ndr, &r->in.str) > ndr_get_array_size(ndr, &r->in.str)) {
-                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.str), ndr_get_array_length(ndr, &r->in.str));
+               if (r->in.local_machine) {
+                       _mem_save_local_machine_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.local_machine, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.local_machine));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->in.local_machine));
+                       if (ndr_get_array_length(ndr, &r->in.local_machine) > ndr_get_array_size(ndr, &r->in.local_machine)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.local_machine), ndr_get_array_length(ndr, &r->in.local_machine));
                        }
-                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.str), sizeof(uint16_t)));
-                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.str, ndr_get_array_length(ndr, &r->in.str), sizeof(uint16_t), CH_UTF16));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_str_0, 0);
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.local_machine), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.local_machine, ndr_get_array_length(ndr, &r->in.local_machine), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_local_machine_0, 0);
                }
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.printer_local));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_t1));
-               if (_ptr_t1) {
-                       NDR_PULL_ALLOC(ndr, r->in.t1);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_notify_options));
+               if (_ptr_notify_options) {
+                       NDR_PULL_ALLOC(ndr, r->in.notify_options);
                } else {
-                       r->in.t1 = NULL;
+                       r->in.notify_options = NULL;
                }
-               if (r->in.t1) {
-                       _mem_save_t1_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->in.t1, 0);
-                       NDR_CHECK(ndr_pull_spoolss_NotifyOptionsContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.t1));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_t1_0, 0);
+               if (r->in.notify_options) {
+                       _mem_save_notify_options_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.notify_options, 0);
+                       NDR_CHECK(ndr_pull_spoolss_NotifyOption(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.notify_options));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_notify_options_0, 0);
                }
        }
        if (flags & NDR_OUT) {
@@ -16641,19 +21289,19 @@ _PUBLIC_ void ndr_print_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct ndr_
                ndr->depth++;
                ndr_print_policy_handle(ndr, "handle", r->in.handle);
                ndr->depth--;
-               ndr_print_uint32(ndr, "flags", r->in.flags);
+               ndr_print_spoolss_PrinterChangeFlags(ndr, "flags", r->in.flags);
                ndr_print_uint32(ndr, "options", r->in.options);
-               ndr_print_ptr(ndr, "str", r->in.str);
+               ndr_print_ptr(ndr, "local_machine", r->in.local_machine);
                ndr->depth++;
-               if (r->in.str) {
-                       ndr_print_string(ndr, "str", r->in.str);
+               if (r->in.local_machine) {
+                       ndr_print_string(ndr, "local_machine", r->in.local_machine);
                }
                ndr->depth--;
                ndr_print_uint32(ndr, "printer_local", r->in.printer_local);
-               ndr_print_ptr(ndr, "t1", r->in.t1);
+               ndr_print_ptr(ndr, "notify_options", r->in.notify_options);
                ndr->depth++;
-               if (r->in.t1) {
-                       ndr_print_spoolss_NotifyOptionsContainer(ndr, "t1", r->in.t1);
+               if (r->in.notify_options) {
+                       ndr_print_spoolss_NotifyOption(ndr, "notify_options", r->in.notify_options);
                }
                ndr->depth--;
                ndr->depth--;
@@ -16670,8 +21318,21 @@ _PUBLIC_ void ndr_print_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct ndr_
 static enum ndr_err_code ndr_push_spoolss_RouterReplyPrinterEx(struct ndr_push *ndr, int flags, const struct spoolss_RouterReplyPrinterEx *r)
 {
        if (flags & NDR_IN) {
+               if (r->in.handle == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS, r->in.handle));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.color));
+               NDR_CHECK(ndr_push_spoolss_PrinterChangeFlags(ndr, NDR_SCALARS, r->in.flags));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.reply_type));
+               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->in.info, r->in.reply_type));
+               NDR_CHECK(ndr_push_spoolss_ReplyPrinterInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
        }
        if (flags & NDR_OUT) {
+               if (r->out.reply_result == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_spoolss_PrinterNotifyFlags(ndr, NDR_SCALARS, *r->out.reply_result));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -16679,9 +21340,34 @@ static enum ndr_err_code ndr_push_spoolss_RouterReplyPrinterEx(struct ndr_push *
 
 static enum ndr_err_code ndr_pull_spoolss_RouterReplyPrinterEx(struct ndr_pull *ndr, int flags, struct spoolss_RouterReplyPrinterEx *r)
 {
+       TALLOC_CTX *_mem_save_handle_0;
+       TALLOC_CTX *_mem_save_reply_result_0;
        if (flags & NDR_IN) {
+               ZERO_STRUCT(r->out);
+
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.handle);
+               }
+               _mem_save_handle_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.handle, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS, r->in.handle));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_handle_0, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.color));
+               NDR_CHECK(ndr_pull_spoolss_PrinterChangeFlags(ndr, NDR_SCALARS, &r->in.flags));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.reply_type));
+               NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->in.info, r->in.reply_type));
+               NDR_CHECK(ndr_pull_spoolss_ReplyPrinterInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
+               NDR_PULL_ALLOC(ndr, r->out.reply_result);
+               ZERO_STRUCTP(r->out.reply_result);
        }
        if (flags & NDR_OUT) {
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.reply_result);
+               }
+               _mem_save_reply_result_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.reply_result, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_spoolss_PrinterNotifyFlags(ndr, NDR_SCALARS, r->out.reply_result));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_reply_result_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -16697,11 +21383,24 @@ _PUBLIC_ void ndr_print_spoolss_RouterReplyPrinterEx(struct ndr_print *ndr, cons
        if (flags & NDR_IN) {
                ndr_print_struct(ndr, "in", "spoolss_RouterReplyPrinterEx");
                ndr->depth++;
+               ndr_print_ptr(ndr, "handle", r->in.handle);
+               ndr->depth++;
+               ndr_print_policy_handle(ndr, "handle", r->in.handle);
+               ndr->depth--;
+               ndr_print_uint32(ndr, "color", r->in.color);
+               ndr_print_spoolss_PrinterChangeFlags(ndr, "flags", r->in.flags);
+               ndr_print_uint32(ndr, "reply_type", r->in.reply_type);
+               ndr_print_set_switch_value(ndr, &r->in.info, r->in.reply_type);
+               ndr_print_spoolss_ReplyPrinterInfo(ndr, "info", &r->in.info);
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_RouterReplyPrinterEx");
                ndr->depth++;
+               ndr_print_ptr(ndr, "reply_result", r->out.reply_result);
+               ndr->depth++;
+               ndr_print_spoolss_PrinterNotifyFlags(ndr, "reply_result", *r->out.reply_result);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -16716,9 +21415,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_RouterRefreshPrinterChangeNotify(str
                }
                NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS, r->in.handle));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.change_low));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.container));
-               if (r->in.container) {
-                       NDR_CHECK(ndr_push_spoolss_NotifyOptionsContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.container));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.options));
+               if (r->in.options) {
+                       NDR_CHECK(ndr_push_spoolss_NotifyOption(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.options));
                }
        }
        if (flags & NDR_OUT) {
@@ -16736,10 +21435,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_RouterRefreshPrinterChangeNotify(str
 
 _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_RouterRefreshPrinterChangeNotify(struct ndr_pull *ndr, int flags, struct spoolss_RouterRefreshPrinterChangeNotify *r)
 {
-       uint32_t _ptr_container;
+       uint32_t _ptr_options;
        uint32_t _ptr_info;
        TALLOC_CTX *_mem_save_handle_0;
-       TALLOC_CTX *_mem_save_container_0;
+       TALLOC_CTX *_mem_save_options_0;
        TALLOC_CTX *_mem_save_info_0;
        TALLOC_CTX *_mem_save_info_1;
        if (flags & NDR_IN) {
@@ -16753,17 +21452,17 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_RouterRefreshPrinterChangeNotify(str
                NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS, r->in.handle));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_handle_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.change_low));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_container));
-               if (_ptr_container) {
-                       NDR_PULL_ALLOC(ndr, r->in.container);
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_options));
+               if (_ptr_options) {
+                       NDR_PULL_ALLOC(ndr, r->in.options);
                } else {
-                       r->in.container = NULL;
+                       r->in.options = NULL;
                }
-               if (r->in.container) {
-                       _mem_save_container_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->in.container, 0);
-                       NDR_CHECK(ndr_pull_spoolss_NotifyOptionsContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.container));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_container_0, 0);
+               if (r->in.options) {
+                       _mem_save_options_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.options, 0);
+                       NDR_CHECK(ndr_pull_spoolss_NotifyOption(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.options));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_options_0, 0);
                }
                NDR_PULL_ALLOC(ndr, r->out.info);
                ZERO_STRUCTP(r->out.info);
@@ -16807,10 +21506,10 @@ _PUBLIC_ void ndr_print_spoolss_RouterRefreshPrinterChangeNotify(struct ndr_prin
                ndr_print_policy_handle(ndr, "handle", r->in.handle);
                ndr->depth--;
                ndr_print_uint32(ndr, "change_low", r->in.change_low);
-               ndr_print_ptr(ndr, "container", r->in.container);
+               ndr_print_ptr(ndr, "options", r->in.options);
                ndr->depth++;
-               if (r->in.container) {
-                       ndr_print_spoolss_NotifyOptionsContainer(ndr, "container", r->in.container);
+               if (r->in.options) {
+                       ndr_print_spoolss_NotifyOption(ndr, "options", r->in.options);
                }
                ndr->depth--;
                ndr->depth--;
@@ -16892,7 +21591,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_OpenPrinterEx(struct ndr_push *ndr,
                        NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.datatype, ndr_charset_length(r->in.datatype, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
                NDR_CHECK(ndr_push_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.devmode_ctr));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.access_mask));
+               NDR_CHECK(ndr_push_spoolss_AccessRights(ndr, NDR_SCALARS, r->in.access_mask));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.level));
                NDR_CHECK(ndr_push_set_switch_value(ndr, &r->in.userlevel, r->in.level));
                NDR_CHECK(ndr_push_spoolss_UserLevel(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.userlevel));
@@ -16954,7 +21653,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_OpenPrinterEx(struct ndr_pull *ndr,
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_datatype_0, 0);
                }
                NDR_CHECK(ndr_pull_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.devmode_ctr));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.access_mask));
+               NDR_CHECK(ndr_pull_spoolss_AccessRights(ndr, NDR_SCALARS, &r->in.access_mask));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.level));
                NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->in.userlevel, r->in.level));
                NDR_CHECK(ndr_pull_spoolss_UserLevel(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.userlevel));
@@ -16997,7 +21696,7 @@ _PUBLIC_ void ndr_print_spoolss_OpenPrinterEx(struct ndr_print *ndr, const char
                }
                ndr->depth--;
                ndr_print_spoolss_DevmodeContainer(ndr, "devmode_ctr", &r->in.devmode_ctr);
-               ndr_print_uint32(ndr, "access_mask", r->in.access_mask);
+               ndr_print_spoolss_AccessRights(ndr, "access_mask", r->in.access_mask);
                ndr_print_uint32(ndr, "level", r->in.level);
                ndr_print_set_switch_value(ndr, &r->in.userlevel, r->in.level);
                ndr_print_spoolss_UserLevel(ndr, "userlevel", &r->in.userlevel);
@@ -17026,22 +21725,28 @@ static enum ndr_err_code ndr_push_spoolss_AddPrinterEx(struct ndr_push *ndr, int
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.server, CH_UTF16)));
                        NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.server, ndr_charset_length(r->in.server, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.level));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.info));
-               if (r->in.info) {
-                       NDR_CHECK(ndr_push_set_switch_value(ndr, r->in.info, r->in.level));
-                       NDR_CHECK(ndr_push_spoolss_PrinterInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info));
+               if (r->in.info_ctr == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
-               NDR_CHECK(ndr_push_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.devmode_ctr));
-               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.secdesc));
-               if (r->in.secdesc) {
-                       NDR_CHECK(ndr_push_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.secdesc));
+               NDR_CHECK(ndr_push_spoolss_SetPrinterInfoCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info_ctr));
+               if (r->in.devmode_ctr == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.ulevel));
-               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->in.userlevel, r->in.ulevel));
-               NDR_CHECK(ndr_push_spoolss_UserLevel(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.userlevel));
+               NDR_CHECK(ndr_push_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.devmode_ctr));
+               if (r->in.secdesc_ctr == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_sec_desc_buf(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.secdesc_ctr));
+               if (r->in.userlevel_ctr == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_spoolss_UserLevelCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.userlevel_ctr));
        }
        if (flags & NDR_OUT) {
+               if (r->out.handle == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS, r->out.handle));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -17050,12 +21755,15 @@ static enum ndr_err_code ndr_push_spoolss_AddPrinterEx(struct ndr_push *ndr, int
 static enum ndr_err_code ndr_pull_spoolss_AddPrinterEx(struct ndr_pull *ndr, int flags, struct spoolss_AddPrinterEx *r)
 {
        uint32_t _ptr_server;
-       uint32_t _ptr_info;
-       uint32_t _ptr_secdesc;
        TALLOC_CTX *_mem_save_server_0;
-       TALLOC_CTX *_mem_save_info_0;
-       TALLOC_CTX *_mem_save_secdesc_0;
+       TALLOC_CTX *_mem_save_info_ctr_0;
+       TALLOC_CTX *_mem_save_devmode_ctr_0;
+       TALLOC_CTX *_mem_save_secdesc_ctr_0;
+       TALLOC_CTX *_mem_save_userlevel_ctr_0;
+       TALLOC_CTX *_mem_save_handle_0;
        if (flags & NDR_IN) {
+               ZERO_STRUCT(r->out);
+
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_server));
                if (_ptr_server) {
                        NDR_PULL_ALLOC(ndr, r->in.server);
@@ -17074,38 +21782,45 @@ static enum ndr_err_code ndr_pull_spoolss_AddPrinterEx(struct ndr_pull *ndr, int
                        NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.server, ndr_get_array_length(ndr, &r->in.server), sizeof(uint16_t), CH_UTF16));
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_server_0, 0);
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.level));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
-               if (_ptr_info) {
-                       NDR_PULL_ALLOC(ndr, r->in.info);
-               } else {
-                       r->in.info = NULL;
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.info_ctr);
                }
-               if (r->in.info) {
-                       _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->in.info, 0);
-                       NDR_CHECK(ndr_pull_set_switch_value(ndr, r->in.info, r->in.level));
-                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
+               _mem_save_info_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.info_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_spoolss_SetPrinterInfoCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_ctr_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.devmode_ctr);
                }
-               NDR_CHECK(ndr_pull_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.devmode_ctr));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
-               if (_ptr_secdesc) {
-                       NDR_PULL_ALLOC(ndr, r->in.secdesc);
-               } else {
-                       r->in.secdesc = NULL;
+               _mem_save_devmode_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.devmode_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_spoolss_DevmodeContainer(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.devmode_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_ctr_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.secdesc_ctr);
                }
-               if (r->in.secdesc) {
-                       _mem_save_secdesc_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->in.secdesc, 0);
-                       NDR_CHECK(ndr_pull_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.secdesc));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
+               _mem_save_secdesc_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.secdesc_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_sec_desc_buf(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.secdesc_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_ctr_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.userlevel_ctr);
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.ulevel));
-               NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->in.userlevel, r->in.ulevel));
-               NDR_CHECK(ndr_pull_spoolss_UserLevel(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.userlevel));
+               _mem_save_userlevel_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.userlevel_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_spoolss_UserLevelCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.userlevel_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_userlevel_ctr_0, LIBNDR_FLAG_REF_ALLOC);
+               NDR_PULL_ALLOC(ndr, r->out.handle);
+               ZERO_STRUCTP(r->out.handle);
        }
        if (flags & NDR_OUT) {
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.handle);
+               }
+               _mem_save_handle_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.handle, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS, r->out.handle));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_handle_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -17127,29 +21842,31 @@ _PUBLIC_ void ndr_print_spoolss_AddPrinterEx(struct ndr_print *ndr, const char *
                        ndr_print_string(ndr, "server", r->in.server);
                }
                ndr->depth--;
-               ndr_print_uint32(ndr, "level", r->in.level);
-               ndr_print_ptr(ndr, "info", r->in.info);
+               ndr_print_ptr(ndr, "info_ctr", r->in.info_ctr);
                ndr->depth++;
-               if (r->in.info) {
-                       ndr_print_set_switch_value(ndr, r->in.info, r->in.level);
-                       ndr_print_spoolss_PrinterInfo(ndr, "info", r->in.info);
-               }
+               ndr_print_spoolss_SetPrinterInfoCtr(ndr, "info_ctr", r->in.info_ctr);
                ndr->depth--;
-               ndr_print_spoolss_DevmodeContainer(ndr, "devmode_ctr", &r->in.devmode_ctr);
-               ndr_print_ptr(ndr, "secdesc", r->in.secdesc);
+               ndr_print_ptr(ndr, "devmode_ctr", r->in.devmode_ctr);
                ndr->depth++;
-               if (r->in.secdesc) {
-                       ndr_print_security_descriptor(ndr, "secdesc", r->in.secdesc);
-               }
+               ndr_print_spoolss_DevmodeContainer(ndr, "devmode_ctr", r->in.devmode_ctr);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "secdesc_ctr", r->in.secdesc_ctr);
+               ndr->depth++;
+               ndr_print_sec_desc_buf(ndr, "secdesc_ctr", r->in.secdesc_ctr);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "userlevel_ctr", r->in.userlevel_ctr);
+               ndr->depth++;
+               ndr_print_spoolss_UserLevelCtr(ndr, "userlevel_ctr", r->in.userlevel_ctr);
                ndr->depth--;
-               ndr_print_uint32(ndr, "ulevel", r->in.ulevel);
-               ndr_print_set_switch_value(ndr, &r->in.userlevel, r->in.ulevel);
-               ndr_print_spoolss_UserLevel(ndr, "userlevel", &r->in.userlevel);
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_AddPrinterEx");
                ndr->depth++;
+               ndr_print_ptr(ndr, "handle", r->out.handle);
+               ndr->depth++;
+               ndr_print_policy_handle(ndr, "handle", r->out.handle);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -17553,7 +22270,11 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterDataEx(struct ndr_push *ndr,
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.value_name, CH_UTF16)));
                NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.value_name, ndr_charset_length(r->in.value_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.type));
-               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->in.buffer));
+               if (r->in.buffer == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
+               NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->in.buffer, r->in.offered));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
        }
        if (flags & NDR_OUT) {
@@ -17588,8 +22309,15 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterDataEx(struct ndr_pull *ndr,
                NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.value_name), sizeof(uint16_t)));
                NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.value_name, ndr_get_array_length(ndr, &r->in.value_name), sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.type));
-               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->in.buffer));
+               NDR_CHECK(ndr_pull_array_size(ndr, &r->in.buffer));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC_N(ndr, r->in.buffer, ndr_get_array_size(ndr, &r->in.buffer));
+               }
+               NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->in.buffer, ndr_get_array_size(ndr, &r->in.buffer)));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
+               if (r->in.buffer) {
+                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->in.buffer, r->in.offered));
+               }
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
@@ -17614,7 +22342,10 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterDataEx(struct ndr_print *ndr, const ch
                ndr_print_string(ndr, "key_name", r->in.key_name);
                ndr_print_string(ndr, "value_name", r->in.value_name);
                ndr_print_uint32(ndr, "type", r->in.type);
-               ndr_print_DATA_BLOB(ndr, "buffer", r->in.buffer);
+               ndr_print_ptr(ndr, "buffer", r->in.buffer);
+               ndr->depth++;
+               ndr_print_array_uint8(ndr, "buffer", r->in.buffer, r->in.offered);
+               ndr->depth--;
                ndr_print_uint32(ndr, "offered", r->in.offered);
                ndr->depth--;
        }
@@ -18599,16 +23330,17 @@ _PUBLIC_ void ndr_print_spoolss_XcvData(struct ndr_print *ndr, const char *name,
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_AddPrinterDriverEx(struct ndr_push *ndr, int flags, const struct spoolss_AddPrinterDriverEx *r)
 {
        if (flags & NDR_IN) {
-               if (r->in.servername == NULL) {
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.servername));
+               if (r->in.servername) {
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+                       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
+                       NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.servername, ndr_charset_length(r->in.servername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+               }
+               if (r->in.info_ctr == NULL) {
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.servername, CH_UTF16)));
-               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.servername, ndr_charset_length(r->in.servername, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.level));
-               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->in.info, r->in.level));
-               NDR_CHECK(ndr_push_spoolss_AddDriverInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
+               NDR_CHECK(ndr_push_spoolss_AddDriverInfoCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info_ctr));
                NDR_CHECK(ndr_push_spoolss_AddPrinterDriverExFlags(ndr, NDR_SCALARS, r->in.flags));
        }
        if (flags & NDR_OUT) {
@@ -18619,17 +23351,35 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_AddPrinterDriverEx(struct ndr_push *
 
 _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_AddPrinterDriverEx(struct ndr_pull *ndr, int flags, struct spoolss_AddPrinterDriverEx *r)
 {
+       uint32_t _ptr_servername;
+       TALLOC_CTX *_mem_save_servername_0;
+       TALLOC_CTX *_mem_save_info_ctr_0;
        if (flags & NDR_IN) {
-               NDR_CHECK(ndr_pull_array_size(ndr, &r->in.servername));
-               NDR_CHECK(ndr_pull_array_length(ndr, &r->in.servername));
-               if (ndr_get_array_length(ndr, &r->in.servername) > ndr_get_array_size(ndr, &r->in.servername)) {
-                       return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.servername), ndr_get_array_length(ndr, &r->in.servername));
+               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_servername));
+               if (_ptr_servername) {
+                       NDR_PULL_ALLOC(ndr, r->in.servername);
+               } else {
+                       r->in.servername = NULL;
                }
-               NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t)));
-               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.servername, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t), CH_UTF16));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.level));
-               NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->in.info, r->in.level));
-               NDR_CHECK(ndr_pull_spoolss_AddDriverInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
+               if (r->in.servername) {
+                       _mem_save_servername_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                       NDR_PULL_SET_MEM_CTX(ndr, r->in.servername, 0);
+                       NDR_CHECK(ndr_pull_array_size(ndr, &r->in.servername));
+                       NDR_CHECK(ndr_pull_array_length(ndr, &r->in.servername));
+                       if (ndr_get_array_length(ndr, &r->in.servername) > ndr_get_array_size(ndr, &r->in.servername)) {
+                               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.servername), ndr_get_array_length(ndr, &r->in.servername));
+                       }
+                       NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t)));
+                       NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.servername, ndr_get_array_length(ndr, &r->in.servername), sizeof(uint16_t), CH_UTF16));
+                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_servername_0, 0);
+               }
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.info_ctr);
+               }
+               _mem_save_info_ctr_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.info_ctr, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_spoolss_AddDriverInfoCtr(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.info_ctr));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_ctr_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_spoolss_AddPrinterDriverExFlags(ndr, NDR_SCALARS, &r->in.flags));
        }
        if (flags & NDR_OUT) {
@@ -18650,11 +23400,14 @@ _PUBLIC_ void ndr_print_spoolss_AddPrinterDriverEx(struct ndr_print *ndr, const
                ndr->depth++;
                ndr_print_ptr(ndr, "servername", r->in.servername);
                ndr->depth++;
-               ndr_print_string(ndr, "servername", r->in.servername);
+               if (r->in.servername) {
+                       ndr_print_string(ndr, "servername", r->in.servername);
+               }
+               ndr->depth--;
+               ndr_print_ptr(ndr, "info_ctr", r->in.info_ctr);
+               ndr->depth++;
+               ndr_print_spoolss_AddDriverInfoCtr(ndr, "info_ctr", r->in.info_ctr);
                ndr->depth--;
-               ndr_print_uint32(ndr, "level", r->in.level);
-               ndr_print_set_switch_value(ndr, &r->in.info, r->in.level);
-               ndr_print_spoolss_AddDriverInfo(ndr, "info", &r->in.info);
                ndr_print_spoolss_AddPrinterDriverExFlags(ndr, "flags", r->in.flags);
                ndr->depth--;
        }
@@ -19711,7 +24464,7 @@ const struct ndr_interface_table ndr_table_spoolss = {
                NDR_SPOOLSS_VERSION
        },
        .helpstring     = NDR_SPOOLSS_HELPSTRING,
-       .num_calls      = 114,
+       .num_calls      = 96,
        .calls          = spoolss_calls,
        .endpoints      = &spoolss_endpoints,
        .authservices   = &spoolss_authservices