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
;
102 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
103 W_ERROR_NOT_OK_RETURN(result
);
105 return winreg_printer_update_changeid(mem_ctx
, b
,
109 WERROR
winreg_printer_get_changeid_internal(TALLOC_CTX
*mem_ctx
,
110 const struct auth_session_info
*session_info
,
111 struct messaging_context
*msg_ctx
,
116 struct dcerpc_binding_handle
*b
;
118 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
119 W_ERROR_NOT_OK_RETURN(result
);
121 return winreg_printer_get_changeid(mem_ctx
, b
,
126 WERROR
winreg_get_printer_internal(TALLOC_CTX
*mem_ctx
,
127 const struct auth_session_info
*session_info
,
128 struct messaging_context
*msg_ctx
,
130 struct spoolss_PrinterInfo2
**pinfo2
)
133 struct dcerpc_binding_handle
*b
;
135 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
136 W_ERROR_NOT_OK_RETURN(result
);
138 return winreg_get_printer(mem_ctx
, b
,
144 WERROR
winreg_create_printer_internal(TALLOC_CTX
*mem_ctx
,
145 const struct auth_session_info
*session_info
,
146 struct messaging_context
*msg_ctx
,
147 const char *sharename
)
150 struct dcerpc_binding_handle
*b
;
152 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
153 W_ERROR_NOT_OK_RETURN(result
);
155 return winreg_create_printer(mem_ctx
, b
,
159 WERROR
winreg_update_printer_internal(TALLOC_CTX
*mem_ctx
,
160 const struct auth_session_info
*session_info
,
161 struct messaging_context
*msg_ctx
,
162 const char *sharename
,
164 struct spoolss_SetPrinterInfo2
*info2
,
165 struct spoolss_DeviceMode
*devmode
,
166 struct security_descriptor
*secdesc
)
169 struct dcerpc_binding_handle
*b
;
171 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
172 W_ERROR_NOT_OK_RETURN(result
);
174 return winreg_update_printer(mem_ctx
, b
,
182 WERROR
winreg_set_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
183 const struct auth_session_info
*session_info
,
184 struct messaging_context
*msg_ctx
,
188 enum winreg_Type type
,
193 struct dcerpc_binding_handle
*b
;
195 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
196 W_ERROR_NOT_OK_RETURN(result
);
198 return winreg_set_printer_dataex(mem_ctx
, b
,
207 WERROR
winreg_enum_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
208 const struct auth_session_info
*session_info
,
209 struct messaging_context
*msg_ctx
,
212 uint32_t *pnum_values
,
213 struct spoolss_PrinterEnumValues
**penum_values
)
216 struct dcerpc_binding_handle
*b
;
218 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
219 W_ERROR_NOT_OK_RETURN(result
);
221 return winreg_enum_printer_dataex(mem_ctx
, b
,
228 WERROR
winreg_get_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
229 const struct auth_session_info
*session_info
,
230 struct messaging_context
*msg_ctx
,
234 enum winreg_Type
*type
,
239 struct dcerpc_binding_handle
*b
;
241 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
242 W_ERROR_NOT_OK_RETURN(result
);
244 return winreg_get_printer_dataex(mem_ctx
, b
,
253 WERROR
winreg_delete_printer_dataex_internal(TALLOC_CTX
*mem_ctx
,
254 const struct auth_session_info
*session_info
,
255 struct messaging_context
*msg_ctx
,
261 struct dcerpc_binding_handle
*b
;
263 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
264 W_ERROR_NOT_OK_RETURN(result
);
266 return winreg_delete_printer_dataex(mem_ctx
, b
,
272 WERROR
winreg_get_driver_internal(TALLOC_CTX
*mem_ctx
,
273 const struct auth_session_info
*session_info
,
274 struct messaging_context
*msg_ctx
,
275 const char *architecture
,
276 const char *driver_name
,
277 uint32_t driver_version
,
278 struct spoolss_DriverInfo8
**_info8
)
281 struct dcerpc_binding_handle
*b
;
283 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
284 W_ERROR_NOT_OK_RETURN(result
);
286 return winreg_get_driver(mem_ctx
, b
,
293 WERROR
winreg_get_driver_list_internal(TALLOC_CTX
*mem_ctx
,
294 const struct auth_session_info
*session_info
,
295 struct messaging_context
*msg_ctx
,
296 const char *architecture
,
298 uint32_t *num_drivers
,
299 const char ***drivers_p
)
302 struct dcerpc_binding_handle
*b
;
304 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
305 W_ERROR_NOT_OK_RETURN(result
);
307 return winreg_get_driver_list(mem_ctx
, b
,
314 WERROR
winreg_del_driver_internal(TALLOC_CTX
*mem_ctx
,
315 const struct auth_session_info
*session_info
,
316 struct messaging_context
*msg_ctx
,
317 struct spoolss_DriverInfo8
*info8
,
321 struct dcerpc_binding_handle
*b
;
323 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
324 W_ERROR_NOT_OK_RETURN(result
);
326 return winreg_del_driver(mem_ctx
, b
,
331 WERROR
winreg_add_driver_internal(TALLOC_CTX
*mem_ctx
,
332 const struct auth_session_info
*session_info
,
333 struct messaging_context
*msg_ctx
,
334 struct spoolss_AddDriverInfoCtr
*r
,
335 const char **driver_name
,
336 uint32_t *driver_version
)
339 struct dcerpc_binding_handle
*b
;
341 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
342 W_ERROR_NOT_OK_RETURN(result
);
344 return winreg_add_driver(mem_ctx
, b
,
350 WERROR
winreg_get_printer_secdesc_internal(TALLOC_CTX
*mem_ctx
,
351 const struct auth_session_info
*session_info
,
352 struct messaging_context
*msg_ctx
,
353 const char *sharename
,
354 struct spoolss_security_descriptor
**psecdesc
)
357 struct dcerpc_binding_handle
*b
;
359 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
360 W_ERROR_NOT_OK_RETURN(result
);
362 return winreg_get_printer_secdesc(mem_ctx
, b
,
367 WERROR
winreg_set_printer_secdesc_internal(TALLOC_CTX
*mem_ctx
,
368 const struct auth_session_info
*session_info
,
369 struct messaging_context
*msg_ctx
,
370 const char *sharename
,
371 const struct spoolss_security_descriptor
*secdesc
)
374 struct dcerpc_binding_handle
*b
;
376 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
377 W_ERROR_NOT_OK_RETURN(result
);
379 return winreg_set_printer_secdesc(mem_ctx
, b
,
384 WERROR
winreg_printer_enumforms1_internal(TALLOC_CTX
*mem_ctx
,
385 const struct auth_session_info
*session_info
,
386 struct messaging_context
*msg_ctx
,
388 union spoolss_FormInfo
**pinfo
)
391 struct dcerpc_binding_handle
*b
;
393 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
394 W_ERROR_NOT_OK_RETURN(result
);
396 return winreg_printer_enumforms1(mem_ctx
, b
,
401 WERROR
winreg_printer_getform1_internal(TALLOC_CTX
*mem_ctx
,
402 const struct auth_session_info
*session_info
,
403 struct messaging_context
*msg_ctx
,
404 const char *form_name
,
405 struct spoolss_FormInfo1
*r
)
408 struct dcerpc_binding_handle
*b
;
410 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
411 W_ERROR_NOT_OK_RETURN(result
);
413 return winreg_printer_getform1(mem_ctx
, b
,
418 WERROR
winreg_printer_addform1_internal(TALLOC_CTX
*mem_ctx
,
419 const struct auth_session_info
*session_info
,
420 struct messaging_context
*msg_ctx
,
421 struct spoolss_AddFormInfo1
*form
)
424 struct dcerpc_binding_handle
*b
;
426 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
427 W_ERROR_NOT_OK_RETURN(result
);
429 return winreg_printer_addform1(mem_ctx
, b
,
433 WERROR
winreg_printer_setform1_internal(TALLOC_CTX
*mem_ctx
,
434 const struct auth_session_info
*session_info
,
435 struct messaging_context
*msg_ctx
,
436 const char *form_name
,
437 struct spoolss_AddFormInfo1
*form
)
440 struct dcerpc_binding_handle
*b
;
442 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
443 W_ERROR_NOT_OK_RETURN(result
);
445 return winreg_printer_setform1(mem_ctx
, b
,
450 WERROR
winreg_printer_deleteform1_internal(TALLOC_CTX
*mem_ctx
,
451 const struct auth_session_info
*session_info
,
452 struct messaging_context
*msg_ctx
,
453 const char *form_name
)
456 struct dcerpc_binding_handle
*b
;
458 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
459 W_ERROR_NOT_OK_RETURN(result
);
461 return winreg_printer_deleteform1(mem_ctx
, b
,
465 WERROR
winreg_enum_printer_key_internal(TALLOC_CTX
*mem_ctx
,
466 const struct auth_session_info
*session_info
,
467 struct messaging_context
*msg_ctx
,
470 uint32_t *pnum_subkeys
,
471 const char ***psubkeys
)
474 struct dcerpc_binding_handle
*b
;
476 result
= winreg_printer_binding_handle(mem_ctx
, session_info
, msg_ctx
, &b
);
477 W_ERROR_NOT_OK_RETURN(result
);
479 return winreg_enum_printer_key(mem_ctx
, b
,