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
;
191 tmp_ctx
= talloc_stackframe();
192 if (tmp_ctx
== NULL
) {
196 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
197 if (!W_ERROR_IS_OK(result
)) {
198 talloc_free(tmp_ctx
);
202 result
= winreg_create_printer(mem_ctx
,
206 talloc_free(tmp_ctx
);
210 WERROR
winreg_update_printer_internal(TALLOC_CTX
*mem_ctx
,
211 const struct auth_session_info
*session_info
,
212 struct messaging_context
*msg_ctx
,
213 const char *sharename
,
215 struct spoolss_SetPrinterInfo2
*info2
,
216 struct spoolss_DeviceMode
*devmode
,
217 struct security_descriptor
*secdesc
)
220 struct dcerpc_binding_handle
*b
;
223 tmp_ctx
= talloc_stackframe();
224 if (tmp_ctx
== NULL
) {
228 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
229 if (!W_ERROR_IS_OK(result
)) {
230 talloc_free(tmp_ctx
);
234 result
= winreg_update_printer(mem_ctx
,
242 talloc_free(tmp_ctx
);
246 WERROR
winreg_set_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
247 const struct auth_session_info
*session_info
,
248 struct messaging_context
*msg_ctx
,
252 enum winreg_Type type
,
257 struct dcerpc_binding_handle
*b
;
260 tmp_ctx
= talloc_stackframe();
261 if (tmp_ctx
== NULL
) {
265 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
266 if (!W_ERROR_IS_OK(result
)) {
267 talloc_free(tmp_ctx
);
271 result
= winreg_set_printer_dataex(mem_ctx
,
280 talloc_free(tmp_ctx
);
284 WERROR
winreg_enum_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
285 const struct auth_session_info
*session_info
,
286 struct messaging_context
*msg_ctx
,
289 uint32_t *pnum_values
,
290 struct spoolss_PrinterEnumValues
**penum_values
)
293 struct dcerpc_binding_handle
*b
;
296 tmp_ctx
= talloc_stackframe();
297 if (tmp_ctx
== NULL
) {
301 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
302 if (!W_ERROR_IS_OK(result
)) {
303 talloc_free(tmp_ctx
);
307 result
= winreg_enum_printer_dataex(mem_ctx
,
314 talloc_free(tmp_ctx
);
318 WERROR
winreg_get_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
319 const struct auth_session_info
*session_info
,
320 struct messaging_context
*msg_ctx
,
324 enum winreg_Type
*type
,
329 struct dcerpc_binding_handle
*b
;
332 tmp_ctx
= talloc_stackframe();
333 if (tmp_ctx
== NULL
) {
337 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
338 if (!W_ERROR_IS_OK(result
)) {
339 talloc_free(tmp_ctx
);
343 result
= winreg_get_printer_dataex(mem_ctx
,
352 talloc_free(tmp_ctx
);
356 WERROR
winreg_delete_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
357 const struct auth_session_info
*session_info
,
358 struct messaging_context
*msg_ctx
,
364 struct dcerpc_binding_handle
*b
;
367 tmp_ctx
= talloc_stackframe();
368 if (tmp_ctx
== NULL
) {
372 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
373 if (!W_ERROR_IS_OK(result
)) {
374 talloc_free(tmp_ctx
);
378 result
= winreg_delete_printer_dataex(mem_ctx
,
384 talloc_free(tmp_ctx
);
388 WERROR
winreg_get_driver_internal(TALLOC_CTX
*mem_ctx
,
389 const struct auth_session_info
*session_info
,
390 struct messaging_context
*msg_ctx
,
391 const char *architecture
,
392 const char *driver_name
,
393 uint32_t driver_version
,
394 struct spoolss_DriverInfo8
**_info8
)
397 struct dcerpc_binding_handle
*b
;
400 tmp_ctx
= talloc_stackframe();
401 if (tmp_ctx
== NULL
) {
405 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
406 if (!W_ERROR_IS_OK(result
)) {
407 talloc_free(tmp_ctx
);
411 result
= winreg_get_driver(mem_ctx
,
418 talloc_free(tmp_ctx
);
422 WERROR
winreg_get_driver_list_internal(TALLOC_CTX
*mem_ctx
,
423 const struct auth_session_info
*session_info
,
424 struct messaging_context
*msg_ctx
,
425 const char *architecture
,
427 uint32_t *num_drivers
,
428 const char ***drivers_p
)
431 struct dcerpc_binding_handle
*b
;
434 tmp_ctx
= talloc_stackframe();
435 if (tmp_ctx
== NULL
) {
439 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
440 if (!W_ERROR_IS_OK(result
)) {
441 talloc_free(tmp_ctx
);
445 result
= winreg_get_driver_list(mem_ctx
,
452 talloc_free(tmp_ctx
);
456 WERROR
winreg_del_driver_internal(TALLOC_CTX
*mem_ctx
,
457 const struct auth_session_info
*session_info
,
458 struct messaging_context
*msg_ctx
,
459 struct spoolss_DriverInfo8
*info8
,
463 struct dcerpc_binding_handle
*b
;
466 tmp_ctx
= talloc_stackframe();
467 if (tmp_ctx
== NULL
) {
471 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
472 if (!W_ERROR_IS_OK(result
)) {
473 talloc_free(tmp_ctx
);
477 result
= winreg_del_driver(mem_ctx
,
482 talloc_free(tmp_ctx
);
486 WERROR
winreg_add_driver_internal(TALLOC_CTX
*mem_ctx
,
487 const struct auth_session_info
*session_info
,
488 struct messaging_context
*msg_ctx
,
489 struct spoolss_AddDriverInfoCtr
*r
,
490 const char **driver_name
,
491 uint32_t *driver_version
)
494 struct dcerpc_binding_handle
*b
;
497 tmp_ctx
= talloc_stackframe();
498 if (tmp_ctx
== NULL
) {
502 result
= winreg_printer_binding_handle(tmp_ctx
, session_info
, msg_ctx
, &b
);
503 if (!W_ERROR_IS_OK(result
)) {
504 talloc_free(tmp_ctx
);
508 result
= winreg_add_driver(mem_ctx
,
514 talloc_free(tmp_ctx
);
518 WERROR
winreg_get_printer_secdesc_internal(TALLOC_CTX
*mem_ctx
,
519 const struct auth_session_info
*session_info
,
520 struct messaging_context
*msg_ctx
,
521 const char *sharename
,
522 struct spoolss_security_descriptor
**psecdesc
)
525 struct dcerpc_binding_handle
*b
;
527 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
528 W_ERROR_NOT_OK_RETURN(result
);
530 return winreg_get_printer_secdesc(mem_ctx
, b
,
535 WERROR
winreg_set_printer_secdesc_internal(TALLOC_CTX
*mem_ctx
,
536 const struct auth_session_info
*session_info
,
537 struct messaging_context
*msg_ctx
,
538 const char *sharename
,
539 const struct spoolss_security_descriptor
*secdesc
)
542 struct dcerpc_binding_handle
*b
;
544 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
545 W_ERROR_NOT_OK_RETURN(result
);
547 return winreg_set_printer_secdesc(mem_ctx
, b
,
552 WERROR
winreg_printer_enumforms1_internal(TALLOC_CTX
*mem_ctx
,
553 const struct auth_session_info
*session_info
,
554 struct messaging_context
*msg_ctx
,
556 union spoolss_FormInfo
**pinfo
)
559 struct dcerpc_binding_handle
*b
;
561 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
562 W_ERROR_NOT_OK_RETURN(result
);
564 return winreg_printer_enumforms1(mem_ctx
, b
,
569 WERROR
winreg_printer_getform1_internal(TALLOC_CTX
*mem_ctx
,
570 const struct auth_session_info
*session_info
,
571 struct messaging_context
*msg_ctx
,
572 const char *form_name
,
573 struct spoolss_FormInfo1
*r
)
576 struct dcerpc_binding_handle
*b
;
578 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
579 W_ERROR_NOT_OK_RETURN(result
);
581 return winreg_printer_getform1(mem_ctx
, b
,
586 WERROR
winreg_printer_addform1_internal(TALLOC_CTX
*mem_ctx
,
587 const struct auth_session_info
*session_info
,
588 struct messaging_context
*msg_ctx
,
589 struct spoolss_AddFormInfo1
*form
)
592 struct dcerpc_binding_handle
*b
;
594 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
595 W_ERROR_NOT_OK_RETURN(result
);
597 return winreg_printer_addform1(mem_ctx
, b
,
601 WERROR
winreg_printer_setform1_internal(TALLOC_CTX
*mem_ctx
,
602 const struct auth_session_info
*session_info
,
603 struct messaging_context
*msg_ctx
,
604 const char *form_name
,
605 struct spoolss_AddFormInfo1
*form
)
608 struct dcerpc_binding_handle
*b
;
610 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
611 W_ERROR_NOT_OK_RETURN(result
);
613 return winreg_printer_setform1(mem_ctx
, b
,
618 WERROR
winreg_printer_deleteform1_internal(TALLOC_CTX
*mem_ctx
,
619 const struct auth_session_info
*session_info
,
620 struct messaging_context
*msg_ctx
,
621 const char *form_name
)
624 struct dcerpc_binding_handle
*b
;
626 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
627 W_ERROR_NOT_OK_RETURN(result
);
629 return winreg_printer_deleteform1(mem_ctx
, b
,
633 WERROR
winreg_enum_printer_key_internal(TALLOC_CTX
*mem_ctx
,
634 const struct auth_session_info
*session_info
,
635 struct messaging_context
*msg_ctx
,
638 uint32_t *pnum_subkeys
,
639 const char ***psubkeys
)
642 struct dcerpc_binding_handle
*b
;
644 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
645 W_ERROR_NOT_OK_RETURN(result
);
647 return winreg_enum_printer_key(mem_ctx
, b
,