summaryrefslogtreecommitdiff
path: root/packet-dcerpc-srvsvc.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2002-06-16 14:29:15 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2002-06-16 14:29:15 +0000
commitb4104796912826601621feb5d71ca369768f0627 (patch)
tree04d654344d4e14717b14691db9212fea10422dc7 /packet-dcerpc-srvsvc.c
parentcaad19760a2da5dd3ed8f7b92f5805a1919d7fed (diff)
downloadwireshark-b4104796912826601621feb5d71ca369768f0627.tar.gz
Added dissectors for the requests for functions NetrCharDevGetInfo, NetrCharDevControl, NetrCharDevQEnum.
svn path=/trunk/; revision=5684
Diffstat (limited to 'packet-dcerpc-srvsvc.c')
-rw-r--r--packet-dcerpc-srvsvc.c320
1 files changed, 308 insertions, 12 deletions
diff --git a/packet-dcerpc-srvsvc.c b/packet-dcerpc-srvsvc.c
index c0b28cf769..47ffa7aecb 100644
--- a/packet-dcerpc-srvsvc.c
+++ b/packet-dcerpc-srvsvc.c
@@ -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.19 2002/06/16 11:55:46 sahlberg Exp $
+ * $Id: packet-dcerpc-srvsvc.c,v 1.20 2002/06/16 14:29:15 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -49,9 +49,14 @@ 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_chrqpri = -1;
+static int hf_srvsvc_chrqnumusers = -1;
+static int hf_srvsvc_chrqnumahead = -1;
static int hf_srvsvc_chrdev = -1;
+static int hf_srvsvc_chrdevs = -1;
static int hf_srvsvc_chrdev_time = -1;
static int hf_srvsvc_chrdev_status = -1;
+static int hf_srvsvc_chrdev_opcode = -1;
static int hf_srvsvc_info_level = -1;
static int hf_srvsvc_info = -1;
static int hf_srvsvc_rc = -1;
@@ -91,7 +96,7 @@ static e_uuid_t uuid_dcerpc_srvsvc = {
{ 0x12, 0x78, 0x5a, 0x47, 0xbf, 0x6e, 0xe1, 0x88 }
};
-static guint16 ver_dcerpc_srvsvc = 3;
+static guint16 ver_dcerpc_srvsvc = 0; /*!!!!! 3*/
static int
srvsvc_dissect_ENUM_HANDLE(tvbuff_t *tvb, int offset,
@@ -252,13 +257,6 @@ srvsvc_dissect_CHARDEV_ENUM_UNION(tvbuff_t *tvb, int offset,
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;
@@ -336,11 +334,288 @@ srvsvc_dissect_netrchardevenum_rqst(tvbuff_t *tvb, int offset,
}
+/* XXX dont know the out parameters. only the in parameters.
+ *
+ * IDL long NetrCharDevEnum(
+ * IDL [in] [string] [unique] wchar_t *ServerName,
+ * IDL [in] [string] [ref] wchar_t *DevName,
+ * IDL [in] long Level
+ * IDL );
+*/
+static int
+srvsvc_dissect_netrchardevgetinfo_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_pointer_UNICODE_STRING,
+ NDR_POINTER_REF, "Char Device",
+ hf_srvsvc_chrdev, 0);
+
+ offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
+ hf_srvsvc_info_level, 0);
+
+ return offset;
+}
+/* XXX dont know the out parameters. only the in parameters.
+ *
+ * IDL long NetrCharDevControl(
+ * IDL [in] [string] [unique] wchar_t *ServerName,
+ * IDL [in] [string] [ref] wchar_t *DevName,
+ * IDL [in] long Opcode
+ * IDL );
+*/
+static int
+srvsvc_dissect_netrchardevcontrol_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_pointer_UNICODE_STRING,
+ NDR_POINTER_REF, "Char Device",
+ hf_srvsvc_chrdev, 0);
+
+ offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
+ hf_srvsvc_chrdev_opcode, 0);
+
+ return offset;
+}
+
+
+
+/*
+ * IDL typedef struct {
+ * IDL [string] [unique] wchar_t *dev;
+ * IDL } CHARDEVQ_INFO_0;
+ */
+static int
+srvsvc_dissect_CHARDEVQ_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 QDevice",
+ hf_srvsvc_chrdev, 0);
+
+ return offset;
+}
+static int
+srvsvc_dissect_CHARDEVQ_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_CHARDEVQ_INFO_0);
+
+ return offset;
+}
+
+/*
+ * IDL typedef struct {
+ * IDL long EntriesRead;
+ * IDL [size_is(EntriesRead)] [unique] CHARDEVQ_INFO_0 *devs;
+ * IDL } CHARDEVQ_INFO_0_CONTAINER;
+ */
+static int
+srvsvc_dissect_CHARDEVQ_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_CHARDEVQ_INFO_0_array, NDR_POINTER_UNIQUE,
+ "CHARDEVQ_INFO_0 array:", -1, 0);
+
+ return offset;
+}
+
+/*
+ * IDL typedef struct {
+ * IDL [string] [unique] wchar_t *dev;
+ * IDL long priority;
+ * IDL [string] [unique] wchar_t *devs;
+ * IDL long num_users;
+ * IDL long num_ahead;
+ * IDL } CHARDEVQ_INFO_1;
+ */
+static int
+srvsvc_dissect_CHARDEVQ_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_chrqpri, 0);
+
+ offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
+ srvsvc_dissect_pointer_UNICODE_STRING,
+ NDR_POINTER_UNIQUE, "Char Devices",
+ hf_srvsvc_chrdevs, 0);
+
+ offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
+ hf_srvsvc_chrqnumusers, 0);
+
+ offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
+ hf_srvsvc_chrqnumahead, 0);
+
+ return offset;
+}
+static int
+srvsvc_dissect_CHARDEVQ_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_CHARDEVQ_INFO_1);
+
+ return offset;
+}
+
+/*
+ * IDL typedef struct {
+ * IDL long EntriesRead;
+ * IDL [size_is(EntriesRead)] [unique] CHARDEVQ_INFO_1 *devs;
+ * IDL } CHARDEVQ_INFO_1_CONTAINER;
+ */
+static int
+srvsvc_dissect_CHARDEVQ_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_CHARDEVQ_INFO_1_array, NDR_POINTER_UNIQUE,
+ "CHARDEVQ_INFO_1 array:", -1, 3);
+
+ return offset;
+}
+
+/*
+ * IDL typedef [switch_type(long)] union {
+ * IDL [case(0)] [unique] CHARDEVQ_INFO_0_CONTAINER *dev0;
+ * IDL [case(1)] [unique] CHARDEVQ_INFO_1_CONTAINER *dev1;
+ * IDL } CHARDEVQ_ENUM_UNION;
+ */
+static int
+srvsvc_dissect_CHARDEVQ_ENUM_UNION(tvbuff_t *tvb, int offset,
+ packet_info *pinfo, proto_tree *tree,
+ char *drep)
+{
+ guint32 level;
+
+ 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_CHARDEVQ_INFO_0_CONTAINER,
+ NDR_POINTER_UNIQUE, "CHARDEVQ_INFO_0_CONTAINER:",
+ -1, 0);
+ break;
+ case 1:
+ offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
+ srvsvc_dissect_CHARDEVQ_INFO_1_CONTAINER,
+ NDR_POINTER_UNIQUE, "CHARDEVQ_INFO_1_CONTAINER:",
+ -1, 0);
+ break;
+ }
+
+ return offset;
+}
+
+/*
+ * IDL typedef struct {
+ * IDL long Level;
+ * IDL CHARDEVQ_ENUM_UNION devs;
+ * IDL } CHARDEVQ_ENUM_STRUCT;
+ */
+static int
+srvsvc_dissect_CHARDEVQ_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_CHARDEVQ_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] [string] [unique] wchar_t *UserName,
+ * IDL [in] [ref] CHARDEVQ_ENUM_STRUCT *devs,
+ * IDL [in] long PreferredMaximumLength,
+ * IDL [in] [unique] long *ResumeHandle
+ * IDL );
+*/
+static int
+srvsvc_dissect_netrchardevqenum_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_pointer_UNICODE_STRING,
+ NDR_POINTER_UNIQUE, "User",
+ hf_srvsvc_user, 0);
+
+ offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
+ srvsvc_dissect_CHARDEVQ_ENUM_STRUCT,
+ NDR_POINTER_REF, "CHARDEVQ_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;
@@ -939,9 +1214,15 @@ static dcerpc_sub_dissector dcerpc_srvsvc_dissectors[] = {
{SRV_NETRCHARDEVENUM, "NetrCharDevEnum",
srvsvc_dissect_netrchardevenum_rqst,
NULL},
- {SRV_NETRCHARDEVGETINFO, "NetrCharDevGetInfo", NULL, NULL},
- {SRV_NETRCHARDEVCONTROL, "NetrCharDevControl", NULL, NULL},
- {SRV_NETRCHARDEVQENUM, "NetrCharDevQEnum", NULL, NULL},
+ {SRV_NETRCHARDEVGETINFO, "NetrCharDevGetInfo",
+ srvsvc_dissect_netrchardevgetinfo_rqst,
+ NULL},
+ {SRV_NETRCHARDEVCONTROL, "NetrCharDevControl",
+ srvsvc_dissect_netrchardevcontrol_rqst,
+ NULL},
+ {SRV_NETRCHARDEVQENUM, "NetrCharDevQEnum",
+ srvsvc_dissect_netrchardevqenum_rqst,
+ NULL},
{SRV_NETRCHARDEVQGETINFO, "NetrCharDevQGetInfo", NULL, NULL},
{SRV_NETRCHARDEVQSETINFO, "NetrCharDevQSetInfo", NULL, NULL},
{SRV_NETRCHARDEVQPURGE, "NetrCharDevQPurge", NULL, NULL},
@@ -1009,12 +1290,27 @@ proto_register_dcerpc_srvsvc(void)
{ &hf_srvsvc_chrdev,
{ "Char Device", "srvsvc.chrdev", FT_STRING, BASE_NONE,
NULL, 0x0, "Char Device Name", HFILL}},
+ { &hf_srvsvc_chrdevs,
+ { "Char Devices", "srvsvc.chrdevs", FT_STRING, BASE_NONE,
+ NULL, 0x0, "Char Device Names", 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_chrqpri,
+ { "Priority", "srvsvc.chrqdev_pri", FT_UINT32, BASE_HEX,
+ NULL, 0x0, "Char QDevice Priority", HFILL}},
+ { &hf_srvsvc_chrqnumusers,
+ { "Num Users", "srvsvc.chrqdev_numusers", FT_UINT32, BASE_DEC,
+ NULL, 0x0, "Char QDevice Number Of Users", HFILL}},
+ { &hf_srvsvc_chrqnumahead,
+ { "Num Ahead", "srvsvc.chrqdev_numahead", FT_UINT32, BASE_DEC,
+ NULL, 0x0, "", HFILL}},
+ { &hf_srvsvc_chrdev_opcode,
+ { "Opcode", "srvsvc.chrdev_opcode", FT_UINT32, BASE_HEX,
+ NULL, 0x0, "Opcode to apply to the Char Device", HFILL}},
{ &hf_srvsvc_chrdev_time,
{ "Time", "srvsvc.chrdev_time", FT_UINT32, BASE_DEC,
NULL, 0x0, "Char Device Time?", HFILL}},