s3-rpc_client: Added a winreg query multi sz helper.
authorAndreas Schneider <asn@samba.org>
Fri, 28 Jan 2011 09:07:57 +0000 (10:07 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 7 Feb 2011 11:31:59 +0000 (12:31 +0100)
Signed-off-by: Günther Deschner <gd@samba.org>
source3/rpc_client/cli_winreg.c
source3/rpc_client/cli_winreg.h

index c66c50bcc90307757185b3fba0c5b8a367950c83..32f892fdcb14439feccd1e5f1e43a15e1de2fa32 100644 (file)
@@ -169,6 +169,81 @@ NTSTATUS dcerpc_winreg_query_binary(TALLOC_CTX *mem_ctx,
        return status;
 }
 
+NTSTATUS dcerpc_winreg_query_multi_sz(TALLOC_CTX *mem_ctx,
+                                     struct dcerpc_binding_handle *h,
+                                     struct policy_handle *key_handle,
+                                     const char *value,
+                                     const char ***data,
+                                     WERROR *pwerr)
+{
+       struct winreg_String wvalue;
+       enum winreg_Type type;
+       WERROR result = WERR_OK;
+       uint32_t value_len = 0;
+       uint32_t data_size = 0;
+       NTSTATUS status;
+       DATA_BLOB blob;
+
+       wvalue.name = value;
+
+       status = dcerpc_winreg_QueryValue(h,
+                                         mem_ctx,
+                                         key_handle,
+                                         &wvalue,
+                                         &type,
+                                         NULL,
+                                         &data_size,
+                                         &value_len,
+                                         &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               *pwerr = result;
+               return status;
+       }
+
+       if (type != REG_MULTI_SZ) {
+               *pwerr = WERR_INVALID_DATATYPE;
+               return status;
+       }
+
+       blob = data_blob_talloc(mem_ctx, NULL, data_size);
+       if (blob.data == NULL) {
+               *pwerr = WERR_NOMEM;
+               return status;
+       }
+       value_len = 0;
+
+       status = dcerpc_winreg_QueryValue(h,
+                                         mem_ctx,
+                                         key_handle,
+                                         &wvalue,
+                                         &type,
+                                         blob.data,
+                                         &data_size,
+                                         &value_len,
+                                         &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               *pwerr = result;
+               return status;
+       }
+
+       if (data) {
+               bool ok;
+
+               ok = pull_reg_multi_sz(mem_ctx, &blob, data);
+               if (!ok) {
+                       *pwerr = WERR_NOMEM;
+               }
+       }
+
+       return status;
+}
+
 NTSTATUS dcerpc_winreg_set_dword(TALLOC_CTX *mem_ctx,
                                 struct dcerpc_binding_handle *h,
                                 struct policy_handle *key_handle,
index 25b7c65be5a17e406cfc108a0d9b8f4f293cfe33..fd67c9c7cb401b0504d154cafc312fd2676fff36 100644 (file)
@@ -81,6 +81,35 @@ NTSTATUS dcerpc_winreg_query_binary(TALLOC_CTX *mem_ctx,
                                    DATA_BLOB *data,
                                    WERROR *pwerr);
 
+/**
+ * @brief Query a key for the specified multi sz value.
+ *
+ * Get the data that is associated with the named value of a specified registry
+ * open key. This function ensures that the key is a multi sz value.
+ *
+ * @param[in]  mem_ctx  The memory context to use.
+ *
+ * @param[in]  h        The binding handle for the rpc connection.
+ *
+ * @param[in]  key_handle A handle to a key that MUST have been opened
+ *                        previously.
+ *
+ * @param[in]  value    The name of the value to query.
+ *
+ * @param[out] data     A pointer to store the data of the value.
+ *
+ * @param[out] pwerr    A pointer to a WERROR to store result of the query.
+ *
+ * @return              NT_STATUS_OK on success or a corresponding error if
+ *                      there was a problem on the connection.
+ */
+NTSTATUS dcerpc_winreg_query_multi_sz(TALLOC_CTX *mem_ctx,
+                                     struct dcerpc_binding_handle *h,
+                                     struct policy_handle *key_handle,
+                                     const char *value,
+                                     const char ***data,
+                                     WERROR *pwerr);
+
 /**
  * @brief Set a value with the specified dword data.
  *