s3: re-run make samba3-idl.
[abartlet/samba.git/.git] / librpc / gen_ndr / ndr_spoolss.c
index 6178b1c93b29b543144792f6568ffac0b9379d8c..035444b2fde5aaa1ec22da5757c6845361d8c439 100644 (file)
@@ -228,13 +228,13 @@ _PUBLIC_ void ndr_print_spoolss_MinorVersion(struct ndr_print *ndr, const char *
        ndr_print_enum(ndr, name, "ENUM", val, r);
 }
 
-static enum ndr_err_code ndr_push_spoolss_PrinterStatus(struct ndr_push *ndr, int ndr_flags, uint32_t r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterStatus(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_PrinterStatus(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterStatus(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
 {
        uint32_t v;
        NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
@@ -358,8 +358,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo0(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->printername) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->printername));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printername));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printername));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printername));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -367,8 +368,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo0(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->servername) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->servername));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->servername));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->servername));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->servername));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1246,13 +1248,13 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterFlags(struct ndr_print *ndr, const ch
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_PrinterAttributes(struct ndr_push *ndr, int ndr_flags, uint32_t r)
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterAttributes(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_PrinterAttributes(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterAttributes(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
 {
        uint32_t v;
        NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
@@ -1313,8 +1315,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo1(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->description) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->description));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->description));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->description));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->description));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1322,8 +1325,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo1(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1331,8 +1335,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo1(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->comment) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->comment));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->comment));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->comment));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->comment));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1525,7 +1530,12 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->location));
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_push_relative_ptr1(ndr, r->devmode));
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->devmode));
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
+               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -1550,7 +1560,12 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->parameters));
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_push_relative_ptr1(ndr, r->secdesc));
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->secdesc));
+                       ndr->flags = _flags_save_security_descriptor;
+               }
                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));
@@ -1566,8 +1581,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->servername) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->servername));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->servername));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->servername));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->servername));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1575,8 +1591,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->printername) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->printername));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printername));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printername));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printername));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1584,8 +1601,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->sharename) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->sharename));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->sharename));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->sharename));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->sharename));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1593,8 +1611,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->portname) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->portname));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->portname));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->portname));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->portname));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1602,8 +1621,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->drivername) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->drivername));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->drivername));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->drivername));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->drivername));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1611,8 +1631,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->comment) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->comment));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->comment));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->comment));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->comment));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1620,26 +1641,34 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->location) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->location));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->location));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->location));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->location));
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->devmode) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, 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));
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->devmode) {
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, 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));
+                               }
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->devmode));
                        }
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->sepfile) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->sepfile));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->sepfile));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->sepfile));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->sepfile));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1647,8 +1676,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->printprocessor) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->printprocessor));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printprocessor));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printprocessor));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printprocessor));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1656,8 +1686,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->datatype) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->datatype));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->datatype));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->datatype));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->datatype));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -1665,19 +1696,26 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->parameters) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->parameters));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->parameters));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->parameters));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->parameters));
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->secdesc) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, 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));
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->secdesc) {
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, 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));
+                               }
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->secdesc));
                        }
+                       ndr->flags = _flags_save_security_descriptor;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -1797,12 +1835,17 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                        }
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
-               if (_ptr_devmode) {
-                       NDR_PULL_ALLOC(ndr, r->devmode);
-                       NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->devmode, _ptr_devmode));
-               } else {
-                       r->devmode = NULL;
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
+                       if (_ptr_devmode) {
+                               NDR_PULL_ALLOC(ndr, r->devmode);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->devmode, _ptr_devmode));
+                       } else {
+                               r->devmode = NULL;
+                       }
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
@@ -1852,12 +1895,17 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                        }
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
-               if (_ptr_secdesc) {
-                       NDR_PULL_ALLOC(ndr, r->secdesc);
-                       NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->secdesc, _ptr_secdesc));
-               } else {
-                       r->secdesc = NULL;
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
+                       if (_ptr_secdesc) {
+                               NDR_PULL_ALLOC(ndr, r->secdesc);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->secdesc, _ptr_secdesc));
+                       } else {
+                               r->secdesc = NULL;
+                       }
+                       ndr->flags = _flags_save_security_descriptor;
                }
                NDR_CHECK(ndr_pull_spoolss_PrinterAttributes(ndr, NDR_SCALARS, &r->attributes));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->priority));
@@ -1999,23 +2047,28 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->devmode) {
-                       uint32_t _relative_save_offset;
-                       _relative_save_offset = ndr->offset;
-                       NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
-                       if (ndr->offset > ndr->relative_highest_offset) {
-                               ndr->relative_highest_offset = ndr->offset;
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->devmode) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->offset = _relative_save_offset;
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
@@ -2089,23 +2142,28 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->secdesc) {
-                       uint32_t _relative_save_offset;
-                       _relative_save_offset = ndr->offset;
-                       NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
-                       if (ndr->offset > ndr->relative_highest_offset) {
-                               ndr->relative_highest_offset = ndr->offset;
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->secdesc) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->offset = _relative_save_offset;
+                       ndr->flags = _flags_save_security_descriptor;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -2213,18 +2271,29 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo3(struct ndr_push *ndr, i
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 5));
-               NDR_CHECK(ndr_push_relative_ptr1(ndr, r->secdesc));
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->secdesc));
+                       ndr->flags = _flags_save_security_descriptor;
+               }
                NDR_CHECK(ndr_push_trailer_align(ndr, 5));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->secdesc) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, 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));
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->secdesc) {
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, 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));
+                               }
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->secdesc));
                        }
+                       ndr->flags = _flags_save_security_descriptor;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -2236,33 +2305,43 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo3(struct ndr_pull *ndr, i
        TALLOC_CTX *_mem_save_secdesc_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 5));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
