s3: re-run make samba3-idl.
authorGünther Deschner <gd@samba.org>
Fri, 6 Feb 2009 12:57:13 +0000 (13:57 +0100)
committerGünther Deschner <gd@samba.org>
Fri, 6 Feb 2009 13:59:20 +0000 (14:59 +0100)
Guenther

librpc/gen_ndr/cli_spoolss.c
librpc/gen_ndr/cli_spoolss.h
librpc/gen_ndr/ndr_spoolss.c
librpc/gen_ndr/spoolss.h
librpc/gen_ndr/srv_spoolss.c

index 1071f2a3a86d402d657edd5fa1bf081d414396a8..dfb0060d8b342ac76a073c508f82c42d09792eb9 100644 (file)
@@ -173,7 +173,7 @@ NTSTATUS rpccli_spoolss_GetJob(struct rpc_pipe_client *cli,
                               DATA_BLOB *buffer /* [in] [unique] */,
                               uint32_t offered /* [in]  */,
                               union spoolss_JobInfo *info /* [out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
-                              uint32_t needed /* [out]  */,
+                              uint32_t *needed /* [out] [ref] */,
                               WERROR *werror)
 {
        struct spoolss_GetJob r;
@@ -212,7 +212,7 @@ NTSTATUS rpccli_spoolss_GetJob(struct rpc_pipe_client *cli,
        if (info && r.out.info) {
                *info = *r.out.info;
        }
-       return NT_STATUS_NOT_SUPPORTED;
+       *needed = *r.out.needed;
 
        /* Return result */
        if (werror) {
@@ -427,7 +427,7 @@ NTSTATUS rpccli_spoolss_GetPrinter(struct rpc_pipe_client *cli,
                                   DATA_BLOB *buffer /* [in] [unique] */,
                                   uint32_t offered /* [in]  */,
                                   union spoolss_PrinterInfo *info /* [out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
-                                  uint32_t needed /* [out]  */,
+                                  uint32_t *needed /* [out] [ref] */,
                                   WERROR *werror)
 {
        struct spoolss_GetPrinter r;
@@ -465,7 +465,7 @@ NTSTATUS rpccli_spoolss_GetPrinter(struct rpc_pipe_client *cli,
        if (info && r.out.info) {
                *info = *r.out.info;
        }
-       return NT_STATUS_NOT_SUPPORTED;
+       *needed = *r.out.needed;
 
        /* Return result */
        if (werror) {
@@ -624,7 +624,7 @@ NTSTATUS rpccli_spoolss_GetPrinterDriverDirectory(struct rpc_pipe_client *cli,
                                                  DATA_BLOB *buffer /* [in] [unique] */,
                                                  uint32_t offered /* [in]  */,
                                                  union spoolss_DriverDirectoryInfo *info /* [out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
-                                                 uint32_t needed /* [out]  */,
+                                                 uint32_t *needed /* [out] [ref] */,
                                                  WERROR *werror)
 {
        struct spoolss_GetPrinterDriverDirectory r;
@@ -663,7 +663,7 @@ NTSTATUS rpccli_spoolss_GetPrinterDriverDirectory(struct rpc_pipe_client *cli,
        if (info && r.out.info) {
                *info = *r.out.info;
        }
-       return NT_STATUS_NOT_SUPPORTED;
+       *needed = *r.out.needed;
 
        /* Return result */
        if (werror) {
@@ -868,7 +868,7 @@ NTSTATUS rpccli_spoolss_StartDocPrinter(struct rpc_pipe_client *cli,
                                        struct policy_handle *handle /* [in] [ref] */,
                                        uint32_t level /* [in]  */,
                                        union spoolss_DocumentInfo info /* [in] [switch_is(level)] */,
-                                       uint32_t job_id /* [out]  */,
+                                       uint32_t *job_id /* [out] [ref] */,
                                        WERROR *werror)
 {
        struct spoolss_StartDocPrinter r;
@@ -902,7 +902,7 @@ NTSTATUS rpccli_spoolss_StartDocPrinter(struct rpc_pipe_client *cli,
        }
 
        /* Return variables */
-       return NT_STATUS_NOT_SUPPORTED;
+       *job_id = *r.out.job_id;
 
        /* Return result */
        if (werror) {
@@ -960,7 +960,7 @@ NTSTATUS rpccli_spoolss_WritePrinter(struct rpc_pipe_client *cli,
                                     struct policy_handle *handle /* [in] [ref] */,
                                     DATA_BLOB data /* [in]  */,
                                     uint32_t _data_size /* [in] [value(r->in.data.length)] */,
-                                    uint32_t num_written /* [out]  */,
+                                    uint32_t *num_written /* [out] [ref] */,
                                     WERROR *werror)
 {
        struct spoolss_WritePrinter r;
@@ -994,7 +994,7 @@ NTSTATUS rpccli_spoolss_WritePrinter(struct rpc_pipe_client *cli,
        }
 
        /* Return variables */
-       return NT_STATUS_NOT_SUPPORTED;
+       *num_written = *r.out.num_written;
 
        /* Return result */
        if (werror) {
@@ -1093,9 +1093,9 @@ NTSTATUS rpccli_spoolss_AbortPrinter(struct rpc_pipe_client *cli,
 NTSTATUS rpccli_spoolss_ReadPrinter(struct rpc_pipe_client *cli,
                                    TALLOC_CTX *mem_ctx,
                                    struct policy_handle *handle /* [in] [ref] */,
+                                   uint8_t *data /* [out] [ref,size_is(data_size)] */,
                                    uint32_t data_size /* [in]  */,
-                                   DATA_BLOB data /* [out]  */,
-                                   uint32_t _data_size /* [out] [value(r->out.data.length)] */,
+                                   uint32_t *_data_size /* [out] [ref] */,
                                    WERROR *werror)
 {
        struct spoolss_ReadPrinter r;
@@ -1128,8 +1128,8 @@ NTSTATUS rpccli_spoolss_ReadPrinter(struct rpc_pipe_client *cli,
        }
 
        /* Return variables */
-       return NT_STATUS_NOT_SUPPORTED;
-       return NT_STATUS_NOT_SUPPORTED;
+       memcpy(data, r.out.data, r.in.data_size * sizeof(*data));
+       *_data_size = *r.out._data_size;
 
        /* Return result */
        if (werror) {
@@ -1553,7 +1553,7 @@ NTSTATUS rpccli_spoolss_GetForm(struct rpc_pipe_client *cli,
                                DATA_BLOB *buffer /* [in] [unique] */,
                                uint32_t offered /* [in]  */,
                                union spoolss_FormInfo *info /* [out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
-                               uint32_t needed /* [out]  */,
+                               uint32_t *needed /* [out] [ref] */,
                                WERROR *werror)
 {
        struct spoolss_GetForm r;
@@ -1592,7 +1592,7 @@ NTSTATUS rpccli_spoolss_GetForm(struct rpc_pipe_client *cli,
        if (info && r.out.info) {
                *info = *r.out.info;
        }
-       return NT_STATUS_NOT_SUPPORTED;
+       *needed = *r.out.needed;
 
        /* Return result */
        if (werror) {
@@ -2494,9 +2494,9 @@ NTSTATUS rpccli_spoolss_GetPrinterDriver2(struct rpc_pipe_client *cli,
                                          uint32_t client_major_version /* [in]  */,
                                          uint32_t client_minor_version /* [in]  */,
                                          DATA_BLOB *info /* [out] [unique] */,
-                                         uint32_t needed /* [out]  */,
-                                         uint32_t server_major_version /* [out]  */,
-                                         uint32_t server_minor_version /* [out]  */,
+                                         uint32_t *needed /* [out] [ref] */,
+                                         uint32_t *server_major_version /* [out] [ref] */,
+                                         uint32_t *server_minor_version /* [out] [ref] */,
                                          WERROR *werror)
 {
        struct spoolss_GetPrinterDriver2 r;
@@ -2537,9 +2537,9 @@ NTSTATUS rpccli_spoolss_GetPrinterDriver2(struct rpc_pipe_client *cli,
        if (info && r.out.info) {
                *info = *r.out.info;
        }
-       return NT_STATUS_NOT_SUPPORTED;
-       return NT_STATUS_NOT_SUPPORTED;
-       return NT_STATUS_NOT_SUPPORTED;
+       *needed = *r.out.needed;
+       *server_major_version = *r.out.server_major_version;
+       *server_minor_version = *r.out.server_minor_version;
 
        /* Return result */
        if (werror) {
@@ -3637,10 +3637,10 @@ NTSTATUS rpccli_spoolss_GetPrinterDataEx(struct rpc_pipe_client *cli,
                                         struct policy_handle *handle /* [in] [ref] */,
                                         const char *key_name /* [in] [charset(UTF16)] */,
                                         const char *value_name /* [in] [charset(UTF16)] */,
+                                        uint32_t *type /* [out] [ref] */,
+                                        uint8_t *buffer /* [out] [ref,size_is(offered)] */,
                                         uint32_t offered /* [in]  */,
-                                        uint32_t type /* [out]  */,
-                                        DATA_BLOB buffer /* [out]  */,
-                                        uint32_t needed /* [out]  */,
+                                        uint32_t *needed /* [out] [ref] */,
                                         WERROR *werror)
 {
        struct spoolss_GetPrinterDataEx r;
@@ -3675,9 +3675,9 @@ NTSTATUS rpccli_spoolss_GetPrinterDataEx(struct rpc_pipe_client *cli,
        }
 
        /* Return variables */
-       return NT_STATUS_NOT_SUPPORTED;
-       return NT_STATUS_NOT_SUPPORTED;
-       return NT_STATUS_NOT_SUPPORTED;
+       *type = *r.out.type;
+       memcpy(buffer, r.out.buffer, r.in.offered * sizeof(*buffer));
+       *needed = *r.out.needed;
 
        /* Return result */
        if (werror) {
@@ -3691,10 +3691,10 @@ NTSTATUS rpccli_spoolss_EnumPrinterDataEx(struct rpc_pipe_client *cli,
                                          TALLOC_CTX *mem_ctx,
                                          struct policy_handle *handle /* [in] [ref] */,
                                          const char *key_name /* [in] [charset(UTF16)] */,
+                                         uint8_t *buffer /* [out] [ref,size_is(offered)] */,
                                          uint32_t offered /* [in]  */,
-                                         DATA_BLOB buffer /* [out]  */,
-                                         uint32_t needed /* [out]  */,
-                                         uint32_t count /* [out]  */,
+                                         uint32_t *needed /* [out] [ref] */,
+                                         uint32_t *count /* [out] [ref] */,
                                          WERROR *werror)
 {
        struct spoolss_EnumPrinterDataEx r;
@@ -3728,9 +3728,9 @@ NTSTATUS rpccli_spoolss_EnumPrinterDataEx(struct rpc_pipe_client *cli,
        }
 
        /* Return variables */
-       return NT_STATUS_NOT_SUPPORTED;
-       return NT_STATUS_NOT_SUPPORTED;
-       return NT_STATUS_NOT_SUPPORTED;
+       memcpy(buffer, r.out.buffer, r.in.offered * sizeof(*buffer));
+       *needed = *r.out.needed;
+       *count = *r.out.count;
 
        /* Return result */
        if (werror) {
@@ -3744,9 +3744,9 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli,
                                       TALLOC_CTX *mem_ctx,
                                       struct policy_handle *handle /* [in] [ref] */,
                                       const char *key_name /* [in] [charset(UTF16)] */,
-                                      uint32_t key_buffer_size /* [out]  */,
-                                      uint16_t *key_buffer /* [out]  */,
-                                      uint32_t needed /* [in,out]  */,
+                                      uint16_t *key_buffer /* [out] [ref,size_is(key_buffer_size/2)] */,
+                                      uint32_t key_buffer_size /* [in]  */,
+                                      uint32_t *needed /* [out] [ref] */,
                                       WERROR *werror)
 {
        struct spoolss_EnumPrinterKey r;
@@ -3755,7 +3755,7 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli,
        /* In parameters */
        r.in.handle = handle;
        r.in.key_name = key_name;
-       r.in.needed = needed;
+       r.in.key_buffer_size = key_buffer_size;
 
        if (DEBUGLEVEL >= 10) {
                NDR_PRINT_IN_DEBUG(spoolss_EnumPrinterKey, &r);
@@ -3780,9 +3780,8 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli,
        }
 
        /* Return variables */
-       return NT_STATUS_NOT_SUPPORTED;
-       memcpy(key_buffer, r.out.key_buffer, key_buffer_size * sizeof(*key_buffer));
-       return NT_STATUS_NOT_SUPPORTED;
+       memcpy(key_buffer, r.out.key_buffer, r.in.key_buffer_size / 2 * sizeof(*key_buffer));
+       *needed = *r.out.needed;
 
        /* Return result */
        if (werror) {
@@ -4091,11 +4090,10 @@ NTSTATUS rpccli_spoolss_XcvData(struct rpc_pipe_client *cli,
                                const char *function_name /* [in] [charset(UTF16)] */,
                                DATA_BLOB in_data /* [in]  */,
                                uint32_t _in_data_length /* [in] [value(r->in.in_data.length)] */,
-                               uint32_t offered /* [in]  */,
-                               uint32_t unknown1 /* [in]  */,
-                               DATA_BLOB out_data /* [out]  */,
-                               uint32_t needed /* [out]  */,
-                               uint32_t unknown2 /* [out]  */,
+                               uint8_t *out_data /* [out] [ref,size_is(out_data_size)] */,
+                               uint32_t out_data_size /* [in]  */,
+                               uint32_t *needed /* [out] [ref] */,
+                               uint32_t *status_code /* [in,out] [ref] */,
                                WERROR *werror)
 {
        struct spoolss_XcvData r;
@@ -4106,8 +4104,8 @@ NTSTATUS rpccli_spoolss_XcvData(struct rpc_pipe_client *cli,
        r.in.function_name = function_name;
        r.in.in_data = in_data;
        r.in._in_data_length = _in_data_length;
-       r.in.offered = offered;
-       r.in.unknown1 = unknown1;
+       r.in.out_data_size = out_data_size;
+       r.in.status_code = status_code;
 
        if (DEBUGLEVEL >= 10) {
                NDR_PRINT_IN_DEBUG(spoolss_XcvData, &r);
@@ -4132,9 +4130,9 @@ NTSTATUS rpccli_spoolss_XcvData(struct rpc_pipe_client *cli,
        }
 
        /* Return variables */
-       return NT_STATUS_NOT_SUPPORTED;
-       return NT_STATUS_NOT_SUPPORTED;
-       return NT_STATUS_NOT_SUPPORTED;
+       memcpy(out_data, r.out.out_data, r.in.out_data_size * sizeof(*out_data));
+       *needed = *r.out.needed;
+       *status_code = *r.out.status_code;
 
        /* Return result */
        if (werror) {
index ba7de894132a39c6eafe7503fc2874a822808006..b1adf39e4dcf127ce296beb38f98f00c49a77fdc 100644 (file)
@@ -35,7 +35,7 @@ NTSTATUS rpccli_spoolss_GetJob(struct rpc_pipe_client *cli,
                               DATA_BLOB *buffer /* [in] [unique] */,
                               uint32_t offered /* [in]  */,
                               union spoolss_JobInfo *info /* [out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
-                              uint32_t needed /* [out]  */,
+                              uint32_t *needed /* [out] [ref] */,
                               WERROR *werror);
 NTSTATUS rpccli_spoolss_EnumJobs(struct rpc_pipe_client *cli,
                                 TALLOC_CTX *mem_ctx,
@@ -72,7 +72,7 @@ NTSTATUS rpccli_spoolss_GetPrinter(struct rpc_pipe_client *cli,
                                   DATA_BLOB *buffer /* [in] [unique] */,
                                   uint32_t offered /* [in]  */,
                                   union spoolss_PrinterInfo *info /* [out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
-                                  uint32_t needed /* [out]  */,
+                                  uint32_t *needed /* [out] [ref] */,
                                   WERROR *werror);
 NTSTATUS rpccli_spoolss_AddPrinterDriver(struct rpc_pipe_client *cli,
                                         TALLOC_CTX *mem_ctx,
@@ -99,7 +99,7 @@ NTSTATUS rpccli_spoolss_GetPrinterDriverDirectory(struct rpc_pipe_client *cli,
                                                  DATA_BLOB *buffer /* [in] [unique] */,
                                                  uint32_t offered /* [in]  */,
                                                  union spoolss_DriverDirectoryInfo *info /* [out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
-                                                 uint32_t needed /* [out]  */,
+                                                 uint32_t *needed /* [out] [ref] */,
                                                  WERROR *werror);
 NTSTATUS rpccli_spoolss_DeletePrinterDriver(struct rpc_pipe_client *cli,
                                            TALLOC_CTX *mem_ctx,
@@ -130,7 +130,7 @@ NTSTATUS rpccli_spoolss_StartDocPrinter(struct rpc_pipe_client *cli,
                                        struct policy_handle *handle /* [in] [ref] */,
                                        uint32_t level /* [in]  */,
                                        union spoolss_DocumentInfo info /* [in] [switch_is(level)] */,
-                                       uint32_t job_id /* [out]  */,
+                                       uint32_t *job_id /* [out] [ref] */,
                                        WERROR *werror);
 NTSTATUS rpccli_spoolss_StartPagePrinter(struct rpc_pipe_client *cli,
                                         TALLOC_CTX *mem_ctx,
@@ -141,7 +141,7 @@ NTSTATUS rpccli_spoolss_WritePrinter(struct rpc_pipe_client *cli,
                                     struct policy_handle *handle /* [in] [ref] */,
                                     DATA_BLOB data /* [in]  */,
                                     uint32_t _data_size /* [in] [value(r->in.data.length)] */,
-                                    uint32_t num_written /* [out]  */,
+                                    uint32_t *num_written /* [out] [ref] */,
                                     WERROR *werror);
 NTSTATUS rpccli_spoolss_EndPagePrinter(struct rpc_pipe_client *cli,
                                       TALLOC_CTX *mem_ctx,
@@ -154,9 +154,9 @@ NTSTATUS rpccli_spoolss_AbortPrinter(struct rpc_pipe_client *cli,
 NTSTATUS rpccli_spoolss_ReadPrinter(struct rpc_pipe_client *cli,
                                    TALLOC_CTX *mem_ctx,
                                    struct policy_handle *handle /* [in] [ref] */,
+                                   uint8_t *data /* [out] [ref,size_is(data_size)] */,
                                    uint32_t data_size /* [in]  */,
-                                   DATA_BLOB data /* [out]  */,
-                                   uint32_t _data_size /* [out] [value(r->out.data.length)] */,
+                                   uint32_t *_data_size /* [out] [ref] */,
                                    WERROR *werror);
 NTSTATUS rpccli_spoolss_EndDocPrinter(struct rpc_pipe_client *cli,
                                      TALLOC_CTX *mem_ctx,
@@ -211,7 +211,7 @@ NTSTATUS rpccli_spoolss_GetForm(struct rpc_pipe_client *cli,
                                DATA_BLOB *buffer /* [in] [unique] */,
                                uint32_t offered /* [in]  */,
                                union spoolss_FormInfo *info /* [out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
-                               uint32_t needed /* [out]  */,
+                               uint32_t *needed /* [out] [ref] */,
                                WERROR *werror);
 NTSTATUS rpccli_spoolss_SetForm(struct rpc_pipe_client *cli,
                                TALLOC_CTX *mem_ctx,
@@ -311,9 +311,9 @@ NTSTATUS rpccli_spoolss_GetPrinterDriver2(struct rpc_pipe_client *cli,
                                          uint32_t client_major_version /* [in]  */,
                                          uint32_t client_minor_version /* [in]  */,
                                          DATA_BLOB *info /* [out] [unique] */,
-                                         uint32_t needed /* [out]  */,
-                                         uint32_t server_major_version /* [out]  */,
-                                         uint32_t server_minor_version /* [out]  */,
+                                         uint32_t *needed /* [out] [ref] */,
+                                         uint32_t *server_major_version /* [out] [ref] */,
+                                         uint32_t *server_minor_version /* [out] [ref] */,
                                          WERROR *werror);
 NTSTATUS rpccli_spoolss_FindFirstPrinterChangeNotification(struct rpc_pipe_client *cli,
                                                           TALLOC_CTX *mem_ctx,
@@ -441,27 +441,27 @@ NTSTATUS rpccli_spoolss_GetPrinterDataEx(struct rpc_pipe_client *cli,
                                         struct policy_handle *handle /* [in] [ref] */,
                                         const char *key_name /* [in] [charset(UTF16)] */,
                                         const char *value_name /* [in] [charset(UTF16)] */,
+                                        uint32_t *type /* [out] [ref] */,
+                                        uint8_t *buffer /* [out] [ref,size_is(offered)] */,
                                         uint32_t offered /* [in]  */,
-                                        uint32_t type /* [out]  */,
-                                        DATA_BLOB buffer /* [out]  */,
-                                        uint32_t needed /* [out]  */,
+                                        uint32_t *needed /* [out] [ref] */,
                                         WERROR *werror);
 NTSTATUS rpccli_spoolss_EnumPrinterDataEx(struct rpc_pipe_client *cli,
                                          TALLOC_CTX *mem_ctx,
                                          struct policy_handle *handle /* [in] [ref] */,
                                          const char *key_name /* [in] [charset(UTF16)] */,
+                                         uint8_t *buffer /* [out] [ref,size_is(offered)] */,
                                          uint32_t offered /* [in]  */,
-                                         DATA_BLOB buffer /* [out]  */,
-                                         uint32_t needed /* [out]  */,
-                                         uint32_t count /* [out]  */,
+                                         uint32_t *needed /* [out] [ref] */,
+                                         uint32_t *count /* [out] [ref] */,
                                          WERROR *werror);
 NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli,
                                       TALLOC_CTX *mem_ctx,
                                       struct policy_handle *handle /* [in] [ref] */,
                                       const char *key_name /* [in] [charset(UTF16)] */,
-                                      uint32_t key_buffer_size /* [out]  */,
-                                      uint16_t *key_buffer /* [out]  */,
-                                      uint32_t needed /* [in,out]  */,
+                                      uint16_t *key_buffer /* [out] [ref,size_is(key_buffer_size/2)] */,
+                                      uint32_t key_buffer_size /* [in]  */,
+                                      uint32_t *needed /* [out] [ref] */,
                                       WERROR *werror);
 NTSTATUS rpccli_spoolss_DeletePrinterDataEx(struct rpc_pipe_client *cli,
                                            TALLOC_CTX *mem_ctx,
@@ -493,11 +493,10 @@ NTSTATUS rpccli_spoolss_XcvData(struct rpc_pipe_client *cli,
                                const char *function_name /* [in] [charset(UTF16)] */,
                                DATA_BLOB in_data /* [in]  */,
                                uint32_t _in_data_length /* [in] [value(r->in.in_data.length)] */,
-                               uint32_t offered /* [in]  */,
-                               uint32_t unknown1 /* [in]  */,
-                               DATA_BLOB out_data /* [out]  */,
-                               uint32_t needed /* [out]  */,
-                               uint32_t unknown2 /* [out]  */,
+                               uint8_t *out_data /* [out] [ref,size_is(out_data_size)] */,
+                               uint32_t out_data_size /* [in]  */,
+                               uint32_t *needed /* [out] [ref] */,
+                               uint32_t *status_code /* [in,out] [ref] */,
                                WERROR *werror);
 NTSTATUS rpccli_spoolss_AddPrinterDriverEx(struct rpc_pipe_client *cli,
                                           TALLOC_CTX *mem_ctx,
index a677f532db9d506d694345e6061a52abb28e10b5..77321b4997f58afe83a025b9889522b79a10656d 100644 (file)
@@ -9447,7 +9447,10 @@ static enum ndr_err_code ndr_push_spoolss_GetJob(struct ndr_push *ndr, int flags
                                NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
                        }
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.needed));
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -9460,6 +9463,7 @@ static enum ndr_err_code ndr_pull_spoolss_GetJob(struct ndr_pull *ndr, int flags
        TALLOC_CTX *_mem_save_handle_0;
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
+       TALLOC_CTX *_mem_save_needed_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -9485,6 +9489,8 @@ static enum ndr_err_code ndr_pull_spoolss_GetJob(struct ndr_pull *ndr, int flags
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_buffer_0, 0);
                }
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -9505,7 +9511,13 @@ static enum ndr_err_code ndr_pull_spoolss_GetJob(struct ndr_pull *ndr, int flags
                        }
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.needed));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -9546,7 +9558,10 @@ _PUBLIC_ void ndr_print_spoolss_GetJob(struct ndr_print *ndr, const char *name,
                        ndr_print_spoolss_JobInfo(ndr, "info", r->out.info);
                }
                ndr->depth--;
-               ndr_print_uint32(ndr, "needed", r->out.needed);
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -9932,7 +9947,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_GetPrinter(struct ndr_push *ndr, int
                                NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
                        }
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.needed));
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -9945,6 +9963,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_GetPrinter(struct ndr_pull *ndr, int
        TALLOC_CTX *_mem_save_handle_0;
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
+       TALLOC_CTX *_mem_save_needed_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -9969,6 +9988,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_GetPrinter(struct ndr_pull *ndr, int
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_buffer_0, 0);
                }
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -9989,7 +10010,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_GetPrinter(struct ndr_pull *ndr, int
                        }
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.needed));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -10029,7 +10056,10 @@ _PUBLIC_ void ndr_print_spoolss_GetPrinter(struct ndr_print *ndr, const char *na
                        ndr_print_spoolss_PrinterInfo(ndr, "info", r->out.info);
                }
                ndr->depth--;
-               ndr_print_uint32(ndr, "needed", r->out.needed);
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -10378,7 +10408,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_GetPrinterDriverDirectory(struct ndr
                                NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
                        }
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.needed));
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -10394,6 +10427,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_GetPrinterDriverDirectory(struct ndr
        TALLOC_CTX *_mem_save_environment_0;
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
+       TALLOC_CTX *_mem_save_needed_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -10447,6 +10481,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_GetPrinterDriverDirectory(struct ndr
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_buffer_0, 0);
                }
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -10467,7 +10503,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_GetPrinterDriverDirectory(struct ndr
                        }
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.needed));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -10515,7 +10557,10 @@ _PUBLIC_ void ndr_print_spoolss_GetPrinterDriverDirectory(struct ndr_print *ndr,
                        ndr_print_spoolss_DriverDirectoryInfo(ndr, "info", r->out.info);
                }
                ndr->depth--;
-               ndr_print_uint32(ndr, "needed", r->out.needed);
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -10955,7 +11000,10 @@ static enum ndr_err_code ndr_push_spoolss_StartDocPrinter(struct ndr_push *ndr,
                NDR_CHECK(ndr_push_spoolss_DocumentInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.job_id));
+               if (r->out.job_id == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.job_id));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -10964,6 +11012,7 @@ static enum ndr_err_code ndr_push_spoolss_StartDocPrinter(struct ndr_push *ndr,
 static enum ndr_err_code ndr_pull_spoolss_StartDocPrinter(struct ndr_pull *ndr, int flags, struct spoolss_StartDocPrinter *r)
 {
        TALLOC_CTX *_mem_save_handle_0;
+       TALLOC_CTX *_mem_save_job_id_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -10977,9 +11026,17 @@ static enum ndr_err_code ndr_pull_spoolss_StartDocPrinter(struct ndr_pull *ndr,
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.level));
                NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->in.info, r->in.level));
                NDR_CHECK(ndr_pull_spoolss_DocumentInfo(ndr, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
+               NDR_PULL_ALLOC(ndr, r->out.job_id);
+               ZERO_STRUCTP(r->out.job_id);
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.job_id));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.job_id);
+               }
+               _mem_save_job_id_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.job_id, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.job_id));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_job_id_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -11007,7 +11064,10 @@ _PUBLIC_ void ndr_print_spoolss_StartDocPrinter(struct ndr_print *ndr, const cha
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_StartDocPrinter");
                ndr->depth++;
-               ndr_print_uint32(ndr, "job_id", r->out.job_id);
+               ndr_print_ptr(ndr, "job_id", r->out.job_id);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "job_id", *r->out.job_id);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -11082,7 +11142,10 @@ static enum ndr_err_code ndr_push_spoolss_WritePrinter(struct ndr_push *ndr, int
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.data.length));
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.num_written));
+               if (r->out.num_written == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.num_written));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -11091,6 +11154,7 @@ static enum ndr_err_code ndr_push_spoolss_WritePrinter(struct ndr_push *ndr, int
 static enum ndr_err_code ndr_pull_spoolss_WritePrinter(struct ndr_pull *ndr, int flags, struct spoolss_WritePrinter *r)
 {
        TALLOC_CTX *_mem_save_handle_0;
+       TALLOC_CTX *_mem_save_num_written_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -11103,9 +11167,17 @@ static enum ndr_err_code ndr_pull_spoolss_WritePrinter(struct ndr_pull *ndr, int
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_handle_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->in.data));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in._data_size));
+               NDR_PULL_ALLOC(ndr, r->out.num_written);
+               ZERO_STRUCTP(r->out.num_written);
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.num_written));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.num_written);
+               }
+               _mem_save_num_written_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.num_written, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.num_written));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_num_written_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -11132,7 +11204,10 @@ _PUBLIC_ void ndr_print_spoolss_WritePrinter(struct ndr_print *ndr, const char *
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_WritePrinter");
                ndr->depth++;
-               ndr_print_uint32(ndr, "num_written", r->out.num_written);
+               ndr_print_ptr(ndr, "num_written", r->out.num_written);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "num_written", *r->out.num_written);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -11263,8 +11338,15 @@ static enum ndr_err_code ndr_push_spoolss_ReadPrinter(struct ndr_push *ndr, int
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.data_size));
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->out.data));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.data.length));
+               if (r->out.data == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.data_size));
+               NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->out.data, r->in.data_size));
+               if (r->out._data_size == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out._data_size));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -11273,6 +11355,7 @@ static enum ndr_err_code ndr_push_spoolss_ReadPrinter(struct ndr_push *ndr, int
 static enum ndr_err_code ndr_pull_spoolss_ReadPrinter(struct ndr_pull *ndr, int flags, struct spoolss_ReadPrinter *r)
 {
        TALLOC_CTX *_mem_save_handle_0;
+       TALLOC_CTX *_mem_save__data_size_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -11284,11 +11367,28 @@ static enum ndr_err_code ndr_pull_spoolss_ReadPrinter(struct ndr_pull *ndr, int
                NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS, r->in.handle));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_handle_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.data_size));
+               NDR_PULL_ALLOC_N(ndr, r->out.data, r->in.data_size);
+               memset(CONST_DISCARD(struct spoolss_ReadPrinter *,r->out.data), 0, (r->in.data_size) * sizeof(*r->out.data));
+               NDR_PULL_ALLOC(ndr, r->out._data_size);
+               ZERO_STRUCTP(r->out._data_size);
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->out.data));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out._data_size));
+               NDR_CHECK(ndr_pull_array_size(ndr, &r->out.data));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC_N(ndr, r->out.data, ndr_get_array_size(ndr, &r->out.data));
+               }
+               NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->out.data, ndr_get_array_size(ndr, &r->out.data)));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out._data_size);
+               }
+               _mem_save__data_size_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out._data_size, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out._data_size));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save__data_size_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
+               if (r->out.data) {
+                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->out.data, r->in.data_size));
+               }
        }
        return NDR_ERR_SUCCESS;
 }
