diff options
-rw-r--r-- | source3/rpc_client/cli_winreg_spoolss.c | 89 | ||||
-rw-r--r-- | source3/rpc_client/cli_winreg_spoolss.h | 26 |
2 files changed, 115 insertions, 0 deletions
diff --git a/source3/rpc_client/cli_winreg_spoolss.c b/source3/rpc_client/cli_winreg_spoolss.c index 4ce25baed8f..8556d5c0088 100644 --- a/source3/rpc_client/cli_winreg_spoolss.c +++ b/source3/rpc_client/cli_winreg_spoolss.c @@ -4375,3 +4375,92 @@ done: 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, + access_mask, + &hive_hnd, + &key_hnd); + + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("winreg_add_driver_package: " + "Could not open driver package key (%s,%s): %s\n", + package_id, architecture, win_errstr(result))); + goto done; + } + + status = dcerpc_winreg_set_sz(tmp_ctx, + winreg_handle, + &key_hnd, + "CabPath", + cab_path, + &result); + if (!NT_STATUS_IS_OK(status)) { + result = ntstatus_to_werror(status); + } + if (!W_ERROR_IS_OK(result)) { + goto done; + } + + status = dcerpc_winreg_set_sz(tmp_ctx, + winreg_handle, + &key_hnd, + "DriverStorePath", + driver_store_path, + &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; +} + diff --git a/source3/rpc_client/cli_winreg_spoolss.h b/source3/rpc_client/cli_winreg_spoolss.h index 7acba9a2570..7e3f735b587 100644 --- a/source3/rpc_client/cli_winreg_spoolss.h +++ b/source3/rpc_client/cli_winreg_spoolss.h @@ -642,4 +642,30 @@ WERROR winreg_add_core_driver(TALLOC_CTX *mem_ctx, const char *architecture, const struct spoolss_CorePrinterDriver *r); +/** + * @brief This function adds a driver package + * + * @param[in] mem_ctx A talloc memory context. + * + * @param[in] b The dcerpc binding handle + * + * @param[in] package_id The package ID. + * + * @param[in] architecture The architecture type. + * + * @param[in] driver_store_path The local DriverStorePath + * + * @param[in] cab_path The local CabFile path + * + * @return On success WERR_OK, a corresponding DOS error is + * something went wrong. + */ + +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); + #endif /* _RPC_CLIENT_CLI_WINREG_SPOOLSS_H_ */ |