mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
s3-printing: safe a ton of roundtrips by reusing existing winreg binding_handles.
Guenther Pair-Programmed-With: David Disseldorp <ddiss@suse.de>
This commit is contained in:
parent
0a1ec73b96
commit
72b1f8be56
@ -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)) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user