s3: re-run make full_idl.
[abartlet/samba.git/.git] / librpc / gen_ndr / ndr_spoolss.c
index fb452bcec381709ff133c7abc1b9ef85aa7b5def..0f6855ad52720a52e3b1369a1ffef285788108b4 100644 (file)
@@ -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;
                }
@@ -449,6 +451,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo0(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->printername, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->printername));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printername_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -464,6 +469,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo0(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->servername, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->servername));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_servername_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1045,7 +1053,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DeviceMode(struct ndr_push *ndr, int
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_push_align(ndr, 4));
-               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->devicename, 32, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->devicename, MAXDEVICENAME, sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_push_spoolss_DeviceModeSpecVersion(ndr, NDR_SCALARS, r->specversion));
                NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->driverversion));
                NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->size));
@@ -1064,7 +1072,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DeviceMode(struct ndr_push *ndr, int
                NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->yresolution));
                NDR_CHECK(ndr_push_spoolss_DeviceModeTTOption(ndr, NDR_SCALARS, r->ttoption));
                NDR_CHECK(ndr_push_spoolss_DeviceModeCollate(ndr, NDR_SCALARS, r->collate));
-               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->formname, 32, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->formname, MAXDEVICENAME, sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->logpixels));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->bitsperpel));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->pelswidth));
@@ -1101,7 +1109,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DeviceMode(struct ndr_pull *ndr, int
 {
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
-               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->devicename, 32, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->devicename, MAXDEVICENAME, sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_pull_spoolss_DeviceModeSpecVersion(ndr, NDR_SCALARS, &r->specversion));
                NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->driverversion));
                NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->size));
@@ -1120,7 +1128,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DeviceMode(struct ndr_pull *ndr, int
                NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->yresolution));
                NDR_CHECK(ndr_pull_spoolss_DeviceModeTTOption(ndr, NDR_SCALARS, &r->ttoption));
                NDR_CHECK(ndr_pull_spoolss_DeviceModeCollate(ndr, NDR_SCALARS, &r->collate));
-               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->formname, 32, sizeof(uint16_t), CH_UTF16));
+               NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->formname, MAXDEVICENAME, sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->logpixels));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->bitsperpel));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->pelswidth));
@@ -1307,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;
                }
@@ -1316,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;
                }
@@ -1325,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;
                }
@@ -1395,6 +1406,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo1(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->description, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->description));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_description_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1410,6 +1424,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo1(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1425,6 +1442,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo1(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->comment, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->comment));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_comment_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1551,8 +1571,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;
                }
@@ -1560,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->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;
                }
@@ -1569,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->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;
                }
@@ -1578,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->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;
                }
@@ -1587,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->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;
                }
@@ -1596,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->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;
                }
@@ -1605,26 +1631,29 @@ _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));
+                       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));
                }
                {
                        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;
                }
@@ -1632,8 +1661,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;
                }
@@ -1641,8 +1671,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;
                }
@@ -1650,19 +1681,21 @@ _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));
+                       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));
                }
        }
        return NDR_ERR_SUCCESS;
@@ -1869,6 +1902,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->servername, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->servername));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_servername_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1884,6 +1920,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->printername, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->printername));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printername_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1899,6 +1938,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->sharename, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->sharename));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_sharename_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1914,6 +1956,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->portname, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->portname));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_portname_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1929,6 +1974,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->drivername, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->drivername));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_drivername_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1944,6 +1992,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->comment, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->comment));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_comment_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1959,6 +2010,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->location, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->location));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_location_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -1976,6 +2030,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                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;
                }
                {
@@ -1989,6 +2046,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->sepfile, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->sepfile));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_sepfile_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -2004,6 +2064,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->printprocessor, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->printprocessor));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printprocessor_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -2019,6 +2082,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->datatype, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->datatype));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_datatype_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -2034,6 +2100,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->parameters, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->parameters));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_parameters_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -2051,6 +2120,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, i
                                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;
                }
        }
@@ -2164,13 +2236,14 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo3(struct ndr_push *ndr, i
        }
        if (ndr_flags & NDR_BUFFERS) {
                if (r->secdesc) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, 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));
                }
        }
        return NDR_ERR_SUCCESS;
@@ -2205,6 +2278,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo3(struct ndr_pull *ndr, i
                                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;
                }
        }
@@ -2253,8 +2329,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;
                }
@@ -2262,8 +2339,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;
                }
@@ -2318,6 +2396,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo4(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->printername, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->printername));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printername_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -2333,6 +2414,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo4(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->servername, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->servername));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_servername_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -2392,8 +2476,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;
                }
@@ -2401,8 +2486,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;
                }
@@ -2459,6 +2545,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo5(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->printername, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->printername));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printername_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -2474,6 +2563,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo5(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->portname, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->portname));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_portname_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -2590,8 +2682,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;
                }
@@ -2632,6 +2725,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterInfo7(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->guid, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->guid));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_guid_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -2668,13 +2764,14 @@ static enum ndr_err_code ndr_push_spoolss_DeviceModeInfo(struct ndr_push *ndr, i
        }
        if (ndr_flags & NDR_BUFFERS) {
                if (r->devmode) {
-                       NDR_CHECK(ndr_push_relative_ptr2(ndr, 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));
                }
        }
        return NDR_ERR_SUCCESS;
@@ -2709,6 +2806,9 @@ static enum ndr_err_code ndr_pull_spoolss_DeviceModeInfo(struct ndr_pull *ndr, i
                                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;
                }
        }
@@ -3153,8 +3253,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;
                }
@@ -3162,8 +3263,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;
                }
@@ -3171,8 +3273,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;
                }
@@ -3180,8 +3283,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;
                }
@@ -3189,8 +3293,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;
                }
@@ -3198,8 +3303,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;
                }
