1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-07 09:49:30 +03:00

s3-spoolss: Added a get_printer_dataex function using the winreg pipe.

Signed-off-by: Günther Deschner <gd@samba.org>
This commit is contained in:
Andreas Schneider
2010-03-15 12:27:51 +01:00
committed by Günther Deschner
parent bc23545909
commit 511dba5ae8
2 changed files with 146 additions and 0 deletions

View File

@ -241,3 +241,119 @@ done:
TALLOC_FREE(tmp_ctx);
return result;
}
/* Get printer data over a winreg pipe. */
WERROR winreg_get_printer_dataex(struct pipes_struct *p,
const char *printer,
const char *key,
const char *value,
enum winreg_Type *type,
uint8_t **data,
uint32_t *data_size)
{
uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
struct rpc_pipe_client *winreg_pipe = NULL;
struct policy_handle hive_hnd, key_hnd;
struct winreg_String wvalue;
enum winreg_Type type_in;
uint8_t *data_in;
uint32_t data_in_size = 0;
uint32_t value_len = 0;
WERROR result = WERR_OK;
NTSTATUS status;
TALLOC_CTX *tmp_ctx;
tmp_ctx = talloc_new(p->mem_ctx);
if (tmp_ctx == NULL) {
return WERR_NOMEM;
}
ZERO_STRUCT(hive_hnd);
ZERO_STRUCT(key_hnd);
result = winreg_printer_openkey(tmp_ctx,
p->server_info,
&winreg_pipe,
printer,
key,
false,
access_mask,
&hive_hnd,
&key_hnd);
if (!W_ERROR_IS_OK(result)) {
DEBUG(0, ("winreg_get_printer_dataex: Could not open key %s: %s\n",
key, win_errstr(result)));
goto done;
}
wvalue.name = value;
/*
* call QueryValue once with data == NULL to get the
* needed memory size to be allocated, then allocate
* data buffer and call again.
*/
status = rpccli_winreg_QueryValue(winreg_pipe,
tmp_ctx,
&key_hnd,
&wvalue,
&type_in,
NULL,
&data_in_size,
&value_len,
&result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("winreg_get_printer_dataex: Could not query value %s: %s\n",
value, nt_errstr(status)));
if (!W_ERROR_IS_OK(result)) {
goto done;
}
result = ntstatus_to_werror(status);
goto done;
}
data_in = (uint8_t *) TALLOC(tmp_ctx, data_in_size);
if (data_in == NULL) {
result = WERR_NOMEM;
goto done;
}
value_len = 0;
status = rpccli_winreg_QueryValue(winreg_pipe,
tmp_ctx,
&key_hnd,
&wvalue,
&type_in,
data_in,
&data_in_size,
&value_len,
&result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("winreg_get_printer_dataex: Could not query value %s: %s\n",
value, nt_errstr(status)));
if (!W_ERROR_IS_OK(result)) {
result = ntstatus_to_werror(status);
}
goto done;
}
*type = type_in;
*data_size = data_in_size;
if (data_in_size) {
*data = talloc_move(p->mem_ctx, &data_in);
}
result = WERR_OK;
done:
if (winreg_pipe != NULL) {
if (is_valid_policy_hnd(&key_hnd)) {
rpccli_winreg_CloseKey(winreg_pipe, tmp_ctx, &key_hnd, NULL);
}
if (is_valid_policy_hnd(&hive_hnd)) {
rpccli_winreg_CloseKey(winreg_pipe, tmp_ctx, &hive_hnd, NULL);
}
}
TALLOC_FREE(tmp_ctx);
return result;
}

View File

@ -52,4 +52,34 @@ WERROR winreg_set_printer_dataex(struct pipes_struct *p,
uint8_t *data,
uint32_t data_size);
/**
* @internal
*
* @brief Get printer data over a winreg pipe.
*
* @param[in] p The pipes structure to be able to open a new pipe.
*
* @param[in] printer The printer name.
*
* @param[in] key The key of the printer data to get the value.
*
* @param[in] value The name of the value to query.
*
* @param[in] type The type of the value to query.
*
* @param[out] data A pointer to store the data.
*
* @param[out] data_size A pointer to store the size of the data.
*
* @return On success WERR_OK, a corresponding DOS error is
* something went wrong.
*/
WERROR winreg_get_printer_dataex(struct pipes_struct *p,
const char *printer,
const char *key,
const char *value,
enum winreg_Type *type,
uint8_t **data,
uint32_t *data_size);
#endif /* _SRV_SPOOLSS_UITL_H */