-               if (_ptr_secdesc) {
-                       NDR_PULL_ALLOC(ndr, r->secdesc);
-                       NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->secdesc, _ptr_secdesc));
-               } else {
-                       r->secdesc = NULL;
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
+                       if (_ptr_secdesc) {
+                               NDR_PULL_ALLOC(ndr, r->secdesc);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->secdesc, _ptr_secdesc));
+                       } else {
+                               r->secdesc = NULL;
+                       }
+                       ndr->flags = _flags_save_security_descriptor;
                }
                NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->secdesc) {
-                       uint32_t _relative_save_offset;
-                       _relative_save_offset = ndr->offset;
-                       NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
-                       if (ndr->offset > ndr->relative_highest_offset) {
-                               ndr->relative_highest_offset = ndr->offset;
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->secdesc) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->offset = _relative_save_offset;
+                       ndr->flags = _flags_save_security_descriptor;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -2310,8 +2389,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo4(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->printername) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->printername));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printername));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printername));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printername));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -2319,8 +2399,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo4(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->servername) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->servername));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->servername));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->servername));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->servername));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -2455,8 +2536,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo5(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->printername) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->printername));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printername));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printername));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printername));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -2464,8 +2546,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo5(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->portname) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->portname));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->portname));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->portname));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->portname));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -2659,8 +2742,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo7(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->guid) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->guid));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->guid));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->guid));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->guid));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -2735,18 +2819,29 @@ static enum ndr_err_code ndr_push_spoolss_DeviceModeInfo(struct ndr_push *ndr, i
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 5));
-               NDR_CHECK(ndr_push_relative_ptr1(ndr, r->devmode));
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->devmode));
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
+               }
                NDR_CHECK(ndr_push_trailer_align(ndr, 5));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->devmode) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, 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));
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->devmode) {
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, 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));
+                               }
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->devmode));
                        }
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -2758,33 +2853,43 @@ static enum ndr_err_code ndr_pull_spoolss_DeviceModeInfo(struct ndr_pull *ndr, i
        TALLOC_CTX *_mem_save_devmode_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 5));
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
-               if (_ptr_devmode) {
-                       NDR_PULL_ALLOC(ndr, r->devmode);
-                       NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->devmode, _ptr_devmode));
-               } else {
-                       r->devmode = NULL;
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
+                       if (_ptr_devmode) {
+                               NDR_PULL_ALLOC(ndr, r->devmode);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->devmode, _ptr_devmode));
+                       } else {
+                               r->devmode = NULL;
+                       }
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
        }
        if (ndr_flags & NDR_BUFFERS) {
-               if (r->devmode) {
-                       uint32_t _relative_save_offset;
-                       _relative_save_offset = ndr->offset;
-                       NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
-                       if (ndr->offset > ndr->relative_highest_offset) {
-                               ndr->relative_highest_offset = ndr->offset;
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->devmode) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->offset = _relative_save_offset;
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -2806,122 +2911,127 @@ _PUBLIC_ void ndr_print_spoolss_DeviceModeInfo(struct ndr_print *ndr, const char
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PrinterInfo *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);
-               NDR_CHECK(ndr_push_union_align(ndr, 5));
-               switch (level) {
-                       case 0: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo0(ndr, NDR_SCALARS, &r->info0));
-                       break; }
-
-                       case 1: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
-
-                       case 2: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
-
-                       case 3: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo3(ndr, NDR_SCALARS, &r->info3));
-                       break; }
-
-                       case 4: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo4(ndr, NDR_SCALARS, &r->info4));
-                       break; }
-
-                       case 5: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo5(ndr, NDR_SCALARS, &r->info5));
-                       break; }
-
-                       case 6: {
-                               NDR_CHECK(ndr_push_align(ndr, 4));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo6(ndr, NDR_SCALARS, &r->info6));
-                       break; }
-
-                       case 7: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo7(ndr, NDR_SCALARS, &r->info7));
-                       break; }
-
-                       case 8: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS, &r->info8));
-                       break; }
-
-                       case 9: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS, &r->info9));
-                       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 0:
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo0(ndr, NDR_BUFFERS, &r->info0));
-                       break;
-
-                       case 1:
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       break;
-
-                       case 2:
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo2(ndr, NDR_BUFFERS, &r->info2));
-                       break;
-
-                       case 3:
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo3(ndr, NDR_BUFFERS, &r->info3));
-                       break;
-
-                       case 4:
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo4(ndr, NDR_BUFFERS, &r->info4));
-                       break;
-
-                       case 5:
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo5(ndr, NDR_BUFFERS, &r->info5));
-                       break;
-
-                       case 6:
-                       break;
-
-                       case 7:
-                               NDR_CHECK(ndr_push_spoolss_PrinterInfo7(ndr, NDR_BUFFERS, &r->info7));
-                       break;
-
-                       case 8:
-                               NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_BUFFERS, &r->info8));
-                       break;
-
-                       case 9:
-                               NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_BUFFERS, &r->info9));
-                       break;
-
-                       default:
-                       break;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 5));
+                       switch (level) {
+                               case 0: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo0(ndr, NDR_SCALARS, &r->info0));
+                               break; }
+
+                               case 1: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
+
+                               case 2: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
+
+                               case 3: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo3(ndr, NDR_SCALARS, &r->info3));
+                               break; }
+
+                               case 4: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo4(ndr, NDR_SCALARS, &r->info4));
+                               break; }
+
+                               case 5: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo5(ndr, NDR_SCALARS, &r->info5));
+                               break; }
+
+                               case 6: {
+                                       NDR_CHECK(ndr_push_align(ndr, 4));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo6(ndr, NDR_SCALARS, &r->info6));
+                               break; }
+
+                               case 7: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo7(ndr, NDR_SCALARS, &r->info7));
+                               break; }
+
+                               case 8: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS, &r->info8));
+                               break; }
+
+                               case 9: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS, &r->info9));
+                               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 0:
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo0(ndr, NDR_BUFFERS, &r->info0));
+                               break;
+
+                               case 1:
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
+
+                               case 2:
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
+
+                               case 3:
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo3(ndr, NDR_BUFFERS, &r->info3));
+                               break;
+
+                               case 4:
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo4(ndr, NDR_BUFFERS, &r->info4));
+                               break;
+
+                               case 5:
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo5(ndr, NDR_BUFFERS, &r->info5));
+                               break;
+
+                               case 6:
+                               break;
+
+                               case 7:
+                                       NDR_CHECK(ndr_push_spoolss_PrinterInfo7(ndr, NDR_BUFFERS, &r->info7));
+                               break;
+
+                               case 8:
+                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_BUFFERS, &r->info8));
+                               break;
+
+                               case 9:
+                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_BUFFERS, &r->info9));
+                               break;
+
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -2931,180 +3041,191 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo(struct ndr_pull *ndr, in
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 5));
-               switch (level) {
-                       case 0: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo0(ndr, NDR_SCALARS, &r->info0));
-                       break; }
-
-                       case 1: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
-
-                       case 2: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
-
-                       case 3: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo3(ndr, NDR_SCALARS, &r->info3));
-                       break; }
-
-                       case 4: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo4(ndr, NDR_SCALARS, &r->info4));
-                       break; }
-
-                       case 5: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo5(ndr, NDR_SCALARS, &r->info5));
-                       break; }
-
-                       case 6: {
-                               NDR_CHECK(ndr_pull_align(ndr, 4));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo6(ndr, NDR_SCALARS, &r->info6));
-                       break; }
-
-                       case 7: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo7(ndr, NDR_SCALARS, &r->info7));
-                       break; }
-
-                       case 8: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_SCALARS, &r->info8));
-                       break; }
-
-                       case 9: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_SCALARS, &r->info9));
-                       break; }
-
-                       default: {
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 5));
+                       switch (level) {
+                               case 0: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo0(ndr, NDR_SCALARS, &r->info0));
+                               break; }
+
+                               case 1: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
+
+                               case 2: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
+
+                               case 3: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo3(ndr, NDR_SCALARS, &r->info3));
+                               break; }
+
+                               case 4: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo4(ndr, NDR_SCALARS, &r->info4));
+                               break; }
+
+                               case 5: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo5(ndr, NDR_SCALARS, &r->info5));
+                               break; }
+
+                               case 6: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 4));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo6(ndr, NDR_SCALARS, &r->info6));
+                               break; }
+
+                               case 7: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo7(ndr, NDR_SCALARS, &r->info7));
+                               break; }
+
+                               case 8: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_SCALARS, &r->info8));
+                               break; }
+
+                               case 9: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_SCALARS, &r->info9));
+                               break; }
+
+                               default: {
+                               break; }
+
+                       }
+               }
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 0:
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo0(ndr, NDR_BUFFERS, &r->info0));
+                               break;
+
+                               case 1:
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
+
+                               case 2:
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
+
+                               case 3:
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo3(ndr, NDR_BUFFERS, &r->info3));
+                               break;
+
+                               case 4:
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo4(ndr, NDR_BUFFERS, &r->info4));
+                               break;
+
+                               case 5:
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo5(ndr, NDR_BUFFERS, &r->info5));
+                               break;
+
+                               case 6:
+                               break;
+
+                               case 7:
+                                       NDR_CHECK(ndr_pull_spoolss_PrinterInfo7(ndr, NDR_BUFFERS, &r->info7));
+                               break;
+
+                               case 8:
+                                       NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_BUFFERS, &r->info8));
+                               break;
+
+                               case 9:
+                                       NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_BUFFERS, &r->info9));
+                               break;
+
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+       ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_PrinterInfo(struct ndr_print *ndr, const char *name, const union spoolss_PrinterInfo *r)
+{
+       int level;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "spoolss_PrinterInfo");
                switch (level) {
                        case 0:
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo0(ndr, NDR_BUFFERS, &r->info0));
+                               ndr_print_spoolss_PrinterInfo0(ndr, "info0", &r->info0);
                        break;
 
                        case 1:
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               ndr_print_spoolss_PrinterInfo1(ndr, "info1", &r->info1);
                        break;
 
                        case 2:
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               ndr_print_spoolss_PrinterInfo2(ndr, "info2", &r->info2);
                        break;
 
                        case 3:
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo3(ndr, NDR_BUFFERS, &r->info3));
+                               ndr_print_spoolss_PrinterInfo3(ndr, "info3", &r->info3);
                        break;
 
                        case 4:
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo4(ndr, NDR_BUFFERS, &r->info4));
+                               ndr_print_spoolss_PrinterInfo4(ndr, "info4", &r->info4);
                        break;
 
                        case 5:
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo5(ndr, NDR_BUFFERS, &r->info5));
+                               ndr_print_spoolss_PrinterInfo5(ndr, "info5", &r->info5);
                        break;
 
                        case 6:
+                               ndr_print_spoolss_PrinterInfo6(ndr, "info6", &r->info6);
                        break;
 
                        case 7:
-                               NDR_CHECK(ndr_pull_spoolss_PrinterInfo7(ndr, NDR_BUFFERS, &r->info7));
+                               ndr_print_spoolss_PrinterInfo7(ndr, "info7", &r->info7);
                        break;
 
                        case 8:
-                               NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_BUFFERS, &r->info8));
+                               ndr_print_spoolss_DeviceModeInfo(ndr, "info8", &r->info8);
                        break;
 
                        case 9:
-                               NDR_CHECK(ndr_pull_spoolss_DeviceModeInfo(ndr, NDR_BUFFERS, &r->info9));
+                               ndr_print_spoolss_DeviceModeInfo(ndr, "info9", &r->info9);
                        break;
 
                        default:
                        break;
 
                }
-       }
-       ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_PrinterInfo(struct ndr_print *ndr, const char *name, const union spoolss_PrinterInfo *r)
-{
-       int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_PrinterInfo");
-       switch (level) {
-               case 0:
-                       ndr_print_spoolss_PrinterInfo0(ndr, "info0", &r->info0);
-               break;
-
-               case 1:
-                       ndr_print_spoolss_PrinterInfo1(ndr, "info1", &r->info1);
-               break;
-
-               case 2:
-                       ndr_print_spoolss_PrinterInfo2(ndr, "info2", &r->info2);
-               break;
-
-               case 3:
-                       ndr_print_spoolss_PrinterInfo3(ndr, "info3", &r->info3);
-               break;
-
-               case 4:
-                       ndr_print_spoolss_PrinterInfo4(ndr, "info4", &r->info4);
-               break;
-
-               case 5:
-                       ndr_print_spoolss_PrinterInfo5(ndr, "info5", &r->info5);
-               break;
-
-               case 6:
-                       ndr_print_spoolss_PrinterInfo6(ndr, "info6", &r->info6);
-               break;
-
-               case 7:
-                       ndr_print_spoolss_PrinterInfo7(ndr, "info7", &r->info7);
-               break;
-
-               case 8:
-                       ndr_print_spoolss_DeviceModeInfo(ndr, "info8", &r->info8);
-               break;
-
-               case 9:
-                       ndr_print_spoolss_DeviceModeInfo(ndr, "info9", &r->info9);
-               break;
-
-               default:
-               break;
-
+               ndr->flags = _flags_save_UNION;
        }
 }
 
 _PUBLIC_ size_t ndr_size_spoolss_PrinterInfo(const union spoolss_PrinterInfo *r, uint32_t level, struct smb_iconv_convenience *ic, int flags)
 {
+       flags |= LIBNDR_FLAG_RELATIVE_REVERSE;
        return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterInfo, ic);
 }
 