@@ -3319,6 +3425,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo1(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->printer_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->printer_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printer_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3334,6 +3443,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo1(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->server_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->server_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_server_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3349,6 +3461,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo1(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->user_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->user_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3364,6 +3479,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo1(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->document_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->document_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_document_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3379,6 +3497,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo1(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->data_type, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_type));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_type_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3394,6 +3515,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo1(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->text_status, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->text_status));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_text_status_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3541,8 +3665,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;
                }
@@ -3550,8 +3675,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;
                }
@@ -3559,8 +3685,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;
                }
@@ -3568,8 +3695,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;
                }
@@ -3577,8 +3705,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;
                }
@@ -3586,8 +3715,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;
                }
@@ -3595,8 +3725,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;
                }
@@ -3604,8 +3735,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;
                }
@@ -3613,27 +3745,31 @@ _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_relative_ptr2_start(ndr, r->devmode));
                        NDR_CHECK(ndr_push_spoolss_DeviceMode(ndr, NDR_SCALARS, r->devmode));
+                       NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->devmode));
                }
                {
                        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_relative_ptr2_start(ndr, r->secdesc));
                        NDR_CHECK(ndr_push_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
+                       NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->secdesc));
                }
        }
        return NDR_ERR_SUCCESS;
@@ -3829,6 +3965,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->printer_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->printer_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printer_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3844,6 +3983,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->server_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->server_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_server_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3859,6 +4001,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->user_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->user_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3874,6 +4019,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->document_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->document_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_document_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3889,6 +4037,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->notify_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->notify_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_notify_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3904,6 +4055,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->data_type, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_type));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_type_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3919,6 +4073,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->print_processor, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->print_processor));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_print_processor_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3934,6 +4091,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->parameters, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->parameters));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_parameters_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3949,6 +4109,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3961,6 +4124,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                        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;
+                       }
                        ndr->offset = _relative_save_offset;
                }
                {
@@ -3974,6 +4140,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->text_status, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->text_status));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_text_status_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -3986,6 +4155,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo2(struct ndr_pull *ndr, int n
                        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;
+                       }
                        ndr->offset = _relative_save_offset;
                }
        }
@@ -4215,8 +4387,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;
                }
@@ -4224,8 +4397,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;
                }
@@ -4233,8 +4407,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;
                }
@@ -4242,8 +4417,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;
                }
@@ -4251,8 +4427,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;
                }
@@ -4260,8 +4437,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;
                }
@@ -4269,8 +4447,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;
                }
@@ -4278,8 +4457,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;
                }
@@ -4287,27 +4467,31 @@ _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_relative_ptr2_start(ndr, r->devmode));
                        NDR_CHECK(ndr_push_spoolss_DeviceMode(ndr, NDR_SCALARS, r->devmode));
+                       NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->devmode));
                }
                {
                        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_relative_ptr2_start(ndr, r->secdesc));
                        NDR_CHECK(ndr_push_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
+                       NDR_CHECK(ndr_push_relative_ptr2_end(ndr, r->secdesc));
                }
        }
        return NDR_ERR_SUCCESS;
@@ -4504,6 +4688,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->printer_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->printer_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_printer_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4519,6 +4706,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->server_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->server_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_server_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4534,6 +4724,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->user_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->user_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4549,6 +4742,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->document_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->document_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_document_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4564,6 +4760,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->notify_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->notify_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_notify_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4579,6 +4778,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->data_type, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_type));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_type_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4594,6 +4796,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->print_processor, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->print_processor));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_print_processor_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4609,6 +4814,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->parameters, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->parameters));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_parameters_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4624,6 +4832,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4636,6 +4847,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                        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;
+                       }
                        ndr->offset = _relative_save_offset;
                }
                {
@@ -4649,6 +4863,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                                NDR_PULL_SET_MEM_CTX(ndr, r->text_status, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->text_status));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_text_status_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -4661,6 +4878,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_JobInfo4(struct ndr_pull *ndr, int n
                        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;
+                       }
                        ndr->offset = _relative_save_offset;
                }
        }
@@ -6616,12 +6836,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));
@@ -6675,14 +6895,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));
@@ -6707,14 +6919,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;
 }
@@ -6735,8 +6939,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;
@@ -6745,8 +6947,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));
@@ -6791,12 +6991,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);
@@ -6821,12 +7016,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) {
@@ -6925,17 +7115,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);
@@ -6984,17 +7163,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;
 }
@@ -7045,12 +7213,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) {
@@ -7075,12 +7238,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);
@@ -7423,6 +7581,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) {
@@ -7528,13 +7750,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;
 
@@ -7751,7 +7973,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;
@@ -7760,7 +7982,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;
@@ -7855,7 +8077,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;
@@ -7864,7 +8086,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;
@@ -10427,8 +10649,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;
                }
@@ -10468,6 +10691,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo1(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -10536,8 +10762,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;
                }
@@ -10545,8 +10772,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;
                }
@@ -10554,8 +10782,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;
                }
@@ -10563,8 +10792,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;
                }
@@ -10572,8 +10802,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;
                }
@@ -10670,6 +10901,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -10685,6 +10919,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -10700,6 +10937,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -10715,6 +10955,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -10730,6 +10973,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo2(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -10847,8 +11093,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;
                }
@@ -10856,8 +11103,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;
                }
@@ -10865,8 +11113,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;
                }
@@ -10874,8 +11123,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;
                }
@@ -10883,8 +11133,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;
                }
@@ -10892,8 +11143,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;
                }
@@ -10901,8 +11153,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;
                }
@@ -10910,8 +11163,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;
                }
@@ -10919,8 +11173,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;
                }
@@ -11073,6 +11328,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11088,6 +11346,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11103,6 +11364,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11118,6 +11382,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11133,6 +11400,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11148,6 +11418,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->help_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11163,6 +11436,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
                                NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string_array;
@@ -11178,6 +11454,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11193,6 +11472,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo3(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11340,8 +11622,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;
                }
@@ -11349,8 +11632,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;
                }
@@ -11358,8 +11642,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;
                }
@@ -11367,8 +11652,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;
                }
@@ -11376,8 +11662,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;
                }
@@ -11385,8 +11672,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;
                }