@@ -11313,8 +11413,14 @@ _PUBLIC_ void ndr_print_spoolss_ReadPrinter(struct ndr_print *ndr, const char *n
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_ReadPrinter");
                ndr->depth++;
-               ndr_print_DATA_BLOB(ndr, "data", r->out.data);
-               ndr_print_uint32(ndr, "_data_size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?r->out.data.length:r->out._data_size);
+               ndr_print_ptr(ndr, "data", r->out.data);
+               ndr->depth++;
+               ndr_print_array_uint8(ndr, "data", r->out.data, r->in.data_size);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "_data_size", r->out._data_size);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "_data_size", *r->out._data_size);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -11948,7 +12054,10 @@ static enum ndr_err_code ndr_push_spoolss_GetForm(struct ndr_push *ndr, int flag
                                NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info, 4, r->in.offered));
                        }
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.needed));
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -11961,6 +12070,7 @@ static enum ndr_err_code ndr_pull_spoolss_GetForm(struct ndr_pull *ndr, int flag
        TALLOC_CTX *_mem_save_handle_0;
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
+       TALLOC_CTX *_mem_save_needed_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -11992,6 +12102,8 @@ static enum ndr_err_code ndr_pull_spoolss_GetForm(struct ndr_pull *ndr, int flag
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_buffer_0, 0);
                }
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -12012,7 +12124,13 @@ static enum ndr_err_code ndr_pull_spoolss_GetForm(struct ndr_pull *ndr, int flag
                        }
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.needed));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -12053,7 +12171,10 @@ _PUBLIC_ void ndr_print_spoolss_GetForm(struct ndr_print *ndr, const char *name,
                        ndr_print_spoolss_FormInfo(ndr, "info", r->out.info);
                }
                ndr->depth--;
