WERROR winreg_enum_printer_key_internal(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, const char *printer, const char *key, uint32_t *pnum_subkeys, const char ***psubkeys) { WERROR result; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; tmp_ctx = talloc_stackframe(); if (tmp_ctx == NULL) { return WERR_NOMEM; } result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { talloc_free(tmp_ctx); return result; } result = winreg_enum_printer_key(mem_ctx, b, printer, key, pnum_subkeys, psubkeys); talloc_free(tmp_ctx); return result; }
WERROR winreg_printer_update_changeid_internal(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, const char *printer) { WERROR result; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; tmp_ctx = talloc_stackframe(); if (tmp_ctx == NULL) { return WERR_NOMEM; } result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { talloc_free(tmp_ctx); return result; } result = winreg_printer_update_changeid(mem_ctx, b, printer); talloc_free(tmp_ctx); return result; }
WERROR winreg_printer_enumforms1_internal(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, uint32_t *pnum_info, union spoolss_FormInfo **pinfo) { WERROR result; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; tmp_ctx = talloc_stackframe(); if (tmp_ctx == NULL) { return WERR_NOMEM; } result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { talloc_free(tmp_ctx); return result; } result = winreg_printer_enumforms1(mem_ctx, b, pnum_info, pinfo); talloc_free(tmp_ctx); return result; }
WERROR winreg_printer_setform1_internal(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, const char *form_name, struct spoolss_AddFormInfo1 *form) { WERROR result; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; tmp_ctx = talloc_stackframe(); if (tmp_ctx == NULL) { return WERR_NOMEM; } result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { talloc_free(tmp_ctx); return result; } result = winreg_printer_setform1(mem_ctx, b, form_name, form); talloc_free(tmp_ctx); return result; }
WERROR winreg_add_driver_internal(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, struct spoolss_AddDriverInfoCtr *r, const char **driver_name, uint32_t *driver_version) { WERROR result; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; tmp_ctx = talloc_stackframe(); if (tmp_ctx == NULL) { return WERR_NOMEM; } result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { talloc_free(tmp_ctx); return result; } result = winreg_add_driver(mem_ctx, b, r, driver_name, driver_version); talloc_free(tmp_ctx); return result; }
WERROR winreg_set_printer_secdesc_internal(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, const char *sharename, const struct spoolss_security_descriptor *secdesc) { WERROR result; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; tmp_ctx = talloc_stackframe(); if (tmp_ctx == NULL) { return WERR_NOMEM; } result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { talloc_free(tmp_ctx); return result; } result = winreg_set_printer_secdesc(mem_ctx, b, sharename, secdesc); talloc_free(tmp_ctx); return result; }
WERROR winreg_get_driver_list_internal(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, const char *architecture, uint32_t version, uint32_t *num_drivers, const char ***drivers_p) { WERROR result; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; tmp_ctx = talloc_stackframe(); if (tmp_ctx == NULL) { return WERR_NOMEM; } result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { talloc_free(tmp_ctx); return result; } result = winreg_get_driver_list(mem_ctx, b, architecture, version, num_drivers, drivers_p); talloc_free(tmp_ctx); return result; }
WERROR winreg_update_printer_internal(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, const char *sharename, uint32_t info2_mask, struct spoolss_SetPrinterInfo2 *info2, struct spoolss_DeviceMode *devmode, struct security_descriptor *secdesc) { WERROR result; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; tmp_ctx = talloc_stackframe(); if (tmp_ctx == NULL) { return WERR_NOMEM; } result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { talloc_free(tmp_ctx); return result; } result = winreg_update_printer(mem_ctx, b, sharename, info2_mask, info2, devmode, secdesc); talloc_free(tmp_ctx); return result; }
WERROR winreg_get_printer_dataex_internal(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, const char *printer, const char *key, const char *value, enum winreg_Type *type, uint8_t **data, uint32_t *data_size) { WERROR result; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; tmp_ctx = talloc_stackframe(); if (tmp_ctx == NULL) { return WERR_NOMEM; } result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { talloc_free(tmp_ctx); return result; } result = winreg_get_printer_dataex(mem_ctx, b, printer, key, value, type, data, data_size); talloc_free(tmp_ctx); return result; }
bool is_printer_published(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, const char *servername, const char *printer, struct spoolss_PrinterInfo2 **info2) { struct spoolss_PrinterInfo2 *pinfo2 = NULL; WERROR result; struct dcerpc_binding_handle *b; result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { return false; } result = winreg_get_printer(mem_ctx, b, printer, &pinfo2); if (!W_ERROR_IS_OK(result)) { return false; } if (!(pinfo2->attributes & PRINTER_ATTRIBUTE_PUBLISHED)) { TALLOC_FREE(pinfo2); return false; } if (info2) { *info2 = talloc_move(mem_ctx, &pinfo2); } talloc_free(pinfo2); return true; }
bool is_printer_published(TALLOC_CTX *mem_ctx, const struct auth_serversupplied_info *session_info, struct messaging_context *msg_ctx, const char *servername, char *printer, struct GUID *guid, struct spoolss_PrinterInfo2 **info2) { struct spoolss_PrinterInfo2 *pinfo2 = NULL; enum winreg_Type type; uint8_t *data; uint32_t data_size; WERROR result; NTSTATUS status; struct dcerpc_binding_handle *b; result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b); if (!W_ERROR_IS_OK(result)) { return false; } result = winreg_get_printer(mem_ctx, b, printer, &pinfo2); if (!W_ERROR_IS_OK(result)) { return false; } if (!(pinfo2->attributes & PRINTER_ATTRIBUTE_PUBLISHED)) { TALLOC_FREE(pinfo2); return false; } if (!guid) { goto done; } /* fetching printer guids really ought to be a separate function. */ result = winreg_get_printer_dataex(mem_ctx, b, printer, SPOOL_DSSPOOLER_KEY, "objectGUID", &type, &data, &data_size); if (!W_ERROR_IS_OK(result)) { TALLOC_FREE(pinfo2); return false; } /* We used to store the guid as REG_BINARY, then swapped to REG_SZ for Vista compatibility so check for both */ switch (type) { case REG_SZ: status = GUID_from_string((char *)data, guid); if (!NT_STATUS_IS_OK(status)) { TALLOC_FREE(pinfo2); return false; } break; case REG_BINARY: if (data_size != sizeof(struct GUID)) { TALLOC_FREE(pinfo2); return false; } memcpy(guid, data, sizeof(struct GUID)); break; default: DEBUG(0,("is_printer_published: GUID value stored as " "invaluid type (%d)\n", type)); break; } done: if (info2) { *info2 = talloc_move(mem_ctx, &pinfo2); } talloc_free(pinfo2); return true; }