The branch, master has been updated via cb17fcc s3-spoolss: add winreg_del_driver_package_internal() via dceb6dc s3-rpc_cli: add winreg_del_driver_package() via 1e81178 s3-spoolss: add winreg_get_driver_package_internal() via 7ced1c3 s3-rpc_cli: add winreg_get_driver_package() via 5a3b99b s3-spoolss: add winreg_add_driver_package_internal() via 1494e94 s3-rpc_cli: add winreg_add_driver_package() via 48e65a1 s3-spoolss: add winreg_add_core_driver_internal() via f22c5f1 s3-rpc_cli: add winreg_add_core_driver() via 5eeb178 s3-spoolss: add winreg_get_core_driver_internal() via 071faf5 s3-rpc_cli: add winreg_get_core_driver() from 547524d s3: popt: Change to NULL from talloc_autofree_context() now we correctly free on exit.
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit cb17fcc5f53f336d802f6105e6bf3239ac2106a4 Author: Günther Deschner <g...@samba.org> Date: Wed Nov 2 18:17:58 2016 +0100 s3-spoolss: add winreg_del_driver_package_internal() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Autobuild-User(master): Günther Deschner <g...@samba.org> Autobuild-Date(master): Tue May 9 20:44:17 CEST 2017 on sn-devel-144 commit dceb6dc3864206a6562d02499f066e21a61e60d0 Author: Günther Deschner <g...@samba.org> Date: Wed Nov 2 18:17:37 2016 +0100 s3-rpc_cli: add winreg_del_driver_package() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 1e81178e2bf48470f3e5866b70f0f9d305db6438 Author: Günther Deschner <g...@samba.org> Date: Wed Nov 2 14:37:02 2016 +0100 s3-spoolss: add winreg_get_driver_package_internal() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 7ced1c30fcadfcab239a8796292f736a74a4357a Author: Günther Deschner <g...@samba.org> Date: Wed Nov 2 14:36:45 2016 +0100 s3-rpc_cli: add winreg_get_driver_package() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 5a3b99b7ce6a7342a8a427b941268a6a302ee158 Author: Günther Deschner <g...@samba.org> Date: Wed Nov 2 13:43:34 2016 +0100 s3-spoolss: add winreg_add_driver_package_internal() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 1494e94700be68d8c07753371dc8d09b120584fc Author: Günther Deschner <g...@samba.org> Date: Wed Nov 2 13:40:00 2016 +0100 s3-rpc_cli: add winreg_add_driver_package() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 48e65a15ac306051c0f37520a86d38f254b04321 Author: Günther Deschner <g...@samba.org> Date: Mon Oct 31 18:07:50 2016 +0100 s3-spoolss: add winreg_add_core_driver_internal() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit f22c5f1b9aaac39fea7b58817f67654595f74658 Author: Günther Deschner <g...@samba.org> Date: Mon Oct 31 18:07:33 2016 +0100 s3-rpc_cli: add winreg_add_core_driver() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 5eeb178fe8942b0a4c41dee4ed1195ffa4ab524e Author: Günther Deschner <g...@samba.org> Date: Mon Oct 31 17:43:58 2016 +0100 s3-spoolss: add winreg_get_core_driver_internal() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 071faf59dc528a78f724a48b20754318da252968 Author: Günther Deschner <g...@samba.org> Date: Mon Oct 31 17:43:28 2016 +0100 s3-rpc_cli: add winreg_get_core_driver() Guenther Signed-off-by: Guenther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/include/registry.h | 1 + source3/registry/reg_backend_db.c | 1 + source3/registry/reg_init_full.c | 1 + source3/rpc_client/cli_winreg_spoolss.c | 728 ++++++++++++++++++++++++++ source3/rpc_client/cli_winreg_spoolss.h | 114 ++++ source3/rpc_server/spoolss/srv_spoolss_util.c | 160 ++++++ source3/rpc_server/spoolss/srv_spoolss_util.h | 30 ++ 7 files changed, 1035 insertions(+) Changeset truncated at 500 lines: diff --git a/source3/include/registry.h b/source3/include/registry.h index 0de392f..7d2aad9 100644 --- a/source3/include/registry.h +++ b/source3/include/registry.h @@ -103,6 +103,7 @@ struct registry_key { #define KEY_TCPIP_PARAMS "HKLM\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters" #define KEY_PROD_OPTIONS "HKLM\\SYSTEM\\CurrentControlSet\\Control\\ProductOptions" #define KEY_PRINTING "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print" +#define KEY_PCC "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\PackageInstallation" #define KEY_PRINTING_2K "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers" #define KEY_PRINTING_PORTS "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Ports" #define KEY_CURRENT_VERSION "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 9d511b4..928572e 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -121,6 +121,7 @@ static WERROR regdb_trans_do(struct db_context *db, static const char *builtin_registry_paths[] = { KEY_PRINTING_2K, + KEY_PCC, KEY_PRINTING_PORTS, KEY_PRINTING, KEY_PRINTING "\\Forms", diff --git a/source3/registry/reg_init_full.c b/source3/registry/reg_init_full.c index e47b3f6..ca78370 100644 --- a/source3/registry/reg_init_full.c +++ b/source3/registry/reg_init_full.c @@ -55,6 +55,7 @@ struct registry_hook reg_hooks[] = { { KEY_PRINTING "\\Printers", &printing_ops }, { KEY_PRINTING_2K, ®db_ops }, { KEY_PRINTING_PORTS, ®db_ops }, + { KEY_PCC, ®db_ops }, { KEY_SHARES, &shares_reg_ops }, { KEY_SMBCONF, &smbconf_reg_ops }, { KEY_NETLOGON_PARAMS, &netlogon_params_reg_ops }, diff --git a/source3/rpc_client/cli_winreg_spoolss.c b/source3/rpc_client/cli_winreg_spoolss.c index 5ec97e6..7a0817a 100644 --- a/source3/rpc_client/cli_winreg_spoolss.c +++ b/source3/rpc_client/cli_winreg_spoolss.c @@ -34,6 +34,7 @@ #define TOP_LEVEL_PRINT_KEY "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print" #define TOP_LEVEL_PRINT_PRINTERS_KEY TOP_LEVEL_PRINT_KEY "\\Printers" +#define TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY TOP_LEVEL_PRINT_KEY "\\PackageInstallation" #define TOP_LEVEL_CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control\\Print" #define TOP_LEVEL_CONTROL_FORMS_KEY TOP_LEVEL_CONTROL_KEY "\\Forms" @@ -315,6 +316,165 @@ static WERROR winreg_printer_openkey(TALLOC_CTX *mem_ctx, return WERR_OK; } +static WERROR winreg_printer_open_core_driver(TALLOC_CTX *mem_ctx, + struct dcerpc_binding_handle *binding_handle, + const char *architecture, + const char *key, + uint32_t access_mask, + struct policy_handle *hive_handle, + struct policy_handle *key_handle) +{ + struct winreg_String wkey, wkeyclass; + NTSTATUS status; + WERROR result = WERR_OK; + WERROR ignore; + enum winreg_CreateAction action = REG_ACTION_NONE; + const char *path; + + status = dcerpc_winreg_OpenHKLM(binding_handle, + mem_ctx, + NULL, + access_mask, + hive_handle, + &result); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("winreg_printer_open_core_driver: Could not open HKLM hive: %s\n", + nt_errstr(status))); + return ntstatus_to_werror(status); + } + if (!W_ERROR_IS_OK(result)) { + DEBUG(0,("winreg_printer_open_core_driver: Could not open HKLM hive: %s\n", + win_errstr(result))); + return result; + } + + ZERO_STRUCT(wkey); + wkey.name = TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY; + + 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); + if (!NT_STATUS_IS_OK(status)) { + result = ntstatus_to_werror(status); + } + if (!W_ERROR_IS_OK(result)) { + goto done; + } + + dcerpc_winreg_CloseKey(binding_handle, mem_ctx, key_handle, &ignore); + + path = talloc_asprintf(mem_ctx, "%s\\%s", + TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY, + architecture); + if (path == NULL) { + result = WERR_NOT_ENOUGH_MEMORY; + goto done; + } + + wkey.name = path; + + status = dcerpc_winreg_CreateKey(binding_handle, + mem_ctx, + hive_handle, + wkey, + wkeyclass, + 0, + access_mask, + NULL, + key_handle, + &action, + &result); + if (!NT_STATUS_IS_OK(status)) { + result = ntstatus_to_werror(status); + } + if (!W_ERROR_IS_OK(result)) { + goto done; + } + + dcerpc_winreg_CloseKey(binding_handle, mem_ctx, key_handle, &ignore); + + path = talloc_asprintf(mem_ctx, "%s\\%s\\CorePrinterDrivers", + TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY, + architecture); + if (path == NULL) { + result = WERR_NOT_ENOUGH_MEMORY; + goto done; + } + + wkey.name = path; + + status = dcerpc_winreg_CreateKey(binding_handle, + mem_ctx, + hive_handle, + wkey, + wkeyclass, + 0, + access_mask, + NULL, + key_handle, + &action, + &result); + if (!NT_STATUS_IS_OK(status)) { + result = ntstatus_to_werror(status); + } + if (!W_ERROR_IS_OK(result)) { + goto done; + } + + dcerpc_winreg_CloseKey(binding_handle, mem_ctx, key_handle, &ignore); + + path = talloc_asprintf(mem_ctx, "%s\\%s\\CorePrinterDrivers\\%s", + TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY, + architecture, + key); + if (path == NULL) { + result = WERR_NOT_ENOUGH_MEMORY; + goto done; + } + + wkey.name = path; + + status = dcerpc_winreg_CreateKey(binding_handle, + mem_ctx, + hive_handle, + wkey, + wkeyclass, + 0, + access_mask, + NULL, + key_handle, + &action, + &result); + if (!NT_STATUS_IS_OK(status)) { + result = ntstatus_to_werror(status); + } + if (!W_ERROR_IS_OK(result)) { + goto done; + } + + done: + if (is_valid_policy_hnd(hive_handle)) { + dcerpc_winreg_CloseKey(binding_handle, + mem_ctx, + hive_handle, + &ignore); + } + ZERO_STRUCTP(hive_handle); + + return result; +} + /** * @brief Create the registry keyname for the given printer. * @@ -3968,3 +4128,571 @@ done: TALLOC_FREE(tmp_ctx); return result; } + +WERROR winreg_get_core_driver(TALLOC_CTX *mem_ctx, + struct dcerpc_binding_handle *winreg_handle, + const char *architecture, + const struct GUID *core_driver_guid, + struct spoolss_CorePrinterDriver **_core_printer_driver) +{ + uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED; + struct policy_handle hive_hnd, key_hnd; + struct spoolss_CorePrinterDriver *c; + struct spoolss_PrinterEnumValues *enum_values = NULL; + struct spoolss_PrinterEnumValues *v; + uint32_t num_values = 0; + TALLOC_CTX *tmp_ctx; + WERROR result; + NTSTATUS status; + const char *path; + const char *guid_str; + uint32_t i; + const char **enum_names = NULL; + enum winreg_Type *enum_types = NULL; + DATA_BLOB *enum_data_blobs = NULL; + + ZERO_STRUCT(hive_hnd); + ZERO_STRUCT(key_hnd); + + tmp_ctx = talloc_stackframe(); + if (tmp_ctx == NULL) { + return WERR_NOT_ENOUGH_MEMORY; + } + + path = talloc_asprintf(tmp_ctx, "%s\\%s\\CorePrinterDrivers", + TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY, + architecture); + if (path == NULL) { + result = WERR_NOT_ENOUGH_MEMORY; + goto done; + } + + guid_str = GUID_string2(tmp_ctx, core_driver_guid); + if (guid_str == NULL) { + result = WERR_NOT_ENOUGH_MEMORY; + goto done; + } + + result = winreg_printer_openkey(tmp_ctx, + winreg_handle, + path, + guid_str, /* key */ + false, + access_mask, + &hive_hnd, + &key_hnd); + + if (!W_ERROR_IS_OK(result)) { + DEBUG(5, ("winreg_get_core_driver: " + "Could not open core driver key (%s,%s): %s\n", + guid_str, architecture, win_errstr(result))); + goto done; + } + + status = dcerpc_winreg_enumvals(tmp_ctx, + winreg_handle, + &key_hnd, + &num_values, + &enum_names, + &enum_types, + &enum_data_blobs, + &result); + if (!NT_STATUS_IS_OK(status)){ + result = ntstatus_to_werror(status); + } + + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("winreg_get_core_driver: " + "Could not enumerate values for (%s,%s): %s\n", + guid_str, architecture, win_errstr(result))); + goto done; + } + + enum_values = talloc_zero_array(tmp_ctx, + struct spoolss_PrinterEnumValues, + num_values); + if (enum_values == NULL){ + result = WERR_NOT_ENOUGH_MEMORY; + goto done; + } + + for (i = 0; i < num_values; i++){ + enum_values[i].value_name = enum_names[i]; + enum_values[i].value_name_len = strlen_m_term(enum_names[i]) * 2; + enum_values[i].type = enum_types[i]; + enum_values[i].data_length = enum_data_blobs[i].length; + enum_values[i].data = NULL; + if (enum_values[i].data_length != 0){ + enum_values[i].data = &enum_data_blobs[i]; + } + } + + c = talloc_zero(tmp_ctx, struct spoolss_CorePrinterDriver); + if (c == NULL) { + result = WERR_NOT_ENOUGH_MEMORY; + goto done; + } + + c->core_driver_guid = *core_driver_guid; + + result = WERR_OK; + + for (i = 0; i < num_values; i++) { + const char *tmp_str; + + v = &enum_values[i]; + + result = winreg_enumval_to_sz(c, v, + "InfPath", + &c->szPackageID); + CHECK_ERROR(result); + + result = winreg_enumval_to_sz(c, v, + "DriverDate", + &tmp_str); + if (W_ERROR_IS_OK(result)) { + result = winreg_printer_date_to_NTTIME(tmp_str, + &c->driver_date); + } + CHECK_ERROR(result); + + result = winreg_enumval_to_sz(c, v, + "DriverVersion", + &tmp_str); + if (W_ERROR_IS_OK(result)) { + result = winreg_printer_ver_to_qword(tmp_str, + &c->driver_version); + } + CHECK_ERROR(result); + } + + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("winreg_enumval_to_TYPE() failed " + "for %s: %s\n", v->value_name, + win_errstr(result))); + goto done; + } + + *_core_printer_driver = talloc_steal(mem_ctx, c); + result = WERR_OK; +done: + if (winreg_handle != NULL) { + WERROR ignore; + + if (is_valid_policy_hnd(&key_hnd)) { + dcerpc_winreg_CloseKey(winreg_handle, tmp_ctx, &key_hnd, &ignore); + } + if (is_valid_policy_hnd(&hive_hnd)) { + dcerpc_winreg_CloseKey(winreg_handle, tmp_ctx, &hive_hnd, &ignore); + } + } + + TALLOC_FREE(tmp_ctx); + return result; +} + +WERROR winreg_add_core_driver(TALLOC_CTX *mem_ctx, + struct dcerpc_binding_handle *winreg_handle, + const char *architecture, + const struct spoolss_CorePrinterDriver *r) +{ + uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED; + struct policy_handle hive_hnd, key_hnd; + TALLOC_CTX *tmp_ctx = NULL; + NTSTATUS status; + WERROR result; + const char *guid_str; + + ZERO_STRUCT(hive_hnd); + ZERO_STRUCT(key_hnd); + + tmp_ctx = talloc_stackframe(); + if (tmp_ctx == NULL) { + return WERR_NOT_ENOUGH_MEMORY; + } + + guid_str = GUID_string2(tmp_ctx, &r->core_driver_guid); + if (guid_str == NULL) { + result = WERR_NOT_ENOUGH_MEMORY; + goto done; + } + + result = winreg_printer_open_core_driver(tmp_ctx, + winreg_handle, + architecture, + guid_str, + access_mask, + &hive_hnd, + &key_hnd); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("winreg_add_core_driver: " + "Could not open core driver key (%s,%s): %s\n", + guid_str, architecture, win_errstr(result))); + goto done; + } + + result = winreg_printer_write_date(tmp_ctx, winreg_handle, + &key_hnd, "DriverDate", + r->driver_date); + if (!W_ERROR_IS_OK(result)) { + goto done; + } + + result = winreg_printer_write_ver(tmp_ctx, winreg_handle, + &key_hnd, "DriverVersion", + r->driver_version); + if (!W_ERROR_IS_OK(result)) { + goto done; + } + + status = dcerpc_winreg_set_sz(tmp_ctx, + winreg_handle, + &key_hnd, + "InfPath", + r->szPackageID, + &result); + if (!NT_STATUS_IS_OK(status)) { + result = ntstatus_to_werror(status); + } + if (!W_ERROR_IS_OK(result)) { + goto done; + } + + result = WERR_OK; +done: + if (winreg_handle != NULL) { + WERROR ignore; + + if (is_valid_policy_hnd(&key_hnd)) { + dcerpc_winreg_CloseKey(winreg_handle, tmp_ctx, &key_hnd, &ignore); + } + if (is_valid_policy_hnd(&hive_hnd)) { + dcerpc_winreg_CloseKey(winreg_handle, tmp_ctx, &hive_hnd, &ignore); + } + } + + TALLOC_FREE(tmp_ctx); + return result; +} + +WERROR winreg_add_driver_package(TALLOC_CTX *mem_ctx, + struct dcerpc_binding_handle *winreg_handle, + const char *package_id, + const char *architecture, + const char *driver_store_path, + const char *cab_path) +{ + uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED; + struct policy_handle hive_hnd, key_hnd; + TALLOC_CTX *tmp_ctx = NULL; + NTSTATUS status; + WERROR result; + const char *path; + + ZERO_STRUCT(hive_hnd); + ZERO_STRUCT(key_hnd); + + tmp_ctx = talloc_stackframe(); + if (tmp_ctx == NULL) { + return WERR_NOT_ENOUGH_MEMORY; + } + + path = talloc_asprintf(tmp_ctx, "%s\\%s\\DriverPackages", + TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY, + architecture); + if (path == NULL) { + result = WERR_NOT_ENOUGH_MEMORY; + goto done; + } + + result = winreg_printer_openkey(tmp_ctx, + winreg_handle, + path, + package_id, /* key */ + true, -- Samba Shared Repository