static WERROR rpc_get_value_by_name(TALLOC_CTX *mem_ctx, const struct registry_key *parent, const char *value_name, uint32_t *type, DATA_BLOB *data) { struct rpc_key *mykeydata = talloc_get_type(parent, struct rpc_key); struct winreg_QueryValue r; struct winreg_String name; uint8_t value; uint32_t val_size = MAX_VALSIZE; uint32_t zero = 0; WERROR error; NTSTATUS status; if (mykeydata->num_values == -1) { error = rpc_query_key(mem_ctx, parent); if(!W_ERROR_IS_OK(error)) return error; } name.name = value_name; ZERO_STRUCT(r); r.in.handle = &mykeydata->pol; r.in.value_name = &name; r.in.type = type; r.in.data = &value; r.in.data_size = &val_size; r.in.data_length = &zero; r.out.type = type; r.out.data = &value; r.out.data_size = &val_size; r.out.data_length = &zero; status = dcerpc_winreg_QueryValue(mykeydata->pipe, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("QueryValue failed - %s\n", nt_errstr(status))); return ntstatus_to_werror(status); } *type = *(r.out.type); *data = data_blob_talloc(mem_ctx, r.out.data, *r.out.data_length); return r.out.result; }
NTSTATUS dcerpc_winreg_query_dword(TALLOC_CTX *mem_ctx, struct dcerpc_binding_handle *h, struct policy_handle *key_handle, const char *value, uint32_t *data, WERROR *pwerr) { struct winreg_String wvalue; enum winreg_Type type = REG_NONE; uint32_t value_len = 0; uint32_t data_size = 0; WERROR result = WERR_OK; 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_DWORD) { *pwerr = WERR_INVALID_DATATYPE; return status; } if (data_size != 4) { *pwerr = WERR_INVALID_DATA; return status; } blob = data_blob_talloc_zero(mem_ctx, 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) { *data = IVAL(blob.data, 0); } return status; }