mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
s3-rpc_server: Migrated spoolss to dcerpc_winreg_enum_keys.
Signed-off-by: Günther Deschner <gd@samba.org>
This commit is contained in:
parent
c6255adc6f
commit
8238732330
@ -29,6 +29,7 @@
|
||||
#include "secrets.h"
|
||||
#include "rpc_server/rpc_ncacn_np.h"
|
||||
#include "../libcli/security/security.h"
|
||||
#include "rpc_client/cli_winreg.h"
|
||||
|
||||
#define TOP_LEVEL_PRINT_KEY "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print"
|
||||
#define TOP_LEVEL_PRINT_PRINTERS_KEY TOP_LEVEL_PRINT_KEY "\\Printers"
|
||||
@ -541,163 +542,6 @@ static WERROR winreg_printer_enumvalues(TALLOC_CTX *mem_ctx,
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @brief Enumerate subkeys of an opened key handle and get the names.
|
||||
*
|
||||
* @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[in] pnum_subkeys A pointer to store the number of found subkeys.
|
||||
*
|
||||
* @param[in] psubkeys A pointer to an array to store the found names of
|
||||
* subkeys.
|
||||
*
|
||||
* @return WERR_OK on success, the corresponding DOS error
|
||||
* code if something gone wrong.
|
||||
*/
|
||||
static WERROR winreg_printer_enumkeys(TALLOC_CTX *mem_ctx,
|
||||
struct dcerpc_binding_handle *winreg_handle,
|
||||
struct policy_handle *key_hnd,
|
||||
uint32_t *pnum_subkeys,
|
||||
const char ***psubkeys)
|
||||
{
|
||||
TALLOC_CTX *tmp_ctx;
|
||||
const char **subkeys;
|
||||
uint32_t num_subkeys, max_subkeylen, max_classlen;
|
||||
uint32_t num_values, max_valnamelen, max_valbufsize;
|
||||
uint32_t i;
|
||||
NTTIME last_changed_time;
|
||||
uint32_t secdescsize;
|
||||
struct winreg_String classname;
|
||||
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_enumkeys: 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_enumkeys: Could not query info: %s\n",
|
||||
win_errstr(result)));
|
||||
goto error;
|
||||
}
|
||||
|
||||
subkeys = talloc_zero_array(tmp_ctx, const char *, num_subkeys + 2);
|
||||
if (subkeys == NULL) {
|
||||
result = WERR_NOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (num_subkeys == 0) {
|
||||
subkeys[0] = talloc_strdup(subkeys, "");
|
||||
if (subkeys[0] == NULL) {
|
||||
result = WERR_NOMEM;
|
||||
goto error;
|
||||
}
|
||||
*pnum_subkeys = 0;
|
||||
if (psubkeys) {
|
||||
*psubkeys = talloc_move(mem_ctx, &subkeys);
|
||||
}
|
||||
|
||||
TALLOC_FREE(tmp_ctx);
|
||||
return WERR_OK;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_subkeys; i++) {
|
||||
char c = '\0';
|
||||
char n = '\0';
|
||||
char *name = NULL;
|
||||
struct winreg_StringBuf class_buf;
|
||||
struct winreg_StringBuf name_buf;
|
||||
NTTIME modtime;
|
||||
|
||||
class_buf.name = &c;
|
||||
class_buf.size = max_classlen + 2;
|
||||
class_buf.length = 0;
|
||||
|
||||
name_buf.name = &n;
|
||||
name_buf.size = max_subkeylen + 2;
|
||||
name_buf.length = 0;
|
||||
|
||||
ZERO_STRUCT(modtime);
|
||||
|
||||
status = dcerpc_winreg_EnumKey(winreg_handle,
|
||||
tmp_ctx,
|
||||
key_hnd,
|
||||
i,
|
||||
&name_buf,
|
||||
&class_buf,
|
||||
&modtime,
|
||||
&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_enumkeys: Could not enumerate keys: %s\n",
|
||||
nt_errstr(status)));
|
||||
result = ntstatus_to_werror(status);
|
||||
goto error;
|
||||
}
|
||||
if (!W_ERROR_IS_OK(result)) {
|
||||
DEBUG(0, ("winreg_printer_enumkeys: Could not enumerate keys: %s\n",
|
||||
win_errstr(result)));
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (name_buf.name == NULL) {
|
||||
result = WERR_INVALID_PARAMETER;
|
||||
goto error;
|
||||
}
|
||||
|
||||
name = talloc_strdup(subkeys, name_buf.name);
|
||||
if (name == NULL) {
|
||||
result = WERR_NOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
subkeys[i] = name;
|
||||
}
|
||||
|
||||
*pnum_subkeys = num_subkeys;
|
||||
if (psubkeys) {
|
||||
*psubkeys = talloc_move(mem_ctx, &subkeys);
|
||||
}
|
||||
|
||||
error:
|
||||
TALLOC_FREE(tmp_ctx);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
@ -754,11 +598,15 @@ static WERROR winreg_printer_delete_subkeys(TALLOC_CTX *mem_ctx,
|
||||
return result;
|
||||
}
|
||||
|
||||
result = winreg_printer_enumkeys(mem_ctx,
|
||||
status = dcerpc_winreg_enum_keys(mem_ctx,
|
||||
winreg_handle,
|
||||
&key_hnd,
|
||||
&num_subkeys,
|
||||
&subkeys);
|
||||
&subkeys,
|
||||
&result);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
result = ntstatus_to_werror(status);
|
||||
}
|
||||
if (!W_ERROR_IS_OK(result)) {
|
||||
goto done;
|
||||
}
|
||||
@ -2937,6 +2785,7 @@ WERROR winreg_enum_printer_key(TALLOC_CTX *mem_ctx,
|
||||
uint32_t num_subkeys = -1;
|
||||
|
||||
WERROR result = WERR_OK;
|
||||
NTSTATUS status;
|
||||
|
||||
TALLOC_CTX *tmp_ctx;
|
||||
|
||||
@ -2970,11 +2819,15 @@ WERROR winreg_enum_printer_key(TALLOC_CTX *mem_ctx,
|
||||
goto done;
|
||||
}
|
||||
|
||||
result = winreg_printer_enumkeys(tmp_ctx,
|
||||
status = dcerpc_winreg_enum_keys(tmp_ctx,
|
||||
winreg_handle,
|
||||
&key_hnd,
|
||||
&num_subkeys,
|
||||
&subkeys);
|
||||
&subkeys,
|
||||
&result);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
result = ntstatus_to_werror(status);
|
||||
}
|
||||
if (!W_ERROR_IS_OK(result)) {
|
||||
DEBUG(0, ("winreg_enum_printer_key: Could not enumerate subkeys in %s: %s\n",
|
||||
key, win_errstr(result)));
|
||||
@ -4387,6 +4240,7 @@ WERROR winreg_get_driver_list(TALLOC_CTX *mem_ctx,
|
||||
const char **drivers;
|
||||
TALLOC_CTX *tmp_ctx;
|
||||
WERROR result;
|
||||
NTSTATUS status;
|
||||
|
||||
*num_drivers = 0;
|
||||
*drivers_p = NULL;
|
||||
@ -4419,11 +4273,15 @@ WERROR winreg_get_driver_list(TALLOC_CTX *mem_ctx,
|
||||
goto done;
|
||||
}
|
||||
|
||||
result = winreg_printer_enumkeys(tmp_ctx,
|
||||
status = dcerpc_winreg_enum_keys(tmp_ctx,
|
||||
winreg_handle,
|
||||
&key_hnd,
|
||||
num_drivers,
|
||||
&drivers);
|
||||
&drivers,
|
||||
&result);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
result = ntstatus_to_werror(status);
|
||||
}
|
||||
if (!W_ERROR_IS_OK(result)) {
|
||||
DEBUG(0, ("winreg_get_driver_list: "
|
||||
"Could not enumerate drivers for (%s,%u): %s\n",
|
||||
|
Loading…
Reference in New Issue
Block a user