-               ndr_print_uint32(ndr, "needed", r->out.needed);
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -13429,9 +13550,18 @@ static enum ndr_err_code ndr_push_spoolss_GetPrinterDriver2(struct ndr_push *ndr
                if (r->out.info) {
                        NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, *r->out.info));
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.server_major_version));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.server_minor_version));
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
+               if (r->out.server_major_version == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.server_major_version));
+               if (r->out.server_minor_version == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.server_minor_version));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -13446,6 +13576,9 @@ static enum ndr_err_code ndr_pull_spoolss_GetPrinterDriver2(struct ndr_pull *ndr
        TALLOC_CTX *_mem_save_architecture_0;
        TALLOC_CTX *_mem_save_buffer_0;
        TALLOC_CTX *_mem_save_info_0;
+       TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_server_major_version_0;
+       TALLOC_CTX *_mem_save_server_minor_version_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -13490,6 +13623,12 @@ static enum ndr_err_code ndr_pull_spoolss_GetPrinterDriver2(struct ndr_pull *ndr
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.client_major_version));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.client_minor_version));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.server_major_version);
+               ZERO_STRUCTP(r->out.server_major_version);
+               NDR_PULL_ALLOC(ndr, r->out.server_minor_version);
+               ZERO_STRUCTP(r->out.server_minor_version);
        }
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_info));
@@ -13504,9 +13643,27 @@ static enum ndr_err_code ndr_pull_spoolss_GetPrinterDriver2(struct ndr_pull *ndr
                        NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, r->out.info));
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
                }
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.needed));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.server_major_version));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.server_minor_version));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.server_major_version);
+               }
+               _mem_save_server_major_version_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.server_major_version, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.server_major_version));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_server_major_version_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.server_minor_version);
+               }
+               _mem_save_server_minor_version_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.server_minor_version, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.server_minor_version));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_server_minor_version_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -13553,9 +13710,18 @@ _PUBLIC_ void ndr_print_spoolss_GetPrinterDriver2(struct ndr_print *ndr, const c
                        ndr_print_DATA_BLOB(ndr, "info", *r->out.info);
                }
                ndr->depth--;