@@ -11394,8 +11682,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;
                }
@@ -11403,8 +11692,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;
                }
@@ -11412,8 +11702,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;
                }
@@ -11421,8 +11712,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;
                }
@@ -11589,6 +11881,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11604,6 +11899,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11619,6 +11917,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11634,6 +11935,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11649,6 +11953,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11664,6 +11971,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->help_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11679,6 +11989,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
                                NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string_array;
@@ -11694,6 +12007,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11709,6 +12025,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -11724,6 +12043,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo4(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
                                NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->previous_names));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string_array;
@@ -11850,8 +12172,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;
                }
@@ -11859,8 +12182,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;
                }
@@ -11868,8 +12192,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;
                }
@@ -11877,8 +12202,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;
                }
@@ -11886,8 +12212,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;
                }
@@ -11987,6 +12314,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12002,6 +12332,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12017,6 +12350,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12032,6 +12368,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12047,6 +12386,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo5(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12199,8 +12541,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;
                }
@@ -12208,8 +12551,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;
                }
@@ -12217,8 +12561,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;
                }
@@ -12226,8 +12571,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;
                }
@@ -12235,8 +12581,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;
                }
@@ -12244,8 +12591,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;
                }
@@ -12253,8 +12601,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;
                }
@@ -12262,8 +12611,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;
                }
@@ -12271,8 +12621,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;
                }
@@ -12280,8 +12631,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;
                }
@@ -12289,8 +12641,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;
                }
@@ -12298,8 +12651,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;
                }
@@ -12307,8 +12661,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;
                }
@@ -12316,8 +12671,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;
                }
@@ -12542,6 +12898,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12557,6 +12916,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12572,6 +12934,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12587,6 +12952,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12602,6 +12970,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12617,6 +12988,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->help_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12632,6 +13006,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
                                NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string_array;
@@ -12647,6 +13024,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12662,6 +13042,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12677,6 +13060,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
                                NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->previous_names));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string_array;
@@ -12692,6 +13078,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12707,6 +13096,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_url, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_url));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_url_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12722,6 +13114,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->hardware_id, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->hardware_id));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_hardware_id_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12737,6 +13132,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo6(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->provider, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->provider));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_provider_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -12844,6 +13242,208 @@ _PUBLIC_ size_t ndr_size_spoolss_DriverInfo6(const struct spoolss_DriverInfo6 *r
        return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo6, ic);
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo7(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo7 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 5));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->size));
+               NDR_CHECK(ndr_push_spoolss_DriverOSVersion(ndr, NDR_SCALARS, r->version));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->driver_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->inf_name));
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->install_source_root));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_trailer_align(ndr, 5));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2_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;
+               }
+               {
+                       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_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;
+               }
+               {
+                       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_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;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo7(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo7 *r)
+{
+       uint32_t _ptr_driver_name;
+       TALLOC_CTX *_mem_save_driver_name_0;
+       uint32_t _ptr_inf_name;
+       TALLOC_CTX *_mem_save_inf_name_0;
+       uint32_t _ptr_install_source_root;
+       TALLOC_CTX *_mem_save_install_source_root_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 5));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->size));
+               NDR_CHECK(ndr_pull_spoolss_DriverOSVersion(ndr, NDR_SCALARS, &r->version));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_driver_name));
+                       if (_ptr_driver_name) {
+                               NDR_PULL_ALLOC(ndr, r->driver_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->driver_name, _ptr_driver_name));
+                       } else {
+                               r->driver_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_inf_name));
+                       if (_ptr_inf_name) {
+                               NDR_PULL_ALLOC(ndr, r->inf_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->inf_name, _ptr_inf_name));
+                       } else {
+                               r->inf_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_install_source_root));
+                       if (_ptr_install_source_root) {
+                               NDR_PULL_ALLOC(ndr, r->install_source_root);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->install_source_root, _ptr_install_source_root));
+                       } else {
+                               r->install_source_root = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->driver_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->driver_name));
+                               _mem_save_driver_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->inf_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->inf_name));
+                               _mem_save_inf_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->inf_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->inf_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_inf_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->install_source_root) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->install_source_root));
+                               _mem_save_install_source_root_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->install_source_root, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->install_source_root));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_install_source_root_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_DriverInfo7(struct ndr_print *ndr, const char *name, const struct spoolss_DriverInfo7 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_DriverInfo7");
+       ndr->depth++;
+       ndr_print_uint32(ndr, "size", r->size);
+       ndr_print_spoolss_DriverOSVersion(ndr, "version", r->version);
+       ndr_print_ptr(ndr, "driver_name", r->driver_name);
+       ndr->depth++;
+       if (r->driver_name) {
+               ndr_print_string(ndr, "driver_name", r->driver_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "inf_name", r->inf_name);
+       ndr->depth++;
+       if (r->inf_name) {
+               ndr_print_string(ndr, "inf_name", r->inf_name);
+       }
+       ndr->depth--;
+       ndr_print_ptr(ndr, "install_source_root", r->install_source_root);
+       ndr->depth++;
+       if (r->install_source_root) {
+               ndr_print_string(ndr, "install_source_root", r->install_source_root);
+       }
+       ndr->depth--;
+       ndr->depth--;
+}
+
+_PUBLIC_ size_t ndr_size_spoolss_DriverInfo7(const struct spoolss_DriverInfo7 *r, struct smb_iconv_convenience *ic, int flags)
+{
+       return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_DriverInfo7, ic);
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo8 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
@@ -12885,6 +13485,12 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->help_file));
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->dependent_files));
+                       ndr->flags = _flags_save_string_array;
+               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -12897,12 +13503,6 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo8(struct ndr_push *ndr, in
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->default_datatype));
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->dependent_files));
-                       ndr->flags = _flags_save_string_array;
-               }
                {
                        uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -12975,8 +13575,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;
                }
@@ -12984,8 +13585,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;
                }
@@ -12993,8 +13595,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;
                }
@@ -13002,8 +13605,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;
                }