@@ -3228,8 +3349,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo1(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->printer_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->printer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printer_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printer_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3237,8 +3359,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo1(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->server_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->server_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->server_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->server_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->server_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3246,8 +3369,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo1(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->user_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->user_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->user_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->user_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->user_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3255,8 +3379,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo1(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->document_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->document_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->document_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->document_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->document_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3264,8 +3389,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo1(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->data_type) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->data_type));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->data_type));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_type));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data_type));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3273,8 +3399,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo1(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->text_status) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->text_status));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->text_status));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->text_status));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->text_status));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3609,14 +3736,24 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_push_relative_ptr1(ndr, r->devmode));
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->devmode));
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
+               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->text_status));
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_push_relative_ptr1(ndr, r->secdesc));
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->secdesc));
+                       ndr->flags = _flags_save_security_descriptor;
+               }
                NDR_CHECK(ndr_push_spoolss_JobStatus(ndr, NDR_SCALARS, r->status));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->priority));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->position));
@@ -3634,8 +3771,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->printer_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->printer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printer_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printer_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3643,8 +3781,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->server_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->server_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->server_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->server_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->server_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3652,8 +3791,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->user_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->user_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->user_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->user_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->user_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3661,8 +3801,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->document_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->document_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->document_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->document_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->document_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3670,8 +3811,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->notify_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->notify_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->notify_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->notify_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->notify_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3679,8 +3821,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->data_type) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->data_type));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->data_type));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_type));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data_type));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3688,8 +3831,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        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_relative_ptr2_start(ndr, r->print_processor));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->print_processor));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->print_processor));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3697,8 +3841,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->parameters) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->parameters));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->parameters));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->parameters));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->parameters));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -3706,27 +3851,51 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo2(struct ndr_push *ndr, int n
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->devmode) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, r->devmode));
-                       NDR_CHECK(ndr_push_spoolss_DeviceMode(ndr, NDR_SCALARS, r->devmode));
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->devmode) {
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, 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));
+                               }
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->devmode));
+                       }
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->text_status) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->text_status));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->text_status));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->text_status));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->text_status));
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->secdesc) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, r->secdesc));
-                       NDR_CHECK(ndr_push_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->secdesc) {
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, 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));
+                               }
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->secdesc));
+                       }
+                       ndr->flags = _flags_save_security_descriptor;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -3869,12 +4038,17 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                        }
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
-               if (_ptr_devmode) {
-                       NDR_PULL_ALLOC(ndr, r->devmode);
-                       NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->devmode, _ptr_devmode));
-               } else {
-                       r->devmode = NULL;
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
+                       if (_ptr_devmode) {
+                               NDR_PULL_ALLOC(ndr, r->devmode);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->devmode, _ptr_devmode));
+                       } else {
+                               r->devmode = NULL;
+                       }
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
@@ -3888,12 +4062,17 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                        }
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
-               if (_ptr_secdesc) {
-                       NDR_PULL_ALLOC(ndr, r->secdesc);
-                       NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->secdesc, _ptr_secdesc));
-               } else {
-                       r->secdesc = NULL;
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
+                       if (_ptr_secdesc) {
+                               NDR_PULL_ALLOC(ndr, r->secdesc);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->secdesc, _ptr_secdesc));
+                       } else {
+                               r->secdesc = NULL;
+                       }
+                       ndr->flags = _flags_save_security_descriptor;
                }
                NDR_CHECK(ndr_pull_spoolss_JobStatus(ndr, NDR_SCALARS, &r->status));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->priority));
@@ -4073,18 +4252,28 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->devmode) {
-                       uint32_t _relative_save_offset;
-                       _relative_save_offset = ndr->offset;
-                       NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->devmode));
-                       _mem_save_devmode_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->devmode, 0);
-                       NDR_CHECK(ndr_pull_spoolss_DeviceMode(ndr, NDR_SCALARS, r->devmode));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
-                       if (ndr->offset > ndr->relative_highest_offset) {
-                               ndr->relative_highest_offset = ndr->offset;
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->devmode) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->offset = _relative_save_offset;
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
@@ -4104,18 +4293,28 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->secdesc) {
-                       uint32_t _relative_save_offset;
-                       _relative_save_offset = ndr->offset;
-                       NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->secdesc));
-                       _mem_save_secdesc_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->secdesc, 0);
-                       NDR_CHECK(ndr_pull_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
-                       if (ndr->offset > ndr->relative_highest_offset) {
-                               ndr->relative_highest_offset = ndr->offset;
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->secdesc) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->offset = _relative_save_offset;
+                       ndr->flags = _flags_save_security_descriptor;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -4318,14 +4517,24 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_push_relative_ptr1(ndr, r->devmode));
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->devmode));
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
+               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->text_status));
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_push_relative_ptr1(ndr, r->secdesc));
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->secdesc));
+                       ndr->flags = _flags_save_security_descriptor;
+               }
                NDR_CHECK(ndr_push_spoolss_JobStatus(ndr, NDR_SCALARS, r->status));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->priority));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->position));
@@ -4344,8 +4553,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->printer_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->printer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->printer_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->printer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->printer_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -4353,8 +4563,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->server_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->server_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->server_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->server_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->server_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -4362,8 +4573,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->user_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->user_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->user_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->user_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->user_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -4371,8 +4583,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->document_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->document_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->document_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->document_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->document_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -4380,8 +4593,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->notify_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->notify_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->notify_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->notify_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->notify_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -4389,8 +4603,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->data_type) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->data_type));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->data_type));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_type));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data_type));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -4398,8 +4613,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        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_relative_ptr2_start(ndr, r->print_processor));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->print_processor));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->print_processor));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -4407,8 +4623,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->parameters) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->parameters));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->parameters));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->parameters));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->parameters));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -4416,27 +4633,51 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo4(struct ndr_push *ndr, int n
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->devmode) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, r->devmode));
-                       NDR_CHECK(ndr_push_spoolss_DeviceMode(ndr, NDR_SCALARS, r->devmode));
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->devmode) {
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, 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));
+                               }
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->devmode));
+                       }
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->text_status) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->text_status));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->text_status));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->text_status));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->text_status));
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->secdesc) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, r->secdesc));
-                       NDR_CHECK(ndr_push_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->secdesc) {
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, 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));
+                               }
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->secdesc));
+                       }
+                       ndr->flags = _flags_save_security_descriptor;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -4579,12 +4820,17 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                        }
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
-               if (_ptr_devmode) {
-                       NDR_PULL_ALLOC(ndr, r->devmode);
-                       NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->devmode, _ptr_devmode));
-               } else {
-                       r->devmode = NULL;
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode));
+                       if (_ptr_devmode) {
+                               NDR_PULL_ALLOC(ndr, r->devmode);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->devmode, _ptr_devmode));
+                       } else {
+                               r->devmode = NULL;
+                       }
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
@@ -4598,12 +4844,17 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                        }
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
-               if (_ptr_secdesc) {
-                       NDR_PULL_ALLOC(ndr, r->secdesc);
-                       NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->secdesc, _ptr_secdesc));
-               } else {
-                       r->secdesc = NULL;
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
+                       if (_ptr_secdesc) {
+                               NDR_PULL_ALLOC(ndr, r->secdesc);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->secdesc, _ptr_secdesc));
+                       } else {
+                               r->secdesc = NULL;
+                       }
+                       ndr->flags = _flags_save_security_descriptor;
                }
                NDR_CHECK(ndr_pull_spoolss_JobStatus(ndr, NDR_SCALARS, &r->status));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->priority));
@@ -4784,18 +5035,28 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->devmode) {
-                       uint32_t _relative_save_offset;
-                       _relative_save_offset = ndr->offset;
-                       NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->devmode));
-                       _mem_save_devmode_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->devmode, 0);
-                       NDR_CHECK(ndr_pull_spoolss_DeviceMode(ndr, NDR_SCALARS, r->devmode));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
-                       if (ndr->offset > ndr->relative_highest_offset) {
-                               ndr->relative_highest_offset = ndr->offset;
+               {
+                       uint32_t _flags_save_spoolss_DeviceMode = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->devmode) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->offset = _relative_save_offset;
+                       ndr->flags = _flags_save_spoolss_DeviceMode;
                }
                {
                        uint32_t _flags_save_string = ndr->flags;
@@ -4815,18 +5076,28 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                        }
                        ndr->flags = _flags_save_string;
                }
-               if (r->secdesc) {
-                       uint32_t _relative_save_offset;
-                       _relative_save_offset = ndr->offset;
-                       NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->secdesc));
-                       _mem_save_secdesc_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->secdesc, 0);
-                       NDR_CHECK(ndr_pull_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
-                       if (ndr->offset > ndr->relative_highest_offset) {
-                               ndr->relative_highest_offset = ndr->offset;
+               {
+                       uint32_t _flags_save_security_descriptor = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGN4);
+                       if (r->secdesc) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 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_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
                        }
-                       ndr->offset = _relative_save_offset;
+                       ndr->flags = _flags_save_security_descriptor;
                }
        }
        return NDR_ERR_SUCCESS;