-               ndr_print_uint32(ndr, "needed", r->out.needed);
-               ndr_print_uint32(ndr, "server_major_version", r->out.server_major_version);
-               ndr_print_uint32(ndr, "server_minor_version", r->out.server_minor_version);
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "server_major_version", r->out.server_major_version);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "server_major_version", *r->out.server_major_version);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "server_minor_version", r->out.server_minor_version);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "server_minor_version", *r->out.server_minor_version);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -15217,9 +15383,19 @@ static enum ndr_err_code ndr_push_spoolss_GetPrinterDataEx(struct ndr_push *ndr,
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.type));
-               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->out.buffer));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.needed));
+               if (r->out.type == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.type));
+               if (r->out.buffer == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
+               NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->out.buffer, r->in.offered));
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -15228,6 +15404,8 @@ static enum ndr_err_code ndr_push_spoolss_GetPrinterDataEx(struct ndr_push *ndr,
 static 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_needed_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -15253,12 +15431,37 @@ static enum ndr_err_code ndr_pull_spoolss_GetPrinterDataEx(struct ndr_pull *ndr,
                NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.value_name), sizeof(uint16_t)));
                NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.value_name, ndr_get_array_length(ndr, &r->in.value_name), sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.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(CONST_DISCARD(struct spoolss_GetPrinterDataEx *,r->out.buffer), 0, (r->in.offered) * sizeof(*r->out.buffer));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.type));
