2 * dcerpc_stat 2002 Ronnie Sahlberg
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 /* This module provides rpc call/reply SRT statistics to Wireshark,
26 * and displays them graphically.
27 * It is only used by Wireshark and not tshark
29 * It serves as an example on how to use the tap api.
41 #include <epan/packet_info.h>
42 #include <epan/epan.h>
43 #include <epan/stat_cmd_args.h>
45 #include <epan/dissectors/packet-dcerpc.h>
47 #include "../stat_menu.h"
48 #include "../simple_dialog.h"
50 #include "gtk/gui_stat_menu.h"
51 #include "gtk/dlg_utils.h"
52 #include "gtk/gui_utils.h"
53 #include "gtk/filter_dlg.h"
54 #include "gtk/stock_icons.h"
55 #include "gtk/service_response_time_table.h"
56 #include "gtk/gtkglobals.h"
58 #include "gtk/filter_autocomplete.h"
60 #include "gtk/old-gtk-compat.h"
62 /* used to keep track of the statistics for an entire program interface */
63 typedef struct _dcerpcstat_t {
65 srt_stat_table srt_table;
74 uuid_equal(e_uuid_t *uuid1, e_uuid_t *uuid2)
76 if( (uuid1->Data1 != uuid2->Data1)
77 ||(uuid1->Data2 != uuid2->Data2)
78 ||(uuid1->Data3 != uuid2->Data3)
79 ||(uuid1->Data4[0] != uuid2->Data4[0])
80 ||(uuid1->Data4[1] != uuid2->Data4[1])
81 ||(uuid1->Data4[2] != uuid2->Data4[2])
82 ||(uuid1->Data4[3] != uuid2->Data4[3])
83 ||(uuid1->Data4[4] != uuid2->Data4[4])
84 ||(uuid1->Data4[5] != uuid2->Data4[5])
85 ||(uuid1->Data4[6] != uuid2->Data4[6])
86 ||(uuid1->Data4[7] != uuid2->Data4[7]) ){
93 dcerpcstat_gen_title(dcerpcstat_t *rs)
97 title = g_strdup_printf("DCE-RPC Service Response Time statistics for %s major version %u: %s", rs->prog, rs->ver, cf_get_display_name(&cfile));
102 dcerpcstat_set_title(dcerpcstat_t *rs)
106 title = dcerpcstat_gen_title(rs);
107 gtk_window_set_title(GTK_WINDOW(rs->win), title);
112 dcerpcstat_reset(void *rs_arg)
114 dcerpcstat_t *rs = rs_arg;
116 reset_srt_table_data(&rs->srt_table);
117 dcerpcstat_set_title(rs);
122 dcerpcstat_packet(void *rs_arg, packet_info *pinfo, epan_dissect_t *edt _U_, const void *ri_arg)
124 dcerpcstat_t *rs = rs_arg;
125 const dcerpc_info *ri = ri_arg;
130 if(!ri->call_data->req_frame){
131 /* we have not seen the request so we don't know the delta*/
134 if(ri->call_data->opnum >= rs->num_procedures){
135 /* don't handle this since its outside of known table */
139 /* we are only interested in reply packets */
140 if(ri->ptype != PDU_RESP){
144 /* we are only interested in certain program/versions */
145 if( (!uuid_equal( (&ri->call_data->uuid), (&rs->uuid)))
146 ||(ri->call_data->ver != rs->ver)){
151 add_srt_table_data(&rs->srt_table, ri->call_data->opnum, &ri->call_data->req_time, pinfo);
158 dcerpcstat_draw(void *rs_arg)
160 dcerpcstat_t *rs = rs_arg;
162 draw_srt_table_data(&rs->srt_table);
166 /* since the gtk2 implementation of tap is multithreaded we must protect
167 * remove_tap_listener() from modifying the list while draw_tap_listener()
168 * is running. the other protected block is in main.c
170 * there should not be any other critical regions in gtk2
173 win_destroy_cb(GtkWindow *win _U_, gpointer data)
175 dcerpcstat_t *rs = (dcerpcstat_t *)data;
177 protect_thread_critical_region();
178 remove_tap_listener(rs);
179 unprotect_thread_critical_region();
181 free_srt_table_data(&rs->srt_table);
187 /* When called, this function will create a new instance of gtk-dcerpcstat.
190 gtk_dcerpcstat_init(const char *optarg, void* userdata _U_)
193 guint32 i, max_procs;
197 GtkWidget *stat_label;
198 GtkWidget *filter_label;
201 dcerpc_sub_dissector *procs;
203 guint d1,d2,d3,d40,d41,d42,d43,d44,d45,d46,d47;
207 const char *filter = NULL;
208 GString *error_string;
212 * XXX - DCE RPC statistics are maintained only by major version,
213 * not by major and minor version, so the minor version number is
216 * Should we just stop supporting minor version numbers here?
217 * Or should we allow it to be omitted? Or should we keep
218 * separate statistics for different minor version numbers,
219 * and allow the minor version number to be omitted, and
220 * report aggregate statistics for all minor version numbers
225 "dcerpc,srt,%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x,%d.%d,%n",
226 &d1,&d2,&d3,&d40,&d41,&d42,&d43,&d44,&d45,&d46,&d47,&major,&minor,&pos)
245 fprintf(stderr, "wireshark: invalid \"-z dcerpc,srt,<uuid>,<major version>.<minor version>[,<filter>]\" argument\n");
248 if ((major < 0) || (major > 65535)) {
249 fprintf(stderr,"wireshark: dcerpcstat_init() Major version number %d is invalid - must be positive and <= 65535\n", major);
252 if ((minor < 0) || (minor > 65535)) {
253 fprintf(stderr,"wireshark: dcerpcstat_init() Minor version number %d is invalid - must be positive and <= 65535\n", minor);
258 rs = g_malloc(sizeof(dcerpcstat_t));
259 rs->prog = dcerpc_get_proto_name(&uuid, ver);
263 "wireshark: dcerpcstat_init() Protocol with uuid:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x v%u not supported\n",
264 uuid.Data1,uuid.Data2,uuid.Data3,uuid.Data4[0],uuid.Data4[1],uuid.Data4[2],uuid.Data4[3],uuid.Data4[4],uuid.Data4[5],uuid.Data4[6],uuid.Data4[7],ver);
267 hf_opnum = dcerpc_get_proto_hf_opnum(&uuid, ver);
268 procs = dcerpc_get_proto_sub_dissector(&uuid, ver);
272 rs->win = dlg_window_new("dcerpc-stat"); /* transient_for top_level */
273 gtk_window_set_destroy_with_parent(GTK_WINDOW(rs->win), TRUE);
275 dcerpcstat_set_title(rs);
276 gtk_window_set_default_size(GTK_WINDOW(rs->win), 550, 400);
278 vbox = gtk_vbox_new(FALSE, 3);
279 gtk_container_add(GTK_CONTAINER(rs->win), vbox);
280 gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
282 title_string = dcerpcstat_gen_title(rs);
283 stat_label = gtk_label_new(title_string);
284 g_free(title_string);
285 gtk_box_pack_start(GTK_BOX(vbox), stat_label, FALSE, FALSE, 0);
287 filter_string = g_strdup_printf("Filter: %s",filter ? filter : "");
288 filter_label = gtk_label_new(filter_string);
289 g_free(filter_string);
290 gtk_label_set_line_wrap(GTK_LABEL(filter_label), TRUE);
291 gtk_box_pack_start(GTK_BOX(vbox), filter_label, FALSE, FALSE, 0);
293 for(i=0,max_procs=0;procs[i].name;i++){
294 if(procs[i].num>max_procs){
295 max_procs = procs[i].num;
298 rs->num_procedures = max_procs+1;
300 /* We must display TOP LEVEL Widget before calling init_srt_table() */
301 gtk_widget_show_all(rs->win);
304 init_srt_table(&rs->srt_table, max_procs+1, vbox, proto_registrar_get_nth(hf_opnum)->abbrev);
306 init_srt_table(&rs->srt_table, max_procs+1, vbox, NULL);
309 for(i=0;i<(max_procs+1);i++){
311 const char *proc_name;
313 proc_name = "unknown";
314 for(j=0;procs[j].name;j++){
315 if (procs[j].num == i){
316 proc_name = procs[j].name;
320 init_srt_table_row(&rs->srt_table, i, proc_name);
324 error_string = register_tap_listener("dcerpc", rs, filter, 0, dcerpcstat_reset, dcerpcstat_packet, dcerpcstat_draw);
326 /* error, we failed to attach to the tap. clean up */
327 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", error_string->str);
328 g_string_free(error_string, TRUE);
329 free_srt_table_data(&rs->srt_table);
335 bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
336 gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
338 close_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
339 window_set_cancel_button(rs->win, close_bt, window_cancel_button_cb);
341 g_signal_connect(rs->win, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
342 g_signal_connect(rs->win, "destroy", G_CALLBACK(win_destroy_cb), rs);
344 gtk_widget_show_all(rs->win);
345 window_present(rs->win);
347 cf_retap_packets(&cfile);
348 gdk_window_raise(gtk_widget_get_window(rs->win));
353 static e_uuid_t *dcerpc_uuid_program;
354 static guint16 dcerpc_version;
355 static GtkWidget *dlg = NULL;
356 static GtkWidget *filter_entry;
357 static dcerpc_uuid_key *current_uuid_key;
358 static dcerpc_uuid_value *current_uuid_value;
359 static dcerpc_uuid_key *new_uuid_key;
360 static dcerpc_uuid_value *new_uuid_value;
363 dcerpcstat_start_button_clicked(GtkWidget *item _U_, gpointer data _U_)
368 if (dcerpc_uuid_program == NULL) {
369 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Please select a program");
372 str = g_string_new("dcerpc,srt");
373 g_string_append_printf(str,
374 ",%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x,%u.%u",
375 dcerpc_uuid_program->Data1, dcerpc_uuid_program->Data2,
376 dcerpc_uuid_program->Data3,
377 dcerpc_uuid_program->Data4[0], dcerpc_uuid_program->Data4[1],
378 dcerpc_uuid_program->Data4[2], dcerpc_uuid_program->Data4[3],
379 dcerpc_uuid_program->Data4[4], dcerpc_uuid_program->Data4[5],
380 dcerpc_uuid_program->Data4[6], dcerpc_uuid_program->Data4[7],
382 filter = gtk_entry_get_text(GTK_ENTRY(filter_entry));
384 g_string_append_printf(str, ",%s", filter);
387 gtk_dcerpcstat_init(str->str,NULL);
388 g_string_free(str, TRUE);
393 dcerpcstat_version_select(GtkWidget *vers_combo_box, gpointer user_data _U_)
397 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(vers_combo_box), (gpointer)&k)) {
398 g_assert_not_reached(); /* Programming error: somehow no active item */
401 dcerpc_version = k->ver;
405 dcerpcstat_find_vers(gpointer *key, gpointer *value _U_, gpointer user_data)
407 dcerpc_uuid_key *k = (dcerpc_uuid_key *)key;
408 GtkWidget *vers_combo_box = user_data;
411 if(!uuid_equal(&(k->uuid), dcerpc_uuid_program)){
414 g_snprintf(vs, sizeof(vs), "%u", k->ver);
415 ws_combo_box_append_text_and_pointer(GTK_COMBO_BOX(vers_combo_box), vs, k);
419 dcerpcstat_program_select(GtkWidget *prog_combo_box, gpointer user_data)
422 GtkWidget *vers_combo_box;
424 vers_combo_box = user_data;
426 if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(prog_combo_box), (gpointer)&k)) {
427 g_assert_not_reached(); /* Programming error: somehow no active item */
430 g_signal_handlers_disconnect_by_func(vers_combo_box, G_CALLBACK(dcerpcstat_version_select), NULL );
431 ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(vers_combo_box));
433 g_assert((k != NULL) && "dcerpc_stat: invalid selection"); /* Somehow selected top level ?? */
434 dcerpc_uuid_program = &(k->uuid);
436 /* re-create version menu */
437 g_signal_handlers_disconnect_by_func(vers_combo_box, G_CALLBACK(dcerpcstat_version_select), NULL );
438 ws_combo_box_clear_text_and_pointer(GTK_COMBO_BOX(vers_combo_box));
440 g_hash_table_foreach(dcerpc_uuids, (GHFunc)dcerpcstat_find_vers, vers_combo_box);
442 g_signal_connect(vers_combo_box, "changed", G_CALLBACK(dcerpcstat_version_select), NULL);
443 ws_combo_box_set_active(GTK_COMBO_BOX(vers_combo_box), 0); /* default: triggers dcerpcstat_version_select callback */
448 dcerpcstat_add_program_to_menu(dcerpc_uuid_key *k, dcerpc_uuid_value *v, GtkWidget *prog_combo_box, int program_item_index)
450 static GtkTreeIter iter;
453 switch(program_item_index%15){
455 g_snprintf(str,sizeof(str),"%s ...",v->name);
456 iter = ws_combo_box_append_text_and_pointer_full(
457 GTK_COMBO_BOX(prog_combo_box), NULL, str, NULL, FALSE); /* top-level entries are insensitive */
464 return ws_combo_box_append_text_and_pointer_full(
465 GTK_COMBO_BOX(prog_combo_box), &iter, v->name, k, TRUE);
469 dcerpcstat_find_next_program(gpointer *key, gpointer *value, gpointer *user_data _U_)
471 dcerpc_uuid_key *k = (dcerpc_uuid_key *)key;
472 dcerpc_uuid_value *v = (dcerpc_uuid_value *)value;
474 /* first time called, just set new_uuid to this one */
475 if((current_uuid_key==NULL) && (new_uuid_key==NULL)){
481 /* if we haven't got a current one yet, just check the new
482 and scan for the first one alphabetically */
483 if(current_uuid_key==NULL){
484 if(strcmp(new_uuid_value->name, v->name)>0){
492 /* searching for the next one we are only interested in those
493 that sorts alphabetically after the current one */
494 if(strcmp(current_uuid_value->name, v->name) >= 0){
495 /* this one doesnt so just skip it */
499 /* is it the first potential new entry? */
500 if(new_uuid_key==NULL){
506 /* does it sort before the current new one? */
507 if(strcmp(new_uuid_value->name, v->name) > 0){
518 dlg_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
524 #ifdef MAIN_MENU_USE_UIMANAGER
525 void gtk_dcerpcstat_cb(GtkAction *action _U_, gpointer user_data _U_)
528 gtk_dcerpcstat_cb(GtkWidget *w _U_, gpointer d _U_)
532 GtkWidget *prog_box, *prog_label, *prog_combo_box;
533 GtkWidget *vers_label, *vers_combo_box;
534 GtkWidget *filter_box, *filter_bt;
535 GtkWidget *bbox, *start_button, *cancel_button;
536 GtkCellRenderer *cell_renderer;
538 GtkTreeIter program_first_item_iter;
541 int program_item_index = 0;
543 static construct_args_t args = {
544 "Service Response Time Statistics Filter",
550 /* if the window is already open, bring it to front and
551 un-minimize it, as necessary */
553 reactivate_window(dlg);
557 dlg = dlg_window_new("Wireshark: Compute DCE-RPC SRT statistics");
558 gtk_window_set_default_size(GTK_WINDOW(dlg), 400, -1);
560 dlg_box = gtk_vbox_new(FALSE, 10);
561 gtk_container_set_border_width(GTK_CONTAINER(dlg_box), 10);
562 gtk_container_add(GTK_CONTAINER(dlg), dlg_box);
563 gtk_widget_show(dlg_box);
566 prog_box = gtk_hbox_new(FALSE, 3);
569 gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
570 prog_label = gtk_label_new("Program:");
571 gtk_box_pack_start(GTK_BOX(prog_box), prog_label, FALSE, FALSE, 0);
572 gtk_widget_show(prog_label);
575 dcerpc_uuid_program = NULL; /* default: no program selected */
577 /* The "program combo box" is implemented with a two-level tree.
578 Each top-level of the tree has (up to) 15 selectable "program name"
579 children and shows the name of the first child of that entry
580 as "child_name ...". Each of the top-level entries can be expanded
581 (to show the children) but is "insensitive": ie: cannot be selected.
582 (dcerpcstat_add_program_to_menu() does the actual work to add entries
584 XXX: A simpler alternative might be to just do away with all the two-level
585 complexity and just use a standard ws_combo_box... even though the
586 list of "program names" is quite large.
587 XXX: The gtkrc file distributed with Windows Wireshark has the
588 "appears-as-list" GtkComboBox style property set to 1 and thus
589 on Windows the entries for this combo box will appear as a tree-view.
590 The default is 0(FALSE). In this case the the combo box entries will
591 display as a menu with sub-menus.
592 A possibility would be to set "appears-as-list" to 0 just for this
593 particular combo box on Windows so that the entries will appear as a
594 menu even on Windows).
596 prog_combo_box = ws_combo_box_new_text_and_pointer_full(&cell_renderer);
598 /* XXX: Hack So that the top-level insensitive entries don't show
599 as "grayed out"; The "foreground normal" color is used instead.
600 This may not really be necessary but seems better to me.
602 #if GTK_CHECK_VERSION(3,0,0)
603 GtkStyleContext *context;
604 GdkRGBA *new_rgba_fg_color;
605 context = gtk_widget_get_style_context (prog_combo_box);
606 gtk_style_context_get (context, GTK_STATE_NORMAL,
607 "color", &new_rgba_fg_color,
610 g_object_set(cell_renderer,
611 "foreground-rgba", &new_rgba_fg_color,
612 "foreground-set", TRUE,
617 s = gtk_widget_get_style(prog_combo_box);
618 g_object_set(cell_renderer,
619 "foreground-gdk", &(s->fg[GTK_STATE_NORMAL]),
620 "foreground-set", TRUE,
625 current_uuid_key = NULL;
626 current_uuid_value = NULL;
629 new_uuid_value = NULL;
630 g_hash_table_foreach(dcerpc_uuids, (GHFunc)dcerpcstat_find_next_program, NULL);
633 GtkTreeIter tmp_iter;
634 tmp_iter = dcerpcstat_add_program_to_menu(new_uuid_key, new_uuid_value,
635 prog_combo_box, program_item_index);
636 if (program_item_index == 0)
637 program_first_item_iter = tmp_iter;
639 dcerpcstat_add_program_to_menu(new_uuid_key, new_uuid_value,
640 prog_combo_box, program_item_index);
642 program_item_index += 1;
644 current_uuid_key = new_uuid_key;
645 current_uuid_value = new_uuid_value;
646 } while(new_uuid_key != NULL);
647 gtk_box_pack_start(GTK_BOX(prog_box), prog_combo_box, TRUE, TRUE, 0);
648 gtk_widget_show(prog_combo_box);
651 gtk_container_set_border_width(GTK_CONTAINER(prog_box), 10);
652 vers_label = gtk_label_new("Version:");
653 gtk_box_pack_start(GTK_BOX(prog_box), vers_label, FALSE, FALSE, 0);
654 gtk_widget_show(vers_label);
656 /* Version combo-box */
657 /* Note: version combo box rows set when dcerpcstat_program_select() callback invoked */
658 vers_combo_box = ws_combo_box_new_text_and_pointer();
659 gtk_box_pack_start(GTK_BOX(prog_box), vers_combo_box, TRUE, TRUE, 0);
660 gtk_widget_show(vers_combo_box);
662 g_signal_connect(prog_combo_box, "changed", G_CALLBACK(dcerpcstat_program_select), vers_combo_box);
663 #if 0 /* Don't select an active entry given the way the drop down treeview appears if a default (active) entry is set */
664 ws_combo_box_set_active_iter(GTK_COMBO_BOX(prog_combo_box), &program_first_item_iter); /* triggers callback */
666 gtk_box_pack_start(GTK_BOX(dlg_box), prog_box, TRUE, TRUE, 0);
667 gtk_widget_show(prog_box);
670 filter_box = gtk_hbox_new(FALSE, 3);
673 filter_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_DISPLAY_FILTER_ENTRY);
674 g_signal_connect(filter_bt, "clicked", G_CALLBACK(display_filter_construct_cb), &args);
675 gtk_box_pack_start(GTK_BOX(filter_box), filter_bt, FALSE, FALSE, 0);
676 gtk_widget_show(filter_bt);
679 filter_entry = gtk_entry_new();
680 g_signal_connect(filter_entry, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL);
681 g_object_set_data(G_OBJECT(filter_box), E_FILT_AUTOCOMP_PTR_KEY, NULL);
682 g_signal_connect(filter_entry, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL);
683 g_signal_connect(dlg, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL);
684 gtk_box_pack_start(GTK_BOX(filter_box), filter_entry, TRUE, TRUE, 0);
685 filter = gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
687 gtk_entry_set_text(GTK_ENTRY(filter_entry), filter);
689 colorize_filter_te_as_empty(filter_entry);
691 gtk_widget_show(filter_entry);
693 gtk_box_pack_start(GTK_BOX(dlg_box), filter_box, TRUE, TRUE, 0);
694 gtk_widget_show(filter_box);
696 g_object_set_data(G_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_entry);
699 bbox = dlg_button_row_new(WIRESHARK_STOCK_CREATE_STAT, GTK_STOCK_CANCEL, NULL);
700 gtk_box_pack_start(GTK_BOX(dlg_box), bbox, FALSE, FALSE, 0);
701 gtk_widget_show(bbox);
703 start_button = g_object_get_data(G_OBJECT(bbox), WIRESHARK_STOCK_CREATE_STAT);
704 g_signal_connect_swapped(start_button, "clicked",
705 G_CALLBACK(dcerpcstat_start_button_clicked), NULL);
707 cancel_button = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL);
708 window_set_cancel_button(dlg, cancel_button, window_cancel_button_cb);
710 g_signal_connect(dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
711 g_signal_connect(dlg, "destroy", G_CALLBACK(dlg_destroy_cb), NULL);
713 /* Catch the "activate" signal on the filter text entry, so that
714 if the user types Return there, we act as if the "Create Stat"
715 button had been selected, as happens if Return is typed if some
716 widget that *doesn't* handle the Return key has the input
718 dlg_set_activate(filter_entry, start_button);
720 gtk_widget_grab_default(start_button );
722 /* Give the initial focus to the "Filter" entry box. */
723 gtk_widget_grab_focus(filter_entry);
725 gtk_widget_show_all(dlg);
730 register_tap_listener_gtkdcerpcstat(void)
732 register_stat_cmd_arg("dcerpc,srt,", gtk_dcerpcstat_init,NULL);
734 #ifdef MAIN_MENU_USE_UIMANAGER
736 register_stat_menu_item("DCE-RPC...", REGISTER_STAT_GROUP_RESPONSE_TIME,
737 gtk_dcerpcstat_cb, NULL, NULL, NULL);