@@ -13011,8 +13615,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;
                }
@@ -13020,17 +13625,29 @@ _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;
                }
+               {
+                       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_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;
+               }
                {
                        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;
                }
@@ -13038,26 +13655,19 @@ _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;
                }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->dependent_files) {
-                               NDR_CHECK(ndr_push_relative_ptr2(ndr, r->dependent_files));
-                               NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->dependent_files));
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
                {
                        uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
                        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;
                }
@@ -13065,8 +13675,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;
                }
@@ -13074,8 +13685,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;
                }
@@ -13083,8 +13695,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;
                }
@@ -13092,8 +13705,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;
                }
@@ -13101,8 +13715,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;
                }
@@ -13110,8 +13725,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;
                }
@@ -13119,8 +13735,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;
                }
@@ -13128,8 +13745,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;
                }
@@ -13137,8 +13755,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;
                }
@@ -13160,12 +13779,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
        TALLOC_CTX *_mem_save_config_file_0;
        uint32_t _ptr_help_file;
        TALLOC_CTX *_mem_save_help_file_0;
+       uint32_t _ptr_dependent_files;
+       TALLOC_CTX *_mem_save_dependent_files_0;
        uint32_t _ptr_monitor_name;
        TALLOC_CTX *_mem_save_monitor_name_0;
        uint32_t _ptr_default_datatype;
        TALLOC_CTX *_mem_save_default_datatype_0;
-       uint32_t _ptr_dependent_files;
-       TALLOC_CTX *_mem_save_dependent_files_0;
        uint32_t _ptr_previous_names;
        TALLOC_CTX *_mem_save_previous_names_0;
        uint32_t _ptr_manufacturer_name;
@@ -13261,6 +13880,18 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
+                       if (_ptr_dependent_files) {
+                               NDR_PULL_ALLOC(ndr, r->dependent_files);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dependent_files, _ptr_dependent_files));
+                       } else {
+                               r->dependent_files = NULL;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -13285,18 +13916,6 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                        }
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dependent_files));
-                       if (_ptr_dependent_files) {
-                               NDR_PULL_ALLOC(ndr, r->dependent_files);
-                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dependent_files, _ptr_dependent_files));
-                       } else {
-                               r->dependent_files = NULL;
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
                {
                        uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -13436,6 +14055,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13451,6 +14073,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->architecture, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->architecture));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_architecture_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13466,6 +14091,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->driver_path, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->driver_path));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_driver_path_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13481,6 +14109,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->data_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->data_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13496,6 +14127,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->config_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->config_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_config_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13511,10 +14145,31 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->help_file, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->help_file));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_help_file_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
+               {
+                       uint32_t _flags_save_string_array = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->dependent_files) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dependent_files));
+                               _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
+                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string_array;
+               }
                {
                        uint32_t _flags_save_string = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -13526,6 +14181,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13541,25 +14199,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->default_datatype, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->default_datatype));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_default_datatype_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
                }
-               {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->dependent_files) {
-                               uint32_t _relative_save_offset;
-                               _relative_save_offset = ndr->offset;
-                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dependent_files));
-                               _mem_save_dependent_files_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, r->dependent_files, 0);
-                               NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->dependent_files));
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dependent_files_0, 0);
-                               ndr->offset = _relative_save_offset;
-                       }
-                       ndr->flags = _flags_save_string_array;
-               }
                {
                        uint32_t _flags_save_string_array = ndr->flags;
                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
@@ -13571,6 +14217,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->previous_names, 0);
                                NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->previous_names));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_previous_names_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string_array;
@@ -13586,6 +14235,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13601,6 +14253,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->manufacturer_url, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->manufacturer_url));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_manufacturer_url_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13616,6 +14271,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->hardware_id, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->hardware_id));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_hardware_id_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13631,6 +14289,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->provider, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->provider));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_provider_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13646,6 +14307,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->print_processor, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->print_processor));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_print_processor_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13661,6 +14325,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->vendor_setup, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->vendor_setup));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_vendor_setup_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13676,6 +14343,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->color_profiles, 0);
                                NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->color_profiles));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_color_profiles_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string_array;
@@ -13691,6 +14361,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->inf_path, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->inf_path));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_inf_path_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -13706,6 +14379,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo8(struct ndr_pull *ndr, in
                                NDR_PULL_SET_MEM_CTX(ndr, r->core_driver_dependencies, 0);
                                NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->core_driver_dependencies));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_core_driver_dependencies_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string_array;
@@ -13755,6 +14431,12 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo8(struct ndr_print *ndr, const char *n
                ndr_print_string(ndr, "help_file", r->help_file);
        }
        ndr->depth--;
+       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
+       ndr->depth++;
+       if (r->dependent_files) {
+               ndr_print_string_array(ndr, "dependent_files", r->dependent_files);
+       }
+       ndr->depth--;
        ndr_print_ptr(ndr, "monitor_name", r->monitor_name);
        ndr->depth++;
        if (r->monitor_name) {
@@ -13767,12 +14449,6 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo8(struct ndr_print *ndr, const char *n
                ndr_print_string(ndr, "default_datatype", r->default_datatype);
        }
        ndr->depth--;
-       ndr_print_ptr(ndr, "dependent_files", r->dependent_files);
-       ndr->depth++;
-       if (r->dependent_files) {
-               ndr_print_string_array(ndr, "dependent_files", r->dependent_files);
-       }
-       ndr->depth--;
        ndr_print_ptr(ndr, "previous_names", r->previous_names);
        ndr->depth++;
        if (r->previous_names) {
@@ -13893,8 +14569,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;
                }
@@ -13936,6 +14613,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverFileInfo(struct ndr_pull *ndr,
                                NDR_PULL_SET_MEM_CTX(ndr, r->file_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->file_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_file_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -14088,6 +14768,12 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo(struct ndr_push *ndr, int
                                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));
@@ -14133,6 +14819,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo(struct ndr_push *ndr, int
                                NDR_CHECK(ndr_push_spoolss_DriverInfo6(ndr, NDR_BUFFERS, &r->info6));
                        break;
 
+                       case 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;
@@ -14194,6 +14884,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo(struct ndr_pull *ndr, int
                                NDR_CHECK(ndr_pull_spoolss_DriverInfo6(ndr, NDR_SCALARS, &r->info6));
                        break; }
 
+                       case 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));
@@ -14238,6 +14934,10 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo(struct ndr_pull *ndr, int
                                NDR_CHECK(ndr_pull_spoolss_DriverInfo6(ndr, NDR_BUFFERS, &r->info6));
                        break;
 
+                       case 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;
@@ -14285,6 +14985,10 @@ _PUBLIC_ void ndr_print_spoolss_DriverInfo(struct ndr_print *ndr, const char *na
                        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;
@@ -14464,8 +15168,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;
                }
@@ -14505,6 +15210,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcessorInfo1(struct ndr_pull
                                NDR_PULL_SET_MEM_CTX(ndr, r->print_processor_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->print_processor_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_print_processor_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -15364,11 +16072,6 @@ _PUBLIC_ void ndr_print_spoolss_PrinterData(struct ndr_print *ndr, const char *n
        }
 }
 
-_PUBLIC_ size_t ndr_size_spoolss_PrinterData(const union spoolss_PrinterData *r, uint32_t level, struct smb_iconv_convenience *ic, int flags)
-{
-       return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterData, ic);
-}
-
 static enum ndr_err_code ndr_push_spoolss_FormFlags(struct ndr_push *ndr, int ndr_flags, enum spoolss_FormFlags r)
 {
        NDR_CHECK(ndr_push_enum_uint32(ndr, NDR_SCALARS, r));
@@ -15491,8 +16194,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;
                }
@@ -15535,6 +16239,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo1(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->form_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->form_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_form_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -15621,7 +16328,8 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int
                        NDR_CHECK(ndr_push_relative_ptr1(ndr, r->display_name));
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->lang_id));
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->lang_id));
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->unused));
                NDR_CHECK(ndr_push_trailer_align(ndr, 5));
        }
        if (ndr_flags & NDR_BUFFERS) {
@@ -15629,8 +16337,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;
                }
@@ -15638,8 +16347,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;
                }
@@ -15647,8 +16357,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;
                }
@@ -15656,8 +16367,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;
                }
@@ -15730,7 +16442,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int
                        }
                        ndr->flags = _flags_save_string;
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->lang_id));
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->lang_id));
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->unused));
                NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
        }
        if (ndr_flags & NDR_BUFFERS) {
@@ -15745,6 +16458,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->form_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->form_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_form_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -15760,6 +16476,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->keyword, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->keyword));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_keyword_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -15775,6 +16494,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->mui_dll, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->mui_dll));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_mui_dll_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -15790,6 +16512,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->display_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->display_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_display_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -15831,7 +16556,8 @@ _PUBLIC_ void ndr_print_spoolss_FormInfo2(struct ndr_print *ndr, const char *nam
                ndr_print_string(ndr, "display_name", r->display_name);
        }
        ndr->depth--;
-       ndr_print_uint32(ndr, "lang_id", r->lang_id);
+       ndr_print_uint16(ndr, "lang_id", r->lang_id);
+       ndr_print_uint16(ndr, "unused", r->unused);
        ndr->depth--;
 }
 
@@ -16357,8 +17083,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;
                }
@@ -16398,6 +17125,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo1(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->port_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->port_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_port_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -16480,8 +17210,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;
                }
@@ -16489,8 +17220,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;
                }
@@ -16498,8 +17230,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;
                }
@@ -16569,6 +17302,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo2(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->port_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->port_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_port_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -16584,6 +17320,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo2(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -16599,6 +17338,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo2(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->description, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->description));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_description_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -16720,8 +17462,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;
                }
@@ -16763,6 +17506,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfo3(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->status_string, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->status_string));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_status_string_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -16809,8 +17555,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;
                }
@@ -16851,6 +17598,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PortInfoFF(struct ndr_pull *ndr, int
                                NDR_PULL_SET_MEM_CTX(ndr, r->port_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->port_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_port_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -17053,8 +17803,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;
                }
@@ -17094,6 +17845,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorInfo1(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -17149,8 +17903,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;
                }
@@ -17158,8 +17913,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;
                }
@@ -17167,8 +17923,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;
                }
@@ -17236,6 +17993,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->monitor_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->monitor_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_monitor_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -17251,6 +18011,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->environment, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->environment));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_environment_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -17266,6 +18029,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorInfo2(struct ndr_pull *ndr, i
                                NDR_PULL_SET_MEM_CTX(ndr, r->dll_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->dll_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dll_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -17431,8 +18197,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;
                }
@@ -17472,6 +18239,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrintProcDataTypesInfo1(struct ndr_p
                                NDR_PULL_SET_MEM_CTX(ndr, r->name_array, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->name_array));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_array_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -19070,13 +19840,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));
@@ -19084,6 +19855,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);
@@ -19137,6 +19909,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterEnumValues(struct ndr_pull *n
                                NDR_PULL_SET_MEM_CTX(ndr, r->value_name, 0);
                                NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->value_name));
                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_value_name_0, 0);
+                               if (ndr->offset > ndr->relative_highest_offset) {
+                                       ndr->relative_highest_offset = ndr->offset;
+                               }
                                ndr->offset = _relative_save_offset;
                        }
                        ndr->flags = _flags_save_string;
@@ -19155,6 +19930,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_PrinterEnumValues(struct ndr_pull *n
                                NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_data, 0, r->data_length));
                        }
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_0, 0);
+                       if (ndr->offset > ndr->relative_highest_offset) {
+                               ndr->relative_highest_offset = ndr->offset;
+                       }
                        ndr->offset = _relative_save_offset;
                }
        }
@@ -19190,6 +19968,105 @@ _PUBLIC_ size_t ndr_size_spoolss_PrinterEnumValues(const struct spoolss_PrinterE
        return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterEnumValues, ic);
 }
 