-               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->out.buffer));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.needed));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.type);
+               }
+               _mem_save_type_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.type, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(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_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->out.buffer, ndr_get_array_size(ndr, &r->out.buffer)));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
+               if (r->out.buffer) {
+                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->out.buffer, r->in.offered));
+               }
        }
        return NDR_ERR_SUCCESS;
 }
@@ -15285,9 +15488,18 @@ _PUBLIC_ void ndr_print_spoolss_GetPrinterDataEx(struct ndr_print *ndr, const ch
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_GetPrinterDataEx");
                ndr->depth++;
-               ndr_print_uint32(ndr, "type", r->out.type);
-               ndr_print_DATA_BLOB(ndr, "buffer", r->out.buffer);
-               ndr_print_uint32(ndr, "needed", r->out.needed);
+               ndr_print_ptr(ndr, "type", r->out.type);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "type", *r->out.type);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "buffer", r->out.buffer);
+               ndr->depth++;
+               ndr_print_array_uint8(ndr, "buffer", r->out.buffer, r->in.offered);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -15308,9 +15520,19 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterDataEx(struct ndr_push *n
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->out.buffer));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.count));
+               if (r->out.buffer == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
+               NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->out.buffer, r->in.offered));
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
+               if (r->out.count == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.count));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -15319,6 +15541,8 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterDataEx(struct ndr_push *n
 _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterDataEx(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinterDataEx *r)
 {
        TALLOC_CTX *_mem_save_handle_0;
+       TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_count_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -15337,12 +15561,37 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterDataEx(struct ndr_pull *n
                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_N(ndr, r->out.buffer, r->in.offered);
+               memset(CONST_DISCARD(struct spoolss_EnumPrinterDataEx *,r->out.buffer), 0, (r->in.offered) * sizeof(*r->out.buffer));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.count);
+               ZERO_STRUCTP(r->out.count);
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->out.buffer));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.needed));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.count));
+               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_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->out.buffer, ndr_get_array_size(ndr, &r->out.buffer)));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.count);
+               }
+               _mem_save_count_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.count, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.count));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_count_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
+               if (r->out.buffer) {
+                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->out.buffer, r->in.offered));
+               }
        }
        return NDR_ERR_SUCCESS;
 }
