static bool test_strlen_m_term_null(struct torture_context *tctx) { torture_assert_int_equal(tctx, strlen_m_term_null("foo"), 4, "simple len"); torture_assert_int_equal(tctx, strlen_m_term_null("foo\x83l"), 7, "extended len"); torture_assert_int_equal(tctx, strlen_m_term_null(""), 0, "empty"); torture_assert_int_equal(tctx, strlen_m_term_null(NULL), 0, "NULL"); return true; }
static WERROR cmd_winreg_enumkeys(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { NTSTATUS status; WERROR werr; struct policy_handle handle; uint32_t enum_index = 0; struct winreg_StringBuf name; struct dcerpc_binding_handle *b = cli->binding_handle; if (argc < 2) { printf("usage: %s [name]\n", argv[0]); return WERR_OK; } status = dcerpc_winreg_OpenHKLM(b, mem_ctx, NULL, SEC_FLAG_MAXIMUM_ALLOWED, &handle, &werr); if (!NT_STATUS_IS_OK(status)) { return ntstatus_to_werror(status); } if (!W_ERROR_IS_OK(werr)) { return werr; } ZERO_STRUCT(name); name.name = argv[1]; name.length = strlen_m_term_null(name.name)*2; name.size = name.length; status = dcerpc_winreg_EnumKey(b, mem_ctx, &handle, enum_index, &name, NULL, NULL, &werr); if (!NT_STATUS_IS_OK(status)) { return ntstatus_to_werror(status); } if (!W_ERROR_IS_OK(werr)) { return werr; } return WERR_OK; }
static WERROR cmd_winreg_querymultiplevalues_ex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv, bool multiplevalues2) { NTSTATUS status; WERROR werr; struct policy_handle handle, key_handle; struct winreg_String key_name = { 0, }; struct dcerpc_binding_handle *b = cli->binding_handle; struct QueryMultipleValue *values_in, *values_out; uint32_t num_values; uint8_t *buffer = NULL; int i; if (argc < 2) { printf("usage: %s [key] [value1] [value2] ...\n", argv[0]); return WERR_OK; } status = dcerpc_winreg_OpenHKLM(b, mem_ctx, NULL, SEC_FLAG_MAXIMUM_ALLOWED, &handle, &werr); if (!NT_STATUS_IS_OK(status)) { return ntstatus_to_werror(status); } if (!W_ERROR_IS_OK(werr)) { return werr; } key_name.name = argv[1]; status = dcerpc_winreg_OpenKey(b, mem_ctx, &handle, key_name, 0, /* options */ SEC_FLAG_MAXIMUM_ALLOWED, &key_handle, &werr); if (!NT_STATUS_IS_OK(status)) { return ntstatus_to_werror(status); } if (!W_ERROR_IS_OK(werr)) { return werr; } num_values = argc-2; values_in = talloc_zero_array(mem_ctx, struct QueryMultipleValue, num_values); if (values_in == NULL) { return WERR_NOMEM; } values_out = talloc_zero_array(mem_ctx, struct QueryMultipleValue, num_values); if (values_out == NULL) { return WERR_NOMEM; } for (i=0; i < num_values; i++) { values_in[i].ve_valuename = talloc_zero(values_in, struct winreg_ValNameBuf); if (values_in[i].ve_valuename == NULL) { return WERR_NOMEM; } values_in[i].ve_valuename->name = talloc_strdup(values_in[i].ve_valuename, argv[i+2]); values_in[i].ve_valuename->length = strlen_m_term_null(values_in[i].ve_valuename->name)*2; values_in[i].ve_valuename->size = values_in[i].ve_valuename->length; } if (multiplevalues2) { uint32_t offered = 0, needed = 0; status = dcerpc_winreg_QueryMultipleValues2(b, mem_ctx, &key_handle, values_in, values_out, num_values, buffer, &offered, &needed, &werr); if (!NT_STATUS_IS_OK(status)) { return ntstatus_to_werror(status); } if (W_ERROR_EQUAL(werr, WERR_MORE_DATA)) { offered = needed; buffer = talloc_zero_array(mem_ctx, uint8_t, needed); if (buffer == NULL) { return WERR_NOMEM; } status = dcerpc_winreg_QueryMultipleValues2(b, mem_ctx, &key_handle, values_in, values_out, num_values, buffer, &offered, &needed, &werr); if (!NT_STATUS_IS_OK(status)) { return ntstatus_to_werror(status); } if (!W_ERROR_IS_OK(werr)) { return werr; } } } else { uint32_t buffer_size = 0xff; buffer = talloc_zero_array(mem_ctx, uint8_t, buffer_size); if (buffer == NULL) { return WERR_NOMEM; } status = dcerpc_winreg_QueryMultipleValues(b, mem_ctx, &key_handle, values_in, values_out, num_values, buffer, &buffer_size, &werr); if (!NT_STATUS_IS_OK(status)) { return ntstatus_to_werror(status); } if (!W_ERROR_IS_OK(werr)) { return werr; } } for (i=0; i < num_values; i++) { if (buffer) { display_winreg_data(values_in[i].ve_valuename->name, values_out[i].ve_type, buffer + values_out[i].ve_valueptr, values_out[i].ve_valuelen); } } return WERR_OK; }