wireshark/packet-dcerpc-browser.c
Tim Potter 623f5b865d Dynamically create DCERPC opnum value_strings from the subdissector
list rather than duplicating this information in the dissector.  Some
of the opnum strings were starting to get out of date as developers
forgot to update the information in both places.

svn path=/trunk/; revision=7936
2003-06-26 04:30:31 +00:00

1180 lines
31 KiB
C

/* packet-dcerpc-browser.c
* Routines for DCERPC Browser packet disassembly
* Copyright 2001, Ronnie Sahlberg
*
* $Id: packet-dcerpc-browser.c,v 1.11 2003/06/26 04:30:26 tpot Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* The IDL file for this interface can be extracted by grepping for idl
* in capitals.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <glib.h>
#include <epan/packet.h>
#include "packet-dcerpc.h"
#include "packet-dcerpc-browser.h"
#include "packet-dcerpc-nt.h"
#include "smb.h"
static int proto_dcerpc_browser = -1;
static int hf_browser_opnum = -1;
static int hf_browser_rc = -1;
static int hf_browser_unknown_long = -1;
static int hf_browser_unknown_hyper = -1;
static int hf_browser_unknown_bytes = -1;
static int hf_browser_unknown_string = -1;
static gint ett_dcerpc_browser = -1;
static int
dissect_browser_long_pointer(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
dcerpc_info *di;
di=pinfo->private_data;
offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
di->hf_index, NULL);
return offset;
}
/*
IDL [ uuid(6bffd098-a112-3610-9833-012892020162),
IDL version(0.0),
IDL implicit_handle(handle_t rpc_binding)
IDL ] interface browser
IDL {
*/
static e_uuid_t uuid_dcerpc_browser = {
0x6bffd098, 0xa112, 0x3610,
{ 0x98, 0x33, 0x01, 0x28, 0x92, 0x02, 0x01, 0x62 }
};
static guint16 ver_dcerpc_browser = 0;
/*
IDL typedef struct {
IDL long element_7;
IDL [size_is(element_7)] [unique] byte *element_8;
IDL } TYPE_4;
*/
static int
dissect_browser_TYPE_4_data(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
guint32 len;
dcerpc_info *di;
di=pinfo->private_data;
if(di->conformant_run){
/* this call is to make ethereal eat the array header for the conformant run */
offset =dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep, NULL);
return offset;
}
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, &len);
proto_tree_add_item(tree, hf_browser_unknown_bytes, tvb, offset, len,
FALSE);
offset += len;
return len;
}
static int
dissect_browser_TYPE_4(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_4_data, NDR_POINTER_UNIQUE,
"unknown TYPE_4", -1);
return offset;
}
/*
IDL typedef struct {
IDL long element_5;
IDL [size_is(element_5)] [unique] byte *element_6;
IDL } TYPE_3;
*/
static int
dissect_browser_TYPE_3_data(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
guint32 len;
dcerpc_info *di;
di=pinfo->private_data;
if(di->conformant_run){
/* this call is to make ethereal eat the array header for the conformant run */
offset =dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep, NULL);
return offset;
}
/* this is really the length of the encoded data */
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, &len);
proto_tree_add_item(tree, hf_browser_unknown_bytes, tvb, offset, len,
FALSE);
offset += len;
return len;
}
static int
dissect_browser_TYPE_3(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_3_data, NDR_POINTER_UNIQUE,
"unknown TYPE_3", -1);
return offset;
}
/*
IDL typedef [switch_type(long)] union {
IDL [case(100)] [unique] TYPE_3 *element_3;
IDL [case(101)] [unique] TYPE_4 *element_4;
IDL } TYPE_2;
*/
static int
dissect_browser_TYPE_2(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
guint32 level;
/* this is really the union switch arm */
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, &level);
ALIGN_TO_4_BYTES;
switch(level){
case 100:
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_3, NDR_POINTER_UNIQUE,
"unknown TYPE_3", -1);
break;
case 101:
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_4, NDR_POINTER_UNIQUE,
"unknown TYPE_4", -1);
break;
}
return offset;
}
/*
IDL typedef struct {
IDL long element_1;
IDL TYPE_2 element_2;
IDL } TYPE_1;
*/
static int
dissect_browser_TYPE_1(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_browser_TYPE_2(tvb, offset, pinfo, tree, drep);
return offset;
}
/*
IDL long Function_00(
IDL [in] [unique] [string] wchar_t *element_9,
IDL [in] [unique] [string] wchar_t *element_10,
IDL [in] [unique] [string] wchar_t *element_11,
IDL [in,out] [ref] TYPE_1 *element_12,
IDL [in] long element_13,
IDL [out] long element_14,
IDL [in] long element_15,
IDL [in] [unique] [string] wchar_t *element_16,
IDL [in,out] [unique] long *element_17
IDL );
*/
static int
dissect_browser_UNKNOWN_00_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_1, NDR_POINTER_REF,
"unknown TYPE_1", -1);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_long_pointer, NDR_POINTER_UNIQUE,
"unknown long", hf_browser_unknown_long);
return offset;
}
static int
dissect_browser_UNKNOWN_00_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_1, NDR_POINTER_REF,
"unknown TYPE_1", -1);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_long_pointer, NDR_POINTER_UNIQUE,
"unknown long", hf_browser_unknown_long);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL long Function_01(
IDL [in] [unique] [string] wchar_t *element_18,
IDL [in] long element_19,
IDL [in] long element_20
IDL );
*/
static int
dissect_browser_UNKNOWN_01_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
return offset;
}
static int
dissect_browser_UNKNOWN_01_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL long Function_02(
IDL [in] [unique] [string] wchar_t *element_21,
IDL [in,out] [ref] TYPE_1 *element_22,
IDL [out] long element_23
IDL );
*/
static int
dissect_browser_UNKNOWN_02_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_1, NDR_POINTER_REF,
"unknown TYPE_1", -1);
return offset;
}
static int
dissect_browser_UNKNOWN_02_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL long Function_03(
IDL [in] [unique] [string] wchar_t *element_24
IDL );
*/
static int
dissect_browser_UNKNOWN_03_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
return offset;
}
static int
dissect_browser_UNKNOWN_03_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL long Function_04(
IDL [in] [unique] [string] wchar_t *element_25,
IDL [in] [string] char element_26
IDL );
*/
static int
dissect_browser_UNKNOWN_04_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_REF, "unknown string",
hf_browser_unknown_string, 0);
return offset;
}
static int
dissect_browser_UNKNOWN_04_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL typedef struct {
IDL TYPE_6 element_27;
IDL TYPE_6 element_28;
IDL TYPE_6 element_29;
IDL long element_30;
IDL long element_31;
IDL long element_32;
IDL long element_33;
IDL long element_34;
IDL long element_35;
IDL long element_36;
IDL long element_37;
IDL long element_38;
IDL long element_39;
IDL long element_40;
IDL long element_41;
IDL long element_42;
IDL long element_43;
IDL long element_44;
IDL TYPE_6 element_45;
IDL } TYPE_5;
IDL
IDL typedef struct {
IDL hyper element_46;
IDL } TYPE_6;
*/
static int
dissect_browser_TYPE_5(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_hyper, NULL);
offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_hyper, NULL);
offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_hyper, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_hyper, NULL);
return offset;
}
/*
IDL long Function_05(
IDL [in] [unique] [string] wchar_t *element_47,
IDL [out] [ref] TYPE_5 **element_48
IDL );
*/
static int
dissect_browser_UNKNOWN_05_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
return offset;
}
static int
dissect_browser_UNKNOWN_05_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_5, NDR_POINTER_UNIQUE,
"unknown TYPE_5", -1);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL long Function_06(
IDL [in] [unique] [string] wchar_t *element_49
IDL );
*/
static int
dissect_browser_UNKNOWN_06_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
return offset;
}
static int
dissect_browser_UNKNOWN_06_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL long Function_07(
IDL [in] [unique] [string] wchar_t *element_49
IDL );
*/
static int
dissect_browser_UNKNOWN_07_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
return offset;
}
static int
dissect_browser_UNKNOWN_07_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL typedef struct {
IDL TYPE_6 element_59;
IDL TYPE_6 element_60;
IDL TYPE_6 element_61;
IDL long element_62;
IDL long element_63;
IDL long element_64;
IDL TYPE_6 element_65;
IDL long element_66;
IDL long element_67;
IDL long element_68;
IDL long element_69;
IDL long element_70;
IDL long element_71;
IDL long element_72;
IDL long element_73;
IDL long element_74;
IDL } TYPE_11;
*/
static int
dissect_browser_TYPE_11(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_hyper, NULL);
offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_hyper, NULL);
offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_hyper, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_hyper, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
return offset;
}
/*
IDL typedef struct {
IDL long element_57;
IDL [size_is(element_57)] [unique] TYPE_11 *element_58;
IDL } TYPE_10;
*/
static int
dissect_browser_TYPE_11_array(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_11);
return offset;
}
static int
dissect_browser_TYPE_10(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_11_array, NDR_POINTER_UNIQUE,
"unknown TYPE_11_ARRAY", -1);
return offset;
}
/*
IDL typedef struct {
IDL long element_55;
IDL [size_is(element_55)] [unique] byte *element_56;
IDL } TYPE_9;
*/
static int
dissect_browser_TYPE_9_data(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
guint32 len;
dcerpc_info *di;
di=pinfo->private_data;
if(di->conformant_run){
/* this call is to make ethereal eat the array header for the conformant run */
offset =dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep, NULL);
return offset;
}
/* this is really the length of the encoded data */
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, &len);
proto_tree_add_item(tree, hf_browser_unknown_bytes, tvb, offset, len,
FALSE);
offset += len;
return len;
}
static int
dissect_browser_TYPE_9(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_9_data, NDR_POINTER_UNIQUE,
"unknown TYPE_9", -1);
return offset;
}
/*
IDL typedef [switch_type(long)] union {
IDL [case(100)] [unique] TYPE_9 *element_53;
IDL [case(101)] [unique] TYPE_10 *element_54;
IDL } TYPE_8;
*/
static int
dissect_browser_TYPE_8(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
guint32 level;
/* this is really the union switch arm */
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, &level);
ALIGN_TO_4_BYTES;
switch(level){
case 100:
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_9, NDR_POINTER_UNIQUE,
"unknown TYPE_9", -1);
break;
case 101:
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_10, NDR_POINTER_UNIQUE,
"unknown TYPE_10", -1);
break;
}
return offset;
}
/*
IDL typedef struct {
IDL long element_51;
IDL TYPE_8 element_52;
IDL } TYPE_7;
*/
static int
dissect_browser_TYPE_7(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_browser_TYPE_8(tvb, offset, pinfo, tree, drep);
return offset;
}
/*
IDL long Function_08(
IDL [in] [unique] [string] wchar_t *element_75,
IDL [in] long element_76,
IDL [in,out] [ref] TYPE_7 *element_77
IDL );
*/
static int
dissect_browser_UNKNOWN_08_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_7, NDR_POINTER_REF,
"unknown TYPE_7", -1);
return offset;
}
static int
dissect_browser_UNKNOWN_08_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_7, NDR_POINTER_REF,
"unknown TYPE_7", -1);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL long Function_09(
IDL [in] [unique] [string] wchar_t *element_78,
IDL [in] [ref] [string] wchar_t *element_79,
IDL [in] [unique] [string] wchar_t *element_80,
IDL [in] long element_81
IDL );
*/
static int
dissect_browser_UNKNOWN_09_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_REF, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
return offset;
}
static int
dissect_browser_UNKNOWN_09_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL typedef struct {
IDL long element_82;
IDL [size_is(element_82)] [unique] byte *element_83;
IDL } TYPE_12;
*/
static int
dissect_browser_TYPE_12_data(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
guint32 len;
dcerpc_info *di;
di=pinfo->private_data;
if(di->conformant_run){
/* this call is to make ethereal eat the array header for the conformant run */
offset =dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep, NULL);
return offset;
}
/* this is really the length of the encoded data */
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, &len);
proto_tree_add_item(tree, hf_browser_unknown_bytes, tvb, offset, len,
FALSE);
offset += len;
return len;
}
static int
dissect_browser_TYPE_12(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_12_data, NDR_POINTER_UNIQUE,
"unknown TYPE_12", -1);
return offset;
}
/*
IDL long Function_0a(
IDL [in] [unique] [string] wchar_t *element_84,
IDL [in,out] [ref] TYPE_12 *element_85
);
*/
static int
dissect_browser_UNKNOWN_0a_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_12, NDR_POINTER_REF,
"unknown TYPE_12", -1);
return offset;
}
static int
dissect_browser_UNKNOWN_0a_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_12, NDR_POINTER_REF,
"unknown TYPE_12", -1);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL long Function_0b(
IDL [in] [unique] [string] wchar_t *element_86,
IDL [in] [unique] [string] wchar_t *element_87,
IDL [in] [unique] [string] wchar_t *element_88,
IDL [in,out] [ref] TYPE_1 *element_89,
IDL [in] long element_90,
IDL [out] long element_91,
IDL [in] long element_92,
IDL [in] [unique] [string] wchar_t *element_93,
IDL [in] [unique] [string] wchar_t *element_94
IDL );
*/
static int
dissect_browser_UNKNOWN_0b_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_1, NDR_POINTER_REF,
"unknown TYPE_1", -1);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
offset = dissect_ndr_str_pointer_item(tvb, offset, pinfo, tree, drep,
NDR_POINTER_UNIQUE, "unknown string",
hf_browser_unknown_string, 0);
return offset;
}
static int
dissect_browser_UNKNOWN_0b_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
dissect_browser_TYPE_1, NDR_POINTER_REF,
"unknown TYPE_1", -1);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_unknown_long, NULL);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_browser_rc, NULL);
return offset;
}
/*
IDL }
*/
static dcerpc_sub_dissector dcerpc_browser_dissectors[] = {
{ BROWSER_UNKNOWN_00, "BROWSER_UNKNOWN_00",
dissect_browser_UNKNOWN_00_rqst,
dissect_browser_UNKNOWN_00_reply },
{ BROWSER_UNKNOWN_01, "BROWSER_UNKNOWN_01",
dissect_browser_UNKNOWN_01_rqst,
dissect_browser_UNKNOWN_01_reply },
{ BROWSER_UNKNOWN_02, "BROWSER_UNKNOWN_02",
dissect_browser_UNKNOWN_02_rqst,
dissect_browser_UNKNOWN_02_reply },
{ BROWSER_UNKNOWN_03, "BROWSER_UNKNOWN_03",
dissect_browser_UNKNOWN_03_rqst,
dissect_browser_UNKNOWN_03_reply },
{ BROWSER_UNKNOWN_04, "BROWSER_UNKNOWN_04",
dissect_browser_UNKNOWN_04_rqst,
dissect_browser_UNKNOWN_04_reply },
{ BROWSER_UNKNOWN_05, "BROWSER_UNKNOWN_05",
dissect_browser_UNKNOWN_05_rqst,
dissect_browser_UNKNOWN_05_reply },
{ BROWSER_UNKNOWN_06, "BROWSER_UNKNOWN_06",
dissect_browser_UNKNOWN_06_rqst,
dissect_browser_UNKNOWN_06_reply },
{ BROWSER_UNKNOWN_07, "BROWSER_UNKNOWN_07",
dissect_browser_UNKNOWN_07_rqst,
dissect_browser_UNKNOWN_07_reply },
{ BROWSER_UNKNOWN_08, "BROWSER_UNKNOWN_08",
dissect_browser_UNKNOWN_08_rqst,
dissect_browser_UNKNOWN_08_reply },
{ BROWSER_UNKNOWN_09, "BROWSER_UNKNOWN_09",
dissect_browser_UNKNOWN_09_rqst,
dissect_browser_UNKNOWN_09_reply },
{ BROWSER_UNKNOWN_0a, "BROWSER_UNKNOWN_0a",
dissect_browser_UNKNOWN_0a_rqst,
dissect_browser_UNKNOWN_0a_reply },
{ BROWSER_UNKNOWN_0b, "BROWSER_UNKNOWN_0b",
dissect_browser_UNKNOWN_0b_rqst,
dissect_browser_UNKNOWN_0b_reply },
{0, NULL, NULL, NULL }
};
void
proto_register_dcerpc_browser(void)
{
static hf_register_info hf[] = {
{ &hf_browser_opnum, {
"Operation", "rpc_browser.opnum", FT_UINT16, BASE_DEC,
NULL, 0x0, "Operation", HFILL }},
{ &hf_browser_rc, {
"Return code", "rpc_browser.rc", FT_UINT32, BASE_HEX,
VALS(NT_errors), 0x0, "Browser return code", HFILL }},
{ &hf_browser_unknown_long, {
"Unknown long", "rpc_browser.unknown.long", FT_UINT32, BASE_HEX,
NULL, 0x0, "Unknown long. If you know what this is, contact ethereal developers.", HFILL }},
{ &hf_browser_unknown_hyper, {
"Unknown hyper", "rpc_browser.unknown.hyper", FT_UINT64, BASE_HEX,
NULL, 0x0, "Unknown hyper. If you know what this is, contact ethereal developers.", HFILL }},
{ &hf_browser_unknown_bytes, {
"Unknown bytes", "rpc_browser.unknown.bytes", FT_BYTES, BASE_HEX,
NULL, 0x0, "Unknown bytes. If you know what this is, contact ethereal developers.", HFILL }},
{ &hf_browser_unknown_string, {
"Unknown string", "rpc_browser.unknown.string", FT_STRING, BASE_HEX,
NULL, 0x0, "Unknown string. If you know what this is, contact ethereal developers.", HFILL }}
};
static gint *ett[] = {
&ett_dcerpc_browser
};
proto_dcerpc_browser = proto_register_protocol(
"RPC Browser", "RPC_BROWSER", "rpc_browser");
proto_register_field_array(proto_dcerpc_browser, hf,
array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}
void
proto_reg_handoff_dcerpc_browser(void)
{
header_field_info *hf_info;
/* Register protocol as dcerpc */
dcerpc_init_uuid(proto_dcerpc_browser, ett_dcerpc_browser,
&uuid_dcerpc_browser, ver_dcerpc_browser,
dcerpc_browser_dissectors, hf_browser_opnum);
/* Set opnum strings from subdissector list */
hf_info = proto_registrar_get_nth(hf_browser_opnum);
hf_info->strings = value_string_from_subdissectors(
dcerpc_browser_dissectors, array_length(dcerpc_browser_dissectors));
}