@@ -4929,64 +5200,69 @@ _PUBLIC_ size_t ndr_size_spoolss_JobInfo4(const struct spoolss_JobInfo4 *r, stru
 }
 
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_JobInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_JobInfo *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);
-               NDR_CHECK(ndr_push_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_JobInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+{
+       uint32_t _save_relative_base_offset = ndr_push_get_relative_base_offset(ndr);
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_JobInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       case 2: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_JobInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
+                               case 2: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_JobInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
 
-                       case 3: {
-                               NDR_CHECK(ndr_push_align(ndr, 4));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_JobInfo3(ndr, NDR_SCALARS, &r->info3));
-                       break; }
+                               case 3: {
+                                       NDR_CHECK(ndr_push_align(ndr, 4));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_JobInfo3(ndr, NDR_SCALARS, &r->info3));
+                               break; }
 
-                       case 4: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_JobInfo4(ndr, NDR_SCALARS, &r->info4));
-                       break; }
+                               case 4: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_JobInfo4(ndr, NDR_SCALARS, &r->info4));
+                               break; }
 
-                       default: {
-                       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:
-                               NDR_CHECK(ndr_push_spoolss_JobInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       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:
+                                       NDR_CHECK(ndr_push_spoolss_JobInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       case 2:
-                               NDR_CHECK(ndr_push_spoolss_JobInfo2(ndr, NDR_BUFFERS, &r->info2));
-                       break;
+                               case 2:
+                                       NDR_CHECK(ndr_push_spoolss_JobInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
 
-                       case 3:
-                       break;
+                               case 3:
+                               break;
 
-                       case 4:
-                               NDR_CHECK(ndr_push_spoolss_JobInfo4(ndr, NDR_BUFFERS, &r->info4));
-                       break;
+                               case 4:
+                                       NDR_CHECK(ndr_push_spoolss_JobInfo4(ndr, NDR_BUFFERS, &r->info4));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -4996,61 +5272,66 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo(struct ndr_pull *ndr, int nd
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_JobInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_JobInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       case 2: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_JobInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
+                               case 2: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_JobInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
 
-                       case 3: {
-                               NDR_CHECK(ndr_pull_align(ndr, 4));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_JobInfo3(ndr, NDR_SCALARS, &r->info3));
-                       break; }
+                               case 3: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 4));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_JobInfo3(ndr, NDR_SCALARS, &r->info3));
+                               break; }
 
-                       case 4: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_JobInfo4(ndr, NDR_SCALARS, &r->info4));
-                       break; }
+                               case 4: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_JobInfo4(ndr, NDR_SCALARS, &r->info4));
+                               break; }
 
-                       default: {
-                       break; }
+                               default: {
+                               break; }
 
+                       }
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
-               switch (level) {
-                       case 1:
-                               NDR_CHECK(ndr_pull_spoolss_JobInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       break;
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 1:
+                                       NDR_CHECK(ndr_pull_spoolss_JobInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       case 2:
-                               NDR_CHECK(ndr_pull_spoolss_JobInfo2(ndr, NDR_BUFFERS, &r->info2));
-                       break;
+                               case 2:
+                                       NDR_CHECK(ndr_pull_spoolss_JobInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
 
-                       case 3:
-                       break;
+                               case 3:
+                               break;
 
-                       case 4:
-                               NDR_CHECK(ndr_pull_spoolss_JobInfo4(ndr, NDR_BUFFERS, &r->info4));
-                       break;
+                               case 4:
+                                       NDR_CHECK(ndr_pull_spoolss_JobInfo4(ndr, NDR_BUFFERS, &r->info4));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -5059,33 +5340,39 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo(struct ndr_pull *ndr, int nd
 _PUBLIC_ void ndr_print_spoolss_JobInfo(struct ndr_print *ndr, const char *name, const union spoolss_JobInfo *r)
 {
        int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_JobInfo");
-       switch (level) {
-               case 1:
-                       ndr_print_spoolss_JobInfo1(ndr, "info1", &r->info1);
-               break;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "spoolss_JobInfo");
+               switch (level) {
+                       case 1:
+                               ndr_print_spoolss_JobInfo1(ndr, "info1", &r->info1);
+                       break;
 
-               case 2:
-                       ndr_print_spoolss_JobInfo2(ndr, "info2", &r->info2);
-               break;
+                       case 2:
+                               ndr_print_spoolss_JobInfo2(ndr, "info2", &r->info2);
+                       break;
 
-               case 3:
-                       ndr_print_spoolss_JobInfo3(ndr, "info3", &r->info3);
-               break;
+                       case 3:
+                               ndr_print_spoolss_JobInfo3(ndr, "info3", &r->info3);
+                       break;
 
-               case 4:
-                       ndr_print_spoolss_JobInfo4(ndr, "info4", &r->info4);
-               break;
+                       case 4:
+                               ndr_print_spoolss_JobInfo4(ndr, "info4", &r->info4);
+                       break;
 
-               default:
-               break;
+                       default:
+                       break;
 
+               }
+               ndr->flags = _flags_save_UNION;
        }
 }
 
 _PUBLIC_ size_t ndr_size_spoolss_JobInfo(const union spoolss_JobInfo *r, uint32_t level, struct smb_iconv_convenience *ic, int flags)
 {
+       flags |= LIBNDR_FLAG_RELATIVE_REVERSE;
        return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_JobInfo, ic);
 }
 
@@ -6781,12 +7068,12 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo2(struct ndr_push *ndr,
                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_uint32(ndr, NDR_SCALARS, r->devmode_ptr));
                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_uint32(ndr, NDR_SCALARS, r->secdesc_ptr));
                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));
@@ -6840,14 +7127,6 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo2(struct ndr_push *ndr,
                        NDR_CHECK(ndr_push_uint3264(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_uint3264(ndr, NDR_SCALARS, ndr_charset_length(r->sepfile, CH_UTF16)));
                        NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, 0));
@@ -6872,14 +7151,6 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo2(struct ndr_push *ndr,
                        NDR_CHECK(ndr_push_uint3264(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;
 }
@@ -6900,8 +7171,6 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo2(struct ndr_pull *ndr,
        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;
@@ -6910,8 +7179,6 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo2(struct ndr_pull *ndr,
        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, 5));
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_servername));
@@ -6956,12 +7223,7 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo2(struct ndr_pull *ndr,
                } 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_uint32(ndr, NDR_SCALARS, &r->devmode_ptr));
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_sepfile));
                if (_ptr_sepfile) {
                        NDR_PULL_ALLOC(ndr, r->sepfile);
@@ -6986,12 +7248,7 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo2(struct ndr_pull *ndr,
                } 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_uint32(ndr, NDR_SCALARS, &r->secdesc_ptr));
                NDR_CHECK(ndr_pull_spoolss_PrinterAttributes(ndr, NDR_SCALARS, &r->attributes));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->priority));
                if (r->priority > 99) {
@@ -7090,17 +7347,6 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo2(struct ndr_pull *ndr,
                        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_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
-               }
                if (r->sepfile) {
                        _mem_save_sepfile_0 = NDR_PULL_GET_MEM_CTX(ndr);
                        NDR_PULL_SET_MEM_CTX(ndr, r->sepfile, 0);
@@ -7149,17 +7395,6 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo2(struct ndr_pull *ndr,
                        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->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_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
-               }
        }
        return NDR_ERR_SUCCESS;
 }
@@ -7210,12 +7445,7 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterInfo2(struct ndr_print *ndr, const cha
                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_uint32(ndr, "devmode_ptr", r->devmode_ptr);
        ndr_print_ptr(ndr, "sepfile", r->sepfile);
        ndr->depth++;
        if (r->sepfile) {
@@ -7240,12 +7470,7 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterInfo2(struct ndr_print *ndr, const cha
                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_uint32(ndr, "secdesc_ptr", r->secdesc_ptr);
        ndr_print_spoolss_PrinterAttributes(ndr, "attributes", r->attributes);
        ndr_print_uint32(ndr, "priority", r->priority);
        ndr_print_uint32(ndr, "defaultpriority", r->defaultpriority);
@@ -7588,6 +7813,70 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterInfo7(struct ndr_print *ndr, const cha
        ndr->depth--;
 }
 
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo8(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo8 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->devmode_ptr));
+               NDR_CHECK(ndr_push_trailer_align(ndr, 4));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo8(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo8 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->devmode_ptr));
+               NDR_CHECK(ndr_pull_trailer_align(ndr, 4));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo8(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo8 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo8");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "devmode_ptr", r->devmode_ptr);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo9(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo9 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->devmode_ptr));
+               NDR_CHECK(ndr_push_trailer_align(ndr, 4));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo9(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo9 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->devmode_ptr));
+               NDR_CHECK(ndr_pull_trailer_align(ndr, 4));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_SetPrinterInfo9(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo9 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo9");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "devmode_ptr", r->devmode_ptr);
+       ndr->depth--;
+}
+
 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) {
@@ -7693,13 +7982,13 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo(struct ndr_push *ndr, i
 
                        case 8:
                                if (r->info8) {
-                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info8));
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo8(ndr, NDR_SCALARS, r->info8));
                                }
                        break;
 
                        case 9:
                                if (r->info9) {
-                                       NDR_CHECK(ndr_push_spoolss_DeviceModeInfo(ndr, NDR_SCALARS|NDR_BUFFERS, r->info9));
+                                       NDR_CHECK(ndr_push_spoolss_SetPrinterInfo9(ndr, NDR_SCALARS, r->info9));
                                }
                        break;
 
