Added dissection of the request for NetrCharDevEnum function.

svn path=/trunk/; revision=5680
This commit is contained in:
Ronnie Sahlberg 2002-06-16 11:46:18 +00:00
parent 231973f571
commit 78299a48a5
1 changed files with 253 additions and 17 deletions

View File

@ -4,7 +4,7 @@
* Copyright 2002, Richard Sharpe <rsharpe@ns.aus.com>
* decode srvsvc calls where Samba knows them ...
*
* $Id: packet-dcerpc-srvsvc.c,v 1.17 2002/06/16 01:52:25 sahlberg Exp $
* $Id: packet-dcerpc-srvsvc.c,v 1.18 2002/06/16 11:46:18 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -48,6 +48,10 @@ typedef struct _srvsvc_info {
static int proto_dcerpc_srvsvc = -1;
static int hf_srvsvc_server = -1;
static int hf_srvsvc_user = -1;
static int hf_srvsvc_chrdev = -1;
static int hf_srvsvc_chrdev_time = -1;
static int hf_srvsvc_chrdev_status = -1;
static int hf_srvsvc_info_level = -1;
static int hf_srvsvc_info = -1;
static int hf_srvsvc_rc = -1;
@ -81,12 +85,26 @@ static gint ett_srvsvc_share_info = -1;
static gint ett_srvsvc_share_info_1 = -1;
static e_uuid_t uuid_dcerpc_srvsvc = {
0x4b324fc8, 0x1670, 0x01d3,
{ 0x12, 0x78, 0x5a, 0x47, 0xbf, 0x6e, 0xe1, 0x88 }
};
static guint16 ver_dcerpc_srvsvc = 3;
/*static guint16 ver_dcerpc_srvsvc = 3;*/
static guint16 ver_dcerpc_srvsvc = 0; /*XXX*/
static int
srvsvc_dissect_ENUM_HANDLE(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_enum_handle, 0);
return offset;
}
static int
srvsvc_dissect_pointer_UNICODE_STRING(tvbuff_t *tvb, int offset,
@ -106,6 +124,224 @@ srvsvc_dissect_pointer_UNICODE_STRING(tvbuff_t *tvb, int offset,
return offset;
}
/*
* IDL typedef struct {
* IDL [string] [unique] wchar_t *dev;
* IDL } CHARDEV_INFO_0;
*/
static int
srvsvc_dissect_CHARDEV_INFO_0(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_pointer_UNICODE_STRING,
NDR_POINTER_UNIQUE, "Char Device",
hf_srvsvc_chrdev, 0);
return offset;
}
static int
srvsvc_dissect_CHARDEV_INFO_0_array(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_CHARDEV_INFO_0);
return offset;
}
/*
* IDL typedef struct {
* IDL long EntriesRead;
* IDL [size_is(EntriesRead)] [unique] CHARDEV_INFO_0 *devs;
* IDL } CHARDEV_INFO_0_CONTAINER;
*/
static int
srvsvc_dissect_CHARDEV_INFO_0_CONTAINER(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_num_entries, NULL);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_CHARDEV_INFO_0_array, NDR_POINTER_UNIQUE,
"CHARDEV_INFO_0 array:", -1, 0);
return offset;
}
/*
* IDL typedef struct {
* IDL [string] [unique] wchar_t *dev;
* IDL long status;
* IDL [string] [unique] wchar_t *user;
* IDL long time;
* IDL } CHARDEV_INFO_1;
*/
static int
srvsvc_dissect_CHARDEV_INFO_1(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_pointer_UNICODE_STRING,
NDR_POINTER_UNIQUE, "Char Device",
hf_srvsvc_chrdev, 0);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_chrdev_status, 0);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_pointer_UNICODE_STRING,
NDR_POINTER_UNIQUE, "User",
hf_srvsvc_user, 0);
/* XXX dont know how to decode this time field */
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_chrdev_time, 0);
return offset;
}
static int
srvsvc_dissect_CHARDEV_INFO_1_array(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_CHARDEV_INFO_1);
return offset;
}
/*
* IDL typedef struct {
* IDL long EntriesRead;
* IDL [size_is(EntriesRead)] [unique] CHARDEV_INFO_1 *devs;
* IDL } CHARDEV_INFO_1_CONTAINER;
*/
static int
srvsvc_dissect_CHARDEV_INFO_1_CONTAINER(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_num_entries, NULL);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_CHARDEV_INFO_1_array, NDR_POINTER_UNIQUE,
"CHARDEV_INFO_1 array:", -1, 3);
return offset;
}
/*
* IDL typedef [switch_type(long)] union {
* IDL [case(0)] [unique] CHARDEV_INFO_0_CONTAINER *dev0;
* IDL [case(1)] [unique] CHARDEV_INFO_1_CONTAINER *dev1;
* IDL } CHARDEV_ENUM_UNION;
*/
static int
srvsvc_dissect_CHARDEV_ENUM_UNION(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
guint32 level;
dcerpc_info *di;
di=pinfo->private_data;
if(di->conformant_run){
/*just a run to handle conformant arrays, nothing to dissect */
return offset;
}
ALIGN_TO_4_BYTES;
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
switch(level){
case 0:
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_CHARDEV_INFO_0_CONTAINER,
NDR_POINTER_UNIQUE, "CHARDEV_INFO_0_CONTAINER:",
-1, 0);
break;
case 1:
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_CHARDEV_INFO_1_CONTAINER,
NDR_POINTER_UNIQUE, "CHARDEV_INFO_1_CONTAINER:",
-1, 0);
break;
}
return offset;
}
/*
* IDL typedef struct {
* IDL long Level;
* IDL CHARDEV_ENUM_UNION devs;
* IDL } CHARDEV_ENUM_STRUCT;
*/
static int
srvsvc_dissect_CHARDEV_ENUM_STRUCT(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_info_level, 0);
offset = srvsvc_dissect_CHARDEV_ENUM_UNION(tvb, offset, pinfo, tree, drep);
return offset;
}
/* XXX dont know the out parameters. only the in parameters.
*
* IDL long NetrCharDevEnum(
* IDL [in] [string] [unique] wchar_t *ServerName,
* IDL [in] [ref] CHARDEV_ENUM_STRUCT *devs,
* IDL [in] long PreferredMaximumLength,
* IDL [in] [unique] long *ResumeHandle
* IDL );
*/
static int
srvsvc_dissect_netrchardevenum_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_pointer_UNICODE_STRING,
NDR_POINTER_UNIQUE, "Server",
hf_srvsvc_server, 0);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_CHARDEV_ENUM_STRUCT,
NDR_POINTER_REF, "CHARDEV_ENUM_STRUCT",
-1, 0);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_preferred_len, 0);
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
srvsvc_dissect_ENUM_HANDLE,
NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
return offset;
}
/* new functions in order and with idl above this line */
/*
IDL typedef struct {
IDL [unique] [string] wchar_t *share;
@ -385,20 +621,6 @@ srvsvc_dissect_net_share_get_info_reply(tvbuff_t *tvb, int offset,
}
static int
srvsvc_dissect_ENUM_HANDLE(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_enum_handle, 0);
return offset;
}
/*
IDL typedef struct {
IDL long element_x;
@ -715,7 +937,9 @@ srvsvc_dissect_netshareenum_reply(tvbuff_t *tvb, int offset,
}
static dcerpc_sub_dissector dcerpc_srvsvc_dissectors[] = {
{SRV_NETRCHARDEVENUM, "NetrCharDevEnum", NULL, NULL},
{SRV_NETRCHARDEVENUM, "NetrCharDevEnum",
srvsvc_dissect_netrchardevenum_rqst,
NULL},
{SRV_NETRCHARDEVGETINFO, "NetrCharDevGetInfo", NULL, NULL},
{SRV_NETRCHARDEVCONTROL, "NetrCharDevControl", NULL, NULL},
{SRV_NETRCHARDEVQENUM, "NetrCharDevQEnum", NULL, NULL},
@ -783,6 +1007,18 @@ proto_register_dcerpc_srvsvc(void)
{ &hf_srvsvc_server,
{ "Server", "srvsvc.server", FT_STRING, BASE_NONE,
NULL, 0x0, "Server Name", HFILL}},
{ &hf_srvsvc_chrdev,
{ "Char Device", "srvsvc.chrdev", FT_STRING, BASE_NONE,
NULL, 0x0, "Char Device Name", HFILL}},
{ &hf_srvsvc_user,
{ "User", "srvsvc.user", FT_STRING, BASE_NONE,
NULL, 0x0, "User Name", HFILL}},
{ &hf_srvsvc_chrdev_status,
{ "Status", "srvsvc.chrdev_status", FT_UINT32, BASE_HEX,
NULL, 0x0, "Char Device Status", HFILL}},
{ &hf_srvsvc_chrdev_time,
{ "Time", "srvsvc.chrdev_time", FT_UINT32, BASE_DEC,
NULL, 0x0, "Char Device Time?", HFILL}},
{ &hf_srvsvc_info_level,
{ "Info Level", "svrsvc.info_level", FT_UINT32,
BASE_DEC, NULL, 0x0, "Info Level", HFILL}},