@@ -15368,9 +15617,18 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterDataEx(struct ndr_print *ndr, const c
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumPrinterDataEx");
                ndr->depth++;
-               ndr_print_DATA_BLOB(ndr, "buffer", r->out.buffer);
-               ndr_print_uint32(ndr, "needed", r->out.needed);
-               ndr_print_uint32(ndr, "count", r->out.count);
+               ndr_print_ptr(ndr, "buffer", r->out.buffer);
+               ndr->depth++;
+               ndr_print_array_uint8(ndr, "buffer", r->out.buffer, r->in.offered);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "count", r->out.count);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "count", *r->out.count);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -15379,7 +15637,7 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterDataEx(struct ndr_print *ndr, const c
 
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinterKey *r)
 {
-       uint32_t cntr_key_buffer_0;
+       uint32_t cntr_key_buffer_1;
        if (flags & NDR_IN) {
                if (r->in.handle == NULL) {
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
@@ -15389,14 +15647,20 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr,
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.key_name, CH_UTF16)));
                NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.key_name, ndr_charset_length(r->in.key_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.needed));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.key_buffer_size));
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.key_buffer_size));
-               for (cntr_key_buffer_0 = 0; cntr_key_buffer_0 < r->out.key_buffer_size; cntr_key_buffer_0++) {
-                       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->out.key_buffer[cntr_key_buffer_0]));
+               if (r->out.key_buffer == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
                }
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.key_buffer_size / 2));
+               for (cntr_key_buffer_1 = 0; cntr_key_buffer_1 < r->in.key_buffer_size / 2; cntr_key_buffer_1++) {
+                       NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->out.key_buffer[cntr_key_buffer_1]));
+               }
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -15404,9 +15668,10 @@ _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 cntr_key_buffer_0;
+       uint32_t cntr_key_buffer_1;
        TALLOC_CTX *_mem_save_handle_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);
 
@@ -15424,26 +15689,41 @@ _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.needed));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.key_buffer_size));
+               NDR_PULL_ALLOC_N(ndr, r->out.key_buffer, r->in.key_buffer_size / 2);
+               memset(CONST_DISCARD(struct spoolss_EnumPrinterKey *,r->out.key_buffer), 0, (r->in.key_buffer_size / 2) * sizeof(*r->out.key_buffer));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.key_buffer_size));
-               NDR_PULL_ALLOC_N(ndr, r->out.key_buffer, r->out.key_buffer_size);
-               _mem_save_key_buffer_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_CHECK(ndr_pull_array_size(ndr, &r->out.key_buffer));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC_N(ndr, r->out.key_buffer, ndr_get_array_size(ndr, &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);
-               for (cntr_key_buffer_0 = 0; cntr_key_buffer_0 < r->out.key_buffer_size; cntr_key_buffer_0++) {
-                       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->out.key_buffer[cntr_key_buffer_0]));
+               for (cntr_key_buffer_1 = 0; cntr_key_buffer_1 < r->in.key_buffer_size / 2; cntr_key_buffer_1++) {
+                       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->out.key_buffer[cntr_key_buffer_1]));
                }
-               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_0, 0);
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_1, 0);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
+               if (r->out.key_buffer) {
+                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->out.key_buffer, r->in.key_buffer_size / 2));
+               }
        }
        return NDR_ERR_SUCCESS;
 }
 
 _PUBLIC_ void ndr_print_spoolss_EnumPrinterKey(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumPrinterKey *r)
 {
-       uint32_t cntr_key_buffer_0;
+       uint32_t cntr_key_buffer_1;
        ndr_print_struct(ndr, name, "spoolss_EnumPrinterKey");
        ndr->depth++;
        if (flags & NDR_SET_VALUES) {
@@ -15457,24 +15737,29 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterKey(struct ndr_print *ndr, const char
                ndr_print_policy_handle(ndr, "handle", r->in.handle);
                ndr->depth--;
                ndr_print_string(ndr, "key_name", r->in.key_name);
-               ndr_print_uint32(ndr, "needed", r->in.needed);
+               ndr_print_uint32(ndr, "key_buffer_size", r->in.key_buffer_size);
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_EnumPrinterKey");
                ndr->depth++;
-               ndr_print_uint32(ndr, "key_buffer_size", r->out.key_buffer_size);
-               ndr->print(ndr, "%s: ARRAY(%d)", "key_buffer", (int)r->out.key_buffer_size);
+               ndr_print_ptr(ndr, "key_buffer", r->out.key_buffer);
                ndr->depth++;
-               for (cntr_key_buffer_0=0;cntr_key_buffer_0<r->out.key_buffer_size;cntr_key_buffer_0++) {
-                       char *idx_0=NULL;
-                       if (asprintf(&idx_0, "[%d]", cntr_key_buffer_0) != -1) {
-                               ndr_print_uint16(ndr, "key_buffer", r->out.key_buffer[cntr_key_buffer_0]);
-                               free(idx_0);
+               ndr->print(ndr, "%s: ARRAY(%d)", "key_buffer", (int)r->in.key_buffer_size / 2);
+               ndr->depth++;
+               for (cntr_key_buffer_1=0;cntr_key_buffer_1<r->in.key_buffer_size / 2;cntr_key_buffer_1++) {
+                       char *idx_1=NULL;
+                       if (asprintf(&idx_1, "[%d]", cntr_key_buffer_1) != -1) {
+                               ndr_print_uint16(ndr, "key_buffer", r->out.key_buffer[cntr_key_buffer_1]);
+                               free(idx_1);
                        }
                }
                ndr->depth--;
-               ndr_print_uint32(ndr, "needed", r->out.needed);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
@@ -15821,13 +16106,26 @@ static enum ndr_err_code ndr_push_spoolss_XcvData(struct ndr_push *ndr, int flag
                NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.function_name, ndr_charset_length(r->in.function_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->in.in_data));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.in_data.length));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.unknown1));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.out_data_size));
