예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
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;
}
예제 #5
0
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;
}
예제 #6
0
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;
}
예제 #7
0
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;
}
예제 #8
0
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;
}
예제 #9
0
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;
}
예제 #10
0
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;
}
예제 #11
0
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;
}