2 * Unix SMB/CIFS implementation.
4 * SPOOLSS RPC Pipe server / winreg client routines
6 * Copyright (c) 2010 Andreas Schneider <asn@samba.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, see <http://www.gnu.org/licenses/>.
23 #include "rpc_server/rpc_ncacn_np.h"
24 #include "../lib/tsocket/tsocket.h"
25 #include "../librpc/gen_ndr/ndr_spoolss.h"
26 #include "../librpc/gen_ndr/ndr_winreg.h"
27 #include "srv_spoolss_util.h"
28 #include "rpc_client/cli_winreg_spoolss.h"
30 WERROR winreg_printer_binding_handle(TALLOC_CTX *mem_ctx,
31 const struct auth_session_info *session_info,
32 struct messaging_context *msg_ctx,
33 struct dcerpc_binding_handle **winreg_binding_handle)
35 struct tsocket_address *local;
39 rc = tsocket_address_inet_from_strings(mem_ctx,
48 status = rpcint_binding_handle(mem_ctx,
53 winreg_binding_handle);
55 if (!NT_STATUS_IS_OK(status)) {
56 DEBUG(0, ("winreg_printer_binding_handle: Could not connect to winreg pipe: %s\n",
58 return ntstatus_to_werror(status);
64 WERROR winreg_delete_printer_key_internal(TALLOC_CTX *mem_ctx,
65 const struct auth_session_info *session_info,
66 struct messaging_context *msg_ctx,
71 struct dcerpc_binding_handle *b;
74 tmp_ctx = talloc_stackframe();
75 if (tmp_ctx == NULL) {
79 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
80 if (!W_ERROR_IS_OK(result)) {
85 result = winreg_delete_printer_key(tmp_ctx,
94 WERROR winreg_printer_update_changeid_internal(TALLOC_CTX *mem_ctx,
95 const struct auth_session_info *session_info,
96 struct messaging_context *msg_ctx,
100 struct dcerpc_binding_handle *b;
103 tmp_ctx = talloc_stackframe();
104 if (tmp_ctx == NULL) {
108 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
109 if (!W_ERROR_IS_OK(result)) {
110 talloc_free(tmp_ctx);
114 result = winreg_printer_update_changeid(mem_ctx,
118 talloc_free(tmp_ctx);
122 WERROR winreg_printer_get_changeid_internal(TALLOC_CTX *mem_ctx,
123 const struct auth_session_info *session_info,
124 struct messaging_context *msg_ctx,
129 struct dcerpc_binding_handle *b;
132 tmp_ctx = talloc_stackframe();
133 if (tmp_ctx == NULL) {
137 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
138 if (!W_ERROR_IS_OK(result)) {
139 talloc_free(tmp_ctx);
143 result = winreg_printer_get_changeid(mem_ctx,
148 talloc_free(tmp_ctx);
152 WERROR winreg_get_printer_internal(TALLOC_CTX *mem_ctx,
153 const struct auth_session_info *session_info,
154 struct messaging_context *msg_ctx,
156 struct spoolss_PrinterInfo2 **pinfo2)
159 struct dcerpc_binding_handle *b;
162 tmp_ctx = talloc_stackframe();
163 if (tmp_ctx == NULL) {
167 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
168 if (!W_ERROR_IS_OK(result)) {
169 talloc_free(tmp_ctx);
173 result = winreg_get_printer(mem_ctx,
178 talloc_free(tmp_ctx);
182 WERROR winreg_create_printer_internal(TALLOC_CTX *mem_ctx,
183 const struct auth_session_info *session_info,
184 struct messaging_context *msg_ctx,
185 const char *sharename)
188 struct dcerpc_binding_handle *b;
190 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
191 W_ERROR_NOT_OK_RETURN(result);
193 return winreg_create_printer(mem_ctx, b,
197 WERROR winreg_update_printer_internal(TALLOC_CTX *mem_ctx,
198 const struct auth_session_info *session_info,
199 struct messaging_context *msg_ctx,
200 const char *sharename,
202 struct spoolss_SetPrinterInfo2 *info2,
203 struct spoolss_DeviceMode *devmode,
204 struct security_descriptor *secdesc)
207 struct dcerpc_binding_handle *b;
209 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
210 W_ERROR_NOT_OK_RETURN(result);
212 return winreg_update_printer(mem_ctx, b,
220 WERROR winreg_set_printer_dataex_internal(TALLOC_CTX *mem_ctx,
221 const struct auth_session_info *session_info,
222 struct messaging_context *msg_ctx,
226 enum winreg_Type type,
231 struct dcerpc_binding_handle *b;
233 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
234 W_ERROR_NOT_OK_RETURN(result);
236 return winreg_set_printer_dataex(mem_ctx, b,
245 WERROR winreg_enum_printer_dataex_internal(TALLOC_CTX *mem_ctx,
246 const struct auth_session_info *session_info,
247 struct messaging_context *msg_ctx,
250 uint32_t *pnum_values,
251 struct spoolss_PrinterEnumValues **penum_values)
254 struct dcerpc_binding_handle *b;
256 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
257 W_ERROR_NOT_OK_RETURN(result);
259 return winreg_enum_printer_dataex(mem_ctx, b,
266 WERROR winreg_get_printer_dataex_internal(TALLOC_CTX *mem_ctx,
267 const struct auth_session_info *session_info,
268 struct messaging_context *msg_ctx,
272 enum winreg_Type *type,
277 struct dcerpc_binding_handle *b;
279 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
280 W_ERROR_NOT_OK_RETURN(result);
282 return winreg_get_printer_dataex(mem_ctx, b,
291 WERROR winreg_delete_printer_dataex_internal(TALLOC_CTX *mem_ctx,
292 const struct auth_session_info *session_info,
293 struct messaging_context *msg_ctx,
299 struct dcerpc_binding_handle *b;
301 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
302 W_ERROR_NOT_OK_RETURN(result);
304 return winreg_delete_printer_dataex(mem_ctx, b,
310 WERROR winreg_get_driver_internal(TALLOC_CTX *mem_ctx,
311 const struct auth_session_info *session_info,
312 struct messaging_context *msg_ctx,
313 const char *architecture,
314 const char *driver_name,
315 uint32_t driver_version,
316 struct spoolss_DriverInfo8 **_info8)
319 struct dcerpc_binding_handle *b;
321 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
322 W_ERROR_NOT_OK_RETURN(result);
324 return winreg_get_driver(mem_ctx, b,
331 WERROR winreg_get_driver_list_internal(TALLOC_CTX *mem_ctx,
332 const struct auth_session_info *session_info,
333 struct messaging_context *msg_ctx,
334 const char *architecture,
336 uint32_t *num_drivers,
337 const char ***drivers_p)
340 struct dcerpc_binding_handle *b;
342 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
343 W_ERROR_NOT_OK_RETURN(result);
345 return winreg_get_driver_list(mem_ctx, b,
352 WERROR winreg_del_driver_internal(TALLOC_CTX *mem_ctx,
353 const struct auth_session_info *session_info,
354 struct messaging_context *msg_ctx,
355 struct spoolss_DriverInfo8 *info8,
359 struct dcerpc_binding_handle *b;
361 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
362 W_ERROR_NOT_OK_RETURN(result);
364 return winreg_del_driver(mem_ctx, b,
369 WERROR winreg_add_driver_internal(TALLOC_CTX *mem_ctx,
370 const struct auth_session_info *session_info,
371 struct messaging_context *msg_ctx,
372 struct spoolss_AddDriverInfoCtr *r,
373 const char **driver_name,
374 uint32_t *driver_version)
377 struct dcerpc_binding_handle *b;
379 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
380 W_ERROR_NOT_OK_RETURN(result);
382 return winreg_add_driver(mem_ctx, b,
388 WERROR winreg_get_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
389 const struct auth_session_info *session_info,
390 struct messaging_context *msg_ctx,
391 const char *sharename,
392 struct spoolss_security_descriptor **psecdesc)
395 struct dcerpc_binding_handle *b;
397 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
398 W_ERROR_NOT_OK_RETURN(result);
400 return winreg_get_printer_secdesc(mem_ctx, b,
405 WERROR winreg_set_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
406 const struct auth_session_info *session_info,
407 struct messaging_context *msg_ctx,
408 const char *sharename,
409 const struct spoolss_security_descriptor *secdesc)
412 struct dcerpc_binding_handle *b;
414 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
415 W_ERROR_NOT_OK_RETURN(result);
417 return winreg_set_printer_secdesc(mem_ctx, b,
422 WERROR winreg_printer_enumforms1_internal(TALLOC_CTX *mem_ctx,
423 const struct auth_session_info *session_info,
424 struct messaging_context *msg_ctx,
426 union spoolss_FormInfo **pinfo)
429 struct dcerpc_binding_handle *b;
431 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
432 W_ERROR_NOT_OK_RETURN(result);
434 return winreg_printer_enumforms1(mem_ctx, b,
439 WERROR winreg_printer_getform1_internal(TALLOC_CTX *mem_ctx,
440 const struct auth_session_info *session_info,
441 struct messaging_context *msg_ctx,
442 const char *form_name,
443 struct spoolss_FormInfo1 *r)
446 struct dcerpc_binding_handle *b;
448 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
449 W_ERROR_NOT_OK_RETURN(result);
451 return winreg_printer_getform1(mem_ctx, b,
456 WERROR winreg_printer_addform1_internal(TALLOC_CTX *mem_ctx,
457 const struct auth_session_info *session_info,
458 struct messaging_context *msg_ctx,
459 struct spoolss_AddFormInfo1 *form)
462 struct dcerpc_binding_handle *b;
464 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
465 W_ERROR_NOT_OK_RETURN(result);
467 return winreg_printer_addform1(mem_ctx, b,
471 WERROR winreg_printer_setform1_internal(TALLOC_CTX *mem_ctx,
472 const struct auth_session_info *session_info,
473 struct messaging_context *msg_ctx,
474 const char *form_name,
475 struct spoolss_AddFormInfo1 *form)
478 struct dcerpc_binding_handle *b;
480 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
481 W_ERROR_NOT_OK_RETURN(result);
483 return winreg_printer_setform1(mem_ctx, b,
488 WERROR winreg_printer_deleteform1_internal(TALLOC_CTX *mem_ctx,
489 const struct auth_session_info *session_info,
490 struct messaging_context *msg_ctx,
491 const char *form_name)
494 struct dcerpc_binding_handle *b;
496 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
497 W_ERROR_NOT_OK_RETURN(result);
499 return winreg_printer_deleteform1(mem_ctx, b,
503 WERROR winreg_enum_printer_key_internal(TALLOC_CTX *mem_ctx,
504 const struct auth_session_info *session_info,
505 struct messaging_context *msg_ctx,
508 uint32_t *pnum_subkeys,
509 const char ***psubkeys)
512 struct dcerpc_binding_handle *b;
514 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
515 W_ERROR_NOT_OK_RETURN(result);
517 return winreg_enum_printer_key(mem_ctx, b,