@@ -7916,7 +8205,7 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo(struct ndr_pull *ndr, i
                                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_CHECK(ndr_pull_spoolss_SetPrinterInfo8(ndr, NDR_SCALARS, r->info8));
                                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info8_0, 0);
                                }
                        break;
@@ -7925,7 +8214,7 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo(struct ndr_pull *ndr, i
                                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_CHECK(ndr_pull_spoolss_SetPrinterInfo9(ndr, NDR_SCALARS, r->info9));
                                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info9_0, 0);
                                }
                        break;
@@ -8020,7 +8309,7 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterInfo(struct ndr_print *ndr, const char
                        ndr_print_ptr(ndr, "info8", r->info8);
                        ndr->depth++;
                        if (r->info8) {
-                               ndr_print_spoolss_DeviceModeInfo(ndr, "info8", r->info8);
+                               ndr_print_spoolss_SetPrinterInfo8(ndr, "info8", r->info8);
                        }
                        ndr->depth--;
                break;
@@ -8029,7 +8318,7 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterInfo(struct ndr_print *ndr, const char
                        ndr_print_ptr(ndr, "info9", r->info9);
                        ndr->depth++;
                        if (r->info9) {
-                               ndr_print_spoolss_DeviceModeInfo(ndr, "info9", r->info9);
+                               ndr_print_spoolss_SetPrinterInfo9(ndr, "info9", r->info9);
                        }
                        ndr->depth--;
                break;
@@ -10592,8 +10881,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo1(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -10704,8 +10994,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo2(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -10713,8 +11004,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo2(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->architecture));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->architecture));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -10722,8 +11014,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo2(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_path));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_path));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_path));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -10731,8 +11024,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo2(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->data_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -10740,8 +11034,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo2(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->config_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->config_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->config_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11030,8 +11325,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11039,8 +11335,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->architecture));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->architecture));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11048,8 +11345,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_path));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_path));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_path));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11057,8 +11355,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->data_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11066,8 +11365,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->config_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->config_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->config_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11075,8 +11375,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->help_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->help_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->help_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11084,8 +11385,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->dependent_files));
                                NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->dependent_files));
                        }
                        ndr->flags = _flags_save_string_array;
                }
@@ -11093,8 +11395,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->monitor_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->monitor_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11102,8 +11405,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo3(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->default_datatype));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->default_datatype));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->default_datatype));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11550,8 +11854,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11559,8 +11864,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->architecture));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->architecture));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11568,8 +11874,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_path));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_path));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_path));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11577,8 +11884,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->data_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11586,8 +11894,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->config_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->config_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->config_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11595,8 +11904,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->help_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->help_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->help_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11604,8 +11914,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->dependent_files));
                                NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->dependent_files));
                        }
                        ndr->flags = _flags_save_string_array;
                }
@@ -11613,8 +11924,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->monitor_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->monitor_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11622,8 +11934,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->default_datatype));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->default_datatype));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->default_datatype));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -11631,8 +11944,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo4(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->previous_names));
                                NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->previous_names));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->previous_names));
                        }
                        ndr->flags = _flags_save_string_array;
                }
@@ -12090,8 +12404,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo5(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12099,8 +12414,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo5(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->architecture));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->architecture));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12108,8 +12424,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo5(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_path));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_path));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_path));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12117,8 +12434,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo5(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->data_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12126,8 +12444,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo5(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->config_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->config_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->config_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12454,8 +12773,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12463,8 +12783,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->architecture));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->architecture));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12472,8 +12793,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_path));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_path));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_path));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12481,8 +12803,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->data_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12490,8 +12813,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->config_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->config_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->config_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12499,8 +12823,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->help_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->help_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->help_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12508,8 +12833,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->dependent_files));
                                NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->dependent_files));
                        }
                        ndr->flags = _flags_save_string_array;
                }
@@ -12517,8 +12843,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->monitor_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->monitor_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12526,8 +12853,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->default_datatype));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->default_datatype));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->default_datatype));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12535,8 +12863,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->previous_names));
                                NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->previous_names));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->previous_names));
                        }
                        ndr->flags = _flags_save_string_array;
                }
@@ -12544,8 +12873,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->manufacturer_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->manufacturer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->manufacturer_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->manufacturer_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12553,8 +12883,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->manufacturer_url) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->manufacturer_url));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->manufacturer_url));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_url));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->manufacturer_url));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12562,8 +12893,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->hardware_id) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->hardware_id));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->hardware_id));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->hardware_id));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->hardware_id));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -12571,8 +12903,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo6(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->provider) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->provider));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->provider));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->provider));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->provider));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13172,8 +13505,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo7(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13181,8 +13515,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo7(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->inf_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->inf_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->inf_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->inf_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->inf_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13190,8 +13525,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo7(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->install_source_root) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->install_source_root));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->install_source_root));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->install_source_root));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->install_source_root));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13471,8 +13807,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13480,8 +13817,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->architecture));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->architecture));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->architecture));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13489,8 +13827,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->driver_path));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->driver_path));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->driver_path));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13498,8 +13837,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->data_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->data_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13507,8 +13847,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->config_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->config_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->config_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13516,8 +13857,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->help_file));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->help_file));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->help_file));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13525,8 +13867,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->dependent_files));
                                NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->dependent_files));
                        }
                        ndr->flags = _flags_save_string_array;
                }
@@ -13534,8 +13877,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->monitor_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->monitor_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13543,8 +13887,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->default_datatype));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->default_datatype));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->default_datatype));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13552,8 +13897,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->previous_names));
                                NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->previous_names));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->previous_names));
                        }
                        ndr->flags = _flags_save_string_array;
                }
@@ -13561,8 +13907,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->manufacturer_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->manufacturer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->manufacturer_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->manufacturer_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13570,8 +13917,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->manufacturer_url) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->manufacturer_url));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->manufacturer_url));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->manufacturer_url));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->manufacturer_url));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13579,8 +13927,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->hardware_id) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->hardware_id));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->hardware_id));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->hardware_id));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->hardware_id));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13588,8 +13937,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->provider) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->provider));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->provider));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->provider));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->provider));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13597,8 +13947,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->print_processor));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->print_processor));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->print_processor));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13606,8 +13957,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->vendor_setup));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->vendor_setup));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->vendor_setup));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13615,8 +13967,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->color_profiles));
                                NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->color_profiles));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->color_profiles));
                        }
                        ndr->flags = _flags_save_string_array;
                }
@@ -13624,8 +13977,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->inf_path));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->inf_path));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->inf_path));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -13633,8 +13987,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        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_relative_ptr2_start(ndr, r->core_driver_dependencies));
                                NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->core_driver_dependencies));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->core_driver_dependencies));
                        }
                        ndr->flags = _flags_save_string_array;
                }
