From 12cd4002e66164a0a85ae0e4a17f1f0abaef7e42 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 27 Jan 2011 12:27:23 +0100 Subject: s3-rpc_client: Added dcerpc_winreg_int_openkey(). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Günther Deschner --- source3/Makefile.in | 5 +- source3/rpc_client/cli_winreg_int.c | 134 ++++++++++++++++++++++++++++++++++++ source3/rpc_client/cli_winreg_int.h | 65 +++++++++++++++++ 3 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 source3/rpc_client/cli_winreg_int.c create mode 100644 source3/rpc_client/cli_winreg_int.h (limited to 'source3') diff --git a/source3/Makefile.in b/source3/Makefile.in index 7ea24fb155..e247c071c7 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -349,6 +349,9 @@ LIBCLI_EVENTLOG_OBJ = librpc/gen_ndr/ndr_eventlog_c.o LIBCLI_WINREG_OBJ = librpc/gen_ndr/ndr_winreg_c.o +LIBCLI_WINREG_INT_OBJ = $(LIBCLI_WINREG_OBJ) \ + rpc_client/cli_winreg_int.o + LIBCLI_NTSVCS_OBJ = librpc/gen_ndr/ndr_ntsvcs_c.o LIBCLI_DRSUAPI_OBJ = librpc/gen_ndr/ndr_drsuapi_c.o @@ -730,7 +733,7 @@ RPC_SERVER_OBJ = $(RPC_LSARPC_OBJ) $(RPC_WINREG_OBJ) $(RPC_INITSHUTDOWN_OBJ) \ $(RPC_SAMR_OBJ) $(RPC_RPCECHO_OBJ) $(RPC_EPMAPPER_OBJ) \ $(RPC_PIPE_OBJ) $(NPA_TSTREAM_OBJ) \ $(LIBCLI_SPOOLSS_OBJ) \ - $(LIBCLI_WINREG_OBJ) \ + $(LIBCLI_WINREG_INT_OBJ) \ $(LIBCLI_SRVSVC_OBJ) \ $(LIBCLI_LSA_OBJ) \ $(LIBCLI_SAMR_OBJ) \ diff --git a/source3/rpc_client/cli_winreg_int.c b/source3/rpc_client/cli_winreg_int.c new file mode 100644 index 0000000000..bd9cb011c6 --- /dev/null +++ b/source3/rpc_client/cli_winreg_int.c @@ -0,0 +1,134 @@ +/* + * Unix SMB/CIFS implementation. + * + * WINREG internal client routines + * + * Copyright (c) 2011 Andreas Schneider + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include "includes.h" +#include "../librpc/gen_ndr/ndr_winreg_c.h" +#include "rpc_client/cli_winreg_int.h" +#include "rpc_server/rpc_ncacn_np.h" + +NTSTATUS dcerpc_winreg_int_hklm_openkey(TALLOC_CTX *mem_ctx, + const struct auth_serversupplied_info *server_info, + struct messaging_context *msg_ctx, + struct dcerpc_binding_handle **h, + const char *key, + bool create_key, + uint32_t access_mask, + struct policy_handle *hive_handle, + struct policy_handle *key_handle, + WERROR *pwerr) +{ + static struct client_address client_id; + struct dcerpc_binding_handle *binding_handle; + struct winreg_String wkey, wkeyclass; + NTSTATUS status; + WERROR result = WERR_OK; + + strlcpy(client_id.addr, "127.0.0.1", sizeof(client_id.addr)); + client_id.name = "127.0.0.1"; + + status = rpcint_binding_handle(mem_ctx, + &ndr_table_winreg, + &client_id, + server_info, + msg_ctx, + &binding_handle); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("dcerpc_winreg_int_openkey: Could not connect to winreg pipe: %s\n", + nt_errstr(status))); + return status; + } + + status = dcerpc_winreg_OpenHKLM(binding_handle, + mem_ctx, + NULL, + access_mask, + hive_handle, + &result); + if (!NT_STATUS_IS_OK(status)) { + talloc_free(binding_handle); + return status; + } + if (!W_ERROR_IS_OK(result)) { + talloc_free(binding_handle); + *pwerr = result; + return status; + } + + ZERO_STRUCT(wkey); + wkey.name = key; + + if (create_key) { + enum winreg_CreateAction action = REG_ACTION_NONE; + + ZERO_STRUCT(wkeyclass); + wkeyclass.name = ""; + + status = dcerpc_winreg_CreateKey(binding_handle, + mem_ctx, + hive_handle, + wkey, + wkeyclass, + 0, + access_mask, + NULL, + key_handle, + &action, + &result); + switch (action) { + case REG_ACTION_NONE: + DEBUG(8, ("dcerpc_winreg_int_openkey: createkey" + " did nothing -- huh?\n")); + break; + case REG_CREATED_NEW_KEY: + DEBUG(8, ("dcerpc_winreg_int_openkey: createkey" + " created %s\n", key)); + break; + case REG_OPENED_EXISTING_KEY: + DEBUG(8, ("dcerpc_winreg_int_openkey: createkey" + " opened existing %s\n", key)); + break; + } + } else { + status = dcerpc_winreg_OpenKey(binding_handle, + mem_ctx, + hive_handle, + wkey, + 0, + access_mask, + key_handle, + &result); + } + if (!NT_STATUS_IS_OK(status)) { + talloc_free(binding_handle); + return status; + } + if (!W_ERROR_IS_OK(result)) { + talloc_free(binding_handle); + *pwerr = result; + return status; + } + + *h = binding_handle; + + return status; +} + +/* vim: set ts=8 sw=8 noet cindent syntax=c.doxygen: */ diff --git a/source3/rpc_client/cli_winreg_int.h b/source3/rpc_client/cli_winreg_int.h new file mode 100644 index 0000000000..83d96526a3 --- /dev/null +++ b/source3/rpc_client/cli_winreg_int.h @@ -0,0 +1,65 @@ +/* + * Unix SMB/CIFS implementation. + * + * WINREG internal client routines + * + * Copyright (c) 2011 Andreas Schneider + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#ifndef CLI_WINREG_INT_H +#define CLI_WINREG_INT_H + +/* + * @brief Connect to the interal winreg server and open the given key. + * + * The function will create the needed subkeys if they don't exist. + * + * @param[in] mem_ctx The memory context to use. + * + * @param[in] server_info The supplied server info. + * + * @param[in] path The path to the key to open. + * + * @param[in] key The key to open. + * + * @param[in] create_key Set to true if the key should be created if it + * doesn't exist. + * + * @param[in] access_mask The access mask to open the key. + * + * @param[out] binding_handle A pointer for the winreg dcerpc binding handle. + * + * @param[out] hive_handle A policy handle for the opened hive. + * + * @param[out] key_handle A policy handle for the opened key. + * + * @return WERR_OK on success, the corresponding DOS error + * code if something gone wrong. + */ +NTSTATUS dcerpc_winreg_int_hklm_openkey(TALLOC_CTX *mem_ctx, + const struct auth_serversupplied_info *server_info, + struct messaging_context *msg_ctx, + struct dcerpc_binding_handle **h, + const char *key, + bool create_key, + uint32_t access_mask, + struct policy_handle *hive_handle, + struct policy_handle *key_handle, + WERROR *pwerr); + +#endif /* CLI_WINREG_INT_H */ + +/* vim: set ts=8 sw=8 noet cindent syntax=c.doxygen: */ -- cgit