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
;
161 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
162 W_ERROR_NOT_OK_RETURN(result
);
164 return winreg_get_printer(mem_ctx
, b
,
170 WERROR
winreg_create_printer_internal(TALLOC_CTX
*mem_ctx
,
171 const struct auth_session_info
*session_info
,
172 struct messaging_context
*msg_ctx
,
173 const char *sharename
)
176 struct dcerpc_binding_handle
*b
;
178 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
179 W_ERROR_NOT_OK_RETURN(result
);
181 return winreg_create_printer(mem_ctx
, b
,
185 WERROR
winreg_update_printer_internal(TALLOC_CTX
*mem_ctx
,
186 const struct auth_session_info
*session_info
,
187 struct messaging_context
*msg_ctx
,
188 const char *sharename
,
190 struct spoolss_SetPrinterInfo2
*info2
,
191 struct spoolss_DeviceMode
*devmode
,
192 struct security_descriptor
*secdesc
)
195 struct dcerpc_binding_handle
*b
;
197 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
198 W_ERROR_NOT_OK_RETURN(result
);
200 return winreg_update_printer(mem_ctx
, b
,
208 WERROR
winreg_set_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
209 const struct auth_session_info
*session_info
,
210 struct messaging_context
*msg_ctx
,
214 enum winreg_Type type
,
219 struct dcerpc_binding_handle
*b
;
221 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
222 W_ERROR_NOT_OK_RETURN(result
);
224 return winreg_set_printer_dataex(mem_ctx
, b
,
233 WERROR
winreg_enum_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
234 const struct auth_session_info
*session_info
,
235 struct messaging_context
*msg_ctx
,
238 uint32_t *pnum_values
,
239 struct spoolss_PrinterEnumValues
**penum_values
)
242 struct dcerpc_binding_handle
*b
;
244 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
245 W_ERROR_NOT_OK_RETURN(result
);
247 return winreg_enum_printer_dataex(mem_ctx
, b
,
254 WERROR
winreg_get_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
255 const struct auth_session_info
*session_info
,
256 struct messaging_context
*msg_ctx
,
260 enum winreg_Type
*type
,
265 struct dcerpc_binding_handle
*b
;
267 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
268 W_ERROR_NOT_OK_RETURN(result
);
270 return winreg_get_printer_dataex(mem_ctx
, b
,
279 WERROR
winreg_delete_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
280 const struct auth_session_info
*session_info
,
281 struct messaging_context
*msg_ctx
,
287 struct dcerpc_binding_handle
*b
;
289 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
290 W_ERROR_NOT_OK_RETURN(result
);
292 return winreg_delete_printer_dataex(mem_ctx
, b
,
298 WERROR
winreg_get_driver_internal(TALLOC_CTX
*mem_ctx
,
299 const struct auth_session_info
*session_info
,
300 struct messaging_context
*msg_ctx
,
301 const char *architecture
,
302 const char *driver_name
,
303 uint32_t driver_version
,
304 struct spoolss_DriverInfo8
**_info8
)
307 struct dcerpc_binding_handle
*b
;
309 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
310 W_ERROR_NOT_OK_RETURN(result
);
312 return winreg_get_driver(mem_ctx
, b
,
319 WERROR
winreg_get_driver_list_internal(TALLOC_CTX
*mem_ctx
,
320 const struct auth_session_info
*session_info
,
321 struct messaging_context
*msg_ctx
,
322 const char *architecture
,
324 uint32_t *num_drivers
,
325 const char ***drivers_p
)
328 struct dcerpc_binding_handle
*b
;
330 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
331 W_ERROR_NOT_OK_RETURN(result
);
333 return winreg_get_driver_list(mem_ctx
, b
,
340 WERROR
winreg_del_driver_internal(TALLOC_CTX
*mem_ctx
,
341 const struct auth_session_info
*session_info
,
342 struct messaging_context
*msg_ctx
,
343 struct spoolss_DriverInfo8
*info8
,
347 struct dcerpc_binding_handle
*b
;
349 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
350 W_ERROR_NOT_OK_RETURN(result
);
352 return winreg_del_driver(mem_ctx
, b
,
357 WERROR
winreg_add_driver_internal(TALLOC_CTX
*mem_ctx
,
358 const struct auth_session_info
*session_info
,
359 struct messaging_context
*msg_ctx
,
360 struct spoolss_AddDriverInfoCtr
*r
,
361 const char **driver_name
,
362 uint32_t *driver_version
)
365 struct dcerpc_binding_handle
*b
;
367 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
368 W_ERROR_NOT_OK_RETURN(result
);
370 return winreg_add_driver(mem_ctx
, b
,
376 WERROR
winreg_get_printer_secdesc_internal(TALLOC_CTX
*mem_ctx
,
377 const struct auth_session_info
*session_info
,
378 struct messaging_context
*msg_ctx
,
379 const char *sharename
,
380 struct spoolss_security_descriptor
**psecdesc
)
383 struct dcerpc_binding_handle
*b
;
385 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
386 W_ERROR_NOT_OK_RETURN(result
);
388 return winreg_get_printer_secdesc(mem_ctx
, b
,
393 WERROR
winreg_set_printer_secdesc_internal(TALLOC_CTX
*mem_ctx
,
394 const struct auth_session_info
*session_info
,
395 struct messaging_context
*msg_ctx
,
396 const char *sharename
,
397 const struct spoolss_security_descriptor
*secdesc
)
400 struct dcerpc_binding_handle
*b
;
402 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
403 W_ERROR_NOT_OK_RETURN(result
);
405 return winreg_set_printer_secdesc(mem_ctx
, b
,
410 WERROR
winreg_printer_enumforms1_internal(TALLOC_CTX
*mem_ctx
,
411 const struct auth_session_info
*session_info
,
412 struct messaging_context
*msg_ctx
,
414 union spoolss_FormInfo
**pinfo
)
417 struct dcerpc_binding_handle
*b
;
419 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
420 W_ERROR_NOT_OK_RETURN(result
);
422 return winreg_printer_enumforms1(mem_ctx
, b
,
427 WERROR
winreg_printer_getform1_internal(TALLOC_CTX
*mem_ctx
,
428 const struct auth_session_info
*session_info
,
429 struct messaging_context
*msg_ctx
,
430 const char *form_name
,
431 struct spoolss_FormInfo1
*r
)
434 struct dcerpc_binding_handle
*b
;
436 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
437 W_ERROR_NOT_OK_RETURN(result
);
439 return winreg_printer_getform1(mem_ctx
, b
,
444 WERROR
winreg_printer_addform1_internal(TALLOC_CTX
*mem_ctx
,
445 const struct auth_session_info
*session_info
,
446 struct messaging_context
*msg_ctx
,
447 struct spoolss_AddFormInfo1
*form
)
450 struct dcerpc_binding_handle
*b
;
452 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
453 W_ERROR_NOT_OK_RETURN(result
);
455 return winreg_printer_addform1(mem_ctx
, b
,
459 WERROR
winreg_printer_setform1_internal(TALLOC_CTX
*mem_ctx
,
460 const struct auth_session_info
*session_info
,
461 struct messaging_context
*msg_ctx
,
462 const char *form_name
,
463 struct spoolss_AddFormInfo1
*form
)
466 struct dcerpc_binding_handle
*b
;
468 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
469 W_ERROR_NOT_OK_RETURN(result
);
471 return winreg_printer_setform1(mem_ctx
, b
,
476 WERROR
winreg_printer_deleteform1_internal(TALLOC_CTX
*mem_ctx
,
477 const struct auth_session_info
*session_info
,
478 struct messaging_context
*msg_ctx
,
479 const char *form_name
)
482 struct dcerpc_binding_handle
*b
;
484 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
485 W_ERROR_NOT_OK_RETURN(result
);
487 return winreg_printer_deleteform1(mem_ctx
, b
,
491 WERROR
winreg_enum_printer_key_internal(TALLOC_CTX
*mem_ctx
,
492 const struct auth_session_info
*session_info
,
493 struct messaging_context
*msg_ctx
,
496 uint32_t *pnum_subkeys
,
497 const char ***psubkeys
)
500 struct dcerpc_binding_handle
*b
;
502 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
503 W_ERROR_NOT_OK_RETURN(result
);
505 return winreg_enum_printer_key(mem_ctx
, b
,