From 740418a150ff0ccccf47b4a40783c35f81723a89 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 4 May 2010 11:43:27 +0200 Subject: s3-spoolss: Added a winreg_printer_query_binary function. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Günther Deschner --- source3/rpc_server/srv_spoolss_util.c | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) (limited to 'source3/rpc_server') diff --git a/source3/rpc_server/srv_spoolss_util.c b/source3/rpc_server/srv_spoolss_util.c index 995cb7becc..786aef176a 100644 --- a/source3/rpc_server/srv_spoolss_util.c +++ b/source3/rpc_server/srv_spoolss_util.c @@ -1010,6 +1010,77 @@ static WERROR winreg_printer_write_binary(TALLOC_CTX *mem_ctx, return result; } +static WERROR winreg_printer_query_binary(TALLOC_CTX *mem_ctx, + struct rpc_pipe_client *pipe_handle, + struct policy_handle *key_handle, + const char *value, + DATA_BLOB *data) +{ + struct winreg_String wvalue; + enum winreg_Type type; + WERROR result = WERR_OK; + uint32_t value_len = 0; + NTSTATUS status; + DATA_BLOB blob; + + wvalue.name = value; + status = rpccli_winreg_QueryValue(pipe_handle, + mem_ctx, + key_handle, + &wvalue, + &type, + NULL, + (uint32_t *) &blob.length, + &value_len, + &result); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("winreg_printer_query_dword: Could not query value %s: %s\n", + wvalue.name, nt_errstr(status))); + if (!W_ERROR_IS_OK(result)) { + goto done; + } + result = ntstatus_to_werror(status); + goto done; + } + + if (type != REG_BINARY) { + result = WERR_INVALID_DATATYPE; + goto done; + } + + blob.data = (uint8_t *) TALLOC(mem_ctx, blob.length); + if (blob.data == NULL) { + result = WERR_NOMEM; + goto done; + } + value_len = 0; + + status = rpccli_winreg_QueryValue(pipe_handle, + mem_ctx, + key_handle, + &wvalue, + &type, + blob.data, + (uint32_t *) &blob.length, + &value_len, + &result); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("winreg_printer_query_dword: Could not query value %s: %s\n", + wvalue.name, nt_errstr(status))); + if (!W_ERROR_IS_OK(result)) { + result = ntstatus_to_werror(status); + } + goto done; + } + + if (data) { + data->data = blob.data; + data->length = blob.length; + } +done: + return result; +} + static WERROR winreg_printer_query_dword(TALLOC_CTX *mem_ctx, struct rpc_pipe_client *pipe_handle, struct policy_handle *key_handle, -- cgit