diff options
-rw-r--r-- | source3/rpc_client/cli_winreg_spoolss.c | 281 |
1 files changed, 0 insertions, 281 deletions
diff --git a/source3/rpc_client/cli_winreg_spoolss.c b/source3/rpc_client/cli_winreg_spoolss.c index 83ea617946..9b7c72421c 100644 --- a/source3/rpc_client/cli_winreg_spoolss.c +++ b/source3/rpc_client/cli_winreg_spoolss.c @@ -320,287 +320,6 @@ static char *winreg_printer_data_keyname(TALLOC_CTX *mem_ctx, const char *printe return talloc_asprintf(mem_ctx, "%s\\%s", TOP_LEVEL_PRINT_PRINTERS_KEY, printer); } -/** - * @internal - * - * @brief Enumerate values of an opened key handle and retrieve the data. - * - * @param[in] mem_ctx The memory context to use. - * - * @param[in] winreg_handle The binding handle for the rpc connection. - * - * @param[in] key_hnd The opened key handle. - * - * @param[out] pnum_values A pointer to store he number of values found. - * - * @param[out] pnum_values A pointer to store the number of values we found. - * - * @return WERR_OK on success, the corresponding DOS error - * code if something gone wrong. - */ -static WERROR winreg_printer_enumvalues(TALLOC_CTX *mem_ctx, - struct dcerpc_binding_handle *winreg_handle, - struct policy_handle *key_hnd, - uint32_t *pnum_values, - struct spoolss_PrinterEnumValues **penum_values) -{ - TALLOC_CTX *tmp_ctx; - uint32_t num_subkeys, max_subkeylen, max_classlen; - uint32_t num_values, max_valnamelen, max_valbufsize; - uint32_t secdescsize; - uint32_t i; - NTTIME last_changed_time; - struct winreg_String classname; - - struct spoolss_PrinterEnumValues *enum_values; - - WERROR result = WERR_OK; - NTSTATUS status; - - tmp_ctx = talloc_stackframe(); - if (tmp_ctx == NULL) { - return WERR_NOMEM; - } - - ZERO_STRUCT(classname); - - status = dcerpc_winreg_QueryInfoKey(winreg_handle, - tmp_ctx, - key_hnd, - &classname, - &num_subkeys, - &max_subkeylen, - &max_classlen, - &num_values, - &max_valnamelen, - &max_valbufsize, - &secdescsize, - &last_changed_time, - &result); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("winreg_printer_enumvalues: Could not query info: %s\n", - nt_errstr(status))); - result = ntstatus_to_werror(status); - goto error; - } - if (!W_ERROR_IS_OK(result)) { - DEBUG(0, ("winreg_printer_enumvalues: Could not query info: %s\n", - win_errstr(result))); - goto error; - } - - if (num_values == 0) { - *pnum_values = 0; - TALLOC_FREE(tmp_ctx); - return WERR_OK; - } - - enum_values = talloc_array(tmp_ctx, struct spoolss_PrinterEnumValues, num_values); - if (enum_values == NULL) { - result = WERR_NOMEM; - goto error; - } - - for (i = 0; i < num_values; i++) { - struct spoolss_PrinterEnumValues val; - struct winreg_ValNameBuf name_buf; - enum winreg_Type type = REG_NONE; - uint8_t *data; - uint32_t data_size; - uint32_t length; - char n = '\0'; - - name_buf.name = &n; - name_buf.size = max_valnamelen + 2; - name_buf.length = 0; - - data_size = max_valbufsize; - data = NULL; - if (data_size) { - data = (uint8_t *) talloc_zero_size(tmp_ctx, data_size); - } - length = 0; - - status = dcerpc_winreg_EnumValue(winreg_handle, - tmp_ctx, - key_hnd, - i, - &name_buf, - &type, - data, - data_size ? &data_size : NULL, - &length, - &result); - if (W_ERROR_EQUAL(result, WERR_NO_MORE_ITEMS) ) { - result = WERR_OK; - status = NT_STATUS_OK; - break; - } - - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("winreg_printer_enumvalues: Could not enumerate values: %s\n", - nt_errstr(status))); - result = ntstatus_to_werror(status); - goto error; - } - if (!W_ERROR_IS_OK(result)) { - DEBUG(0, ("winreg_printer_enumvalues: Could not enumerate values: %s\n", - win_errstr(result))); - goto error; - } - - if (name_buf.name == NULL) { - result = WERR_INVALID_PARAMETER; - goto error; - } - - val.value_name = talloc_strdup(enum_values, name_buf.name); - if (val.value_name == NULL) { - result = WERR_NOMEM; - goto error; - } - val.value_name_len = strlen_m_term(val.value_name) * 2; - - val.type = type; - val.data_length = length; - val.data = NULL; - if (val.data_length) { - val.data = talloc(enum_values, DATA_BLOB); - if (val.data == NULL) { - result = WERR_NOMEM; - goto error; - } - *val.data = data_blob_talloc(val.data, data, val.data_length); - } - - enum_values[i] = val; - } - - *pnum_values = num_values; - if (penum_values) { - *penum_values = talloc_move(mem_ctx, &enum_values); - } - - result = WERR_OK; - - error: - TALLOC_FREE(tmp_ctx); - return result; -} - -/** - * @internal - * - * @brief A function to delete a key and its subkeys recurively. - * - * @param[in] mem_ctx The memory context to use. - * - * @param[in] winreg_handle The binding handle for the rpc connection. - * - * @param[in] hive_handle A opened hive handle to the key. - * - * @param[in] access_mask The access mask to access the key. - * - * @param[in] key The key to delete - * - * @return WERR_OK on success, the corresponding DOS error - * code if something gone wrong. - */ -static WERROR winreg_printer_delete_subkeys(TALLOC_CTX *mem_ctx, - struct dcerpc_binding_handle *winreg_handle, - struct policy_handle *hive_handle, - uint32_t access_mask, - const char *key) -{ - const char **subkeys = NULL; - uint32_t num_subkeys = 0; - struct policy_handle key_hnd; - struct winreg_String wkey = { 0, }; - WERROR result = WERR_OK; - NTSTATUS status; - uint32_t i; - - ZERO_STRUCT(key_hnd); - wkey.name = key; - - DEBUG(2, ("winreg_printer_delete_subkeys: delete key %s\n", key)); - /* open the key */ - status = dcerpc_winreg_OpenKey(winreg_handle, - mem_ctx, - hive_handle, - wkey, - 0, - access_mask, - &key_hnd, - &result); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("winreg_printer_delete_subkeys: Could not open key %s: %s\n", - wkey.name, nt_errstr(status))); - return ntstatus_to_werror(status); - } - if (!W_ERROR_IS_OK(result)) { - DEBUG(0, ("winreg_printer_delete_subkeys: Could not open key %s: %s\n", - wkey.name, win_errstr(result))); - return result; - } - - status = dcerpc_winreg_enum_keys(mem_ctx, - winreg_handle, - &key_hnd, - &num_subkeys, - &subkeys, - &result); - if (!NT_STATUS_IS_OK(status)) { - result = ntstatus_to_werror(status); - } - if (!W_ERROR_IS_OK(result)) { - goto done; - } - - for (i = 0; i < num_subkeys; i++) { - /* create key + subkey */ - char *subkey = talloc_asprintf(mem_ctx, "%s\\%s", key, subkeys[i]); - if (subkey == NULL) { - goto done; - } - - DEBUG(2, ("winreg_printer_delete_subkeys: delete subkey %s\n", subkey)); - result = winreg_printer_delete_subkeys(mem_ctx, - winreg_handle, - hive_handle, - access_mask, - subkey); - if (!W_ERROR_IS_OK(result)) { - goto done; - } - } - - if (is_valid_policy_hnd(&key_hnd)) { - WERROR ignore; - dcerpc_winreg_CloseKey(winreg_handle, mem_ctx, &key_hnd, &ignore); - } - - wkey.name = key; - - status = dcerpc_winreg_DeleteKey(winreg_handle, - mem_ctx, - hive_handle, - wkey, - &result); - if (!NT_STATUS_IS_OK(status)) { - result = ntstatus_to_werror(status); - } - -done: - if (is_valid_policy_hnd(&key_hnd)) { - WERROR ignore; - - dcerpc_winreg_CloseKey(winreg_handle, mem_ctx, &key_hnd, &ignore); - } - - return result; -} - static WERROR winreg_printer_opendriver(TALLOC_CTX *mem_ctx, struct dcerpc_binding_handle *winreg_handle, const char *drivername, |