@@ -14446,8 +14801,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverFileInfo(struct ndr_push *ndr,
                        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_relative_ptr2_start(ndr, r->file_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->file_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->file_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -14596,121 +14952,126 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo101(struct ndr_print *ndr, const char
        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);
-       if (ndr_flags & NDR_SCALARS) {
-               int level = ndr_push_get_switch_value(ndr, r);
-               NDR_CHECK(ndr_push_union_align(ndr, 8));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
-
-                       case 2: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
-
-                       case 3: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo3(ndr, NDR_SCALARS, &r->info3));
-                       break; }
-
-                       case 4: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo4(ndr, NDR_SCALARS, &r->info4));
-                       break; }
-
-                       case 5: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               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 7: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo7(ndr, NDR_SCALARS, &r->info7));
-                       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 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_DriverInfo101(ndr, NDR_SCALARS, &r->info101));
-                       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:
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       break;
-
-                       case 2:
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo2(ndr, NDR_BUFFERS, &r->info2));
-                       break;
-
-                       case 3:
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo3(ndr, NDR_BUFFERS, &r->info3));
-                       break;
-
-                       case 4:
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo4(ndr, NDR_BUFFERS, &r->info4));
-                       break;
-
-                       case 5:
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo5(ndr, NDR_BUFFERS, &r->info5));
-                       break;
-
-                       case 6:
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo6(ndr, NDR_BUFFERS, &r->info6));
-                       break;
-
-                       case 7:
-                               NDR_CHECK(ndr_push_spoolss_DriverInfo7(ndr, NDR_BUFFERS, &r->info7));
-                       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;
-
+_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);
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 8));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
+
+                               case 2: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
+
+                               case 3: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo3(ndr, NDR_SCALARS, &r->info3));
+                               break; }
+
+                               case 4: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo4(ndr, NDR_SCALARS, &r->info4));
+                               break; }
+
+                               case 5: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       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 7: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo7(ndr, NDR_SCALARS, &r->info7));
+                               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 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_DriverInfo101(ndr, NDR_SCALARS, &r->info101));
+                               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:
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
+
+                               case 2:
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
+
+                               case 3:
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo3(ndr, NDR_BUFFERS, &r->info3));
+                               break;
+
+                               case 4:
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo4(ndr, NDR_BUFFERS, &r->info4));
+                               break;
+
+                               case 5:
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo5(ndr, NDR_BUFFERS, &r->info5));
+                               break;
+
+                               case 6:
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo6(ndr, NDR_BUFFERS, &r->info6));
+                               break;
+
+                               case 7:
+                                       NDR_CHECK(ndr_push_spoolss_DriverInfo7(ndr, NDR_BUFFERS, &r->info7));
+                               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;
+
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -14720,167 +15081,178 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo(struct ndr_pull *ndr, int
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 8));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
-
-                       case 2: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
-
-                       case 3: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo3(ndr, NDR_SCALARS, &r->info3));
-                       break; }
-
-                       case 4: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo4(ndr, NDR_SCALARS, &r->info4));
-                       break; }
-
-                       case 5: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo5(ndr, NDR_SCALARS, &r->info5));
-                       break; }
-
-                       case 6: {
-                               NDR_CHECK(ndr_pull_align(ndr, 8));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo6(ndr, NDR_SCALARS, &r->info6));
-                       break; }
-
-                       case 7: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo7(ndr, NDR_SCALARS, &r->info7));
-                       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; }
-
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 8));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
+
+                               case 2: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
+
+                               case 3: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo3(ndr, NDR_SCALARS, &r->info3));
+                               break; }
+
+                               case 4: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo4(ndr, NDR_SCALARS, &r->info4));
+                               break; }
+
+                               case 5: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo5(ndr, NDR_SCALARS, &r->info5));
+                               break; }
+
+                               case 6: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 8));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo6(ndr, NDR_SCALARS, &r->info6));
+                               break; }
+
+                               case 7: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo7(ndr, NDR_SCALARS, &r->info7));
+                               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; }
+
+                       }
+               }
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 1:
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
+
+                               case 2:
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
+
+                               case 3:
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo3(ndr, NDR_BUFFERS, &r->info3));
+                               break;
+
+                               case 4:
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo4(ndr, NDR_BUFFERS, &r->info4));
+                               break;
+
+                               case 5:
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo5(ndr, NDR_BUFFERS, &r->info5));
+                               break;
+
+                               case 6:
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo6(ndr, NDR_BUFFERS, &r->info6));
+                               break;
+
+                               case 7:
+                                       NDR_CHECK(ndr_pull_spoolss_DriverInfo7(ndr, NDR_BUFFERS, &r->info7));
+                               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;
+
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+       ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_DriverInfo(struct ndr_print *ndr, const char *name, const union spoolss_DriverInfo *r)
+{
+       int level;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "spoolss_DriverInfo");
                switch (level) {
                        case 1:
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               ndr_print_spoolss_DriverInfo1(ndr, "info1", &r->info1);
                        break;
 
                        case 2:
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               ndr_print_spoolss_DriverInfo2(ndr, "info2", &r->info2);
                        break;
 
                        case 3:
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo3(ndr, NDR_BUFFERS, &r->info3));
+                               ndr_print_spoolss_DriverInfo3(ndr, "info3", &r->info3);
                        break;
 
                        case 4:
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo4(ndr, NDR_BUFFERS, &r->info4));
+                               ndr_print_spoolss_DriverInfo4(ndr, "info4", &r->info4);
                        break;
 
                        case 5:
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo5(ndr, NDR_BUFFERS, &r->info5));
+                               ndr_print_spoolss_DriverInfo5(ndr, "info5", &r->info5);
                        break;
 
                        case 6:
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo6(ndr, NDR_BUFFERS, &r->info6));
+                               ndr_print_spoolss_DriverInfo6(ndr, "info6", &r->info6);
                        break;
 
                        case 7:
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo7(ndr, NDR_BUFFERS, &r->info7));
+                               ndr_print_spoolss_DriverInfo7(ndr, "info7", &r->info7);
                        break;
 
                        case 8:
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo8(ndr, NDR_BUFFERS, &r->info8));
+                               ndr_print_spoolss_DriverInfo8(ndr, "info8", &r->info8);
                        break;
 
                        case 101:
-                               NDR_CHECK(ndr_pull_spoolss_DriverInfo101(ndr, NDR_BUFFERS, &r->info101));
+                               ndr_print_spoolss_DriverInfo101(ndr, "info101", &r->info101);
                        break;
 
                        default:
                        break;
 
                }
-       }
-       ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
-       return NDR_ERR_SUCCESS;
-}
-
-_PUBLIC_ void ndr_print_spoolss_DriverInfo(struct ndr_print *ndr, const char *name, const union spoolss_DriverInfo *r)
-{
-       int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_DriverInfo");
-       switch (level) {
-               case 1:
-                       ndr_print_spoolss_DriverInfo1(ndr, "info1", &r->info1);
-               break;
-
-               case 2:
-                       ndr_print_spoolss_DriverInfo2(ndr, "info2", &r->info2);
-               break;
-
-               case 3:
-                       ndr_print_spoolss_DriverInfo3(ndr, "info3", &r->info3);
-               break;
-
-               case 4:
-                       ndr_print_spoolss_DriverInfo4(ndr, "info4", &r->info4);
-               break;
-
-               case 5:
-                       ndr_print_spoolss_DriverInfo5(ndr, "info5", &r->info5);
-               break;
-
-               case 6:
-                       ndr_print_spoolss_DriverInfo6(ndr, "info6", &r->info6);
-               break;
-
-               case 7:
-                       ndr_print_spoolss_DriverInfo7(ndr, "info7", &r->info7);
-               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;
-
+               ndr->flags = _flags_save_UNION;
        }
 }
 
 _PUBLIC_ size_t ndr_size_spoolss_DriverInfo(const union spoolss_DriverInfo *r, uint32_t level, struct smb_iconv_convenience *ic, int flags)
 {
+       flags |= LIBNDR_FLAG_RELATIVE_REVERSE;
        return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo, ic);
 }
 
@@ -14934,35 +15306,40 @@ _PUBLIC_ size_t ndr_size_spoolss_DriverDirectoryInfo1(const struct spoolss_Drive
 _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);
-       if (ndr_flags & NDR_SCALARS) {
-               int level = ndr_push_get_switch_value(ndr, r);
-               NDR_CHECK(ndr_push_union_align(ndr, 4));
-               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_DriverDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 4));
+                       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_DriverDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       default: {
-                               NDR_CHECK(ndr_push_align(ndr, 4));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_DriverDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+                               default: {
+                                       NDR_CHECK(ndr_push_align(ndr, 4));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_DriverDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
+                               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;
+               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;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -14972,34 +15349,39 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverDirectoryInfo(struct ndr_pull
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 4));
-               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_DriverDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 4));
+                       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_DriverDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       default: {
-                               NDR_CHECK(ndr_pull_align(ndr, 4));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_DriverDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+                               default: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 4));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_DriverDirectoryInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
+                       }
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
-               switch (level) {
-                       case 1:
-                       break;
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 1:
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -15008,22 +15390,28 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverDirectoryInfo(struct ndr_pull
 _PUBLIC_ void ndr_print_spoolss_DriverDirectoryInfo(struct ndr_print *ndr, const char *name, const union spoolss_DriverDirectoryInfo *r)
 {
        int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_DriverDirectoryInfo");
-       switch (level) {
-               case 1:
-                       ndr_print_spoolss_DriverDirectoryInfo1(ndr, "info1", &r->info1);
-               break;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "spoolss_DriverDirectoryInfo");
+               switch (level) {
+                       case 1:
+                               ndr_print_spoolss_DriverDirectoryInfo1(ndr, "info1", &r->info1);
+                       break;
 
-               default:
-                       ndr_print_spoolss_DriverDirectoryInfo1(ndr, "info1", &r->info1);
-               break;
+                       default:
+                               ndr_print_spoolss_DriverDirectoryInfo1(ndr, "info1", &r->info1);
+                       break;
 
+               }
+               ndr->flags = _flags_save_UNION;
        }
 }
 
 _PUBLIC_ size_t ndr_size_spoolss_DriverDirectoryInfo(const union spoolss_DriverDirectoryInfo *r, uint32_t level, struct smb_iconv_convenience *ic, int flags)
 {
+       flags |= LIBNDR_FLAG_RELATIVE_REVERSE;
        return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverDirectoryInfo, ic);
 }
 
@@ -15044,8 +15432,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcessorInfo1(struct ndr_push
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->print_processor_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->print_processor_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->print_processor_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->print_processor_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->print_processor_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -15117,33 +15506,38 @@ _PUBLIC_ size_t ndr_size_spoolss_PrintProcessorInfo1(const struct spoolss_PrintP
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcessorInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PrintProcessorInfo *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);
-               NDR_CHECK(ndr_push_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrintProcessorInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrintProcessorInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       default: {
-                       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:
-                               NDR_CHECK(ndr_push_spoolss_PrintProcessorInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       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:
+                                       NDR_CHECK(ndr_push_spoolss_PrintProcessorInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -15153,32 +15547,37 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcessorInfo(struct ndr_pull *
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrintProcessorInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrintProcessorInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       default: {
-                       break; }
+                               default: {
+                               break; }
 
+                       }
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
-               switch (level) {
-                       case 1:
-                               NDR_CHECK(ndr_pull_spoolss_PrintProcessorInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       break;
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 1:
+                                       NDR_CHECK(ndr_pull_spoolss_PrintProcessorInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -15187,16 +15586,21 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcessorInfo(struct ndr_pull *
 _PUBLIC_ void ndr_print_spoolss_PrintProcessorInfo(struct ndr_print *ndr, const char *name, const union spoolss_PrintProcessorInfo *r)
 {
        int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_PrintProcessorInfo");
-       switch (level) {
-               case 1:
-                       ndr_print_spoolss_PrintProcessorInfo1(ndr, "info1", &r->info1);
-               break;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "spoolss_PrintProcessorInfo");
+               switch (level) {
+                       case 1:
+                               ndr_print_spoolss_PrintProcessorInfo1(ndr, "info1", &r->info1);
+                       break;
 
-               default:
-               break;
+                       default:
+                       break;
 
+               }
+               ndr->flags = _flags_save_UNION;
        }
 }
 
@@ -15250,35 +15654,40 @@ _PUBLIC_ size_t ndr_size_spoolss_PrintProcessorDirectoryInfo1(const struct spool
 _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);
-               NDR_CHECK(ndr_push_union_align(ndr, 4));
-               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; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 4));
+                       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: {
-                               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: {
+                                       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; }
 
+                       }
                }
-       }
-       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;
+               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;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -15288,34 +15697,39 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcessorDirectoryInfo(struct n
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 4));
-               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; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 4));
+                       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: {
-                               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: {
+                                       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; }
 
+                       }
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
-               switch (level) {
-                       case 1:
-                       break;
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 1:
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -15324,22 +15738,28 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcessorDirectoryInfo(struct n
 _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;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               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:
-                       ndr_print_spoolss_PrintProcessorDirectoryInfo1(ndr, "info1", &r->info1);
-               break;
+                       default:
+                               ndr_print_spoolss_PrintProcessorDirectoryInfo1(ndr, "info1", &r->info1);
+                       break;
 
+               }
+               ndr->flags = _flags_save_UNION;
        }
 }
 
 _PUBLIC_ size_t ndr_size_spoolss_PrintProcessorDirectoryInfo(const union spoolss_PrintProcessorDirectoryInfo *r, uint32_t level, struct smb_iconv_convenience *ic, int flags)
 {
+       flags |= LIBNDR_FLAG_RELATIVE_REVERSE;
        return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_PrintProcessorDirectoryInfo, ic);
 }
 
@@ -16069,8 +16489,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo1(struct ndr_push *ndr, int
                        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_relative_ptr2_start(ndr, r->form_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->form_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->form_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -16211,8 +16632,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int
                        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_relative_ptr2_start(ndr, r->form_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->form_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->form_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -16220,8 +16642,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
                        if (r->keyword) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->keyword));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->keyword));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->keyword));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->keyword));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -16229,8 +16652,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int
                        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_relative_ptr2_start(ndr, r->mui_dll));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->mui_dll));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->mui_dll));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -16238,8 +16662,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int
                        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_relative_ptr2_start(ndr, r->display_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->display_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->display_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -16439,43 +16864,48 @@ _PUBLIC_ size_t ndr_size_spoolss_FormInfo2(const struct spoolss_FormInfo2 *r, st
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_FormInfo *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);
-               NDR_CHECK(ndr_push_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_FormInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_FormInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       case 2: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_FormInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
+                               case 2: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       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; }
+                               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:
-                               NDR_CHECK(ndr_push_spoolss_FormInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       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:
+                                       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;
+                               case 2:
+                                       NDR_CHECK(ndr_push_spoolss_FormInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -16485,42 +16915,47 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo(struct ndr_pull *ndr, int n
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_FormInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_FormInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       case 2: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_FormInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
+                               case 2: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       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; }
+                               default: {
+                               break; }
 
+                       }
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
-               switch (level) {
-                       case 1:
-                               NDR_CHECK(ndr_pull_spoolss_FormInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       break;
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 1:
+                                       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;
+                               case 2:
+                                       NDR_CHECK(ndr_pull_spoolss_FormInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -16529,25 +16964,31 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo(struct ndr_pull *ndr, int n
 _PUBLIC_ void ndr_print_spoolss_FormInfo(struct ndr_print *ndr, const char *name, const union spoolss_FormInfo *r)
 {
        int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_FormInfo");
-       switch (level) {
-               case 1:
-                       ndr_print_spoolss_FormInfo1(ndr, "info1", &r->info1);
-               break;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "spoolss_FormInfo");
+               switch (level) {
+                       case 1:
+                               ndr_print_spoolss_FormInfo1(ndr, "info1", &r->info1);
+                       break;
 
-               case 2:
-                       ndr_print_spoolss_FormInfo2(ndr, "info2", &r->info2);
-               break;
+                       case 2:
+                               ndr_print_spoolss_FormInfo2(ndr, "info2", &r->info2);
+                       break;
 
-               default:
-               break;
+                       default:
+                       break;
 
+               }
+               ndr->flags = _flags_save_UNION;
        }
 }
 
 _PUBLIC_ size_t ndr_size_spoolss_FormInfo(const union spoolss_FormInfo *r, uint32_t level, struct smb_iconv_convenience *ic, int flags)
 {
+       flags |= LIBNDR_FLAG_RELATIVE_REVERSE;
        return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_FormInfo, ic);
 }
 
@@ -16953,8 +17394,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo1(struct ndr_push *ndr, int
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->port_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->port_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->port_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->port_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->port_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17079,8 +17521,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo2(struct ndr_push *ndr, int
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->port_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->port_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->port_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->port_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->port_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17088,8 +17531,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo2(struct ndr_push *ndr, int
                        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_relative_ptr2_start(ndr, r->monitor_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->monitor_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17097,8 +17541,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo2(struct ndr_push *ndr, int
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->description) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->description));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->description));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->description));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->description));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17328,8 +17773,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo3(struct ndr_push *ndr, int
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->status_string) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->status_string));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->status_string));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->status_string));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->status_string));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17420,8 +17866,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfoFF(struct ndr_push *ndr, int
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->port_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->port_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->port_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->port_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->port_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17495,63 +17942,68 @@ _PUBLIC_ size_t ndr_size_spoolss_PortInfoFF(const struct spoolss_PortInfoFF *r,
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PortInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PortInfo *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);
-               NDR_CHECK(ndr_push_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PortInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PortInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       case 2: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PortInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
+                               case 2: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PortInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
 
-                       case 3: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PortInfo3(ndr, NDR_SCALARS, &r->info3));
-                       break; }
+                               case 3: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PortInfo3(ndr, NDR_SCALARS, &r->info3));
+                               break; }
 
-                       case 0xff: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PortInfoFF(ndr, NDR_SCALARS, &r->infoFF));
-                       break; }
+                               case 0xff: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PortInfoFF(ndr, NDR_SCALARS, &r->infoFF));
+                               break; }
 
-                       default: {
-                       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:
-                               NDR_CHECK(ndr_push_spoolss_PortInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       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:
+                                       NDR_CHECK(ndr_push_spoolss_PortInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       case 2:
-                               NDR_CHECK(ndr_push_spoolss_PortInfo2(ndr, NDR_BUFFERS, &r->info2));
-                       break;
+                               case 2:
+                                       NDR_CHECK(ndr_push_spoolss_PortInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
 
-                       case 3:
-                               NDR_CHECK(ndr_push_spoolss_PortInfo3(ndr, NDR_BUFFERS, &r->info3));
-                       break;
+                               case 3:
+                                       NDR_CHECK(ndr_push_spoolss_PortInfo3(ndr, NDR_BUFFERS, &r->info3));
+                               break;
 
-                       case 0xff:
-                               NDR_CHECK(ndr_push_spoolss_PortInfoFF(ndr, NDR_BUFFERS, &r->infoFF));
-                       break;
+                               case 0xff:
+                                       NDR_CHECK(ndr_push_spoolss_PortInfoFF(ndr, NDR_BUFFERS, &r->infoFF));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -17561,62 +18013,67 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo(struct ndr_pull *ndr, int n
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PortInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PortInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       case 2: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PortInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
+                               case 2: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PortInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
 
-                       case 3: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PortInfo3(ndr, NDR_SCALARS, &r->info3));
-                       break; }
+                               case 3: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PortInfo3(ndr, NDR_SCALARS, &r->info3));
+                               break; }
 
-                       case 0xff: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PortInfoFF(ndr, NDR_SCALARS, &r->infoFF));
-                       break; }
+                               case 0xff: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PortInfoFF(ndr, NDR_SCALARS, &r->infoFF));
+                               break; }
 
-                       default: {
-                       break; }
+                               default: {
+                               break; }
 
