From b4104796912826601621feb5d71ca369768f0627 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Sun, 16 Jun 2002 14:29:15 +0000 Subject: Added dissectors for the requests for functions NetrCharDevGetInfo, NetrCharDevControl, NetrCharDevQEnum. svn path=/trunk/; revision=5684 --- packet-dcerpc-srvsvc.c | 320 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file 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 * 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 @@ -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}}, -- cgit v1.2.1