static int
svcctl_dissect_OpenSCManagerW_rqst(tvbuff_t *tvb, int offset,
				  packet_info *pinfo, proto_tree *tree,
				  guint8 *drep)
{
	dcerpc_info *di = (dcerpc_info *)pinfo->private_data;
	dcerpc_call_value *dcv = (dcerpc_call_value *)di->call_data;
	const char *mn, *dn;

	/* MachineName */
	dcv->private_data=NULL;
	offset = dissect_ndr_pointer_cb(
		tvb, offset, pinfo, tree, drep,
		dissect_ndr_wchar_cvstring, NDR_POINTER_UNIQUE,
		"MachineName", hf_svcctl_machinename, cb_wstr_postprocess,
		GINT_TO_POINTER(CB_STR_COL_INFO | CB_STR_SAVE | 1));
	mn=(const char *)dcv->private_data;
	if(!mn)
		mn="";

	/* DatabaseName */
	dcv->private_data=NULL;
	offset = dissect_ndr_pointer_cb(
		tvb, offset, pinfo, tree, drep,
		dissect_ndr_wchar_cvstring, NDR_POINTER_UNIQUE,
		"Database", hf_svcctl_database, cb_wstr_postprocess,
		GINT_TO_POINTER(CB_STR_COL_INFO | 1));
	dn=(const char *)dcv->private_data;
	if(!dn)
		dn="";

	/* OpenSCManager() stores the server\database  in se_data */
	if(!pinfo->fd->flags.visited){
		if(!dcv->se_data){
			dcv->se_data=se_strdup_printf("%s\\%s",mn,dn);
		}
	}

	/* access mask */
	offset = dissect_nt_access_mask(
		tvb, offset, pinfo, tree, drep, hf_svcctl_access_mask,
		&svcctl_scm_access_mask_info, NULL);

	return offset;
}
示例#2
0
int
dissect_ndr_counted_byte_array_cb(tvbuff_t *tvb, int offset,
				  packet_info *pinfo, proto_tree *tree,
				  guint8 *drep, int hf_index,
				  dcerpc_callback_fnct_t *callback,
				  void *callback_args)
{
	dcerpc_info *di = pinfo->private_data;
	proto_item *item;
	proto_tree *subtree;
	guint16 len, size;

        /* Structure starts with short, but is aligned for pointer */

	ALIGN_TO_5_BYTES;

	if (di->conformant_run)
		return offset;

	item = proto_tree_add_text(tree, tvb, offset, 0, "%s",
		proto_registrar_get_name(hf_index));

	subtree = proto_item_add_subtree(item, ett_nt_counted_byte_array);

	/*
           struct {
               short len;
               short size;
               [size_is(size), length_is(len), ptr] unsigned char *string;
           } WHATEVER_THIS_IS_CALLED;

         */

	offset = dissect_ndr_uint16(tvb, offset, pinfo, subtree, drep,
			hf_nt_cs_len, &len);

	offset = dissect_ndr_uint16(tvb, offset, pinfo, subtree, drep,
			hf_nt_cs_size, &size);

	offset = dissect_ndr_pointer_cb(tvb, offset, pinfo, subtree, drep,
			dissect_ndr_char_cvstring, NDR_POINTER_UNIQUE,
			"Byte Array", hf_index, callback, callback_args);

	if (di->call_data->flags & DCERPC_IS_NDR64) {
		ALIGN_TO_5_BYTES;
	}

	return offset;
}
示例#3
0
int
dissect_ndr_counted_string_cb(tvbuff_t *tvb, int offset,
			      packet_info *pinfo, proto_tree *tree,
			      guint8 *drep, int hf_index,
			      dcerpc_callback_fnct_t *callback,
			      void *callback_args)
{
	dcerpc_info *di = pinfo->private_data;
	guint16 len, size;

        /* Structure starts with short, but is aligned for pointer */

	ALIGN_TO_5_BYTES;

	if (di->conformant_run)
		return offset;

	/*
           struct {
               short len;
               short size;
               [size_is(size/2), length_is(len/2), ptr] unsigned short *string;
           } UNICODE_STRING;

         */

	offset = dissect_ndr_uint16(tvb, offset, pinfo, tree, drep,
			hf_nt_cs_len, &len);

	offset = dissect_ndr_uint16(tvb, offset, pinfo, tree, drep,
			hf_nt_cs_size, &size);

	offset = dissect_ndr_pointer_cb(tvb, offset, pinfo, tree, drep,
			dissect_ndr_wchar_cvstring, NDR_POINTER_UNIQUE,
			"Character Array", hf_index, callback, callback_args);

	if (di->call_data->flags & DCERPC_IS_NDR64) {
		ALIGN_TO_5_BYTES;
	}

	return offset;
}
static int
svcctl_dissect_CreateServiceW_rqst(tvbuff_t *tvb, int offset,
		packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
	/* policy handle */
	offset = dissect_nt_policy_hnd(tvb, offset, pinfo, tree, drep,
		hf_svcctl_hnd, NULL, NULL, FALSE, FALSE);

	/* service name */
	offset = dissect_ndr_cvstring(tvb, offset, pinfo, tree, drep,
		sizeof(guint16), hf_svcctl_service_name, TRUE, NULL);

	/* display name */
	offset = dissect_ndr_pointer_cb(
		tvb, offset, pinfo, tree, drep,
		dissect_ndr_wchar_cvstring, NDR_POINTER_UNIQUE,
		"Display Name", hf_svcctl_display_name, cb_wstr_postprocess,
		GINT_TO_POINTER(1));

	/* access mask */
	offset = dissect_nt_access_mask(
		tvb, offset, pinfo, tree, drep, hf_svcctl_access_mask,
		&svcctl_scm_access_mask_info, NULL);

	/* service type */
	offset = svcctl_dissect_dwServiceType_flags(tvb, offset, pinfo, tree, drep, SVC_CREATE_SERVICE_W);

	/* service start type */
	offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
		hf_svcctl_service_start_type, NULL);

	/* service error control */
	offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
		hf_svcctl_service_error_control, NULL);

	/* binary path name */
	offset = dissect_ndr_cvstring(tvb, offset, pinfo, tree, drep,
		sizeof(guint16), hf_svcctl_binarypathname, TRUE, NULL);

	/* load order group */
	offset = dissect_ndr_pointer_cb(
		tvb, offset, pinfo, tree, drep,
		dissect_ndr_wchar_cvstring, NDR_POINTER_UNIQUE,
		"Load Order Group", hf_svcctl_loadordergroup, cb_wstr_postprocess,
		GINT_TO_POINTER(1));

	/* tag id */
	offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
		hf_svcctl_tagid, NULL);

	/* dependencies */
	offset = dissect_ndr_pointer_cb(
		tvb, offset, pinfo, tree, drep,
		dissect_ndr_wchar_cvstring, NDR_POINTER_UNIQUE,
		"Dependencies", hf_svcctl_dependencies, cb_wstr_postprocess,
		GINT_TO_POINTER(1));

	/* depend size */
	offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
		hf_svcctl_depend_size, NULL);

	/* service start name */
	offset = dissect_ndr_pointer_cb(
		tvb, offset, pinfo, tree, drep,
		dissect_ndr_wchar_cvstring, NDR_POINTER_UNIQUE,
		"Service Start Name", hf_svcctl_service_start_name, cb_wstr_postprocess,
		GINT_TO_POINTER(1));

	/* password */
	offset = dissect_ndr_pointer_cb(
		tvb, offset, pinfo, tree, drep,
		dissect_ndr_wchar_cvstring, NDR_POINTER_UNIQUE,
		"Password", hf_svcctl_password, cb_wstr_postprocess,
		GINT_TO_POINTER(1));

	/* password size */
	offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
		hf_svcctl_password_size, NULL);

	return offset;
}