+               if (r->in.status_code == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->in.status_code));
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->out.out_data));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.needed));
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->out.unknown2));
+               if (r->out.out_data == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.out_data_size));
+               NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->out.out_data, r->in.out_data_size));
+               if (r->out.needed == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.needed));
+               if (r->out.status_code == NULL) {
+                       return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.status_code));
                NDR_CHECK(ndr_push_WERROR(ndr, NDR_SCALARS, r->out.result));
        }
        return NDR_ERR_SUCCESS;
@@ -15836,6 +16134,8 @@ static enum ndr_err_code ndr_push_spoolss_XcvData(struct ndr_push *ndr, int flag
 static enum ndr_err_code ndr_pull_spoolss_XcvData(struct ndr_pull *ndr, int flags, struct spoolss_XcvData *r)
 {
        TALLOC_CTX *_mem_save_handle_0;
+       TALLOC_CTX *_mem_save_needed_0;
+       TALLOC_CTX *_mem_save_status_code_0;
        if (flags & NDR_IN) {
                ZERO_STRUCT(r->out);
 
@@ -15855,14 +16155,45 @@ static enum ndr_err_code ndr_pull_spoolss_XcvData(struct ndr_pull *ndr, int flag
                NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.function_name, ndr_get_array_length(ndr, &r->in.function_name), sizeof(uint16_t), CH_UTF16));
                NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->in.in_data));
                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in._in_data_length));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.unknown1));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.out_data_size));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->in.status_code);
+               }
+               _mem_save_status_code_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->in.status_code, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->in.status_code));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_status_code_0, LIBNDR_FLAG_REF_ALLOC);
+               NDR_PULL_ALLOC_N(ndr, r->out.out_data, r->in.out_data_size);
+               memset(CONST_DISCARD(struct spoolss_XcvData *,r->out.out_data), 0, (r->in.out_data_size) * sizeof(*r->out.out_data));
+               NDR_PULL_ALLOC(ndr, r->out.needed);
+               ZERO_STRUCTP(r->out.needed);
+               NDR_PULL_ALLOC(ndr, r->out.status_code);
+               *r->out.status_code = *r->in.status_code;
        }
        if (flags & NDR_OUT) {
-               NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->out.out_data));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.needed));
-               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->out.unknown2));
+               NDR_CHECK(ndr_pull_array_size(ndr, &r->out.out_data));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC_N(ndr, r->out.out_data, ndr_get_array_size(ndr, &r->out.out_data));
+               }
+               NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->out.out_data, ndr_get_array_size(ndr, &r->out.out_data)));
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.needed);
+               }
+               _mem_save_needed_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.needed, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
+               if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+                       NDR_PULL_ALLOC(ndr, r->out.status_code);
+               }
+               _mem_save_status_code_0 = NDR_PULL_GET_MEM_CTX(ndr);
+               NDR_PULL_SET_MEM_CTX(ndr, r->out.status_code, LIBNDR_FLAG_REF_ALLOC);
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.status_code));
+               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_status_code_0, LIBNDR_FLAG_REF_ALLOC);
                NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
+               if (r->out.out_data) {
+                       NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->out.out_data, r->in.out_data_size));
+               }
        }
        return NDR_ERR_SUCCESS;
 }
@@ -15884,16 +16215,28 @@ _PUBLIC_ void ndr_print_spoolss_XcvData(struct ndr_print *ndr, const char *name,
                ndr_print_string(ndr, "function_name", r->in.function_name);
                ndr_print_DATA_BLOB(ndr, "in_data", r->in.in_data);
                ndr_print_uint32(ndr, "_in_data_length", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?r->in.in_data.length:r->in._in_data_length);
-               ndr_print_uint32(ndr, "offered", r->in.offered);
-               ndr_print_uint32(ndr, "unknown1", r->in.unknown1);
+               ndr_print_uint32(ndr, "out_data_size", r->in.out_data_size);
+               ndr_print_ptr(ndr, "status_code", r->in.status_code);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "status_code", *r->in.status_code);
+               ndr->depth--;
                ndr->depth--;
        }
        if (flags & NDR_OUT) {
                ndr_print_struct(ndr, "out", "spoolss_XcvData");
                ndr->depth++;
-               ndr_print_DATA_BLOB(ndr, "out_data", r->out.out_data);
-               ndr_print_uint32(ndr, "needed", r->out.needed);
-               ndr_print_uint32(ndr, "unknown2", r->out.unknown2);
+               ndr_print_ptr(ndr, "out_data", r->out.out_data);
+               ndr->depth++;
+               ndr_print_array_uint8(ndr, "out_data", r->out.out_data, r->in.out_data_size);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "needed", r->out.needed);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "needed", *r->out.needed);
+               ndr->depth--;
+               ndr_print_ptr(ndr, "status_code", r->out.status_code);
+               ndr->depth++;
+               ndr_print_uint32(ndr, "status_code", *r->out.status_code);
+               ndr->depth--;
                ndr_print_WERROR(ndr, "result", r->out.result);
                ndr->depth--;
        }
