s3:rpc_server: Improve local dispatching
authorSamuel Cabrero <scabrero@samba.org>
Mon, 18 Nov 2019 13:01:52 +0000 (14:01 +0100)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 8 Apr 2020 22:23:05 +0000 (22:23 +0000)
Craft core structures to dispatch local calls in the same way as remote
ones, removing the special handling in the autogenerated code.

This is also necessary to drop s3 rpc handles implementation.

Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet@samba.org>
Autobuild-Date(master): Wed Apr  8 22:23:05 UTC 2020 on sn-devel-184

librpc/rpc/dcesrv_core.h
pidl/lib/Parse/Pidl/Samba4/NDR/ServerCompat.pm
source3/rpc_server/rpc_ncacn_np.c
source3/rpc_server/spoolss/srv_iremotewinspool.c
source3/winbindd/winbindd_dual_ndr.c

index 3f2b7676e8d5e5ac68d0eff0842a8cfbc3f95ead..c1234980b829c2b9f6a75120f070ee0c7208a2c5 100644 (file)
@@ -69,7 +69,7 @@ struct dcesrv_interface {
 
        /* the local dispatch function for the chosen interface.
         */
-       NTSTATUS (*local)(void *p, int opnum, TALLOC_CTX *, const DATA_BLOB *in, DATA_BLOB *out);
+       NTSTATUS (*local)(struct dcesrv_call_state *, TALLOC_CTX *, void *);
 
        /* for any private use by the interface code */
        const void *private_data;
index a1729d86d77750cefa84ca7d69e723b8811a6d58..14f6ad9a1a089de463ee8b11c4c12a576a27025f 100644 (file)
@@ -212,67 +212,6 @@ sub gen_reply_switch($)
        }
 }
 
-# generate the switch statement for local function dispatch
-sub gen_local_dispatch_switch($)
-{
-       my ($self, $interface) = @_;
-
-       my @alloc_error_block = ("p->fault_state = DCERPC_FAULT_CANT_PERFORM;",
-                                "return NT_STATUS_NO_MEMORY;");
-
-       foreach my $fn (@{$interface->{FUNCTIONS}}) {
-               next if not defined($fn->{OPNUM});
-
-               $self->pidl("case $fn->{OPNUM}: { /* $fn->{NAME} */");
-               $self->indent();
-               $self->pidl("struct $fn->{NAME} *r2 = (struct $fn->{NAME} *)r;");
-               $self->pidl("if (DEBUGLEVEL >= 10) {\n");
-               $self->indent();
-               $self->pidl("NDR_PRINT_FUNCTION_DEBUG($fn->{NAME}, NDR_IN, r2);");
-               $self->deindent();
-               $self->pidl("}");
-
-               $self->gen_fn_out($fn, \@alloc_error_block);
-
-               if ($fn->{RETURN_TYPE} && $fn->{RETURN_TYPE} ne "void") {
-                       $self->pidl("r2->out.result = _$fn->{NAME}(p, r2);");
-               } else {
-                       $self->pidl("_$fn->{NAME}(p, r2);");
-               }
-               $self->pidl("break;");
-               $self->deindent();
-               $self->pidl("}");
-       }
-}
-
-#####################################################
-# generate the switch statement for local function reply
-sub gen_local_reply_switch($)
-{
-       my ($self, $interface) = @_;
-
-       foreach my $fn (@{$interface->{FUNCTIONS}}) {
-               next if not defined($fn->{OPNUM});
-
-               $self->pidl("case $fn->{OPNUM}: { /* $fn->{NAME} */");
-               $self->indent();
-               $self->pidl("struct $fn->{NAME} *r2 = (struct $fn->{NAME} *)r;");
-               $self->pidl("if (DEBUGLEVEL >= 10 && p->fault_state == 0) {");
-               $self->indent();
-               $self->pidl("NDR_PRINT_FUNCTION_DEBUG($fn->{NAME}, NDR_OUT | NDR_SET_VALUES, r2);");
-               $self->deindent();
-               $self->pidl("}");
-               $self->pidl("if (p->fault_state != 0) {\n");
-               $self->indent();
-               $self->pidl("DBG_WARNING(\"dcerpc_fault %s in $fn->{NAME}\\n\", dcerpc_errstr(mem_ctx, p->fault_state));");
-               $self->deindent();
-               $self->pidl("}");
-               $self->pidl("break;");
-               $self->deindent();
-               $self->pidl("}");
-       }
-}
-
 #####################################################################
 # produce boilerplate code for a interface
 sub boilerplate_iface($)
@@ -392,15 +331,14 @@ sub boilerplate_iface($)
        $self->pidl("}");
        $self->pidl("");
 
-       $self->pidl_hdr("NTSTATUS $name\__op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r);");
-       $self->pidl("NTSTATUS $name\__op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)");
+       $self->pidl("static NTSTATUS $name\__op_dispatch_internal(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r, enum s3compat_rpc_dispatch dispatch)");
        $self->pidl("{");
        $self->indent();
        $self->pidl("uint16_t opnum = dce_call->pkt.u.request.opnum;");
        $self->pidl("struct pipes_struct *p = NULL;");
        $self->pidl("struct auth_session_info *pipe_session_info = NULL;");
        $self->pidl("NTSTATUS status = NT_STATUS_OK;");
-       $self->pidl("bool impersonated;");
+       $self->pidl("bool impersonated = false;");
        $self->pidl("");
        $self->pidl("/* Retrieve pipes struct */");
        $self->pidl("p = dcesrv_get_pipes_struct(dce_call->conn);");
@@ -417,6 +355,8 @@ sub boilerplate_iface($)
        $self->pidl("");
 
        $self->pidl("/* Impersonate */");
+       $self->pidl("if (dispatch == S3COMPAT_RPC_DISPATCH_EXTERNAL) {");
+       $self->indent();
        $self->pidl("impersonated = become_authenticated_pipe_user(p->session_info);");
        $self->pidl("if (!impersonated) {");
        $self->indent();
@@ -425,6 +365,8 @@ sub boilerplate_iface($)
        $self->pidl("goto fail;");
        $self->deindent();
        $self->pidl("}");
+       $self->deindent();
+       $self->pidl("}");
        $self->pidl("");
 
        $self->pidl("switch (opnum) {");
@@ -469,6 +411,15 @@ sub boilerplate_iface($)
        $self->pidl("}");
        $self->pidl("");
 
+       $self->pidl_hdr("NTSTATUS $name\__op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r);");
+       $self->pidl("NTSTATUS $name\__op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)");
+       $self->pidl("{");
+       $self->indent();
+       $self->pidl("return $name\__op_dispatch_internal(dce_call, mem_ctx, r, S3COMPAT_RPC_DISPATCH_EXTERNAL);");
+       $self->deindent();
+       $self->pidl("}");
+       $self->pidl("");
+
        $self->pidl_hdr("NTSTATUS $name\__op_reply(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r);");
        $self->pidl("NTSTATUS $name\__op_reply(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)");
        $self->pidl("{");
@@ -519,112 +470,11 @@ sub boilerplate_iface($)
        ##############################
        ####    LOCAL DISPATCH    ####
        ##############################
-       $self->pidl_hdr("NTSTATUS $name\__op_local(void *q, int opnum, TALLOC_CTX *mem_ctx, const DATA_BLOB *in, DATA_BLOB *out);");
-       $self->pidl("NTSTATUS $name\__op_local(void *q, int opnum, TALLOC_CTX *mem_ctx, const DATA_BLOB *in, DATA_BLOB *out)");
+       $self->pidl_hdr("NTSTATUS $name\__op_local(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r);");
+       $self->pidl("NTSTATUS $name\__op_local(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)");
        $self->pidl("{");
        $self->indent();
-       $self->pidl("struct pipes_struct *p = talloc_get_type_abort(q, struct pipes_struct);");
-       $self->pidl("void *r;");
-       $self->pidl("struct ndr_pull *pull;");
-       $self->pidl("struct ndr_push *push;");
-       $self->pidl("enum ndr_err_code ndr_err;");
-       $self->pidl("");
-       $self->pidl("p->fault_state = 0;");
-       $self->pidl("if (opnum >= ndr_table_$name.num_calls) {");
-       $self->indent();
-       $self->pidl("p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;");
-       $self->pidl("return NT_STATUS_NET_WRITE_FAULT;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("r = talloc_named(mem_ctx, ndr_table_$name.calls[opnum].struct_size, \"struct %s\", ndr_table_$name.calls[opnum].name);");
-       $self->pidl("if (r == NULL) {");
-       $self->indent();
-       $self->pidl("p->fault_state = DCERPC_FAULT_CANT_PERFORM;");
-       $self->pidl("return NT_STATUS_NO_MEMORY;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("pull = ndr_pull_init_blob(in, r);");
-       $self->pidl("if (pull == NULL) {");
-       $self->indent();
-       $self->pidl("talloc_free(r);");
-       $self->pidl("p->fault_state = DCERPC_FAULT_CANT_PERFORM;");
-       $self->pidl("return NT_STATUS_NO_MEMORY;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("pull->flags |= LIBNDR_FLAG_REF_ALLOC;");
-       $self->pidl("if (p->endian) {");
-       $self->indent();
-       $self->pidl("pull->flags |= LIBNDR_FLAG_BIGENDIAN;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("ndr_err = ndr_table_$name.calls[opnum].ndr_pull(pull, NDR_IN, r);");
-       $self->pidl("if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {");
-       $self->indent();
-       $self->pidl("p->fault_state = DCERPC_FAULT_NDR;");
-       $self->pidl("talloc_free(r);");
-       $self->pidl("return NT_STATUS_NET_WRITE_FAULT;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("switch (opnum) {");
-       $self->gen_local_dispatch_switch($interface);
-       $self->pidl("default:");
-       $self->indent();
-       $self->pidl("p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;");
-       $self->pidl("break;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("if (p->fault_state != 0) {");
-       $self->indent();
-       $self->pidl("talloc_free(r);");
-       $self->pidl("return NT_STATUS_NET_WRITE_FAULT;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("switch (opnum) {");
-       $self->gen_local_reply_switch($interface);
-       $self->pidl("default:");
-       $self->indent();
-       $self->pidl("p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;");
-       $self->pidl("break;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("push = ndr_push_init_ctx(r);");
-       $self->pidl("if (push == NULL) {");
-       $self->indent();
-       $self->pidl("talloc_free(r);");
-       $self->pidl("p->fault_state = DCERPC_FAULT_CANT_PERFORM;");
-       $self->pidl("return NT_STATUS_NO_MEMORY;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("/*");
-       $self->pidl(" * carry over the pointer count to the reply in case we are");
-       $self->pidl(" * using full pointer. See NDR specification for full pointers");
-       $self->pidl(" */");
-       $self->pidl("push->ptr_count = pull->ptr_count;");
-       $self->pidl("");
-       $self->pidl("ndr_err = ndr_table_$name.calls[opnum].ndr_push(push, NDR_OUT, r);");
-       $self->pidl("if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {");
-       $self->indent();
-       $self->pidl("p->fault_state = DCERPC_FAULT_NDR;");
-       $self->pidl("talloc_free(r);");
-       $self->pidl("return NT_STATUS_NET_WRITE_FAULT;");
-       $self->deindent();
-       $self->pidl("}");
-       $self->pidl("");
-       $self->pidl("*out = ndr_push_blob(push);");
-       $self->pidl("talloc_steal(mem_ctx, out->data);");
-       $self->pidl("");
-       $self->pidl("talloc_free(r);");
-       $self->pidl("");
-       $self->pidl("return NT_STATUS_OK;");
+       $self->pidl("return $name\__op_dispatch_internal(dce_call, mem_ctx, r, S3COMPAT_RPC_DISPATCH_INTERNAL);");
        $self->deindent();
        $self->pidl("}");
        $self->pidl("");
@@ -854,6 +704,13 @@ sub Parse($$)
        $self->pidl("#include <rpc_server/rpc_server.h>");
        $self->pidl("#include <util/debug.h>");
        $self->pidl("");
+       $self->pidl("enum s3compat_rpc_dispatch {");
+       $self->indent();
+       $self->pidl("S3COMPAT_RPC_DISPATCH_EXTERNAL = 0x00000001,");
+       $self->pidl("S3COMPAT_RPC_DISPATCH_INTERNAL = 0x00000002,");
+       $self->deindent();
+       $self->pidl("};");
+       $self->pidl("");
 
        foreach my $x (@{$ndr}) {
                $self->parse_interface($x) if ($x->{TYPE} eq "INTERFACE" and not defined($x->{PROPERTIES}{object}));
index 850dd6b90a1326fc9090089c0e82d5b68944c8d6..028b8a1a29a3715cebf7a5d5e19a430aca382563 100644 (file)
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
 
-static NTSTATUS make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx,
-                               const struct ndr_syntax_id *syntax,
-                               const struct tsocket_address *remote_address,
-                               const struct tsocket_address *local_address,
-                               const struct auth_session_info *session_info,
-                               struct messaging_context *msg_ctx,
-                               struct pipes_struct **p);
-
 struct np_proxy_state {
        uint16_t file_type;
        uint16_t device_state;
@@ -249,118 +241,274 @@ out:
        return status;
 }
 
-/****************************************************************************
- Make an internal namedpipes structure
-****************************************************************************/
-
-static NTSTATUS make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx,
-                               const struct ndr_syntax_id *syntax,
+static NTSTATUS make_internal_ncacn_conn(TALLOC_CTX *mem_ctx,
+                               const struct ndr_interface_table *table,
                                const struct tsocket_address *remote_address,
                                const struct tsocket_address *local_address,
                                const struct auth_session_info *session_info,
                                struct messaging_context *msg_ctx,
-                               struct pipes_struct **p)
+                               struct dcerpc_ncacn_conn **_out)
 {
-       struct pipes_struct *out;
        struct pipe_rpc_fns *context_fns;
-       const char *pipe_name;
+       struct dcerpc_ncacn_conn *ncacn_conn = NULL;
+       const char *pipe_name = NULL;
+       NTSTATUS status;
        int ret;
-       const struct ndr_interface_table *table;
 
-       table = ndr_table_by_uuid(&syntax->uuid);
-       if (table == NULL) {
-               DBG_ERR("Unknown interface\n");
-               return NT_STATUS_RPC_INTERFACE_NOT_FOUND;
+       pipe_name = dcerpc_default_transport_endpoint(mem_ctx,
+                                                     NCACN_NP,
+                                                     table);
+
+       DBG_INFO("Create pipe requested %s\n", pipe_name);
+
+       ncacn_conn = talloc_zero(mem_ctx, struct dcerpc_ncacn_conn);
+       if (ncacn_conn == NULL) {
+               return NT_STATUS_NO_MEMORY;
        }
 
-       pipe_name = dcerpc_default_transport_endpoint(mem_ctx, NCACN_NP, table);
+       ncacn_conn->msg_ctx = msg_ctx;
 
-       DBG_INFO("Create pipe requested %s\n", pipe_name);
+       if (remote_address != NULL) {
+               ncacn_conn->remote_client_addr =
+                       tsocket_address_copy(remote_address, ncacn_conn);
+               if (ncacn_conn->remote_client_addr == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto fail;
+               }
+       }
 
-       ret = make_base_pipes_struct(mem_ctx, msg_ctx, pipe_name,
-                                    NCALRPC, RPC_LITTLE_ENDIAN,
-                                    remote_address, local_address, &out);
+       if (local_address != NULL) {
+               ncacn_conn->local_server_addr =
+                       tsocket_address_copy(local_address, ncacn_conn);
+               if (ncacn_conn->local_server_addr == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto fail;
+               }
+       }
+
+       ncacn_conn->session_info = copy_session_info(ncacn_conn, session_info);
+       if (ncacn_conn->session_info == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
+       }
+
+       ret = make_base_pipes_struct(ncacn_conn,
+                                    msg_ctx,
+                                    pipe_name,
+                                    NCALRPC,
+                                    RPC_LITTLE_ENDIAN,
+                                    ncacn_conn->remote_client_addr,
+                                    ncacn_conn->local_server_addr,
+                                    &ncacn_conn->p);
        if (ret) {
                DBG_ERR("No memory for pipes_struct!\n");
-               return NT_STATUS_NO_MEMORY;
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
        }
 
-       if (!init_pipe_handles(out, syntax)) {
+       if (!init_pipe_handles(ncacn_conn->p, &table->syntax_id)) {
                DBG_ERR("init_pipe_handles failed.\n");
-               TALLOC_FREE(out);
-               return NT_STATUS_UNSUCCESSFUL;
-       }
-
-       out->session_info = copy_session_info(out, session_info);
-       if (out->session_info == NULL) {
-               DBG_ERR("copy_serverinfo failed\n");
-               close_policy_by_pipe(out);
-               TALLOC_FREE(out);
-               return NT_STATUS_UNSUCCESSFUL;
+               status = NT_STATUS_UNSUCCESSFUL;
+               goto fail;
        }
 
-       context_fns = talloc_zero(out, struct pipe_rpc_fns);
+       context_fns = talloc_zero(ncacn_conn->p, struct pipe_rpc_fns);
        if (context_fns == NULL) {
                DBG_ERR("No memory");
-               TALLOC_FREE(out);
-               return NT_STATUS_NO_MEMORY;
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
        }
 
        context_fns->next = context_fns->prev = NULL;
        context_fns->context_id = 0;
-       context_fns->syntax = *syntax;
+       context_fns->syntax = table->syntax_id;
 
        /* add to the list of open contexts */
-       DLIST_ADD(out->contexts, context_fns);
+       DLIST_ADD(ncacn_conn->p->contexts, context_fns);
 
        DEBUG(4,("Created internal pipe %s\n", pipe_name));
 
-       *p = out;
+       *_out = ncacn_conn;
 
        return NT_STATUS_OK;
+
+fail:
+       talloc_free(ncacn_conn);
+       return status;
+}
+
+static NTSTATUS find_ncalrpc_default_endpoint(struct dcesrv_context *dce_ctx,
+                                             struct dcesrv_endpoint **ep)
+{
+       TALLOC_CTX *tmp_ctx = NULL;
+       struct dcerpc_binding *binding = NULL;
+       const char *ep_description = NULL;
+       NTSTATUS status;
+
+       tmp_ctx = talloc_new(dce_ctx);
+       if (tmp_ctx == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       /*
+        * Some services use a rpcint binding handle in their initialization,
+        * before the server is fully initialized. Search the NCALRPC endpoint
+        * with and without endpoint
+        */
+       status = dcerpc_parse_binding(tmp_ctx, "ncalrpc:", &binding);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
+
+       status = dcesrv_find_endpoint(dce_ctx, binding, ep);
+       if (NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
+
+       if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC) {
+               ep_description = "ncalrpc:[SMBD]";
+       } else {
+               ep_description = "ncalrpc:[DEFAULT]";
+       }
+
+       status = dcerpc_parse_binding(tmp_ctx, ep_description, &binding);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
+
+       status = dcesrv_find_endpoint(dce_ctx, binding, ep);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
+
+out:
+       talloc_free(tmp_ctx);
+       return status;
 }
 
-static NTSTATUS rpcint_dispatch(struct pipes_struct *p,
+static NTSTATUS make_internal_dcesrv_connection(TALLOC_CTX *mem_ctx,
                                const struct ndr_interface_table *ndr_table,
-                               TALLOC_CTX *mem_ctx,
-                               uint32_t opnum,
-                               const DATA_BLOB *in_data,
-                               DATA_BLOB *out_data)
+                               struct dcerpc_ncacn_conn *ncacn_conn,
+                               struct dcesrv_connection **_out)
 {
+       struct dcesrv_connection *conn = NULL;
+       struct dcesrv_connection_context *context = NULL;
+       struct dcesrv_endpoint *endpoint = NULL;
        NTSTATUS status;
-       const struct dcesrv_endpoint_server *ep_server = NULL;
-       struct dcesrv_interface iface;
-       const struct ndr_syntax_id *abstract_syntax = &ndr_table->syntax_id;
-       bool ok;
 
-       ep_server = dcesrv_ep_server_byname(ndr_table->name);
-       if (ep_server == NULL) {
-               DBG_ERR("Failed to get DCE/RPC endpoint server '%s'\n",
-                       ndr_table->name);
-               return NT_STATUS_NOT_FOUND;
+       conn = talloc_zero(mem_ctx, struct dcesrv_connection);
+       if (conn == NULL) {
+               return NT_STATUS_NO_MEMORY;
        }
+       conn->dce_ctx = global_dcesrv_context();
+       conn->preferred_transfer = &ndr_transfer_syntax_ndr;
+       conn->transport.private_data = ncacn_conn;
 
-       ok = ep_server->interface_by_uuid(&iface, &abstract_syntax->uuid,
-                                         abstract_syntax->if_version);
-       if (!ok) {
-               DBG_ERR("Failed to get DCE/RPC interface\n");
-               return NT_STATUS_NOT_FOUND;
+       status = find_ncalrpc_default_endpoint(conn->dce_ctx, &endpoint);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto fail;
+       }
+       conn->endpoint = endpoint;
+
+       conn->default_auth_state = talloc_zero(conn, struct dcesrv_auth);
+       if (conn->default_auth_state == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
+       }
+       conn->default_auth_state->session_info = ncacn_conn->session_info;
+       conn->default_auth_state->auth_finished = true;
+
+       context = talloc_zero(conn, struct dcesrv_connection_context);
+       if (context == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
+       }
+       context->conn = conn;
+       context->context_id = 0;
+       context->transfer_syntax = *(conn->preferred_transfer);
+       context->iface = find_interface_by_uuid(conn->endpoint,
+                                       &ndr_table->syntax_id.uuid,
+                                       ndr_table->syntax_id.if_version);
+       if (context->iface == NULL) {
+               status = NT_STATUS_RPC_INTERFACE_NOT_FOUND;
+               goto fail;
+       }
+
+       DLIST_ADD(conn->contexts, context);
+
+       *_out = conn;
+
+       return NT_STATUS_OK;
+fail:
+       talloc_free(conn);
+       return status;
+}
+
+static NTSTATUS rpcint_dispatch(struct dcesrv_call_state *call)
+{
+       NTSTATUS status;
+       struct ndr_pull *pull = NULL;
+       struct ndr_push *push = NULL;
+       struct data_blob_list_item *rep = NULL;
+
+       pull = ndr_pull_init_blob(&call->pkt.u.request.stub_and_verifier,
+                                 call);
+       if (pull == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+
+       call->ndr_pull = pull;
+
+       /* unravel the NDR for the packet */
+       status = call->context->iface->ndr_pull(call, call, pull, &call->r);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
+               return status;
+       }
+
+       status = call->context->iface->local(call, call, call->r);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
+               return status;
+       }
+
+       push = ndr_push_init_ctx(call);
+       if (push == NULL) {
+               return NT_STATUS_NO_MEMORY;
        }
 
-       status = iface.local(p, opnum, mem_ctx, in_data, out_data);
+       push->ptr_count = call->ndr_pull->ptr_count;
+
+       status = call->context->iface->ndr_push(call, call, push, call->r);
        if (!NT_STATUS_IS_OK(status)) {
                DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
-                       iface.name, opnum,
-                       dcerpc_errstr(mem_ctx, p->fault_state));
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
                return status;
        }
 
+       rep = talloc_zero(call, struct data_blob_list_item);
+       if (rep == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       rep->blob = ndr_push_blob(push);
+       DLIST_ADD_END(call->replies, rep);
+
        return NT_STATUS_OK;
 }
 
 struct rpcint_bh_state {
-       struct pipes_struct *p;
-       const struct ndr_interface_table *ndr_table;
+       struct dcesrv_connection *conn;
 };
 
 static bool rpcint_bh_is_connected(struct dcerpc_binding_handle *h)
@@ -368,7 +516,7 @@ static bool rpcint_bh_is_connected(struct dcerpc_binding_handle *h)
        struct rpcint_bh_state *hs = dcerpc_binding_handle_data(h,
                                     struct rpcint_bh_state);
 
-       if (!hs->p) {
+       if (hs->conn == NULL) {
                return false;
        }
 
@@ -383,9 +531,7 @@ static uint32_t rpcint_bh_set_timeout(struct dcerpc_binding_handle *h,
 }
 
 struct rpcint_bh_raw_call_state {
-       DATA_BLOB in_data;
-       DATA_BLOB out_data;
-       uint32_t out_flags;
+       struct dcesrv_call_state *call;
 };
 
 static struct tevent_req *rpcint_bh_raw_call_send(TALLOC_CTX *mem_ctx,
@@ -402,6 +548,7 @@ static struct tevent_req *rpcint_bh_raw_call_send(TALLOC_CTX *mem_ctx,
                struct rpcint_bh_state);
        struct tevent_req *req;
        struct rpcint_bh_raw_call_state *state;
+       struct dcesrv_context *dce_ctx = global_dcesrv_context();
        bool ok;
        NTSTATUS status;
 
@@ -410,8 +557,6 @@ static struct tevent_req *rpcint_bh_raw_call_send(TALLOC_CTX *mem_ctx,
        if (req == NULL) {
                return NULL;
        }
-       state->in_data.data = discard_const_p(uint8_t, in_data);
-       state->in_data.length = in_length;
 
        ok = rpcint_bh_is_connected(h);
        if (!ok) {
@@ -419,13 +564,33 @@ static struct tevent_req *rpcint_bh_raw_call_send(TALLOC_CTX *mem_ctx,
                return tevent_req_post(req, ev);
        }
 
+       state->call = talloc_zero(hs->conn, struct dcesrv_call_state);
+       if (tevent_req_nomem(state->call, req)) {
+               return tevent_req_post(req, ev);
+       }
+
+       state->call->event_ctx = ev;
+       state->call->conn = hs->conn;
+       state->call->context = hs->conn->contexts;
+       state->call->auth_state = hs->conn->default_auth_state;
+
+       if (hs->conn->assoc_group == NULL) {
+               ZERO_STRUCT(state->call->pkt);
+               state->call->pkt.u.bind.assoc_group_id = 0;
+               status = dce_ctx->callbacks.assoc_group.find(state->call);
+               if (tevent_req_nterror(req, status)) {
+                       return tevent_req_post(req, ev);
+               }
+       }
+
+       ZERO_STRUCT(state->call->pkt);
+       state->call->pkt.u.request.opnum = opnum;
+       state->call->pkt.u.request.context_id = 0;
+       state->call->pkt.u.request.stub_and_verifier.data = discard_const_p(uint8_t, in_data);
+       state->call->pkt.u.request.stub_and_verifier.length = in_length;
+
        /* TODO: allow async */
-       status = rpcint_dispatch(hs->p,
-                                hs->ndr_table,
-                                state,
-                                opnum,
-                                &state->in_data,
-                                &state->out_data);
+       status = rpcint_dispatch(state->call);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
                return tevent_req_post(req, ev);
@@ -444,6 +609,7 @@ static NTSTATUS rpcint_bh_raw_call_recv(struct tevent_req *req,
        struct rpcint_bh_raw_call_state *state =
                tevent_req_data(req,
                struct rpcint_bh_raw_call_state);
+       struct data_blob_list_item *rep = NULL;
        NTSTATUS status;
 
        if (tevent_req_is_nterror(req, &status)) {
@@ -451,9 +617,15 @@ static NTSTATUS rpcint_bh_raw_call_recv(struct tevent_req *req,
                return status;
        }
 
-       *out_data = talloc_move(mem_ctx, &state->out_data.data);
-       *out_length = state->out_data.length;
+       rep = state->call->replies;
+       DLIST_REMOVE(state->call->replies, rep);
+
+       *out_data = talloc_steal(mem_ctx, rep->blob.data);
+       *out_length = rep->blob.length;
        *out_flags = 0;
+
+       talloc_free(rep);
+
        tevent_req_received(req);
        return NT_STATUS_OK;
 }
@@ -487,9 +659,9 @@ static struct tevent_req *rpcint_bh_disconnect_send(TALLOC_CTX *mem_ctx,
        /*
         * TODO: do a real async disconnect ...
         *
-        * For now the caller needs to free pipes_struct
+        * For now the caller needs to free dcesrv_connection
         */
-       hs->p = NULL;
+       hs->conn = NULL;
 
        tevent_req_done(req);
        return tevent_req_post(req, ev);
@@ -562,12 +734,9 @@ static NTSTATUS rpcint_binding_handle_ex(TALLOC_CTX *mem_ctx,
 {
        struct dcerpc_binding_handle *h;
        struct rpcint_bh_state *hs;
+       struct dcerpc_ncacn_conn *ncacn_conn = NULL;
        NTSTATUS status;
 
-       if (ndr_table) {
-               abstract_syntax = &ndr_table->syntax_id;
-       }
-
        h = dcerpc_binding_handle_create(mem_ctx,
                                         &rpcint_bh_ops,
                                         NULL,
@@ -579,15 +748,22 @@ static NTSTATUS rpcint_binding_handle_ex(TALLOC_CTX *mem_ctx,
                return NT_STATUS_NO_MEMORY;
        }
 
-       hs->ndr_table = ndr_table;
-
-       status = make_internal_rpc_pipe_p(hs,
-                                         abstract_syntax,
+       status = make_internal_ncacn_conn(hs,
+                                         ndr_table,
                                          remote_address,
                                          local_address,
                                          session_info,
                                          msg_ctx,
-                                         &hs->p);
+                                         &ncacn_conn);
+       if (!NT_STATUS_IS_OK(status)) {
+               TALLOC_FREE(h);
+               return status;
+       }
+
+       status = make_internal_dcesrv_connection(ncacn_conn,
+                                                ndr_table,
+                                                ncacn_conn,
+                                                &hs->conn);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(h);
                return status;
index d3dff11f419ca431ec186814b6548b6b4df3b8ab..9e064a84b9a0841bc972e7ff2472ae4ca483777a 100644 (file)
@@ -115,13 +115,13 @@ NTSTATUS iremotewinspool__op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC
        return NT_STATUS_OK;
 }
 
-NTSTATUS iremotewinspool__op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)
+static NTSTATUS iremotewinspool__op_dispatch_internal(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r, bool rpcint_call)
 {
        uint16_t opnum = dce_call->pkt.u.request.opnum;
        struct pipes_struct *p = NULL;
        struct auth_session_info *pipe_session_info = NULL;
        NTSTATUS status = NT_STATUS_OK;
-       bool impersonated;
+       bool impersonated = false;
 
        if (forward_opnum_to_spoolss(opnum)) {
                return spoolss__op_dispatch(dce_call, mem_ctx, r);
@@ -141,11 +141,13 @@ NTSTATUS iremotewinspool__op_dispatch(struct dcesrv_call_state *dce_call, TALLOC
        p->fault_state = 0;
 
        /* Impersonate */
-       impersonated = become_authenticated_pipe_user(p->session_info);
-       if (!impersonated) {
-               dce_call->fault_code = DCERPC_FAULT_ACCESS_DENIED;
-               status = NT_STATUS_NET_WRITE_FAULT;
-               goto fail;
+       if (!rpcint_call) {
+               impersonated = become_authenticated_pipe_user(p->session_info);
+               if (!impersonated) {
+                       dce_call->fault_code = DCERPC_FAULT_ACCESS_DENIED;
+                       status = NT_STATUS_NET_WRITE_FAULT;
+                       goto fail;
+               }
        }
 
        switch (opnum) {
@@ -1282,6 +1284,11 @@ fail:
        return status;
 }
 
+NTSTATUS iremotewinspool__op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)
+{
+       return iremotewinspool__op_dispatch_internal(dce_call, mem_ctx, r, false);
+}
+
 NTSTATUS iremotewinspool__op_reply(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)
 {
        uint16_t opnum = dce_call->pkt.u.request.opnum;
@@ -2296,2035 +2303,9 @@ NTSTATUS iremotewinspool__op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC
        return NT_STATUS_OK;
 }
 
-NTSTATUS iremotewinspool__op_local(void *q, int opnum, TALLOC_CTX *mem_ctx, const DATA_BLOB *in, DATA_BLOB *out)
+NTSTATUS iremotewinspool__op_local(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r)
 {
-       struct pipes_struct *p = talloc_get_type_abort(q, struct pipes_struct);
-       void *r;
-       struct ndr_pull *pull;
-       struct ndr_push *push;
-       enum ndr_err_code ndr_err;
-
-       if (forward_opnum_to_spoolss(opnum)) {
-               return spoolss__op_local(q, opnum, mem_ctx, in, out);
-       }
-
-       p->fault_state = 0;
-       if (opnum >= ndr_table_iremotewinspool.num_calls) {
-               p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
-               return NT_STATUS_NET_WRITE_FAULT;
-       }
-
-       r = talloc_named(mem_ctx, ndr_table_iremotewinspool.calls[opnum].struct_size, "struct %s", ndr_table_iremotewinspool.calls[opnum].name);
-       if (r == NULL) {
-               p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       pull = ndr_pull_init_blob(in, r);
-       if (pull == NULL) {
-               talloc_free(r);
-               p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
-       if (p->endian) {
-               pull->flags |= LIBNDR_FLAG_BIGENDIAN;
-       }
-
-       ndr_err = ndr_table_iremotewinspool.calls[opnum].ndr_pull(pull, NDR_IN, r);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               p->fault_state = DCERPC_FAULT_NDR;
-               talloc_free(r);
-               return NT_STATUS_NET_WRITE_FAULT;
-       }
-
-       switch (opnum) {
-       case 0: { /* winspool_AsyncOpenPrinter */
-               struct winspool_AsyncOpenPrinter *r2 = (struct winspool_AsyncOpenPrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncOpenPrinter, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pHandle = talloc_zero(r2, struct policy_handle);
-               if (r2->out.pHandle == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncOpenPrinter(p, r2);
-               break;
-       }
-       case 1: { /* winspool_AsyncAddPrinter */
-               struct winspool_AsyncAddPrinter *r2 = (struct winspool_AsyncAddPrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPrinter, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pHandle = talloc_zero(r2, struct policy_handle);
-               if (r2->out.pHandle == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncAddPrinter(p, r2);
-               break;
-       }
-       case 2: { /* winspool_AsyncSetJob */
-               struct winspool_AsyncSetJob *r2 = (struct winspool_AsyncSetJob *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetJob, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncSetJob(p, r2);
-               break;
-       }
-       case 3: { /* winspool_AsyncGetJob */
-               struct winspool_AsyncGetJob *r2 = (struct winspool_AsyncGetJob *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetJob, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pJob = r2->in.pJob;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetJob(p, r2);
-               break;
-       }
-       case 4: { /* winspool_AsyncEnumJobs */
-               struct winspool_AsyncEnumJobs *r2 = (struct winspool_AsyncEnumJobs *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumJobs, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pJob = r2->in.pJob;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcReturned = talloc_zero(r2, uint32_t);
-               if (r2->out.pcReturned == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumJobs(p, r2);
-               break;
-       }
-       case 5: { /* winspool_AsyncAddJob */
-               struct winspool_AsyncAddJob *r2 = (struct winspool_AsyncAddJob *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddJob, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pAddJob = r2->in.pAddJob;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncAddJob(p, r2);
-               break;
-       }
-       case 6: { /* winspool_AsyncScheduleJob */
-               struct winspool_AsyncScheduleJob *r2 = (struct winspool_AsyncScheduleJob *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncScheduleJob, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncScheduleJob(p, r2);
-               break;
-       }
-       case 7: { /* winspool_AsyncDeletePrinter */
-               struct winspool_AsyncDeletePrinter *r2 = (struct winspool_AsyncDeletePrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinter, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeletePrinter(p, r2);
-               break;
-       }
-       case 8: { /* winspool_AsyncSetPrinter */
-               struct winspool_AsyncSetPrinter *r2 = (struct winspool_AsyncSetPrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetPrinter, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncSetPrinter(p, r2);
-               break;
-       }
-       case 9: { /* winspool_AsyncGetPrinter */
-               struct winspool_AsyncGetPrinter *r2 = (struct winspool_AsyncGetPrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinter, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pPrinter = r2->in.pPrinter;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetPrinter(p, r2);
-               break;
-       }
-       case 10: { /* winspool_AsyncStartDocPrinter */
-               struct winspool_AsyncStartDocPrinter *r2 = (struct winspool_AsyncStartDocPrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncStartDocPrinter, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pJobId = talloc_zero(r2, uint32_t);
-               if (r2->out.pJobId == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncStartDocPrinter(p, r2);
-               break;
-       }
-       case 11: { /* winspool_AsyncStartPagePrinter */
-               struct winspool_AsyncStartPagePrinter *r2 = (struct winspool_AsyncStartPagePrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncStartPagePrinter, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncStartPagePrinter(p, r2);
-               break;
-       }
-       case 12: { /* winspool_AsyncWritePrinter */
-               struct winspool_AsyncWritePrinter *r2 = (struct winspool_AsyncWritePrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncWritePrinter, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pcWritten = talloc_zero(r2, uint32_t);
-               if (r2->out.pcWritten == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncWritePrinter(p, r2);
-               break;
-       }
-       case 13: { /* winspool_AsyncEndPagePrinter */
-               struct winspool_AsyncEndPagePrinter *r2 = (struct winspool_AsyncEndPagePrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEndPagePrinter, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncEndPagePrinter(p, r2);
-               break;
-       }
-       case 14: { /* winspool_AsyncEndDocPrinter */
-               struct winspool_AsyncEndDocPrinter *r2 = (struct winspool_AsyncEndDocPrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEndDocPrinter, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncEndDocPrinter(p, r2);
-               break;
-       }
-       case 15: { /* winspool_AsyncAbortPrinter */
-               struct winspool_AsyncAbortPrinter *r2 = (struct winspool_AsyncAbortPrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAbortPrinter, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncAbortPrinter(p, r2);
-               break;
-       }
-       case 16: { /* winspool_AsyncGetPrinterData */
-               struct winspool_AsyncGetPrinterData *r2 = (struct winspool_AsyncGetPrinterData *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterData, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pType = talloc_zero(r2, uint32_t);
-               if (r2->out.pType == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pData = talloc_zero_array(r2, uint8_t, r2->in.nSize);
-               if (r2->out.pData == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetPrinterData(p, r2);
-               break;
-       }
-       case 17: { /* winspool_AsyncGetPrinterDataEx */
-               struct winspool_AsyncGetPrinterDataEx *r2 = (struct winspool_AsyncGetPrinterDataEx *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterDataEx, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pType = talloc_zero(r2, uint32_t);
-               if (r2->out.pType == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pData = talloc_zero_array(r2, uint8_t, r2->in.nSize);
-               if (r2->out.pData == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetPrinterDataEx(p, r2);
-               break;
-       }
-       case 18: { /* winspool_AsyncSetPrinterData */
-               struct winspool_AsyncSetPrinterData *r2 = (struct winspool_AsyncSetPrinterData *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetPrinterData, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncSetPrinterData(p, r2);
-               break;
-       }
-       case 19: { /* winspool_AsyncSetPrinterDataEx */
-               struct winspool_AsyncSetPrinterDataEx *r2 = (struct winspool_AsyncSetPrinterDataEx *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetPrinterDataEx, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncSetPrinterDataEx(p, r2);
-               break;
-       }
-       case 20: { /* winspool_AsyncClosePrinter */
-               struct winspool_AsyncClosePrinter *r2 = (struct winspool_AsyncClosePrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncClosePrinter, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.phPrinter = r2->in.phPrinter;
-               r2->out.result = _winspool_AsyncClosePrinter(p, r2);
-               break;
-       }
-       case 21: { /* winspool_AsyncAddForm */
-               struct winspool_AsyncAddForm *r2 = (struct winspool_AsyncAddForm *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddForm, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncAddForm(p, r2);
-               break;
-       }
-       case 22: { /* winspool_AsyncDeleteForm */
-               struct winspool_AsyncDeleteForm *r2 = (struct winspool_AsyncDeleteForm *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeleteForm, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeleteForm(p, r2);
-               break;
-       }
-       case 23: { /* winspool_AsyncGetForm */
-               struct winspool_AsyncGetForm *r2 = (struct winspool_AsyncGetForm *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetForm, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pForm = r2->in.pForm;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetForm(p, r2);
-               break;
-       }
-       case 24: { /* winspool_AsyncSetForm */
-               struct winspool_AsyncSetForm *r2 = (struct winspool_AsyncSetForm *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetForm, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncSetForm(p, r2);
-               break;
-       }
-       case 25: { /* winspool_AsyncEnumForms */
-               struct winspool_AsyncEnumForms *r2 = (struct winspool_AsyncEnumForms *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumForms, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pForm = r2->in.pForm;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcReturned = talloc_zero(r2, uint32_t);
-               if (r2->out.pcReturned == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumForms(p, r2);
-               break;
-       }
-       case 26: { /* winspool_AsyncGetPrinterDriver */
-               struct winspool_AsyncGetPrinterDriver *r2 = (struct winspool_AsyncGetPrinterDriver *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterDriver, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pDriver = r2->in.pDriver;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pdwServerMaxVersion = talloc_zero(r2, uint32_t);
-               if (r2->out.pdwServerMaxVersion == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pdwServerMinVersion = talloc_zero(r2, uint32_t);
-               if (r2->out.pdwServerMinVersion == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetPrinterDriver(p, r2);
-               break;
-       }
-       case 27: { /* winspool_AsyncEnumPrinterData */
-               struct winspool_AsyncEnumPrinterData *r2 = (struct winspool_AsyncEnumPrinterData *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinterData, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pValueName = talloc_zero_array(r2, uint16_t, r2->in.cbValueName / 2);
-               if (r2->out.pValueName == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcbValueName = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbValueName == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pType = talloc_zero(r2, uint32_t);
-               if (r2->out.pType == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pData = talloc_zero_array(r2, uint8_t, r2->in.cbData);
-               if (r2->out.pData == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcbData = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbData == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumPrinterData(p, r2);
-               break;
-       }
-       case 28: { /* winspool_AsyncEnumPrinterDataEx */
-               struct winspool_AsyncEnumPrinterDataEx *r2 = (struct winspool_AsyncEnumPrinterDataEx *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinterDataEx, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pEnumValues = talloc_zero_array(r2, uint8_t, r2->in.cbEnumValues);
-               if (r2->out.pEnumValues == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcbEnumValues = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbEnumValues == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pnEnumValues = talloc_zero(r2, uint32_t);
-               if (r2->out.pnEnumValues == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumPrinterDataEx(p, r2);
-               break;
-       }
-       case 29: { /* winspool_AsyncEnumPrinterKey */
-               struct winspool_AsyncEnumPrinterKey *r2 = (struct winspool_AsyncEnumPrinterKey *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinterKey, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pSubkey = talloc_zero_array(r2, uint16_t, r2->in.cbSubkey / 2);
-               if (r2->out.pSubkey == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcbSubkey = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbSubkey == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumPrinterKey(p, r2);
-               break;
-       }
-       case 30: { /* winspool_AsyncDeletePrinterData */
-               struct winspool_AsyncDeletePrinterData *r2 = (struct winspool_AsyncDeletePrinterData *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterData, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeletePrinterData(p, r2);
-               break;
-       }
-       case 31: { /* winspool_AsyncDeletePrinterDataEx */
-               struct winspool_AsyncDeletePrinterDataEx *r2 = (struct winspool_AsyncDeletePrinterDataEx *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterDataEx, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeletePrinterDataEx(p, r2);
-               break;
-       }
-       case 32: { /* winspool_AsyncDeletePrinterKey */
-               struct winspool_AsyncDeletePrinterKey *r2 = (struct winspool_AsyncDeletePrinterKey *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterKey, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeletePrinterKey(p, r2);
-               break;
-       }
-       case 33: { /* winspool_AsyncXcvData */
-               struct winspool_AsyncXcvData *r2 = (struct winspool_AsyncXcvData *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncXcvData, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pdwStatus = r2->in.pdwStatus;
-               r2->out.pOutputData = talloc_zero_array(r2, uint8_t, r2->in.cbOutputData);
-               if (r2->out.pOutputData == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcbOutputNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbOutputNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncXcvData(p, r2);
-               break;
-       }
-       case 34: { /* winspool_AsyncSendRecvBidiData */
-               struct winspool_AsyncSendRecvBidiData *r2 = (struct winspool_AsyncSendRecvBidiData *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSendRecvBidiData, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.ppRespData = talloc_zero(r2, struct RPC_BIDI_RESPONSE_CONTAINER *);
-               if (r2->out.ppRespData == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncSendRecvBidiData(p, r2);
-               break;
-       }
-       case 35: { /* winspool_AsyncCreatePrinterIC */
-               struct winspool_AsyncCreatePrinterIC *r2 = (struct winspool_AsyncCreatePrinterIC *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncCreatePrinterIC, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pHandle = talloc_zero(r2, struct policy_handle);
-               if (r2->out.pHandle == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncCreatePrinterIC(p, r2);
-               break;
-       }
-       case 36: { /* winspool_AsyncPlayGdiScriptOnPrinterIC */
-               struct winspool_AsyncPlayGdiScriptOnPrinterIC *r2 = (struct winspool_AsyncPlayGdiScriptOnPrinterIC *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncPlayGdiScriptOnPrinterIC, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pOut = talloc_zero_array(r2, uint8_t, r2->in.cOut);
-               if (r2->out.pOut == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncPlayGdiScriptOnPrinterIC(p, r2);
-               break;
-       }
-       case 37: { /* winspool_AsyncDeletePrinterIC */
-               struct winspool_AsyncDeletePrinterIC *r2 = (struct winspool_AsyncDeletePrinterIC *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterIC, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.phPrinterIC = r2->in.phPrinterIC;
-               r2->out.result = _winspool_AsyncDeletePrinterIC(p, r2);
-               break;
-       }
-       case 38: { /* winspool_AsyncEnumPrinters */
-               struct winspool_AsyncEnumPrinters *r2 = (struct winspool_AsyncEnumPrinters *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinters, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pPrinterEnum = r2->in.pPrinterEnum;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcReturned = talloc_zero(r2, uint32_t);
-               if (r2->out.pcReturned == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumPrinters(p, r2);
-               break;
-       }
-       case 39: { /* winspool_AsyncAddPrinterDriver */
-               struct winspool_AsyncAddPrinterDriver *r2 = (struct winspool_AsyncAddPrinterDriver *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPrinterDriver, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncAddPrinterDriver(p, r2);
-               break;
-       }
-       case 40: { /* winspool_AsyncEnumPrinterDrivers */
-               struct winspool_AsyncEnumPrinterDrivers *r2 = (struct winspool_AsyncEnumPrinterDrivers *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinterDrivers, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pDrivers = r2->in.pDrivers;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcReturned = talloc_zero(r2, uint32_t);
-               if (r2->out.pcReturned == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumPrinterDrivers(p, r2);
-               break;
-       }
-       case 41: { /* winspool_AsyncGetPrinterDriverDirectory */
-               struct winspool_AsyncGetPrinterDriverDirectory *r2 = (struct winspool_AsyncGetPrinterDriverDirectory *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterDriverDirectory, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pDriverDirectory = r2->in.pDriverDirectory;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetPrinterDriverDirectory(p, r2);
-               break;
-       }
-       case 42: { /* winspool_AsyncDeletePrinterDriver */
-               struct winspool_AsyncDeletePrinterDriver *r2 = (struct winspool_AsyncDeletePrinterDriver *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterDriver, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeletePrinterDriver(p, r2);
-               break;
-       }
-       case 43: { /* winspool_AsyncDeletePrinterDriverEx */
-               struct winspool_AsyncDeletePrinterDriverEx *r2 = (struct winspool_AsyncDeletePrinterDriverEx *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterDriverEx, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeletePrinterDriverEx(p, r2);
-               break;
-       }
-       case 44: { /* winspool_AsyncAddPrintProcessor */
-               struct winspool_AsyncAddPrintProcessor *r2 = (struct winspool_AsyncAddPrintProcessor *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPrintProcessor, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncAddPrintProcessor(p, r2);
-               break;
-       }
-       case 45: { /* winspool_AsyncEnumPrintProcessors */
-               struct winspool_AsyncEnumPrintProcessors *r2 = (struct winspool_AsyncEnumPrintProcessors *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrintProcessors, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pPrintProcessorInfo = r2->in.pPrintProcessorInfo;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcReturned = talloc_zero(r2, uint32_t);
-               if (r2->out.pcReturned == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumPrintProcessors(p, r2);
-               break;
-       }
-       case 46: { /* winspool_AsyncGetPrintProcessorDirectory */
-               struct winspool_AsyncGetPrintProcessorDirectory *r2 = (struct winspool_AsyncGetPrintProcessorDirectory *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrintProcessorDirectory, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pPrintProcessorDirectory = r2->in.pPrintProcessorDirectory;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetPrintProcessorDirectory(p, r2);
-               break;
-       }
-       case 47: { /* winspool_AsyncEnumPorts */
-               struct winspool_AsyncEnumPorts *r2 = (struct winspool_AsyncEnumPorts *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPorts, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pPort = r2->in.pPort;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcReturned = talloc_zero(r2, uint32_t);
-               if (r2->out.pcReturned == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumPorts(p, r2);
-               break;
-       }
-       case 48: { /* winspool_AsyncEnumMonitors */
-               struct winspool_AsyncEnumMonitors *r2 = (struct winspool_AsyncEnumMonitors *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumMonitors, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pMonitor = r2->in.pMonitor;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcReturned = talloc_zero(r2, uint32_t);
-               if (r2->out.pcReturned == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumMonitors(p, r2);
-               break;
-       }
-       case 49: { /* winspool_AsyncAddPort */
-               struct winspool_AsyncAddPort *r2 = (struct winspool_AsyncAddPort *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPort, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncAddPort(p, r2);
-               break;
-       }
-       case 50: { /* winspool_AsyncSetPort */
-               struct winspool_AsyncSetPort *r2 = (struct winspool_AsyncSetPort *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetPort, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncSetPort(p, r2);
-               break;
-       }
-       case 51: { /* winspool_AsyncAddMonitor */
-               struct winspool_AsyncAddMonitor *r2 = (struct winspool_AsyncAddMonitor *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddMonitor, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncAddMonitor(p, r2);
-               break;
-       }
-       case 52: { /* winspool_AsyncDeleteMonitor */
-               struct winspool_AsyncDeleteMonitor *r2 = (struct winspool_AsyncDeleteMonitor *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeleteMonitor, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeleteMonitor(p, r2);
-               break;
-       }
-       case 53: { /* winspool_AsyncDeletePrintProcessor */
-               struct winspool_AsyncDeletePrintProcessor *r2 = (struct winspool_AsyncDeletePrintProcessor *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrintProcessor, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeletePrintProcessor(p, r2);
-               break;
-       }
-       case 54: { /* winspool_AsyncEnumPrintProcessorDatatypes */
-               struct winspool_AsyncEnumPrintProcessorDatatypes *r2 = (struct winspool_AsyncEnumPrintProcessorDatatypes *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrintProcessorDatatypes, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pDatatypes = r2->in.pDatatypes;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcReturned = talloc_zero(r2, uint32_t);
-               if (r2->out.pcReturned == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumPrintProcessorDatatypes(p, r2);
-               break;
-       }
-       case 55: { /* winspool_AsyncAddPerMachineConnection */
-               struct winspool_AsyncAddPerMachineConnection *r2 = (struct winspool_AsyncAddPerMachineConnection *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPerMachineConnection, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncAddPerMachineConnection(p, r2);
-               break;
-       }
-       case 56: { /* winspool_AsyncDeletePerMachineConnection */
-               struct winspool_AsyncDeletePerMachineConnection *r2 = (struct winspool_AsyncDeletePerMachineConnection *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePerMachineConnection, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeletePerMachineConnection(p, r2);
-               break;
-       }
-       case 57: { /* winspool_AsyncEnumPerMachineConnections */
-               struct winspool_AsyncEnumPerMachineConnections *r2 = (struct winspool_AsyncEnumPerMachineConnections *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPerMachineConnections, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pPrinterEnum = r2->in.pPrinterEnum;
-               r2->out.pcbNeeded = talloc_zero(r2, uint32_t);
-               if (r2->out.pcbNeeded == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcReturned = talloc_zero(r2, uint32_t);
-               if (r2->out.pcReturned == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumPerMachineConnections(p, r2);
-               break;
-       }
-       case 58: { /* winspool_SyncRegisterForRemoteNotifications */
-               struct winspool_SyncRegisterForRemoteNotifications *r2 = (struct winspool_SyncRegisterForRemoteNotifications *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_SyncRegisterForRemoteNotifications, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.phRpcHandle = talloc_zero(r2, struct policy_handle);
-               if (r2->out.phRpcHandle == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_SyncRegisterForRemoteNotifications(p, r2);
-               break;
-       }
-       case 59: { /* winspool_SyncUnRegisterForRemoteNotifications */
-               struct winspool_SyncUnRegisterForRemoteNotifications *r2 = (struct winspool_SyncUnRegisterForRemoteNotifications *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_SyncUnRegisterForRemoteNotifications, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.phRpcHandle = r2->in.phRpcHandle;
-               r2->out.result = _winspool_SyncUnRegisterForRemoteNotifications(p, r2);
-               break;
-       }
-       case 60: { /* winspool_SyncRefreshRemoteNotifications */
-               struct winspool_SyncRefreshRemoteNotifications *r2 = (struct winspool_SyncRefreshRemoteNotifications *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_SyncRefreshRemoteNotifications, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.ppNotifyData = talloc_zero(r2, struct winspool_PrintPropertiesCollection *);
-               if (r2->out.ppNotifyData == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_SyncRefreshRemoteNotifications(p, r2);
-               break;
-       }
-       case 61: { /* winspool_AsyncGetRemoteNotifications */
-               struct winspool_AsyncGetRemoteNotifications *r2 = (struct winspool_AsyncGetRemoteNotifications *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetRemoteNotifications, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.ppNotifyData = talloc_zero(r2, struct winspool_PrintPropertiesCollection *);
-               if (r2->out.ppNotifyData == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetRemoteNotifications(p, r2);
-               break;
-       }
-       case 62: { /* winspool_AsyncInstallPrinterDriverFromPackage */
-               struct winspool_AsyncInstallPrinterDriverFromPackage *r2 = (struct winspool_AsyncInstallPrinterDriverFromPackage *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncInstallPrinterDriverFromPackage, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncInstallPrinterDriverFromPackage(p, r2);
-               break;
-       }
-       case 63: { /* winspool_AsyncUploadPrinterDriverPackage */
-               struct winspool_AsyncUploadPrinterDriverPackage *r2 = (struct winspool_AsyncUploadPrinterDriverPackage *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncUploadPrinterDriverPackage, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pszDestInfPath = r2->in.pszDestInfPath;
-               r2->out.pcchDestInfPath = r2->in.pcchDestInfPath;
-               r2->out.result = _winspool_AsyncUploadPrinterDriverPackage(p, r2);
-               break;
-       }
-       case 64: { /* winspool_AsyncGetCorePrinterDrivers */
-               struct winspool_AsyncGetCorePrinterDrivers *r2 = (struct winspool_AsyncGetCorePrinterDrivers *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetCorePrinterDrivers, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pCorePrinterDrivers = talloc_zero_array(r2, struct spoolss_CorePrinterDriver, r2->in.cCorePrinterDrivers);
-               if (r2->out.pCorePrinterDrivers == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetCorePrinterDrivers(p, r2);
-               break;
-       }
-       case 65: { /* winspool_AsyncCorePrinterDriverInstalled */
-               struct winspool_AsyncCorePrinterDriverInstalled *r2 = (struct winspool_AsyncCorePrinterDriverInstalled *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncCorePrinterDriverInstalled, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pbDriverInstalled = talloc_zero(r2, int32_t);
-               if (r2->out.pbDriverInstalled == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncCorePrinterDriverInstalled(p, r2);
-               break;
-       }
-       case 66: { /* winspool_AsyncGetPrinterDriverPackagePath */
-               struct winspool_AsyncGetPrinterDriverPackagePath *r2 = (struct winspool_AsyncGetPrinterDriverPackagePath *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterDriverPackagePath, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pszDriverPackageCab = r2->in.pszDriverPackageCab;
-               r2->out.pcchRequiredSize = talloc_zero(r2, uint32_t);
-               if (r2->out.pcchRequiredSize == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetPrinterDriverPackagePath(p, r2);
-               break;
-       }
-       case 67: { /* winspool_AsyncDeletePrinterDriverPackage */
-               struct winspool_AsyncDeletePrinterDriverPackage *r2 = (struct winspool_AsyncDeletePrinterDriverPackage *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterDriverPackage, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeletePrinterDriverPackage(p, r2);
-               break;
-       }
-       case 68: { /* winspool_AsyncReadPrinter */
-               struct winspool_AsyncReadPrinter *r2 = (struct winspool_AsyncReadPrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncReadPrinter, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pBuf = talloc_zero_array(r2, uint8_t, r2->in.cbBuf);
-               if (r2->out.pBuf == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.pcNoBytesRead = talloc_zero(r2, uint32_t);
-               if (r2->out.pcNoBytesRead == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncReadPrinter(p, r2);
-               break;
-       }
-       case 69: { /* winspool_AsyncResetPrinter */
-               struct winspool_AsyncResetPrinter *r2 = (struct winspool_AsyncResetPrinter *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncResetPrinter, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncResetPrinter(p, r2);
-               break;
-       }
-       case 70: { /* winspool_AsyncGetJobNamedPropertyValue */
-               struct winspool_AsyncGetJobNamedPropertyValue *r2 = (struct winspool_AsyncGetJobNamedPropertyValue *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetJobNamedPropertyValue, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pValue = talloc_zero(r2, struct spoolss_PrintPropertyValue);
-               if (r2->out.pValue == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncGetJobNamedPropertyValue(p, r2);
-               break;
-       }
-       case 71: { /* winspool_AsyncSetJobNamedProperty */
-               struct winspool_AsyncSetJobNamedProperty *r2 = (struct winspool_AsyncSetJobNamedProperty *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetJobNamedProperty, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncSetJobNamedProperty(p, r2);
-               break;
-       }
-       case 72: { /* winspool_AsyncDeleteJobNamedProperty */
-               struct winspool_AsyncDeleteJobNamedProperty *r2 = (struct winspool_AsyncDeleteJobNamedProperty *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeleteJobNamedProperty, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncDeleteJobNamedProperty(p, r2);
-               break;
-       }
-       case 73: { /* winspool_AsyncEnumJobNamedProperties */
-               struct winspool_AsyncEnumJobNamedProperties *r2 = (struct winspool_AsyncEnumJobNamedProperties *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumJobNamedProperties, NDR_IN, r2);
-               }
-               NDR_ZERO_STRUCT(r2->out);
-               r2->out.pcProperties = talloc_zero(r2, uint32_t);
-               if (r2->out.pcProperties == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.ppProperties = talloc_zero(r2, struct spoolss_PrintNamedProperty *);
-               if (r2->out.ppProperties == NULL) {
-                       p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               r2->out.result = _winspool_AsyncEnumJobNamedProperties(p, r2);
-               break;
-       }
-       case 74: { /* winspool_AsyncLogJobInfoForBranchOffice */
-               struct winspool_AsyncLogJobInfoForBranchOffice *r2 = (struct winspool_AsyncLogJobInfoForBranchOffice *)r;
-               if (DEBUGLEVEL >= 10) {
-
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncLogJobInfoForBranchOffice, NDR_IN, r2);
-               }
-               r2->out.result = _winspool_AsyncLogJobInfoForBranchOffice(p, r2);
-               break;
-       }
-       default:
-               p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
-               break;
-       }
-
-       if (p->fault_state != 0) {
-               talloc_free(r);
-               return NT_STATUS_NET_WRITE_FAULT;
-       }
-
-       switch (opnum) {
-       case 0: { /* winspool_AsyncOpenPrinter */
-               struct winspool_AsyncOpenPrinter *r2 = (struct winspool_AsyncOpenPrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncOpenPrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncOpenPrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 1: { /* winspool_AsyncAddPrinter */
-               struct winspool_AsyncAddPrinter *r2 = (struct winspool_AsyncAddPrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncAddPrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 2: { /* winspool_AsyncSetJob */
-               struct winspool_AsyncSetJob *r2 = (struct winspool_AsyncSetJob *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetJob, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncSetJob\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 3: { /* winspool_AsyncGetJob */
-               struct winspool_AsyncGetJob *r2 = (struct winspool_AsyncGetJob *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetJob, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetJob\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 4: { /* winspool_AsyncEnumJobs */
-               struct winspool_AsyncEnumJobs *r2 = (struct winspool_AsyncEnumJobs *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumJobs, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumJobs\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 5: { /* winspool_AsyncAddJob */
-               struct winspool_AsyncAddJob *r2 = (struct winspool_AsyncAddJob *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddJob, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncAddJob\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 6: { /* winspool_AsyncScheduleJob */
-               struct winspool_AsyncScheduleJob *r2 = (struct winspool_AsyncScheduleJob *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncScheduleJob, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncScheduleJob\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 7: { /* winspool_AsyncDeletePrinter */
-               struct winspool_AsyncDeletePrinter *r2 = (struct winspool_AsyncDeletePrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 8: { /* winspool_AsyncSetPrinter */
-               struct winspool_AsyncSetPrinter *r2 = (struct winspool_AsyncSetPrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetPrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncSetPrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 9: { /* winspool_AsyncGetPrinter */
-               struct winspool_AsyncGetPrinter *r2 = (struct winspool_AsyncGetPrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetPrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 10: { /* winspool_AsyncStartDocPrinter */
-               struct winspool_AsyncStartDocPrinter *r2 = (struct winspool_AsyncStartDocPrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncStartDocPrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncStartDocPrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 11: { /* winspool_AsyncStartPagePrinter */
-               struct winspool_AsyncStartPagePrinter *r2 = (struct winspool_AsyncStartPagePrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncStartPagePrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncStartPagePrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 12: { /* winspool_AsyncWritePrinter */
-               struct winspool_AsyncWritePrinter *r2 = (struct winspool_AsyncWritePrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncWritePrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncWritePrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 13: { /* winspool_AsyncEndPagePrinter */
-               struct winspool_AsyncEndPagePrinter *r2 = (struct winspool_AsyncEndPagePrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEndPagePrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEndPagePrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 14: { /* winspool_AsyncEndDocPrinter */
-               struct winspool_AsyncEndDocPrinter *r2 = (struct winspool_AsyncEndDocPrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEndDocPrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEndDocPrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 15: { /* winspool_AsyncAbortPrinter */
-               struct winspool_AsyncAbortPrinter *r2 = (struct winspool_AsyncAbortPrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAbortPrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncAbortPrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 16: { /* winspool_AsyncGetPrinterData */
-               struct winspool_AsyncGetPrinterData *r2 = (struct winspool_AsyncGetPrinterData *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterData, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetPrinterData\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 17: { /* winspool_AsyncGetPrinterDataEx */
-               struct winspool_AsyncGetPrinterDataEx *r2 = (struct winspool_AsyncGetPrinterDataEx *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterDataEx, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetPrinterDataEx\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 18: { /* winspool_AsyncSetPrinterData */
-               struct winspool_AsyncSetPrinterData *r2 = (struct winspool_AsyncSetPrinterData *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetPrinterData, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncSetPrinterData\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 19: { /* winspool_AsyncSetPrinterDataEx */
-               struct winspool_AsyncSetPrinterDataEx *r2 = (struct winspool_AsyncSetPrinterDataEx *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetPrinterDataEx, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncSetPrinterDataEx\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 20: { /* winspool_AsyncClosePrinter */
-               struct winspool_AsyncClosePrinter *r2 = (struct winspool_AsyncClosePrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncClosePrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncClosePrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 21: { /* winspool_AsyncAddForm */
-               struct winspool_AsyncAddForm *r2 = (struct winspool_AsyncAddForm *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddForm, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncAddForm\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 22: { /* winspool_AsyncDeleteForm */
-               struct winspool_AsyncDeleteForm *r2 = (struct winspool_AsyncDeleteForm *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeleteForm, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeleteForm\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 23: { /* winspool_AsyncGetForm */
-               struct winspool_AsyncGetForm *r2 = (struct winspool_AsyncGetForm *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetForm, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetForm\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 24: { /* winspool_AsyncSetForm */
-               struct winspool_AsyncSetForm *r2 = (struct winspool_AsyncSetForm *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetForm, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncSetForm\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 25: { /* winspool_AsyncEnumForms */
-               struct winspool_AsyncEnumForms *r2 = (struct winspool_AsyncEnumForms *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumForms, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumForms\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 26: { /* winspool_AsyncGetPrinterDriver */
-               struct winspool_AsyncGetPrinterDriver *r2 = (struct winspool_AsyncGetPrinterDriver *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterDriver, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetPrinterDriver\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 27: { /* winspool_AsyncEnumPrinterData */
-               struct winspool_AsyncEnumPrinterData *r2 = (struct winspool_AsyncEnumPrinterData *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinterData, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumPrinterData\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 28: { /* winspool_AsyncEnumPrinterDataEx */
-               struct winspool_AsyncEnumPrinterDataEx *r2 = (struct winspool_AsyncEnumPrinterDataEx *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinterDataEx, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumPrinterDataEx\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 29: { /* winspool_AsyncEnumPrinterKey */
-               struct winspool_AsyncEnumPrinterKey *r2 = (struct winspool_AsyncEnumPrinterKey *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinterKey, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumPrinterKey\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 30: { /* winspool_AsyncDeletePrinterData */
-               struct winspool_AsyncDeletePrinterData *r2 = (struct winspool_AsyncDeletePrinterData *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterData, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePrinterData\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 31: { /* winspool_AsyncDeletePrinterDataEx */
-               struct winspool_AsyncDeletePrinterDataEx *r2 = (struct winspool_AsyncDeletePrinterDataEx *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterDataEx, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePrinterDataEx\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 32: { /* winspool_AsyncDeletePrinterKey */
-               struct winspool_AsyncDeletePrinterKey *r2 = (struct winspool_AsyncDeletePrinterKey *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterKey, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePrinterKey\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 33: { /* winspool_AsyncXcvData */
-               struct winspool_AsyncXcvData *r2 = (struct winspool_AsyncXcvData *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncXcvData, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncXcvData\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 34: { /* winspool_AsyncSendRecvBidiData */
-               struct winspool_AsyncSendRecvBidiData *r2 = (struct winspool_AsyncSendRecvBidiData *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSendRecvBidiData, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncSendRecvBidiData\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 35: { /* winspool_AsyncCreatePrinterIC */
-               struct winspool_AsyncCreatePrinterIC *r2 = (struct winspool_AsyncCreatePrinterIC *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncCreatePrinterIC, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncCreatePrinterIC\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 36: { /* winspool_AsyncPlayGdiScriptOnPrinterIC */
-               struct winspool_AsyncPlayGdiScriptOnPrinterIC *r2 = (struct winspool_AsyncPlayGdiScriptOnPrinterIC *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncPlayGdiScriptOnPrinterIC, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncPlayGdiScriptOnPrinterIC\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 37: { /* winspool_AsyncDeletePrinterIC */
-               struct winspool_AsyncDeletePrinterIC *r2 = (struct winspool_AsyncDeletePrinterIC *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterIC, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePrinterIC\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 38: { /* winspool_AsyncEnumPrinters */
-               struct winspool_AsyncEnumPrinters *r2 = (struct winspool_AsyncEnumPrinters *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinters, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumPrinters\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 39: { /* winspool_AsyncAddPrinterDriver */
-               struct winspool_AsyncAddPrinterDriver *r2 = (struct winspool_AsyncAddPrinterDriver *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPrinterDriver, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncAddPrinterDriver\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 40: { /* winspool_AsyncEnumPrinterDrivers */
-               struct winspool_AsyncEnumPrinterDrivers *r2 = (struct winspool_AsyncEnumPrinterDrivers *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrinterDrivers, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumPrinterDrivers\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 41: { /* winspool_AsyncGetPrinterDriverDirectory */
-               struct winspool_AsyncGetPrinterDriverDirectory *r2 = (struct winspool_AsyncGetPrinterDriverDirectory *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterDriverDirectory, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetPrinterDriverDirectory\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 42: { /* winspool_AsyncDeletePrinterDriver */
-               struct winspool_AsyncDeletePrinterDriver *r2 = (struct winspool_AsyncDeletePrinterDriver *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterDriver, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePrinterDriver\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 43: { /* winspool_AsyncDeletePrinterDriverEx */
-               struct winspool_AsyncDeletePrinterDriverEx *r2 = (struct winspool_AsyncDeletePrinterDriverEx *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterDriverEx, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePrinterDriverEx\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 44: { /* winspool_AsyncAddPrintProcessor */
-               struct winspool_AsyncAddPrintProcessor *r2 = (struct winspool_AsyncAddPrintProcessor *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPrintProcessor, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncAddPrintProcessor\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 45: { /* winspool_AsyncEnumPrintProcessors */
-               struct winspool_AsyncEnumPrintProcessors *r2 = (struct winspool_AsyncEnumPrintProcessors *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrintProcessors, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumPrintProcessors\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 46: { /* winspool_AsyncGetPrintProcessorDirectory */
-               struct winspool_AsyncGetPrintProcessorDirectory *r2 = (struct winspool_AsyncGetPrintProcessorDirectory *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrintProcessorDirectory, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetPrintProcessorDirectory\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 47: { /* winspool_AsyncEnumPorts */
-               struct winspool_AsyncEnumPorts *r2 = (struct winspool_AsyncEnumPorts *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPorts, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumPorts\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 48: { /* winspool_AsyncEnumMonitors */
-               struct winspool_AsyncEnumMonitors *r2 = (struct winspool_AsyncEnumMonitors *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumMonitors, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumMonitors\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 49: { /* winspool_AsyncAddPort */
-               struct winspool_AsyncAddPort *r2 = (struct winspool_AsyncAddPort *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPort, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncAddPort\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 50: { /* winspool_AsyncSetPort */
-               struct winspool_AsyncSetPort *r2 = (struct winspool_AsyncSetPort *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetPort, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncSetPort\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 51: { /* winspool_AsyncAddMonitor */
-               struct winspool_AsyncAddMonitor *r2 = (struct winspool_AsyncAddMonitor *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddMonitor, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncAddMonitor\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 52: { /* winspool_AsyncDeleteMonitor */
-               struct winspool_AsyncDeleteMonitor *r2 = (struct winspool_AsyncDeleteMonitor *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeleteMonitor, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeleteMonitor\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 53: { /* winspool_AsyncDeletePrintProcessor */
-               struct winspool_AsyncDeletePrintProcessor *r2 = (struct winspool_AsyncDeletePrintProcessor *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrintProcessor, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePrintProcessor\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 54: { /* winspool_AsyncEnumPrintProcessorDatatypes */
-               struct winspool_AsyncEnumPrintProcessorDatatypes *r2 = (struct winspool_AsyncEnumPrintProcessorDatatypes *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPrintProcessorDatatypes, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumPrintProcessorDatatypes\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 55: { /* winspool_AsyncAddPerMachineConnection */
-               struct winspool_AsyncAddPerMachineConnection *r2 = (struct winspool_AsyncAddPerMachineConnection *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncAddPerMachineConnection, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncAddPerMachineConnection\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 56: { /* winspool_AsyncDeletePerMachineConnection */
-               struct winspool_AsyncDeletePerMachineConnection *r2 = (struct winspool_AsyncDeletePerMachineConnection *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePerMachineConnection, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePerMachineConnection\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 57: { /* winspool_AsyncEnumPerMachineConnections */
-               struct winspool_AsyncEnumPerMachineConnections *r2 = (struct winspool_AsyncEnumPerMachineConnections *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumPerMachineConnections, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumPerMachineConnections\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 58: { /* winspool_SyncRegisterForRemoteNotifications */
-               struct winspool_SyncRegisterForRemoteNotifications *r2 = (struct winspool_SyncRegisterForRemoteNotifications *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_SyncRegisterForRemoteNotifications, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_SyncRegisterForRemoteNotifications\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 59: { /* winspool_SyncUnRegisterForRemoteNotifications */
-               struct winspool_SyncUnRegisterForRemoteNotifications *r2 = (struct winspool_SyncUnRegisterForRemoteNotifications *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_SyncUnRegisterForRemoteNotifications, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_SyncUnRegisterForRemoteNotifications\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 60: { /* winspool_SyncRefreshRemoteNotifications */
-               struct winspool_SyncRefreshRemoteNotifications *r2 = (struct winspool_SyncRefreshRemoteNotifications *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_SyncRefreshRemoteNotifications, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_SyncRefreshRemoteNotifications\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 61: { /* winspool_AsyncGetRemoteNotifications */
-               struct winspool_AsyncGetRemoteNotifications *r2 = (struct winspool_AsyncGetRemoteNotifications *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetRemoteNotifications, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetRemoteNotifications\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 62: { /* winspool_AsyncInstallPrinterDriverFromPackage */
-               struct winspool_AsyncInstallPrinterDriverFromPackage *r2 = (struct winspool_AsyncInstallPrinterDriverFromPackage *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncInstallPrinterDriverFromPackage, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncInstallPrinterDriverFromPackage\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 63: { /* winspool_AsyncUploadPrinterDriverPackage */
-               struct winspool_AsyncUploadPrinterDriverPackage *r2 = (struct winspool_AsyncUploadPrinterDriverPackage *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncUploadPrinterDriverPackage, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncUploadPrinterDriverPackage\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 64: { /* winspool_AsyncGetCorePrinterDrivers */
-               struct winspool_AsyncGetCorePrinterDrivers *r2 = (struct winspool_AsyncGetCorePrinterDrivers *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetCorePrinterDrivers, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetCorePrinterDrivers\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 65: { /* winspool_AsyncCorePrinterDriverInstalled */
-               struct winspool_AsyncCorePrinterDriverInstalled *r2 = (struct winspool_AsyncCorePrinterDriverInstalled *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncCorePrinterDriverInstalled, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncCorePrinterDriverInstalled\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 66: { /* winspool_AsyncGetPrinterDriverPackagePath */
-               struct winspool_AsyncGetPrinterDriverPackagePath *r2 = (struct winspool_AsyncGetPrinterDriverPackagePath *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetPrinterDriverPackagePath, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetPrinterDriverPackagePath\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 67: { /* winspool_AsyncDeletePrinterDriverPackage */
-               struct winspool_AsyncDeletePrinterDriverPackage *r2 = (struct winspool_AsyncDeletePrinterDriverPackage *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeletePrinterDriverPackage, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeletePrinterDriverPackage\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 68: { /* winspool_AsyncReadPrinter */
-               struct winspool_AsyncReadPrinter *r2 = (struct winspool_AsyncReadPrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncReadPrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncReadPrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 69: { /* winspool_AsyncResetPrinter */
-               struct winspool_AsyncResetPrinter *r2 = (struct winspool_AsyncResetPrinter *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncResetPrinter, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncResetPrinter\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 70: { /* winspool_AsyncGetJobNamedPropertyValue */
-               struct winspool_AsyncGetJobNamedPropertyValue *r2 = (struct winspool_AsyncGetJobNamedPropertyValue *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncGetJobNamedPropertyValue, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncGetJobNamedPropertyValue\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 71: { /* winspool_AsyncSetJobNamedProperty */
-               struct winspool_AsyncSetJobNamedProperty *r2 = (struct winspool_AsyncSetJobNamedProperty *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncSetJobNamedProperty, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncSetJobNamedProperty\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 72: { /* winspool_AsyncDeleteJobNamedProperty */
-               struct winspool_AsyncDeleteJobNamedProperty *r2 = (struct winspool_AsyncDeleteJobNamedProperty *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncDeleteJobNamedProperty, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncDeleteJobNamedProperty\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 73: { /* winspool_AsyncEnumJobNamedProperties */
-               struct winspool_AsyncEnumJobNamedProperties *r2 = (struct winspool_AsyncEnumJobNamedProperties *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncEnumJobNamedProperties, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncEnumJobNamedProperties\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       case 74: { /* winspool_AsyncLogJobInfoForBranchOffice */
-               struct winspool_AsyncLogJobInfoForBranchOffice *r2 = (struct winspool_AsyncLogJobInfoForBranchOffice *)r;
-               if (DEBUGLEVEL >= 10 && p->fault_state == 0) {
-                       NDR_PRINT_FUNCTION_DEBUG(winspool_AsyncLogJobInfoForBranchOffice, NDR_OUT | NDR_SET_VALUES, r2);
-               }
-               if (p->fault_state != 0) {
-
-                       DBG_WARNING("dcerpc_fault %s in winspool_AsyncLogJobInfoForBranchOffice\n", dcerpc_errstr(mem_ctx, p->fault_state));
-               }
-               break;
-       }
-       default:
-               p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
-               break;
-       }
-
-       push = ndr_push_init_ctx(r);
-       if (push == NULL) {
-               talloc_free(r);
-               p->fault_state = DCERPC_FAULT_CANT_PERFORM;
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       /*
-        * carry over the pointer count to the reply in case we are
-        * using full pointer. See NDR specification for full pointers
-        */
-       push->ptr_count = pull->ptr_count;
-
-       ndr_err = ndr_table_iremotewinspool.calls[opnum].ndr_push(push, NDR_OUT, r);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               p->fault_state = DCERPC_FAULT_NDR;
-               talloc_free(r);
-               return NT_STATUS_NET_WRITE_FAULT;
-       }
-
-       *out = ndr_push_blob(push);
-       talloc_steal(mem_ctx, out->data);
-
-       talloc_free(r);
-
-       return NT_STATUS_OK;
+       return iremotewinspool__op_dispatch_internal(dce_call, mem_ctx, r, true);
 }
 
 static const struct dcesrv_interface dcesrv_iremotewinspool_interface = {
index f615ada1fca8cb4a9ae9b393ad2e1aba050bf228..f2d8c815dca3dcfb03bbffd520bad47c4ee23ed0 100644 (file)
@@ -32,6 +32,9 @@
 #include "ntdomain.h"
 #include "librpc/rpc/dcesrv_core.h"
 #include "librpc/gen_ndr/ndr_winbind.h"
+#include "rpc_server/rpc_config.h"
+#include "rpc_server/rpc_server.h"
+#include "rpc_dce.h"
 
 struct wbint_bh_state {
        struct winbindd_domain *domain;
@@ -320,6 +323,134 @@ static const struct dcerpc_binding_handle_ops wbint_bh_ops = {
        .do_ndr_print           = wbint_bh_do_ndr_print,
 };
 
+static NTSTATUS make_internal_ncacn_conn(TALLOC_CTX *mem_ctx,
+                               const struct ndr_interface_table *table,
+                               struct dcerpc_ncacn_conn **_out)
+{
+       struct dcerpc_ncacn_conn *ncacn_conn = NULL;
+       NTSTATUS status;
+
+       ncacn_conn = talloc_zero(mem_ctx, struct dcerpc_ncacn_conn);
+       if (ncacn_conn == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       ncacn_conn->p = talloc_zero(ncacn_conn, struct pipes_struct);
+       if (ncacn_conn->p == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
+       }
+       ncacn_conn->p->mem_ctx = mem_ctx;
+
+       *_out = ncacn_conn;
+
+       return NT_STATUS_OK;
+
+fail:
+       talloc_free(ncacn_conn);
+       return status;
+}
+
+static NTSTATUS find_ncalrpc_default_endpoint(struct dcesrv_context *dce_ctx,
+                                             struct dcesrv_endpoint **ep)
+{
+       TALLOC_CTX *tmp_ctx = NULL;
+       struct dcerpc_binding *binding = NULL;
+       NTSTATUS status;
+
+       tmp_ctx = talloc_new(dce_ctx);
+       if (tmp_ctx == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       /*
+        * Some services use a rpcint binding handle in their initialization,
+        * before the server is fully initialized. Search the NCALRPC endpoint
+        * with and without endpoint
+        */
+       status = dcerpc_parse_binding(tmp_ctx, "ncalrpc:", &binding);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
+
+       status = dcesrv_find_endpoint(dce_ctx, binding, ep);
+       if (NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
+
+       status = dcerpc_parse_binding(tmp_ctx, "ncalrpc:[DEFAULT]", &binding);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
+
+       status = dcesrv_find_endpoint(dce_ctx, binding, ep);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
+
+out:
+       talloc_free(tmp_ctx);
+       return status;
+}
+
+static NTSTATUS make_internal_dcesrv_connection(TALLOC_CTX *mem_ctx,
+                               const struct ndr_interface_table *ndr_table,
+                               struct dcerpc_ncacn_conn *ncacn_conn,
+                               struct dcesrv_connection **_out)
+{
+       struct dcesrv_connection *conn = NULL;
+       struct dcesrv_connection_context *context = NULL;
+       struct dcesrv_endpoint *endpoint = NULL;
+       NTSTATUS status;
+
+       conn = talloc_zero(mem_ctx, struct dcesrv_connection);
+       if (conn == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       conn->dce_ctx = global_dcesrv_context();
+       conn->preferred_transfer = &ndr_transfer_syntax_ndr;
+       conn->transport.private_data = ncacn_conn;
+
+       status = find_ncalrpc_default_endpoint(conn->dce_ctx, &endpoint);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto fail;
+       }
+       conn->endpoint = endpoint;
+
+       conn->default_auth_state = talloc_zero(conn, struct dcesrv_auth);
+       if (conn->default_auth_state == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
+       }
+       conn->default_auth_state->session_info = ncacn_conn->session_info;
+       conn->default_auth_state->auth_finished = true;
+
+       context = talloc_zero(conn, struct dcesrv_connection_context);
+       if (context == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
+       }
+       context->conn = conn;
+       context->context_id = 0;
+       context->transfer_syntax = *(conn->preferred_transfer);
+       context->iface = find_interface_by_uuid(conn->endpoint,
+                                       &ndr_table->syntax_id.uuid,
+                                       ndr_table->syntax_id.if_version);
+       if (context->iface == NULL) {
+               status = NT_STATUS_RPC_INTERFACE_NOT_FOUND;
+               goto fail;
+       }
+
+       DLIST_ADD(conn->contexts, context);
+
+       *_out = conn;
+
+       return NT_STATUS_OK;
+fail:
+       talloc_free(conn);
+       return status;
+}
+
 /* initialise a wbint binding handle */
 struct dcerpc_binding_handle *wbint_binding_handle(TALLOC_CTX *mem_ctx,
                                                struct winbindd_domain *domain,
@@ -344,70 +475,148 @@ struct dcerpc_binding_handle *wbint_binding_handle(TALLOC_CTX *mem_ctx,
        return h;
 }
 
+static NTSTATUS rpcint_dispatch(struct dcesrv_call_state *call)
+{
+       NTSTATUS status;
+       struct ndr_pull *pull = NULL;
+       struct ndr_push *push = NULL;
+       struct data_blob_list_item *rep = NULL;
+
+       pull = ndr_pull_init_blob(&call->pkt.u.request.stub_and_verifier,
+                                 call);
+       if (pull == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+
+       call->ndr_pull = pull;
+
+       /* unravel the NDR for the packet */
+       status = call->context->iface->ndr_pull(call, call, pull, &call->r);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
+               return status;
+       }
+
+       status = call->context->iface->local(call, call, call->r);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
+               return status;
+       }
+
+       push = ndr_push_init_ctx(call);
+       if (push == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       push->ptr_count = call->ndr_pull->ptr_count;
+
+       status = call->context->iface->ndr_push(call, call, push, call->r);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("DCE/RPC fault in call %s:%02X - %s\n",
+                       call->context->iface->name,
+                       call->pkt.u.request.opnum,
+                       dcerpc_errstr(call, call->fault_code));
+               return status;
+       }
+
+       rep = talloc_zero(call, struct data_blob_list_item);
+       if (rep == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       rep->blob = ndr_push_blob(push);
+       DLIST_ADD_END(call->replies, rep);
+
+       return NT_STATUS_OK;
+}
+
 enum winbindd_result winbindd_dual_ndrcmd(struct winbindd_domain *domain,
                                          struct winbindd_cli_state *state)
 {
-       const struct dcesrv_endpoint_server *ep_server = NULL;
-       struct dcesrv_interface iface;
-       const struct ndr_syntax_id *abstract_syntax;
-       bool ok;
+       struct dcerpc_ncacn_conn *ncacn_conn = NULL;
+       struct dcesrv_connection *dcesrv_conn = NULL;
+       struct dcesrv_call_state *dcesrv_call = NULL;
+       struct data_blob_list_item *rep = NULL;
        uint32_t opnum = state->request->data.ndrcmd;
-       struct pipes_struct *p;
        TALLOC_CTX *mem_ctx;
-       DATA_BLOB in;
-       DATA_BLOB out;
        NTSTATUS status;
 
        DBG_DEBUG("Running command %s (domain '%s')\n",
                  ndr_table_winbind.calls[opnum].name,
                  domain ? domain->name : "(null)");
 
-       ep_server = dcesrv_ep_server_byname(ndr_table_winbind.name);
-       if (ep_server == NULL) {
-               DBG_ERR("Failed to get DCE/RPC endpoint server '%s'\n",
-                       ndr_table_winbind.name);
+       mem_ctx = talloc_stackframe();
+       if (mem_ctx == NULL) {
+               DBG_ERR("No memory");
                return WINBINDD_ERROR;
        }
 
-       abstract_syntax = &ndr_table_winbind.syntax_id;
-       ok = ep_server->interface_by_uuid(&iface, &abstract_syntax->uuid,
-                                         abstract_syntax->if_version);
-       if (!ok) {
-               DBG_ERR("Failed to get DCE/RPC interface\n");
-               return WINBINDD_ERROR;
+       status = make_internal_ncacn_conn(mem_ctx,
+                                         &ndr_table_winbind,
+                                         &ncacn_conn);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
        }
 
-       mem_ctx = talloc_stackframe();
-       if (mem_ctx == NULL) {
-               DBG_ERR("No memory");
-               return WINBINDD_ERROR;
+       status = make_internal_dcesrv_connection(ncacn_conn,
+                                                &ndr_table_winbind,
+                                                ncacn_conn,
+                                                &dcesrv_conn);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
        }
 
-       p = talloc_zero(mem_ctx, struct pipes_struct);
-       if (p == NULL) {
-               DBG_ERR("No memory\n");
-               return WINBINDD_ERROR;
+       dcesrv_call = talloc_zero(dcesrv_conn, struct dcesrv_call_state);
+       if (dcesrv_call == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto out;
        }
-       p->mem_ctx = mem_ctx;
 
-       in = data_blob_const(state->request->extra_data.data,
-                            state->request->extra_len);
+       dcesrv_call->conn = dcesrv_conn;
+       dcesrv_call->context = dcesrv_conn->contexts;
+       dcesrv_call->auth_state = dcesrv_conn->default_auth_state;
 
-       status = iface.local(p, opnum, mem_ctx, &in, &out);
+       ZERO_STRUCT(dcesrv_call->pkt);
+       dcesrv_call->pkt.u.bind.assoc_group_id = 0;
+       status = dcesrv_call->conn->dce_ctx->callbacks.assoc_group.find(
+                                                               dcesrv_call);
        if (!NT_STATUS_IS_OK(status)) {
-               TALLOC_FREE(mem_ctx);
-               return WINBINDD_ERROR;
+               goto out;
        }
 
-       state->response->extra_data.data =
-               talloc_steal(state->mem_ctx, out.data);
-       state->response->length += out.length;
-
-       TALLOC_FREE(mem_ctx);
+       ZERO_STRUCT(dcesrv_call->pkt);
+       dcesrv_call->pkt.u.request.opnum = opnum;
+       dcesrv_call->pkt.u.request.context_id = 0;
+       dcesrv_call->pkt.u.request.stub_and_verifier =
+               data_blob_const(state->request->extra_data.data,
+                               state->request->extra_len);
 
-       if (state->response->extra_data.data == NULL) {
-               return WINBINDD_ERROR;
+       status = rpcint_dispatch(dcesrv_call);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
        }
 
-       return WINBINDD_OK;
+       rep = dcesrv_call->replies;
+       DLIST_REMOVE(dcesrv_call->replies, rep);
+
+       state->response->extra_data.data = talloc_steal(state->mem_ctx,
+                                                       rep->blob.data);
+       state->response->length += rep->blob.length;
+
+       talloc_free(rep);
+
+out:
+       talloc_free(mem_ctx);
+       if (NT_STATUS_IS_OK(status)) {
+               return WINBINDD_OK;
+       }
+       return WINBINDD_ERROR;
 }