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; }
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; }
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; }