From 72b1f8be5619ed778c4aa0b967f6a4f34d7e9de8 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 5 Jul 2011 00:55:35 +0200 Subject: s3-printing: safe a ton of roundtrips by reusing existing winreg binding_handles. Guenther Pair-Programmed-With: David Disseldorp --- source3/rpc_server/spoolss/srv_spoolss_nt.c | 339 ++++++++++++++++------------ 1 file changed, 191 insertions(+), 148 deletions(-) (limited to 'source3/rpc_server') diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c index 19a7d78673..0bf678780b 100644 --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c @@ -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; versionin.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); } -- cgit