index 49eb7990799b3478f4d33b35ce48c2c690b0fd83..59d5c44d3d8fcb6e2a4f6e3b4db038a62858a43c 100644 (file)
@@ -842,7 +842,7 @@ struct spoolss_GetJob {
 
        struct {
                union spoolss_JobInfo *info;/* [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */
-               uint32_t needed;
+               uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
 
@@ -949,7 +949,7 @@ struct spoolss_GetPrinter {
 
        struct {
                union spoolss_PrinterInfo *info;/* [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */
-               uint32_t needed;
+               uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
 
@@ -1034,7 +1034,7 @@ struct spoolss_GetPrinterDriverDirectory {
 
        struct {
                union spoolss_DriverDirectoryInfo *info;/* [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */
-               uint32_t needed;
+               uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
 
@@ -1131,7 +1131,7 @@ struct spoolss_StartDocPrinter {
        } in;
 
        struct {
-               uint32_t job_id;
+               uint32_t *job_id;/* [ref] */
                WERROR result;
        } out;
 
@@ -1158,7 +1158,7 @@ struct spoolss_WritePrinter {
        } in;
 
        struct {
-               uint32_t num_written;
+               uint32_t *num_written;/* [ref] */
                WERROR result;
        } out;
 
@@ -1196,8 +1196,8 @@ struct spoolss_ReadPrinter {
        } in;
 
        struct {
-               DATA_BLOB data;
-               uint32_t _data_size;/* [value(r->out.data.length)] */
+               uint8_t *data;/* [ref,size_is(data_size)] */
+               uint32_t *_data_size;/* [ref] */
                WERROR result;
        } out;
 
@@ -1381,7 +1381,7 @@ struct spoolss_GetForm {
 
        struct {
                union spoolss_FormInfo *info;/* [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */
-               uint32_t needed;
+               uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
 
@@ -1697,9 +1697,9 @@ struct spoolss_GetPrinterDriver2 {
 
        struct {
                DATA_BLOB *info;/* [unique] */
-               uint32_t needed;
-               uint32_t server_major_version;
-               uint32_t server_minor_version;
+               uint32_t *needed;/* [ref] */
+               uint32_t *server_major_version;/* [ref] */
+               uint32_t *server_minor_version;/* [ref] */
                WERROR result;
        } out;
 
@@ -1987,9 +1987,9 @@ struct spoolss_GetPrinterDataEx {
        } in;
 
        struct {
-               uint32_t type;
-               DATA_BLOB buffer;
-               uint32_t needed;
+               uint32_t *type;/* [ref] */
+               uint8_t *buffer;/* [ref,size_is(offered)] */
+               uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
 
@@ -2004,9 +2004,9 @@ struct spoolss_EnumPrinterDataEx {
        } in;
 
        struct {
-               DATA_BLOB buffer;
-               uint32_t needed;
-               uint32_t count;
+               uint8_t *buffer;/* [ref,size_is(offered)] */
+               uint32_t *needed;/* [ref] */
+               uint32_t *count;/* [ref] */
                WERROR result;
        } out;
 
@@ -2017,13 +2017,12 @@ struct spoolss_EnumPrinterKey {
        struct {
                struct policy_handle *handle;/* [ref] */
                const char *key_name;/* [charset(UTF16)] */
-               uint32_t needed;
+               uint32_t key_buffer_size;
        } in;
 
        struct {
-               uint32_t key_buffer_size;
-               uint16_t *key_buffer;
-               uint32_t needed;
+               uint16_t *key_buffer;/* [ref,size_is(key_buffer_size/2)] */
+               uint32_t *needed;/* [ref] */
                WERROR result;
        } out;
 
@@ -2098,14 +2097,14 @@ struct spoolss_XcvData {
                const char *function_name;/* [charset(UTF16)] */
                DATA_BLOB in_data;
                uint32_t _in_data_length;/* [value(r->in.in_data.length)] */
-               uint32_t offered;
-               uint32_t unknown1;
+               uint32_t out_data_size;
+               uint32_t *status_code;/* [ref] */
        } in;
 
        struct {
-               DATA_BLOB out_data;
-               uint32_t needed;
-               uint32_t unknown2;
+               uint8_t *out_data;/* [ref,size_is(out_data_size)] */
+               uint32_t *needed;/* [ref] */
+               uint32_t *status_code;/* [ref] */
                WERROR result;
        } out;
 
index abf49766a4659711a2c604d9781351c547928848..1f7d29f39f1e4a1ce91aba46e3507887e12acedc 100644 (file)
@@ -1787,7 +1787,7 @@ static bool api_spoolss_ReadPrinter(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.data = talloc_zero(r, DATA_BLOB);
+       r->out.data = talloc_zero_array(r, uint8_t, r->in.data_size);
        if (r->out.data == NULL) {
                talloc_free(r);
                return false;
@@ -6064,7 +6064,7 @@ static bool api_spoolss_GetPrinterDataEx(pipes_struct *p)
                return false;
        }
 
-       r->out.buffer = talloc_zero(r, DATA_BLOB);
+       r->out.buffer = talloc_zero_array(r, uint8_t, r->in.offered);
        if (r->out.buffer == NULL) {
                talloc_free(r);
                return false;
@@ -6150,7 +6150,7 @@ static bool api_spoolss_EnumPrinterDataEx(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.buffer = talloc_zero(r, DATA_BLOB);
+       r->out.buffer = talloc_zero_array(r, uint8_t, r->in.offered);
        if (r->out.buffer == NULL) {
                talloc_free(r);
                return false;
@@ -6242,15 +6242,14 @@ static bool api_spoolss_EnumPrinterKey(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.needed = r->in.needed;
-       r->out.key_buffer_size = talloc_zero(r, uint32_t);
-       if (r->out.key_buffer_size == NULL) {
+       r->out.key_buffer = talloc_zero_array(r, uint16_t, r->in.key_buffer_size / 2);
+       if (r->out.key_buffer == NULL) {
                talloc_free(r);
                return false;
        }
 
-       r->out.key_buffer = talloc_zero_array(r, uint16_t, r->out.key_buffer_size);
-       if (r->out.key_buffer == NULL) {
+       r->out.needed = talloc_zero(r, uint32_t);
+       if (r->out.needed == NULL) {
                talloc_free(r);
                return false;
        }
@@ -6840,7 +6839,8 @@ static bool api_spoolss_XcvData(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.out_data = talloc_zero(r, DATA_BLOB);
+       r->out.status_code = r->in.status_code;
+       r->out.out_data = talloc_zero_array(r, uint8_t, r->in.out_data_size);
        if (r->out.out_data == NULL) {
                talloc_free(r);
                return false;
@@ -6852,12 +6852,6 @@ static bool api_spoolss_XcvData(pipes_struct *p)
                return false;
        }
 
-       r->out.unknown2 = talloc_zero(r, uint32_t);
-       if (r->out.unknown2 == NULL) {
-               talloc_free(r);
-               return false;
-       }
-
        r->out.result = _spoolss_XcvData(p, r);
 
        if (p->rng_fault_state) {
@@ -7770,7 +7764,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_READPRINTER: {
                        struct spoolss_ReadPrinter *r = (struct spoolss_ReadPrinter *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.data = talloc_zero(mem_ctx, DATA_BLOB);
+                       r->out.data = talloc_zero_array(mem_ctx, uint8_t, r->in.data_size);
                        if (r->out.data == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -8266,7 +8260,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.buffer = talloc_zero(mem_ctx, DATA_BLOB);
+                       r->out.buffer = talloc_zero_array(mem_ctx, uint8_t, r->in.offered);
                        if (r->out.buffer == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -8283,7 +8277,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMPRINTERDATAEX: {
                        struct spoolss_EnumPrinterDataEx *r = (struct spoolss_EnumPrinterDataEx *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.buffer = talloc_zero(mem_ctx, DATA_BLOB);
+                       r->out.buffer = talloc_zero_array(mem_ctx, uint8_t, r->in.offered);
                        if (r->out.buffer == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -8305,14 +8299,13 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMPRINTERKEY: {
                        struct spoolss_EnumPrinterKey *r = (struct spoolss_EnumPrinterKey *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.needed = r->in.needed;
-                       r->out.key_buffer_size = talloc_zero(mem_ctx, uint32_t);
-                       if (r->out.key_buffer_size == NULL) {
+                       r->out.key_buffer = talloc_zero_array(mem_ctx, uint16_t, r->in.key_buffer_size / 2);
+                       if (r->out.key_buffer == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.key_buffer = talloc_zero_array(mem_ctx, uint16_t, r->out.key_buffer_size);
-                       if (r->out.key_buffer == NULL) {
+                       r->out.needed = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.needed == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
 
@@ -8365,7 +8358,8 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_XCVDATA: {
                        struct spoolss_XcvData *r = (struct spoolss_XcvData *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.out_data = talloc_zero(mem_ctx, DATA_BLOB);
+                       r->out.status_code = r->in.status_code;
+                       r->out.out_data = talloc_zero_array(mem_ctx, uint8_t, r->in.out_data_size);
                        if (r->out.out_data == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -8375,11 +8369,6 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.unknown2 = talloc_zero(mem_ctx, uint32_t);
-                       if (r->out.unknown2 == NULL) {
-                       return NT_STATUS_NO_MEMORY;
-                       }
-
                        r->out.result = _spoolss_XcvData(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }