s3-printing: safe a ton of roundtrips by reusing existing winreg binding_handles.
authorGünther Deschner <gd@samba.org>
Mon, 4 Jul 2011 22:55:35 +0000 (00:55 +0200)
committerGünther Deschner <gd@samba.org>
Thu, 7 Jul 2011 16:06:02 +0000 (18:06 +0200)
Guenther

Pair-Programmed-With: David Disseldorp <ddiss@suse.de>

source3/printing/nt_printing.c
source3/printing/nt_printing_ads.c
source3/rpc_server/spoolss/srv_spoolss_nt.c

index 1887a61119da4839a3a71f8ae41580c623032132..fd2ab2a1971fae743c71a48ad8c9dd37d938c97f 100644 (file)
@@ -32,6 +32,7 @@
 #include "auth.h"
 #include "messages.h"
 #include "rpc_server/spoolss/srv_spoolss_nt.h"
+#include "rpc_client/cli_winreg_spoolss.h"
 
 /* Map generic permissions to printer object specific permissions */
 
@@ -1182,6 +1183,7 @@ bool printer_driver_in_use(TALLOC_CTX *mem_ctx,
        bool in_use = False;
        struct spoolss_PrinterInfo2 *pinfo2 = NULL;
        WERROR result;
+       struct dcerpc_binding_handle *b = NULL;
 
        if (!r) {
                return false;
@@ -1196,7 +1198,17 @@ bool printer_driver_in_use(TALLOC_CTX *mem_ctx,
                        continue;
                }
 
-               result = winreg_get_printer_internal(mem_ctx, session_info, msg_ctx,
+               if (b == NULL) {
+                       result = winreg_printer_binding_handle(mem_ctx,
+                                                              session_info,
+                                                              msg_ctx,
+                                                              &b);
+                       if (!W_ERROR_IS_OK(result)) {
+                               return false;
+                       }
+               }
+
+               result = winreg_get_printer(mem_ctx, b,
                                            lp_servicename(snum),
                                            &pinfo2);
                if (!W_ERROR_IS_OK(result)) {
@@ -1222,18 +1234,18 @@ bool printer_driver_in_use(TALLOC_CTX *mem_ctx,
                   "Windows NT x86" version 2 or 3 left */
 
                if (!strequal("Windows NT x86", r->architecture)) {
-                       werr = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+                       werr = winreg_get_driver(mem_ctx, b,
                                                 "Windows NT x86",
                                                 r->driver_name,
                                                 DRIVER_ANY_VERSION,
                                                 &driver);
                } else if (r->version == 2) {
-                       werr = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+                       werr = winreg_get_driver(mem_ctx, b,
                                                 "Windows NT x86",
                                                 r->driver_name,
                                                 3, &driver);
                } else if (r->version == 3) {
-                       werr = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+                       werr = winreg_get_driver(mem_ctx, b,
                                                 "Windows NT x86",
                                                 r->driver_name,
                                                 2, &driver);
@@ -1412,6 +1424,7 @@ bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
        uint32_t num_drivers;
        const char **drivers;
        WERROR result;
+       struct dcerpc_binding_handle *b;
 
        if ( !info )
                return False;
@@ -1424,7 +1437,15 @@ bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
 
        /* get the list of drivers */
 
-       result = winreg_get_driver_list_internal(mem_ctx, session_info, msg_ctx,
+       result = winreg_printer_binding_handle(mem_ctx,
+                                              session_info,
+                                              msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               return false;
+       }
+
+       result = winreg_get_driver_list(mem_ctx, b,
                                        info->architecture, version,
                                        &num_drivers, &drivers);
        if (!W_ERROR_IS_OK(result)) {
@@ -1441,7 +1462,7 @@ bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
 
                driver = NULL;
 
-               result = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+               result = winreg_get_driver(mem_ctx, b,
                                           info->architecture, drivers[i],
                                           version, &driver);
                if (!W_ERROR_IS_OK(result)) {
index c5e3f99fb62cffa25059cfa901095a91137960b8..beb52404234b6ba179a4a6313608d837a02d9498 100644 (file)
@@ -399,8 +399,17 @@ bool is_printer_published(TALLOC_CTX *mem_ctx,
        uint32_t data_size;
        WERROR result;
        NTSTATUS status;
+       struct dcerpc_binding_handle *b;
 
-       result = winreg_get_printer_internal(mem_ctx, session_info, msg_ctx,
+       result = winreg_printer_binding_handle(mem_ctx,
+                                              session_info,
+                                              msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               return false;
+       }
+
+       result = winreg_get_printer(mem_ctx, b,
                                    printer, &pinfo2);
        if (!W_ERROR_IS_OK(result)) {
                return false;
@@ -417,7 +426,7 @@ bool is_printer_published(TALLOC_CTX *mem_ctx,
 
        /* fetching printer guids really ought to be a separate function. */
 
-       result = winreg_get_printer_dataex_internal(mem_ctx, session_info, msg_ctx,
+       result = winreg_get_printer_dataex(mem_ctx, b,
                                           printer,
                                           SPOOL_DSSPOOLER_KEY, "objectGUID",
                                           &type, &data, &data_size);
index 19a7d786738516737ce0342f0bf7de94f29fdd54..0bf678780b7254378b331c2b1bc77d2c56610668 100644 (file)
@@ -1543,6 +1543,7 @@ void do_drv_upgrade_printer(struct messaging_context *msg,
        const char *drivername;
        int snum;
        int n_services = lp_numservices();
+       struct dcerpc_binding_handle *b = NULL;
 
        tmp_ctx = talloc_new(NULL);
        if (!tmp_ctx) return;
@@ -1575,7 +1576,17 @@ void do_drv_upgrade_printer(struct messaging_context *msg,
                        continue;
                }
 
-               result = winreg_get_printer_internal(tmp_ctx, session_info, msg,
+               if (b == NULL) {
+                       result = winreg_printer_binding_handle(tmp_ctx,
+                                                              session_info,
+                                                              msg,
+                                                              &b);
+                       if (!W_ERROR_IS_OK(result)) {
+                               break;
+                       }
+               }
+
+               result = winreg_get_printer(tmp_ctx, b,
                                            lp_const_servicename(snum),
                                            &pinfo2);
 
@@ -1594,9 +1605,7 @@ void do_drv_upgrade_printer(struct messaging_context *msg,
                DEBUG(6,("Updating printer [%s]\n", pinfo2->printername));
 
                /* all we care about currently is the change_id */
-               result = winreg_printer_update_changeid_internal(tmp_ctx,
-                                                       session_info,
-                                                       msg,
+               result = winreg_printer_update_changeid(tmp_ctx, b,
                                                        pinfo2->printername);
 
                if (!W_ERROR_IS_OK(result)) {
@@ -2077,6 +2086,7 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
        struct spoolss_DriverInfo8 *info_win2k = NULL;
        int                             version;
        WERROR                          status;
+       struct dcerpc_binding_handle *b;
 
        /* if the user is not root, doesn't have SE_PRINT_OPERATOR privilege,
           and not a printer admin, then fail */
@@ -2098,9 +2108,15 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
        if ((version = get_version_id(r->in.architecture)) == -1)
                return WERR_INVALID_ENVIRONMENT;
 
-       status = winreg_get_driver_internal(p->mem_ctx,
-                                  get_session_info_system(),
-                                  p->msg_ctx,
+       status = winreg_printer_binding_handle(p->mem_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(status)) {
+               return status;
+       }
+
+       status = winreg_get_driver(p->mem_ctx, b,
                                   r->in.architecture, r->in.driver,
                                   version, &info);
        if (!W_ERROR_IS_OK(status)) {
@@ -2109,9 +2125,7 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
                if ( version == 2 ) {
                        version = 3;
 
-                       status = winreg_get_driver_internal(p->mem_ctx,
-                                                  get_session_info_system(),
-                                                  p->msg_ctx,
+                       status = winreg_get_driver(p->mem_ctx, b,
                                                   r->in.architecture,
                                                   r->in.driver,
                                                   version, &info);
@@ -2137,18 +2151,14 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
        }
 
        if (version == 2) {
-               status = winreg_get_driver_internal(p->mem_ctx,
-                                          get_session_info_system(),
-                                          p->msg_ctx,
+               status = winreg_get_driver(p->mem_ctx, b,
                                           r->in.architecture,
                                           r->in.driver, 3, &info_win2k);
                if (W_ERROR_IS_OK(status)) {
                        /* if we get to here, we now have 2 driver info structures to remove */
                        /* remove the Win2k driver first*/
 
-                       status = winreg_del_driver_internal(p->mem_ctx,
-                                                  get_session_info_system(),
-                                                  p->msg_ctx,
+                       status = winreg_del_driver(p->mem_ctx, b,
                                                   info_win2k, 3);
                        talloc_free(info_win2k);
 
@@ -2159,9 +2169,7 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
                }
        }
 
-       status = winreg_del_driver_internal(p->mem_ctx,
-                                  get_session_info_system(),
-                                  p->msg_ctx,
+       status = winreg_del_driver(p->mem_ctx, b,
                                   info, version);
 
 done:
@@ -2182,6 +2190,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
        int                             version;
        bool                            delete_files;
        WERROR                          status;
+       struct dcerpc_binding_handle *b;
 
        /* if the user is not root, doesn't have SE_PRINT_OPERATOR privilege,
           and not a printer admin, then fail */
@@ -2206,9 +2215,15 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
        if (r->in.delete_flags & DPD_DELETE_SPECIFIC_VERSION)
                version = r->in.version;
 
-       status = winreg_get_driver_internal(p->mem_ctx,
-                                  get_session_info_system(),
-                                  p->msg_ctx,
+       status = winreg_printer_binding_handle(p->mem_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(status)) {
+               return status;
+       }
+
+       status = winreg_get_driver(p->mem_ctx, b,
                                   r->in.architecture,
                                   r->in.driver,
                                   version,
@@ -2228,9 +2243,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
                /* try for Win2k driver if "Windows NT x86" */
 
                version = 3;
-               status = winreg_get_driver_internal(info,
-                                          get_session_info_system(),
-                                          p->msg_ctx,
+               status = winreg_get_driver(info, b,
                                           r->in.architecture,
                                           r->in.driver,
                                           version, &info);
@@ -2279,9 +2292,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
        /* also check for W32X86/3 if necessary; maybe we already have? */
 
        if ( (version == 2) && ((r->in.delete_flags & DPD_DELETE_SPECIFIC_VERSION) != DPD_DELETE_SPECIFIC_VERSION)  ) {
-               status = winreg_get_driver_internal(info,
-                                          get_session_info_system(),
-                                          p->msg_ctx,
+               status = winreg_get_driver(info, b,
                                           r->in.architecture,
                                           r->in.driver, 3, &info_win2k);
                if (W_ERROR_IS_OK(status)) {
@@ -2301,9 +2312,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
                        /* if we get to here, we now have 2 driver info structures to remove */
                        /* remove the Win2k driver first*/
 
-                       status = winreg_del_driver_internal(info,
-                                                  get_session_info_system(),
-                                                  p->msg_ctx,
+                       status = winreg_del_driver(info, b,
                                                   info_win2k,
                                                   3);
 
@@ -2325,9 +2334,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
                }
        }
 
-       status = winreg_del_driver_internal(info,
-                                  get_session_info_system(),
-                                  p->msg_ctx,
+       status = winreg_del_driver(info, b,
                                   info,
                                   version);
        if (!W_ERROR_IS_OK(status)) {
@@ -4305,6 +4312,7 @@ static WERROR enum_all_printers_info_level(TALLOC_CTX *mem_ctx,
        union spoolss_PrinterInfo *info = NULL;
        uint32_t count = 0;
        WERROR result = WERR_OK;
+       struct dcerpc_binding_handle *b = NULL;
 
        *count_p = 0;
        *info_p = NULL;
@@ -4323,9 +4331,17 @@ static WERROR enum_all_printers_info_level(TALLOC_CTX *mem_ctx,
                DEBUG(4,("Found a printer in smb.conf: %s[%x]\n",
                        printer, snum));
 
-               result = winreg_create_printer_internal(mem_ctx,
-                                              session_info,
-                                              msg_ctx,
+               if (b == NULL) {
+                       result = winreg_printer_binding_handle(mem_ctx,
+                                                              session_info,
+                                                              msg_ctx,
+                                                              &b);
+                       if (!W_ERROR_IS_OK(result)) {
+                               goto out;
+                       }
+               }
+
+               result = winreg_create_printer(mem_ctx, b,
                                               printer);
                if (!W_ERROR_IS_OK(result)) {
                        goto out;
@@ -4339,7 +4355,7 @@ static WERROR enum_all_printers_info_level(TALLOC_CTX *mem_ctx,
                        goto out;
                }
 
-               result = winreg_get_printer_internal(mem_ctx, session_info, msg_ctx,
+               result = winreg_get_printer(mem_ctx, b,
                                            printer, &info2);
                if (!W_ERROR_IS_OK(result)) {
                        goto out;
@@ -5529,14 +5545,21 @@ static WERROR construct_printer_driver_info_level(TALLOC_CTX *mem_ctx,
        struct spoolss_PrinterInfo2 *pinfo2 = NULL;
        struct spoolss_DriverInfo8 *driver;
        WERROR result;
+       struct dcerpc_binding_handle *b;
 
        if (level == 101) {
                return WERR_UNKNOWN_LEVEL;
        }
 
-       result = winreg_get_printer_internal(mem_ctx,
-                                   session_info,
-                                   msg_ctx,
+       result = winreg_printer_binding_handle(mem_ctx,
+                                              session_info,
+                                              msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               return result;
+       }
+
+       result = winreg_get_printer(mem_ctx, b,
                                    lp_const_servicename(snum),
                                    &pinfo2);
 
@@ -5547,7 +5570,7 @@ static WERROR construct_printer_driver_info_level(TALLOC_CTX *mem_ctx,
                return WERR_INVALID_PRINTER_NAME;
        }
 
-       result = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+       result = winreg_get_driver(mem_ctx, b,
                                   architecture,
                                   pinfo2->drivername, version, &driver);
 
@@ -5566,7 +5589,7 @@ static WERROR construct_printer_driver_info_level(TALLOC_CTX *mem_ctx,
 
                /* Yes - try again with a WinNT driver. */
                version = 2;
-               result = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+               result = winreg_get_driver(mem_ctx, b,
                                           architecture,
                                           pinfo2->drivername,
                                           version, &driver);
@@ -5966,8 +5989,8 @@ static WERROR update_printer_sec(struct policy_handle *handle,
        const char *printer;
        WERROR result;
        int snum;
-
        struct printer_handle *Printer = find_printer_index_by_hnd(p, handle);
+       struct dcerpc_binding_handle *b;
 
        if (!Printer || !get_printer_snum(p, handle, &snum, NULL)) {
                DEBUG(2,("update_printer_sec: Invalid handle (%s:%u:%u)\n",
@@ -5995,11 +6018,17 @@ static WERROR update_printer_sec(struct policy_handle *handle,
                goto done;
        }
 
+       result = winreg_printer_binding_handle(p->mem_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
        /* NT seems to like setting the security descriptor even though
           nothing may have actually changed. */
-       result = winreg_get_printer_secdesc_internal(p->mem_ctx,
-                                           get_session_info_system(),
-                                           p->msg_ctx,
+       result = winreg_get_printer_secdesc(p->mem_ctx, b,
                                            printer,
                                            &old_secdesc);
        if (!W_ERROR_IS_OK(result)) {
@@ -6049,9 +6078,7 @@ static WERROR update_printer_sec(struct policy_handle *handle,
                goto done;
        }
 
-       result = winreg_set_printer_secdesc_internal(p->mem_ctx,
-                                           get_session_info_system(),
-                                           p->msg_ctx,
+       result = winreg_set_printer_secdesc(p->mem_ctx, b,
                                            printer,
                                            new_secdesc);
 
@@ -6257,12 +6284,19 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
        const char *spooling;
        DATA_BLOB buffer;
        WERROR result = WERR_OK;
+       struct dcerpc_binding_handle *b;
+
+       result = winreg_printer_binding_handle(mem_ctx,
+                                              session_info,
+                                              msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               return result;
+       }
 
        if (force_update || !strequal(printer->drivername, old_printer->drivername)) {
                push_reg_sz(mem_ctx, &buffer, printer->drivername);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_DRIVERNAME,
@@ -6282,9 +6316,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
 
        if (force_update || !strequal(printer->comment, old_printer->comment)) {
                push_reg_sz(mem_ctx, &buffer, printer->comment);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_DESCRIPTION,
@@ -6301,9 +6333,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
 
        if (force_update || !strequal(printer->sharename, old_printer->sharename)) {
                push_reg_sz(mem_ctx, &buffer, printer->sharename);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_PRINTSHARENAME,
@@ -6330,9 +6360,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
                }
 
                push_reg_sz(mem_ctx, &buffer, p);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_PRINTERNAME,
@@ -6348,9 +6376,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
 
        if (force_update || !strequal(printer->portname, old_printer->portname)) {
                push_reg_sz(mem_ctx, &buffer, printer->portname);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_PORTNAME,
@@ -6367,9 +6393,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
 
        if (force_update || !strequal(printer->location, old_printer->location)) {
                push_reg_sz(mem_ctx, &buffer, printer->location);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_LOCATION,
@@ -6387,9 +6411,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
 
        if (force_update || !strequal(printer->sepfile, old_printer->sepfile)) {
                push_reg_sz(mem_ctx, &buffer, printer->sepfile);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_PRINTSEPARATORFILE,
@@ -6408,9 +6430,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
        if (force_update || printer->starttime != old_printer->starttime) {
                buffer = data_blob_talloc(mem_ctx, NULL, 4);
                SIVAL(buffer.data, 0, printer->starttime);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_PRINTSTARTTIME,
@@ -6422,9 +6442,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
        if (force_update || printer->untiltime != old_printer->untiltime) {
                buffer = data_blob_talloc(mem_ctx, NULL, 4);
                SIVAL(buffer.data, 0, printer->untiltime);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_PRINTENDTIME,
@@ -6436,9 +6454,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
        if (force_update || printer->priority != old_printer->priority) {
                buffer = data_blob_talloc(mem_ctx, NULL, 4);
                SIVAL(buffer.data, 0, printer->priority);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_PRIORITY,
@@ -6451,9 +6467,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
                buffer = data_blob_talloc(mem_ctx, NULL, 4);
                SIVAL(buffer.data, 0, (printer->attributes &
                                       PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS));
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_PRINTKEEPPRINTEDJOBS,
@@ -6475,9 +6489,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
                                spooling = "unknown";
                }
                push_reg_sz(mem_ctx, &buffer, spooling);
-               winreg_set_printer_dataex_internal(mem_ctx,
-                                         session_info,
-                                         msg_ctx,
+               winreg_set_printer_dataex(mem_ctx, b,
                                          printer->sharename,
                                          SPOOL_DSSPOOLER_KEY,
                                          SPOOL_REG_PRINTSPOOLING,
@@ -6487,9 +6499,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
        }
 
        push_reg_sz(mem_ctx, &buffer, lp_netbios_name());
-       winreg_set_printer_dataex_internal(mem_ctx,
-                                 session_info,
-                                 msg_ctx,
+       winreg_set_printer_dataex(mem_ctx, b,
                                  printer->sharename,
                                  SPOOL_DSSPOOLER_KEY,
                                  SPOOL_REG_SHORTSERVERNAME,
@@ -6509,9 +6519,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
        }
 
        push_reg_sz(mem_ctx, &buffer, longname);
-       winreg_set_printer_dataex_internal(mem_ctx,
-                                 session_info,
-                                 msg_ctx,
+       winreg_set_printer_dataex(mem_ctx, b,
                                  printer->sharename,
                                  SPOOL_DSSPOOLER_KEY,
                                  SPOOL_REG_SERVERNAME,
@@ -6522,9 +6530,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
        uncname = talloc_asprintf(mem_ctx, "\\\\%s\\%s",
                                  lp_netbios_name(), printer->sharename);
        push_reg_sz(mem_ctx, &buffer, uncname);
-       winreg_set_printer_dataex_internal(mem_ctx,
-                                 session_info,
-                                 msg_ctx,
+       winreg_set_printer_dataex(mem_ctx, b,
                                  printer->sharename,
                                  SPOOL_DSSPOOLER_KEY,
                                  SPOOL_REG_UNCNAME,
@@ -6553,6 +6559,7 @@ static WERROR update_printer(struct pipes_struct *p,
        int snum;
        WERROR result = WERR_OK;
        TALLOC_CTX *tmp_ctx;
+       struct dcerpc_binding_handle *b;
 
        DEBUG(8,("update_printer\n"));
 
@@ -6571,9 +6578,15 @@ static WERROR update_printer(struct pipes_struct *p,
                goto done;
        }
 
-       result = winreg_get_printer_internal(tmp_ctx,
-                                   get_session_info_system(),
-                                   p->msg_ctx,
+       result = winreg_printer_binding_handle(tmp_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+       result = winreg_get_printer(tmp_ctx, b,
                                    lp_const_servicename(snum),
                                    &old_printer);
        if (!W_ERROR_IS_OK(result)) {
@@ -6635,9 +6648,7 @@ static WERROR update_printer(struct pipes_struct *p,
        if (devmode == NULL) {
                printer_mask &= ~SPOOLSS_PRINTER_INFO_DEVMODE;
        }
-       result = winreg_update_printer_internal(tmp_ctx,
-                                      get_session_info_system(),
-                                      p->msg_ctx,
+       result = winreg_update_printer(tmp_ctx, b,
                                       printer->sharename,
                                       printer_mask,
                                       printer,
@@ -7324,12 +7335,21 @@ static WERROR enumprinterdrivers_level_by_architecture(TALLOC_CTX *mem_ctx,
        WERROR result = WERR_OK;
        uint32_t num_drivers;
        const char **drivers;
+       struct dcerpc_binding_handle *b;
 
        *count_p = 0;
        *info_p = NULL;
 
+       result = winreg_printer_binding_handle(mem_ctx,
+                                              session_info,
+                                              msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               goto out;
+       }
+
        for (version=0; version<DRIVER_MAX_VERSION; version++) {
-               result = winreg_get_driver_list_internal(mem_ctx, session_info, msg_ctx,
+               result = winreg_get_driver_list(mem_ctx, b,
                                                architecture, version,
                                                &num_drivers, &drivers);
                if (!W_ERROR_IS_OK(result)) {
@@ -7354,8 +7374,7 @@ static WERROR enumprinterdrivers_level_by_architecture(TALLOC_CTX *mem_ctx,
                for (i = 0; i < num_drivers; i++) {
                        DEBUG(5, ("\tdriver: [%s]\n", drivers[i]));
 
-                       result = winreg_get_driver_internal(mem_ctx, session_info,
-                                                  msg_ctx,
+                       result = winreg_get_driver(mem_ctx, b,
                                                   architecture, drivers[i],
                                                   version, &driver);
                        if (!W_ERROR_IS_OK(result)) {
@@ -8517,8 +8536,8 @@ WERROR _spoolss_AddForm(struct pipes_struct *p,
        struct spoolss_AddFormInfo1 *form = r->in.info.info1;
        int snum = -1;
        WERROR status = WERR_OK;
-
        struct printer_handle *Printer = find_printer_index_by_hnd(p, r->in.handle);
+       struct dcerpc_binding_handle *b;
 
        DEBUG(5,("_spoolss_AddForm\n"));
 
@@ -8551,9 +8570,15 @@ WERROR _spoolss_AddForm(struct pipes_struct *p,
                return WERR_INVALID_PARAM;
        }
 
-       status = winreg_printer_addform1_internal(p->mem_ctx,
-                                        get_session_info_system(),
-                                        p->msg_ctx,
+       status = winreg_printer_binding_handle(p->mem_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(status)) {
+               return status;
+       }
+
+       status = winreg_printer_addform1(p->mem_ctx, b,
                                         form);
        if (!W_ERROR_IS_OK(status)) {
                return status;
@@ -8567,9 +8592,7 @@ WERROR _spoolss_AddForm(struct pipes_struct *p,
                        return WERR_BADFID;
                }
 
-               status = winreg_printer_update_changeid_internal(p->mem_ctx,
-                                                       get_session_info_system(),
-                                                       p->msg_ctx,
+               status = winreg_printer_update_changeid(p->mem_ctx, b,
                                                        lp_const_servicename(snum));
                if (!W_ERROR_IS_OK(status)) {
                        return status;
@@ -8590,6 +8613,7 @@ WERROR _spoolss_DeleteForm(struct pipes_struct *p,
        struct printer_handle *Printer = find_printer_index_by_hnd(p, r->in.handle);
        int snum = -1;
        WERROR status = WERR_OK;
+       struct dcerpc_binding_handle *b;
 
        DEBUG(5,("_spoolss_DeleteForm\n"));
 
@@ -8610,9 +8634,15 @@ WERROR _spoolss_DeleteForm(struct pipes_struct *p,
                return WERR_ACCESS_DENIED;
        }
 
-       status = winreg_printer_deleteform1_internal(p->mem_ctx,
-                                           get_session_info_system(),
-                                           p->msg_ctx,
+       status = winreg_printer_binding_handle(p->mem_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(status)) {
+               return status;
+       }
+
+       status = winreg_printer_deleteform1(p->mem_ctx, b,
                                            form_name);
        if (!W_ERROR_IS_OK(status)) {
                return status;
@@ -8626,9 +8656,7 @@ WERROR _spoolss_DeleteForm(struct pipes_struct *p,
                        return WERR_BADFID;
                }
 
-               status = winreg_printer_update_changeid_internal(p->mem_ctx,
-                                                       get_session_info_system(),
-                                                       p->msg_ctx,
+               status = winreg_printer_update_changeid(p->mem_ctx, b,
                                                        lp_const_servicename(snum));
                if (!W_ERROR_IS_OK(status)) {
                        return status;
@@ -8649,6 +8677,7 @@ WERROR _spoolss_SetForm(struct pipes_struct *p,
        const char *form_name = r->in.form_name;
        int snum = -1;
        WERROR status = WERR_OK;
+       struct dcerpc_binding_handle *b;
 
        struct printer_handle *Printer = find_printer_index_by_hnd(p, r->in.handle);
 
@@ -8674,9 +8703,15 @@ WERROR _spoolss_SetForm(struct pipes_struct *p,
                return WERR_ACCESS_DENIED;
        }
 
-       status = winreg_printer_setform1_internal(p->mem_ctx,
-                                        get_session_info_system(),
-                                        p->msg_ctx,
+       status = winreg_printer_binding_handle(p->mem_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(status)) {
+               return status;
+       }
+
+       status = winreg_printer_setform1(p->mem_ctx, b,
                                         form_name,
                                         form);
        if (!W_ERROR_IS_OK(status)) {
@@ -8691,9 +8726,7 @@ WERROR _spoolss_SetForm(struct pipes_struct *p,
                        return WERR_BADFID;
                }
 
-               status = winreg_printer_update_changeid_internal(p->mem_ctx,
-                                                       get_session_info_system(),
-                                                       p->msg_ctx,
+               status = winreg_printer_update_changeid(p->mem_ctx, b,
                                                        lp_const_servicename(snum));
                if (!W_ERROR_IS_OK(status)) {
                        return status;
@@ -9250,7 +9283,7 @@ WERROR _spoolss_GetPrinterDataEx(struct pipes_struct *p,
        enum winreg_Type val_type = REG_NONE;
        uint8_t *val_data = NULL;
        uint32_t val_size = 0;
-
+       struct dcerpc_binding_handle *b;
 
        DEBUG(4,("_spoolss_GetPrinterDataEx\n"));
 
@@ -9308,6 +9341,14 @@ WERROR _spoolss_GetPrinterDataEx(struct pipes_struct *p,
                return WERR_INVALID_PARAM;
        }
 
+       result = winreg_printer_binding_handle(p->mem_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               return result;
+       }
+
        /* XP sends this and wants the ChangeID value from PRINTER_INFO_0 */
        if (strequal(r->in.key_name, SPOOL_PRINTERDATA_KEY) &&
            strequal(r->in.value_name, "ChangeId")) {
@@ -9316,9 +9357,7 @@ WERROR _spoolss_GetPrinterDataEx(struct pipes_struct *p,
                if (r->in.offered >= *r->out.needed) {
                        uint32_t changeid = 0;
 
-                       result = winreg_printer_get_changeid_internal(p->mem_ctx,
-                                                            get_session_info_system(),
-                                                            p->msg_ctx,
+                       result = winreg_printer_get_changeid(p->mem_ctx, b,
                                                             printer,
                                                             &changeid);
                        if (!W_ERROR_IS_OK(result)) {
@@ -9331,9 +9370,7 @@ WERROR _spoolss_GetPrinterDataEx(struct pipes_struct *p,
                goto done;
        }
 
-       result = winreg_get_printer_dataex_internal(p->mem_ctx,
-                                          get_session_info_system(),
-                                          p->msg_ctx,
+       result = winreg_get_printer_dataex(p->mem_ctx, b,
                                           printer,
                                           r->in.key_name,
                                           r->in.value_name,
@@ -9370,6 +9407,7 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
        WERROR                  result = WERR_OK;
        struct printer_handle *Printer = find_printer_index_by_hnd(p, r->in.handle);
        char                    *oid_string;
+       struct dcerpc_binding_handle *b;
 
        DEBUG(4,("_spoolss_SetPrinterDataEx\n"));
 
@@ -9406,9 +9444,15 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
                return WERR_ACCESS_DENIED;
        }
 
-       result = winreg_get_printer_internal(Printer,
-                                   get_session_info_system(),
-                                   p->msg_ctx,
+       result = winreg_printer_binding_handle(p->mem_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(result)) {
+               return result;
+       }
+
+       result = winreg_get_printer(Printer, b,
                                    lp_servicename(snum),
                                    &pinfo2);
        if (!W_ERROR_IS_OK(result)) {
@@ -9425,9 +9469,7 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
 
        /* save the registry data */
 
-       result = winreg_set_printer_dataex_internal(p->mem_ctx,
-                                          get_session_info_system(),
-                                          p->msg_ctx,
+       result = winreg_set_printer_dataex(p->mem_ctx, b,
                                           pinfo2->sharename,
                                           r->in.key_name,
                                           r->in.value_name,
@@ -9451,9 +9493,7 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
                         * previous set_printer_dataex() call.  I have no idea if
                         * this is right.    --jerry
                         */
-                       winreg_set_printer_dataex_internal(p->mem_ctx,
-                                                 get_session_info_system(),
-                                                 p->msg_ctx,
+                       winreg_set_printer_dataex(p->mem_ctx, b,
                                                  pinfo2->sharename,
                                                  str,
                                                  r->in.value_name,
@@ -9462,9 +9502,7 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
                                                  strlen(oid_string) + 1);
                }
 
-               result = winreg_printer_update_changeid_internal(p->mem_ctx,
-                                                       get_session_info_system(),
-                                                       p->msg_ctx,
+               result = winreg_printer_update_changeid(p->mem_ctx, b,
                                                        lp_const_servicename(snum));
 
        }
@@ -9600,6 +9638,7 @@ WERROR _spoolss_DeletePrinterKey(struct pipes_struct *p,
        int                     snum=0;
        WERROR                  status;
        const char *printer;
+       struct dcerpc_binding_handle *b;
 
        DEBUG(5,("_spoolss_DeletePrinterKey\n"));
 
@@ -9625,16 +9664,20 @@ WERROR _spoolss_DeletePrinterKey(struct pipes_struct *p,
 
        printer = lp_const_servicename(snum);
 
+       status = winreg_printer_binding_handle(p->mem_ctx,
+                                              get_session_info_system(),
+                                              p->msg_ctx,
+                                              &b);
+       if (!W_ERROR_IS_OK(status)) {
+               return status;
+       }
+
        /* delete the key and all subkeys */
-       status = winreg_delete_printer_key_internal(p->mem_ctx,
-                                          get_session_info_system(),
-                                          p->msg_ctx,
+       status = winreg_delete_printer_key(p->mem_ctx, b,
                                           printer,
                                           r->in.key_name);
        if (W_ERROR_IS_OK(status)) {
-               status = winreg_printer_update_changeid_internal(p->mem_ctx,
-                                                       get_session_info_system(),
-                                                       p->msg_ctx,
+               status = winreg_printer_update_changeid(p->mem_ctx, b,
                                                        printer);
        }