+                       }
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
-               switch (level) {
-                       case 1:
-                               NDR_CHECK(ndr_pull_spoolss_PortInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       break;
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 1:
+                                       NDR_CHECK(ndr_pull_spoolss_PortInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       case 2:
-                               NDR_CHECK(ndr_pull_spoolss_PortInfo2(ndr, NDR_BUFFERS, &r->info2));
-                       break;
+                               case 2:
+                                       NDR_CHECK(ndr_pull_spoolss_PortInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
 
-                       case 3:
-                               NDR_CHECK(ndr_pull_spoolss_PortInfo3(ndr, NDR_BUFFERS, &r->info3));
-                       break;
+                               case 3:
+                                       NDR_CHECK(ndr_pull_spoolss_PortInfo3(ndr, NDR_BUFFERS, &r->info3));
+                               break;
 
-                       case 0xff:
-                               NDR_CHECK(ndr_pull_spoolss_PortInfoFF(ndr, NDR_BUFFERS, &r->infoFF));
-                       break;
+                               case 0xff:
+                                       NDR_CHECK(ndr_pull_spoolss_PortInfoFF(ndr, NDR_BUFFERS, &r->infoFF));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -17625,28 +18082,33 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo(struct ndr_pull *ndr, int n
 _PUBLIC_ void ndr_print_spoolss_PortInfo(struct ndr_print *ndr, const char *name, const union spoolss_PortInfo *r)
 {
        int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_PortInfo");
-       switch (level) {
-               case 1:
-                       ndr_print_spoolss_PortInfo1(ndr, "info1", &r->info1);
-               break;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "spoolss_PortInfo");
+               switch (level) {
+                       case 1:
+                               ndr_print_spoolss_PortInfo1(ndr, "info1", &r->info1);
+                       break;
 
-               case 2:
-                       ndr_print_spoolss_PortInfo2(ndr, "info2", &r->info2);
-               break;
+                       case 2:
+                               ndr_print_spoolss_PortInfo2(ndr, "info2", &r->info2);
+                       break;
 
-               case 3:
-                       ndr_print_spoolss_PortInfo3(ndr, "info3", &r->info3);
-               break;
+                       case 3:
+                               ndr_print_spoolss_PortInfo3(ndr, "info3", &r->info3);
+                       break;
 
-               case 0xff:
-                       ndr_print_spoolss_PortInfoFF(ndr, "infoFF", &r->infoFF);
-               break;
+                       case 0xff:
+                               ndr_print_spoolss_PortInfoFF(ndr, "infoFF", &r->infoFF);
+                       break;
 
-               default:
-               break;
+                       default:
+                       break;
 
+               }
+               ndr->flags = _flags_save_UNION;
        }
 }
 
@@ -17667,8 +18129,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorInfo1(struct ndr_push *ndr, i
                        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_relative_ptr2_start(ndr, r->monitor_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->monitor_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17766,8 +18229,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorInfo2(struct ndr_push *ndr, i
                        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_relative_ptr2_start(ndr, r->monitor_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->monitor_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->monitor_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17775,8 +18239,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->environment) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->environment));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->environment));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->environment));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->environment));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17784,8 +18249,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorInfo2(struct ndr_push *ndr, i
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->dll_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->dll_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->dll_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->dll_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->dll_name));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -17933,43 +18399,48 @@ _PUBLIC_ size_t ndr_size_spoolss_MonitorInfo2(const struct spoolss_MonitorInfo2
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_MonitorInfo *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);
-               NDR_CHECK(ndr_push_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_MonitorInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_MonitorInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       case 2: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_MonitorInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
+                               case 2: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_MonitorInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
 
-                       default: {
-                       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:
-                               NDR_CHECK(ndr_push_spoolss_MonitorInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       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:
+                                       NDR_CHECK(ndr_push_spoolss_MonitorInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       case 2:
-                               NDR_CHECK(ndr_push_spoolss_MonitorInfo2(ndr, NDR_BUFFERS, &r->info2));
-                       break;
+                               case 2:
+                                       NDR_CHECK(ndr_push_spoolss_MonitorInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -17979,42 +18450,47 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorInfo(struct ndr_pull *ndr, in
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_MonitorInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_MonitorInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       case 2: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_MonitorInfo2(ndr, NDR_SCALARS, &r->info2));
-                       break; }
+                               case 2: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_MonitorInfo2(ndr, NDR_SCALARS, &r->info2));
+                               break; }
 
-                       default: {
-                       break; }
+                               default: {
+                               break; }
 
+                       }
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
-               switch (level) {
-                       case 1:
-                               NDR_CHECK(ndr_pull_spoolss_MonitorInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       break;
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 1:
+                                       NDR_CHECK(ndr_pull_spoolss_MonitorInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       case 2:
-                               NDR_CHECK(ndr_pull_spoolss_MonitorInfo2(ndr, NDR_BUFFERS, &r->info2));
-                       break;
+                               case 2:
+                                       NDR_CHECK(ndr_pull_spoolss_MonitorInfo2(ndr, NDR_BUFFERS, &r->info2));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -18023,20 +18499,25 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorInfo(struct ndr_pull *ndr, in
 _PUBLIC_ void ndr_print_spoolss_MonitorInfo(struct ndr_print *ndr, const char *name, const union spoolss_MonitorInfo *r)
 {
        int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_MonitorInfo");
-       switch (level) {
-               case 1:
-                       ndr_print_spoolss_MonitorInfo1(ndr, "info1", &r->info1);
-               break;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "spoolss_MonitorInfo");
+               switch (level) {
+                       case 1:
+                               ndr_print_spoolss_MonitorInfo1(ndr, "info1", &r->info1);
+                       break;
 
-               case 2:
-                       ndr_print_spoolss_MonitorInfo2(ndr, "info2", &r->info2);
-               break;
+                       case 2:
+                               ndr_print_spoolss_MonitorInfo2(ndr, "info2", &r->info2);
+                       break;
 
-               default:
-               break;
+                       default:
+                       break;
 
+               }
+               ndr->flags = _flags_save_UNION;
        }
 }
 
@@ -18057,8 +18538,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcDataTypesInfo1(struct ndr_p
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->name_array) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->name_array));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->name_array));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->name_array));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->name_array));
                        }
                        ndr->flags = _flags_save_string;
                }
@@ -18130,33 +18612,38 @@ _PUBLIC_ size_t ndr_size_spoolss_PrintProcDataTypesInfo1(const struct spoolss_Pr
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrintProcDataTypesInfo(struct ndr_push *ndr, int ndr_flags, const union spoolss_PrintProcDataTypesInfo *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);
-               NDR_CHECK(ndr_push_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_push_align(ndr, 5));
-                               NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_push_spoolss_PrintProcDataTypesInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               if (ndr_flags & NDR_SCALARS) {
+                       int level = ndr_push_get_switch_value(ndr, r);
+                       NDR_CHECK(ndr_push_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_push_align(ndr, 5));
+                                       NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_push_spoolss_PrintProcDataTypesInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       default: {
-                       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:
-                               NDR_CHECK(ndr_push_spoolss_PrintProcDataTypesInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       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:
+                                       NDR_CHECK(ndr_push_spoolss_PrintProcDataTypesInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -18166,32 +18653,37 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcDataTypesInfo(struct ndr_pu
 {
        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) {
-               NDR_CHECK(ndr_pull_union_align(ndr, 5));
-               switch (level) {
-                       case 1: {
-                               NDR_CHECK(ndr_pull_align(ndr, 5));
-                               NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
-                               NDR_CHECK(ndr_pull_spoolss_PrintProcDataTypesInfo1(ndr, NDR_SCALARS, &r->info1));
-                       break; }
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_pull_get_switch_value(ndr, r);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_pull_union_align(ndr, 5));
+                       switch (level) {
+                               case 1: {
+                                       NDR_CHECK(ndr_pull_align(ndr, 5));
+                                       NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                                       NDR_CHECK(ndr_pull_spoolss_PrintProcDataTypesInfo1(ndr, NDR_SCALARS, &r->info1));
+                               break; }
 
-                       default: {
-                       break; }
+                               default: {
+                               break; }
 
+                       }
                }
-       }
-       if (ndr_flags & NDR_BUFFERS) {
-               NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
-               switch (level) {
-                       case 1:
-                               NDR_CHECK(ndr_pull_spoolss_PrintProcDataTypesInfo1(ndr, NDR_BUFFERS, &r->info1));
-                       break;
+               if (ndr_flags & NDR_BUFFERS) {
+                       NDR_CHECK(ndr_pull_setup_relative_base_offset2(ndr, r));
+                       switch (level) {
+                               case 1:
+                                       NDR_CHECK(ndr_pull_spoolss_PrintProcDataTypesInfo1(ndr, NDR_BUFFERS, &r->info1));
+                               break;
 
-                       default:
-                       break;
+                               default:
+                               break;
 
+                       }
                }
+               ndr->flags = _flags_save_UNION;
        }
        ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);
        return NDR_ERR_SUCCESS;
@@ -18200,16 +18692,21 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcDataTypesInfo(struct ndr_pu
 _PUBLIC_ void ndr_print_spoolss_PrintProcDataTypesInfo(struct ndr_print *ndr, const char *name, const union spoolss_PrintProcDataTypesInfo *r)
 {
        int level;
-       level = ndr_print_get_switch_value(ndr, r);
-       ndr_print_union(ndr, name, level, "spoolss_PrintProcDataTypesInfo");
-       switch (level) {
-               case 1:
-                       ndr_print_spoolss_PrintProcDataTypesInfo1(ndr, "info1", &r->info1);
-               break;
+       {
+               uint32_t _flags_save_UNION = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_RELATIVE_REVERSE);
+               level = ndr_print_get_switch_value(ndr, r);
+               ndr_print_union(ndr, name, level, "spoolss_PrintProcDataTypesInfo");
+               switch (level) {
+                       case 1:
+                               ndr_print_spoolss_PrintProcDataTypesInfo1(ndr, "info1", &r->info1);
+                       break;
 
-               default:
-               break;
+                       default:
+                       break;
 
+               }
+               ndr->flags = _flags_save_UNION;
        }
 }
 
@@ -19699,13 +20196,14 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterEnumValues(struct ndr_push *n
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        if (r->value_name) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->value_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->value_name));
                                NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->value_name));
+                               NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->value_name));
                        }
                        ndr->flags = _flags_save_string;
                }
                if (r->data) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, r->data));
+                       NDR_CHECK(ndr_push_relative_ptr2_start(ndr, r->data));
                        {
                                struct ndr_push *_ndr_data;
                                NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_data, 0, r->data_length));
@@ -19713,6 +20211,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterEnumValues(struct ndr_push *n
                                NDR_CHECK(ndr_push_spoolss_PrinterData(_ndr_data, NDR_SCALARS|NDR_BUFFERS, r->data));
                                NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_data, 0, r->data_length));
                        }
+                       NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->data));
                }
        }
        ndr_push_restore_relative_base_offset(ndr, _save_relative_base_offset);