+static enum ndr_err_code ndr_push_spoolss_KeyNames(struct ndr_push *ndr, int ndr_flags, const union spoolss_KeyNames *r)
+{
+       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 0: {
+                       break; }
+
+                       case 1: {
+                       break; }
+
+                       default: {
+                               {
+                                       uint32_t _flags_save_string_array = ndr->flags;
+                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                                       NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->string_array));
+                                       ndr->flags = _flags_save_string_array;
+                               }
+                       break; }
+
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               int level = ndr_push_get_switch_value(ndr, r);
+               switch (level) {
+                       case 0:
+                       break;
+
+                       case 1:
+                       break;
+
+                       default:
+                       break;
+
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_KeyNames(struct ndr_pull *ndr, int ndr_flags, union spoolss_KeyNames *r)
+{
+       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 0: {
+                       break; }
+
+                       case 1: {
+                       break; }
+
+                       default: {
+                               {
+                                       uint32_t _flags_save_string_array = ndr->flags;
+                                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                                       NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->string_array));
+                                       ndr->flags = _flags_save_string_array;
+                               }
+                       break; }
+
+               }
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               switch (level) {
+                       case 0:
+                       break;
+
+                       case 1:
+                       break;
+
+                       default:
+                       break;
+
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_KeyNames(struct ndr_print *ndr, const char *name, const union spoolss_KeyNames *r)
+{
+       int level;
+       level = ndr_print_get_switch_value(ndr, r);
+       ndr_print_union(ndr, name, level, "spoolss_KeyNames");
+       switch (level) {
+               case 0:
+               break;
+
+               case 1:
+               break;
+
+               default:
+                       ndr_print_string_array(ndr, "string_array", r->string_array);
+               break;
+
+       }
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DeleteDriverFlags(struct ndr_push *ndr, int ndr_flags, uint32_t r)
 {
        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
@@ -27239,7 +28116,7 @@ _PUBLIC_ void ndr_print_spoolss_4c(struct ndr_print *ndr, const char *name, int
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_SetPrinterDataEx(struct ndr_push *ndr, int flags, const struct spoolss_SetPrinterDataEx *r)
+_PUBLIC_ enum ndr_err_code ndr_push__spoolss_SetPrinterDataEx(struct ndr_push *ndr, int flags, const struct _spoolss_SetPrinterDataEx *r)
 {
        if (flags & NDR_IN) {
                if (r->in.handle == NULL) {
@@ -27255,12 +28132,8 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterDataEx(struct ndr_push *ndr,
                NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, ndr_charset_length(r->in.value_name, CH_UTF16)));
                NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.value_name, ndr_charset_length(r->in.value_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_push_winreg_Type(ndr, NDR_SCALARS, r->in.type));
-               if (r->in.buffer == NULL) {
-                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
-               }
-               NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->in.offered));
-               NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->in.buffer, r->in.offered));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
+               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->in.data));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in._offered));
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
@@ -27268,6 +28141,21 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterDataEx(struct ndr_push *ndr,
        return NDR_ERR_SUCCESS;
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push___spoolss_SetPrinterDataEx(struct ndr_push *ndr, int flags, const struct __spoolss_SetPrinterDataEx *r)
+{
+       if (flags & NDR_IN) {
+               NDR_CHECK(ndr_push_winreg_Type(ndr, NDR_SCALARS, r->in.type));
+       }
+       if (flags & NDR_OUT) {
+               if (r->out.data == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_set_switch_value(ndr, r->out.data, r->in.type));
+               NDR_CHECK(ndr_push_spoolss_PrinterData(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.data));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
 static enum ndr_err_code ndr_pull_spoolss_SetPrinterDataEx(struct ndr_pull *ndr, int flags, struct spoolss_SetPrinterDataEx *r)
 {
        TALLOC_CTX *_mem_save_handle_0;
@@ -27294,15 +28182,14 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterDataEx(struct ndr_pull *ndr,
                NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.value_name), sizeof(uint16_t)));
                NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.value_name, ndr_get_array_length(ndr, &r->in.value_name), sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_pull_winreg_Type(ndr, NDR_SCALARS, &r->in.type));
-               NDR_CHECK(ndr_pull_array_size(ndr, &r->in.buffer));
-               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
-                       NDR_PULL_ALLOC_N(ndr, r->in.buffer, ndr_get_array_size(ndr, &r->in.buffer));
-               }
-               NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->in.buffer, ndr_get_array_size(ndr, &r->in.buffer)));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
-               if (r->in.buffer) {
-                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->in.buffer, r->in.offered));
+               {
+                       struct ndr_pull *_ndr_data;
+                       NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_data, 4, -1));
+                       NDR_CHECK(ndr_pull_set_switch_value(_ndr_data, &r->in.data, r->in.type));
+                       NDR_CHECK(ndr_pull_spoolss_PrinterData(_ndr_data, NDR_SCALARS|NDR_BUFFERS, &r->in.data));
+                       NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_data, 4, -1));
                }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in._offered));
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
@@ -27327,11 +28214,9 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterDataEx(struct ndr_print *ndr, const ch
                ndr_print_string(ndr, "key_name", r->in.key_name);
                ndr_print_string(ndr, "value_name", r->in.value_name);
                ndr_print_winreg_Type(ndr, "type", r->in.type);
-               ndr_print_ptr(ndr, "buffer", r->in.buffer);
-               ndr->depth++;
-               ndr_print_array_uint8(ndr, "buffer", r->in.buffer, r->in.offered);
-               ndr->depth--;
-               ndr_print_uint32(ndr, "offered", r->in.offered);
+               ndr_print_set_switch_value(ndr, &r->in.data, r->in.type);
+               ndr_print_spoolss_PrinterData(ndr, "data", &r->in.data);
+               ndr_print_uint32(ndr, "_offered", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?ndr_size_spoolss_PrinterData(&r->in.data, r->in.type, ndr->iconv_convenience, flags):r->in._offered);
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
@@ -27343,7 +28228,7 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterDataEx(struct ndr_print *ndr, const ch
        ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_spoolss_GetPrinterDataEx(struct ndr_push *ndr, int flags, const struct spoolss_GetPrinterDataEx *r)
+_PUBLIC_ enum ndr_err_code ndr_push__spoolss_GetPrinterDataEx(struct ndr_push *ndr, int flags, const struct _spoolss_GetPrinterDataEx *r)
 {
        if (flags & NDR_IN) {
                if (r->in.handle == NULL) {
@@ -27365,11 +28250,10 @@ static enum ndr_err_code ndr_push_spoolss_GetPrinterDataEx(struct ndr_push *ndr,
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
                NDR_CHECK(ndr_push_winreg_Type(ndr, NDR_SCALARS, *r->out.type));
-               if (r->out.buffer == NULL) {
+               if (r->out.data == NULL) {
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
-               NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->in.offered));
-               NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->out.buffer, r->in.offered));
+               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, *r->out.data));
                if (r->out.needed == NULL) {
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
@@ -27379,10 +28263,11 @@ static enum ndr_err_code ndr_push_spoolss_GetPrinterDataEx(struct ndr_push *ndr,
        return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_spoolss_GetPrinterDataEx(struct ndr_pull *ndr, int flags, struct spoolss_GetPrinterDataEx *r)
+_PUBLIC_ enum ndr_err_code ndr_pull__spoolss_GetPrinterDataEx(struct ndr_pull *ndr, int flags, struct _spoolss_GetPrinterDataEx *r)
 {
        TALLOC_CTX *_mem_save_handle_0;
        TALLOC_CTX *_mem_save_type_0;
+       TALLOC_CTX *_mem_save_data_0;
        TALLOC_CTX *_mem_save_needed_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
@@ -27411,8 +28296,8 @@ static enum ndr_err_code ndr_pull_spoolss_GetPrinterDataEx(struct ndr_pull *ndr,
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
                NDR_PULL_ALLOC(ndr, r->out.type);
                ZERO_STRUCTP(r->out.type);
-               NDR_PULL_ALLOC_N(ndr, r->out.buffer, r->in.offered);
-               memset(r->out.buffer, 0, (r->in.offered) * sizeof(*r->out.buffer));
+               NDR_PULL_ALLOC(ndr, r->out.data);
+               ZERO_STRUCTP(r->out.data);
                NDR_PULL_ALLOC(ndr, r->out.needed);
                ZERO_STRUCTP(r->out.needed);
        }
@@ -27424,11 +28309,13 @@ static enum ndr_err_code ndr_pull_spoolss_GetPrinterDataEx(struct ndr_pull *ndr,
                NDR_PULL_SET_MEM_CTX(ndr, r->out.type, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_winreg_Type(ndr, NDR_SCALARS, r->out.type));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_type_0, LIBNDR_FLAG_REF_ALLOC);
-               NDR_CHECK(ndr_pull_array_size(ndr, &r->out.buffer));
                if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
-                       NDR_PULL_ALLOC_N(ndr, r->out.buffer, ndr_get_array_size(ndr, &r->out.buffer));
+                       NDR_PULL_ALLOC(ndr, r->out.data);
                }
-               NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->out.buffer, ndr_get_array_size(ndr, &r->out.buffer)));
+               _mem_save_data_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.data, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, r->out.data));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_0, LIBNDR_FLAG_REF_ALLOC);
                if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
                        NDR_PULL_ALLOC(ndr, r->out.needed);
                }
