s3-rpc_client: Added a winreg query sz helper.
authorAndreas Schneider <asn@samba.org>
Mon, 31 Jan 2011 15:39:34 +0000 (16:39 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 7 Feb 2011 11:32:00 +0000 (12:32 +0100)
Signed-off-by: Günther Deschner <gd@samba.org>
source3/rpc_client/cli_winreg.c
source3/rpc_client/cli_winreg.h

index 081f951b2dce24102d33f211889190c1868ecbba..be58c1f1f46ffe97786ab30a3b748eab48b2bc64 100644 (file)
@@ -244,6 +244,81 @@ NTSTATUS dcerpc_winreg_query_multi_sz(TALLOC_CTX *mem_ctx,
        return status;
 }
 
+NTSTATUS dcerpc_winreg_query_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_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_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 e10792e574ff673e724798be0addef2d8e22eeac..7a6e814831b9e2a4dcd55bef1735369a0204c6f6 100644 (file)
@@ -110,6 +110,35 @@ NTSTATUS dcerpc_winreg_query_multi_sz(TALLOC_CTX *mem_ctx,
                                      const char ***data,
                                      WERROR *pwerr);
 
+/**
+ * @brief Query a key for the specified 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_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.
  *