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
,
45 return WERR_NOT_ENOUGH_MEMORY
;
48 status
= rpcint_binding_handle(mem_ctx
,
54 winreg_binding_handle
);
56 if (!NT_STATUS_IS_OK(status
)) {
57 DEBUG(0, ("winreg_printer_binding_handle: Could not connect to winreg pipe: %s\n",
59 return ntstatus_to_werror(status
);
65 WERROR
winreg_delete_printer_key_internal(TALLOC_CTX
*mem_ctx
,
66 const struct auth_session_info
*session_info
,
67 struct messaging_context
*msg_ctx
,
72 struct dcerpc_binding_handle
*b
;
75 tmp_ctx
= talloc_stackframe();
76 if (tmp_ctx
== NULL
) {
77 return WERR_NOT_ENOUGH_MEMORY
;
80 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
81 if (!W_ERROR_IS_OK(result
)) {
86 result
= winreg_delete_printer_key(tmp_ctx
,
95 WERROR
winreg_printer_update_changeid_internal(TALLOC_CTX
*mem_ctx
,
96 const struct auth_session_info
*session_info
,
97 struct messaging_context
*msg_ctx
,
101 struct dcerpc_binding_handle
*b
;
104 tmp_ctx
= talloc_stackframe();
105 if (tmp_ctx
== NULL
) {
106 return WERR_NOT_ENOUGH_MEMORY
;
109 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
110 if (!W_ERROR_IS_OK(result
)) {
111 talloc_free(tmp_ctx
);
115 result
= winreg_printer_update_changeid(mem_ctx
,
119 talloc_free(tmp_ctx
);
123 WERROR
winreg_printer_get_changeid_internal(TALLOC_CTX
*mem_ctx
,
124 const struct auth_session_info
*session_info
,
125 struct messaging_context
*msg_ctx
,
130 struct dcerpc_binding_handle
*b
;
133 tmp_ctx
= talloc_stackframe();
134 if (tmp_ctx
== NULL
) {
135 return WERR_NOT_ENOUGH_MEMORY
;
138 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
139 if (!W_ERROR_IS_OK(result
)) {
140 talloc_free(tmp_ctx
);
144 result
= winreg_printer_get_changeid(mem_ctx
,
149 talloc_free(tmp_ctx
);
153 WERROR
winreg_get_printer_internal(TALLOC_CTX
*mem_ctx
,
154 const struct auth_session_info
*session_info
,
155 struct messaging_context
*msg_ctx
,
157 struct spoolss_PrinterInfo2
**pinfo2
)
160 struct dcerpc_binding_handle
*b
;
163 tmp_ctx
= talloc_stackframe();
164 if (tmp_ctx
== NULL
) {
165 return WERR_NOT_ENOUGH_MEMORY
;
168 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
169 if (!W_ERROR_IS_OK(result
)) {
170 talloc_free(tmp_ctx
);
174 result
= winreg_get_printer(mem_ctx
,
179 talloc_free(tmp_ctx
);
183 WERROR
winreg_create_printer_internal(TALLOC_CTX
*mem_ctx
,
184 const struct auth_session_info
*session_info
,
185 struct messaging_context
*msg_ctx
,
186 const char *sharename
)
189 struct dcerpc_binding_handle
*b
;
192 tmp_ctx
= talloc_stackframe();
193 if (tmp_ctx
== NULL
) {
194 return WERR_NOT_ENOUGH_MEMORY
;
197 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
198 if (!W_ERROR_IS_OK(result
)) {
199 talloc_free(tmp_ctx
);
203 result
= winreg_create_printer(mem_ctx
,
207 talloc_free(tmp_ctx
);
211 WERROR
winreg_update_printer_internal(TALLOC_CTX
*mem_ctx
,
212 const struct auth_session_info
*session_info
,
213 struct messaging_context
*msg_ctx
,
214 const char *sharename
,
216 struct spoolss_SetPrinterInfo2
*info2
,
217 struct spoolss_DeviceMode
*devmode
,
218 struct security_descriptor
*secdesc
)
221 struct dcerpc_binding_handle
*b
;
224 tmp_ctx
= talloc_stackframe();
225 if (tmp_ctx
== NULL
) {
226 return WERR_NOT_ENOUGH_MEMORY
;
229 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
230 if (!W_ERROR_IS_OK(result
)) {
231 talloc_free(tmp_ctx
);
235 result
= winreg_update_printer(mem_ctx
,
243 talloc_free(tmp_ctx
);
247 WERROR
winreg_set_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
248 const struct auth_session_info
*session_info
,
249 struct messaging_context
*msg_ctx
,
253 enum winreg_Type type
,
258 struct dcerpc_binding_handle
*b
;
261 tmp_ctx
= talloc_stackframe();
262 if (tmp_ctx
== NULL
) {
263 return WERR_NOT_ENOUGH_MEMORY
;
266 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
267 if (!W_ERROR_IS_OK(result
)) {
268 talloc_free(tmp_ctx
);
272 result
= winreg_set_printer_dataex(mem_ctx
,
281 talloc_free(tmp_ctx
);
285 WERROR
winreg_enum_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
286 const struct auth_session_info
*session_info
,
287 struct messaging_context
*msg_ctx
,
290 uint32_t *pnum_values
,
291 struct spoolss_PrinterEnumValues
**penum_values
)
294 struct dcerpc_binding_handle
*b
;
297 tmp_ctx
= talloc_stackframe();
298 if (tmp_ctx
== NULL
) {
299 return WERR_NOT_ENOUGH_MEMORY
;
302 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
303 if (!W_ERROR_IS_OK(result
)) {
304 talloc_free(tmp_ctx
);
308 result
= winreg_enum_printer_dataex(mem_ctx
,
315 talloc_free(tmp_ctx
);
319 WERROR
winreg_get_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
320 const struct auth_session_info
*session_info
,
321 struct messaging_context
*msg_ctx
,
325 enum winreg_Type
*type
,
330 struct dcerpc_binding_handle
*b
;
333 tmp_ctx
= talloc_stackframe();
334 if (tmp_ctx
== NULL
) {
335 return WERR_NOT_ENOUGH_MEMORY
;
338 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
339 if (!W_ERROR_IS_OK(result
)) {
340 talloc_free(tmp_ctx
);
344 result
= winreg_get_printer_dataex(mem_ctx
,
353 talloc_free(tmp_ctx
);
357 WERROR
winreg_delete_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
358 const struct auth_session_info
*session_info
,
359 struct messaging_context
*msg_ctx
,
365 struct dcerpc_binding_handle
*b
;
368 tmp_ctx
= talloc_stackframe();
369 if (tmp_ctx
== NULL
) {
370 return WERR_NOT_ENOUGH_MEMORY
;
373 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
374 if (!W_ERROR_IS_OK(result
)) {
375 talloc_free(tmp_ctx
);
379 result
= winreg_delete_printer_dataex(mem_ctx
,
385 talloc_free(tmp_ctx
);
389 WERROR
winreg_get_driver_internal(TALLOC_CTX
*mem_ctx
,
390 const struct auth_session_info
*session_info
,
391 struct messaging_context
*msg_ctx
,
392 const char *architecture
,
393 const char *driver_name
,
394 uint32_t driver_version
,
395 struct spoolss_DriverInfo8
**_info8
)
398 struct dcerpc_binding_handle
*b
;
401 tmp_ctx
= talloc_stackframe();
402 if (tmp_ctx
== NULL
) {
403 return WERR_NOT_ENOUGH_MEMORY
;
406 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
407 if (!W_ERROR_IS_OK(result
)) {
408 talloc_free(tmp_ctx
);
412 result
= winreg_get_driver(mem_ctx
,
419 talloc_free(tmp_ctx
);
423 WERROR
winreg_get_driver_list_internal(TALLOC_CTX
*mem_ctx
,
424 const struct auth_session_info
*session_info
,
425 struct messaging_context
*msg_ctx
,
426 const char *architecture
,
428 uint32_t *num_drivers
,
429 const char ***drivers_p
)
432 struct dcerpc_binding_handle
*b
;
435 tmp_ctx
= talloc_stackframe();
436 if (tmp_ctx
== NULL
) {
437 return WERR_NOT_ENOUGH_MEMORY
;
440 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
441 if (!W_ERROR_IS_OK(result
)) {
442 talloc_free(tmp_ctx
);
446 result
= winreg_get_driver_list(mem_ctx
,
453 talloc_free(tmp_ctx
);
457 WERROR
winreg_del_driver_internal(TALLOC_CTX
*mem_ctx
,
458 const struct auth_session_info
*session_info
,
459 struct messaging_context
*msg_ctx
,
460 struct spoolss_DriverInfo8
*info8
,
464 struct dcerpc_binding_handle
*b
;
467 tmp_ctx
= talloc_stackframe();
468 if (tmp_ctx
== NULL
) {
469 return WERR_NOT_ENOUGH_MEMORY
;
472 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
473 if (!W_ERROR_IS_OK(result
)) {
474 talloc_free(tmp_ctx
);
478 result
= winreg_del_driver(mem_ctx
,
483 talloc_free(tmp_ctx
);
487 WERROR
winreg_add_driver_internal(TALLOC_CTX
*mem_ctx
,
488 const struct auth_session_info
*session_info
,
489 struct messaging_context
*msg_ctx
,
490 struct spoolss_AddDriverInfoCtr
*r
,
491 const char **driver_name
,
492 uint32_t *driver_version
)
495 struct dcerpc_binding_handle
*b
;
498 tmp_ctx
= talloc_stackframe();
499 if (tmp_ctx
== NULL
) {
500 return WERR_NOT_ENOUGH_MEMORY
;
503 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
504 if (!W_ERROR_IS_OK(result
)) {
505 talloc_free(tmp_ctx
);
509 result
= winreg_add_driver(mem_ctx
,
515 talloc_free(tmp_ctx
);
519 WERROR
winreg_get_core_driver_internal(TALLOC_CTX
*mem_ctx
,
520 const struct auth_session_info
*session_info
,
521 struct messaging_context
*msg_ctx
,
522 const char *architecture
,
523 const struct GUID
*core_driver_guid
,
524 struct spoolss_CorePrinterDriver
**core_printer_driver
)
527 struct dcerpc_binding_handle
*b
;
530 tmp_ctx
= talloc_stackframe();
531 if (tmp_ctx
== NULL
) {
532 return WERR_NOT_ENOUGH_MEMORY
;
535 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
536 if (!W_ERROR_IS_OK(result
)) {
537 talloc_free(tmp_ctx
);
541 result
= winreg_get_core_driver(mem_ctx
,
545 core_printer_driver
);
547 talloc_free(tmp_ctx
);
551 WERROR
winreg_add_core_driver_internal(TALLOC_CTX
*mem_ctx
,
552 const struct auth_session_info
*session_info
,
553 struct messaging_context
*msg_ctx
,
554 const char *architecture
,
555 const struct spoolss_CorePrinterDriver
*core_printer_driver
)
558 struct dcerpc_binding_handle
*b
;
561 tmp_ctx
= talloc_stackframe();
562 if (tmp_ctx
== NULL
) {
563 return WERR_NOT_ENOUGH_MEMORY
;
566 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
567 if (!W_ERROR_IS_OK(result
)) {
568 talloc_free(tmp_ctx
);
572 result
= winreg_add_core_driver(mem_ctx
,
575 core_printer_driver
);
577 talloc_free(tmp_ctx
);
581 WERROR
winreg_add_driver_package_internal(TALLOC_CTX
*mem_ctx
,
582 const struct auth_session_info
*session_info
,
583 struct messaging_context
*msg_ctx
,
584 const char *package_id
,
585 const char *architecture
,
586 const char *driver_store_path
,
587 const char *cab_path
)
590 struct dcerpc_binding_handle
*b
;
593 tmp_ctx
= talloc_stackframe();
594 if (tmp_ctx
== NULL
) {
595 return WERR_NOT_ENOUGH_MEMORY
;
598 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
599 if (!W_ERROR_IS_OK(result
)) {
600 talloc_free(tmp_ctx
);
604 result
= winreg_add_driver_package(mem_ctx
,
611 talloc_free(tmp_ctx
);
615 WERROR
winreg_get_driver_package_internal(TALLOC_CTX
*mem_ctx
,
616 const struct auth_session_info
*session_info
,
617 struct messaging_context
*msg_ctx
,
618 const char *package_id
,
619 const char *architecture
,
620 const char **driver_store_path
,
621 const char **cab_path
)
624 struct dcerpc_binding_handle
*b
;
627 tmp_ctx
= talloc_stackframe();
628 if (tmp_ctx
== NULL
) {
629 return WERR_NOT_ENOUGH_MEMORY
;
632 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
633 if (!W_ERROR_IS_OK(result
)) {
634 talloc_free(tmp_ctx
);
638 result
= winreg_get_driver_package(mem_ctx
,
645 talloc_free(tmp_ctx
);
649 WERROR
winreg_del_driver_package_internal(TALLOC_CTX
*mem_ctx
,
650 const struct auth_session_info
*session_info
,
651 struct messaging_context
*msg_ctx
,
652 const char *package_id
,
653 const char *architecture
)
656 struct dcerpc_binding_handle
*b
;
659 tmp_ctx
= talloc_stackframe();
660 if (tmp_ctx
== NULL
) {
661 return WERR_NOT_ENOUGH_MEMORY
;
664 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
665 if (!W_ERROR_IS_OK(result
)) {
666 talloc_free(tmp_ctx
);
670 result
= winreg_del_driver_package(mem_ctx
,
675 talloc_free(tmp_ctx
);
679 WERROR
winreg_get_printer_secdesc_internal(TALLOC_CTX
*mem_ctx
,
680 const struct auth_session_info
*session_info
,
681 struct messaging_context
*msg_ctx
,
682 const char *sharename
,
683 struct spoolss_security_descriptor
**psecdesc
)
686 struct dcerpc_binding_handle
*b
;
689 tmp_ctx
= talloc_stackframe();
690 if (tmp_ctx
== NULL
) {
691 return WERR_NOT_ENOUGH_MEMORY
;
694 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
695 if (!W_ERROR_IS_OK(result
)) {
696 talloc_free(tmp_ctx
);
700 result
= winreg_get_printer_secdesc(mem_ctx
,
705 talloc_free(tmp_ctx
);
709 WERROR
winreg_set_printer_secdesc_internal(TALLOC_CTX
*mem_ctx
,
710 const struct auth_session_info
*session_info
,
711 struct messaging_context
*msg_ctx
,
712 const char *sharename
,
713 const struct spoolss_security_descriptor
*secdesc
)
716 struct dcerpc_binding_handle
*b
;
719 tmp_ctx
= talloc_stackframe();
720 if (tmp_ctx
== NULL
) {
721 return WERR_NOT_ENOUGH_MEMORY
;
724 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
725 if (!W_ERROR_IS_OK(result
)) {
726 talloc_free(tmp_ctx
);
730 result
= winreg_set_printer_secdesc(mem_ctx
,
735 talloc_free(tmp_ctx
);
739 WERROR
winreg_printer_enumforms1_internal(TALLOC_CTX
*mem_ctx
,
740 const struct auth_session_info
*session_info
,
741 struct messaging_context
*msg_ctx
,
743 union spoolss_FormInfo
**pinfo
)
746 struct dcerpc_binding_handle
*b
;
749 tmp_ctx
= talloc_stackframe();
750 if (tmp_ctx
== NULL
) {
751 return WERR_NOT_ENOUGH_MEMORY
;
754 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
755 if (!W_ERROR_IS_OK(result
)) {
756 talloc_free(tmp_ctx
);
760 result
= winreg_printer_enumforms1(mem_ctx
,
765 talloc_free(tmp_ctx
);
769 WERROR
winreg_printer_getform1_internal(TALLOC_CTX
*mem_ctx
,
770 const struct auth_session_info
*session_info
,
771 struct messaging_context
*msg_ctx
,
772 const char *form_name
,
773 struct spoolss_FormInfo1
*r
)
776 struct dcerpc_binding_handle
*b
;
779 tmp_ctx
= talloc_stackframe();
780 if (tmp_ctx
== NULL
) {
781 return WERR_NOT_ENOUGH_MEMORY
;
784 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
785 if (!W_ERROR_IS_OK(result
)) {
786 talloc_free(tmp_ctx
);
790 result
= winreg_printer_getform1(mem_ctx
,
795 talloc_free(tmp_ctx
);
799 WERROR
winreg_printer_addform1_internal(TALLOC_CTX
*mem_ctx
,
800 const struct auth_session_info
*session_info
,
801 struct messaging_context
*msg_ctx
,
802 struct spoolss_AddFormInfo1
*form
)
805 struct dcerpc_binding_handle
*b
;
808 tmp_ctx
= talloc_stackframe();
809 if (tmp_ctx
== NULL
) {
810 return WERR_NOT_ENOUGH_MEMORY
;
813 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
814 if (!W_ERROR_IS_OK(result
)) {
815 talloc_free(tmp_ctx
);
819 result
= winreg_printer_addform1(mem_ctx
,
823 talloc_free(tmp_ctx
);
827 WERROR
winreg_printer_setform1_internal(TALLOC_CTX
*mem_ctx
,
828 const struct auth_session_info
*session_info
,
829 struct messaging_context
*msg_ctx
,
830 const char *form_name
,
831 struct spoolss_AddFormInfo1
*form
)
834 struct dcerpc_binding_handle
*b
;
837 tmp_ctx
= talloc_stackframe();
838 if (tmp_ctx
== NULL
) {
839 return WERR_NOT_ENOUGH_MEMORY
;
842 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
843 if (!W_ERROR_IS_OK(result
)) {
844 talloc_free(tmp_ctx
);
848 result
= winreg_printer_setform1(mem_ctx
,
853 talloc_free(tmp_ctx
);
857 WERROR
winreg_printer_deleteform1_internal(TALLOC_CTX
*mem_ctx
,
858 const struct auth_session_info
*session_info
,
859 struct messaging_context
*msg_ctx
,
860 const char *form_name
)
863 struct dcerpc_binding_handle
*b
;
866 tmp_ctx
= talloc_stackframe();
867 if (tmp_ctx
== NULL
) {
868 return WERR_NOT_ENOUGH_MEMORY
;
871 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
872 if (!W_ERROR_IS_OK(result
)) {
873 talloc_free(tmp_ctx
);
877 result
= winreg_printer_deleteform1(mem_ctx
,
881 talloc_free(tmp_ctx
);
885 WERROR
winreg_enum_printer_key_internal(TALLOC_CTX
*mem_ctx
,
886 const struct auth_session_info
*session_info
,
887 struct messaging_context
*msg_ctx
,
890 uint32_t *pnum_subkeys
,
891 const char ***psubkeys
)
894 struct dcerpc_binding_handle
*b
;
897 tmp_ctx
= talloc_stackframe();
898 if (tmp_ctx
== NULL
) {
899 return WERR_NOT_ENOUGH_MEMORY
;
902 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
903 if (!W_ERROR_IS_OK(result
)) {
904 talloc_free(tmp_ctx
);
908 result
= winreg_enum_printer_key(mem_ctx
,
915 talloc_free(tmp_ctx
);