@@ -27437,9 +28324,44 @@ static enum ndr_err_code ndr_pull_spoolss_GetPrinterDataEx(struct ndr_pull *ndr,
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
-               if (r->out.buffer) {
-                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->out.buffer, r->in.offered));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push___spoolss_GetPrinterDataEx(struct ndr_push *ndr, int flags, const struct __spoolss_GetPrinterDataEx *r)
+{
+       if (flags & NDR_IN) {
+               NDR_CHECK(ndr_push_winreg_Type(ndr, NDR_SCALARS, r->in.type));
+       }
+       if (flags & NDR_OUT) {
+               if (r->out.data == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_set_switch_value(ndr, r->out.data, r->in.type));
+               NDR_CHECK(ndr_push_spoolss_PrinterData(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.data));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull___spoolss_GetPrinterDataEx(struct ndr_pull *ndr, int flags, struct __spoolss_GetPrinterDataEx *r)
+{
+       TALLOC_CTX *_mem_save_data_0;
+       if (flags & NDR_IN) {
+               ZERO_STRUCT(r->out);
+
+               NDR_CHECK(ndr_pull_winreg_Type(ndr, NDR_SCALARS, &r->in.type));
+               NDR_PULL_ALLOC(ndr, r->out.data);
+               ZERO_STRUCTP(r->out.data);
+       }
+       if (flags & NDR_OUT) {
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.data);
                }
+               _mem_save_data_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.data, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_set_switch_value(ndr, r->out.data, r->in.type));
+               NDR_CHECK(ndr_pull_spoolss_PrinterData(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.data));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_0, LIBNDR_FLAG_REF_ALLOC);
        }
        return NDR_ERR_SUCCESS;
 }
@@ -27470,9 +28392,10 @@ _PUBLIC_ void ndr_print_spoolss_GetPrinterDataEx(struct ndr_print *ndr, const ch
                ndr->depth++;
                ndr_print_winreg_Type(ndr, "type", *r->out.type);
                ndr->depth--;
-               ndr_print_ptr(ndr, "buffer", r->out.buffer);
+               ndr_print_ptr(ndr, "data", r->out.data);
                ndr->depth++;
-               ndr_print_array_uint8(ndr, "buffer", r->out.buffer, r->in.offered);
+               ndr_print_set_switch_value(ndr, r->out.data, *r->out.type);
+               ndr_print_spoolss_PrinterData(ndr, "data", r->out.data);
                ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;
@@ -27670,22 +28593,19 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr,
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
        }
        if (flags & NDR_OUT) {
+               if (r->out._ndr_size == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out._ndr_size));
+               if (r->out.key_buffer == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
                {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (r->out.key_buffer == NULL) {
-                               return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
-                       }
-                       NDR_CHECK(ndr_push_unique_ptr(ndr, *r->out.key_buffer));
-                       if (*r->out.key_buffer) {
-                               {
-                                       struct ndr_push *_ndr_key_buffer;
-                                       NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_key_buffer, 0, r->in.offered));
-                                       NDR_CHECK(ndr_push_string_array(_ndr_key_buffer, NDR_SCALARS, *r->out.key_buffer));
-                                       NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_key_buffer, 0, r->in.offered));
-                               }
-                       }
-                       ndr->flags = _flags_save_string_array;
+                       struct ndr_push *_ndr_key_buffer;
+                       NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_key_buffer, 0, *r->out._ndr_size * 2));
+                       NDR_CHECK(ndr_push_set_switch_value(_ndr_key_buffer, r->out.key_buffer, *r->out._ndr_size));
+                       NDR_CHECK(ndr_push_spoolss_KeyNames(_ndr_key_buffer, NDR_SCALARS|NDR_BUFFERS, r->out.key_buffer));
+                       NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_key_buffer, 0, *r->out._ndr_size * 2));
                }
                if (r->out.needed == NULL) {
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
@@ -27698,10 +28618,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr,
 
 _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterKey(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinterKey *r)
 {
-       uint32_t _ptr_key_buffer;
        TALLOC_CTX *_mem_save_handle_0;
+       TALLOC_CTX *_mem_save__ndr_size_0;
        TALLOC_CTX *_mem_save_key_buffer_0;
-       TALLOC_CTX *_mem_save_key_buffer_1;
        TALLOC_CTX *_mem_save_needed_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
@@ -27721,40 +28640,34 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterKey(struct ndr_pull *ndr,
                NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.key_name), sizeof(uint16_t)));
                NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.key_name, ndr_get_array_length(ndr, &r->in.key_name), sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
+               NDR_PULL_ALLOC(ndr, r->out._ndr_size);
+               ZERO_STRUCTP(r->out._ndr_size);
                NDR_PULL_ALLOC(ndr, r->out.key_buffer);
                ZERO_STRUCTP(r->out.key_buffer);
                NDR_PULL_ALLOC(ndr, r->out.needed);
                ZERO_STRUCTP(r->out.needed);
        }
        if (flags & NDR_OUT) {
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out._ndr_size);
+               }
+               _mem_save__ndr_size_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out._ndr_size, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out._ndr_size));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save__ndr_size_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.key_buffer);
+               }
+               _mem_save_key_buffer_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.key_buffer, LIBNDR_FLAG_REF_ALLOC);
                {
-                       uint32_t _flags_save_string_array = ndr->flags;
-                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
-                       if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
-                               NDR_PULL_ALLOC(ndr, r->out.key_buffer);
-                       }
-                       _mem_save_key_buffer_0 = NDR_PULL_GET_MEM_CTX(ndr);
-                       NDR_PULL_SET_MEM_CTX(ndr, r->out.key_buffer, LIBNDR_FLAG_REF_ALLOC);
-                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_key_buffer));
-                       if (_ptr_key_buffer) {
-                               NDR_PULL_ALLOC(ndr, *r->out.key_buffer);
-                       } else {
-                               *r->out.key_buffer = NULL;
-                       }
-                       if (*r->out.key_buffer) {
-                               _mem_save_key_buffer_1 = NDR_PULL_GET_MEM_CTX(ndr);
-                               NDR_PULL_SET_MEM_CTX(ndr, *r->out.key_buffer, 0);
-                               {
-                                       struct ndr_pull *_ndr_key_buffer;
-                                       NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_key_buffer, 0, r->in.offered));
-                                       NDR_CHECK(ndr_pull_string_array(_ndr_key_buffer, NDR_SCALARS, r->out.key_buffer));
-                                       NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_key_buffer, 0, r->in.offered));
-                               }
-                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_1, 0);
-                       }
-                       NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_0, LIBNDR_FLAG_REF_ALLOC);
-                       ndr->flags = _flags_save_string_array;
+                       struct ndr_pull *_ndr_key_buffer;
+                       NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_key_buffer, 0, *r->out._ndr_size * 2));
+                       NDR_CHECK(ndr_pull_set_switch_value(_ndr_key_buffer, r->out.key_buffer, *r->out._ndr_size));
+                       NDR_CHECK(ndr_pull_spoolss_KeyNames(_ndr_key_buffer, NDR_SCALARS|NDR_BUFFERS, r->out.key_buffer));
+                       NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_key_buffer, 0, *r->out._ndr_size * 2));
                }
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_0, LIBNDR_FLAG_REF_ALLOC);
                if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
                        NDR_PULL_ALLOC(ndr, r->out.needed);
                }
@@ -27788,14 +28701,14 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterKey(struct ndr_print *ndr, const char
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumPrinterKey");
                ndr->depth++;
-               ndr_print_ptr(ndr, "key_buffer", r->out.key_buffer);
-               ndr->depth++;
-               ndr_print_ptr(ndr, "key_buffer", *r->out.key_buffer);
+               ndr_print_ptr(ndr, "_ndr_size", r->out._ndr_size);
                ndr->depth++;
-               if (*r->out.key_buffer) {
-                       ndr_print_string_array(ndr, "key_buffer", *r->out.key_buffer);
-               }
+               ndr_print_uint32(ndr, "_ndr_size", *r->out._ndr_size);
                ndr->depth--;
+               ndr_print_ptr(ndr, "key_buffer", r->out.key_buffer);
+               ndr->depth++;
+               ndr_print_set_switch_value(ndr, r->out.key_buffer, *r->out._ndr_size);
+               ndr_print_spoolss_KeyNames(ndr, "key_buffer", r->out.key_buffer);
                ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
                ndr->depth++;