aboutsummaryrefslogtreecommitdiffstats
path: root/packet-dcerpc-srvsvc.c
diff options
context:
space:
mode:
authorsharpe <sharpe@f5534014-38df-0310-8fa8-9805f1628bb7>2002-05-27 04:11:06 +0000
committersharpe <sharpe@f5534014-38df-0310-8fa8-9805f1628bb7>2002-05-27 04:11:06 +0000
commit7fa2784d7db4f61d383e8ff3ac106c9fa3173520 (patch)
tree0ef9dbae7ce1b7e394e143c055d94cb99585d347 /packet-dcerpc-srvsvc.c
parentc1cdd0c2b13ef7d7d272ec5756068d764320d336 (diff)
Account for hidden share types in share_types.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@5572 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'packet-dcerpc-srvsvc.c')
-rw-r--r--packet-dcerpc-srvsvc.c152
1 files changed, 119 insertions, 33 deletions
diff --git a/packet-dcerpc-srvsvc.c b/packet-dcerpc-srvsvc.c
index b4885f7d8a..f6cc710150 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.9 2002/05/25 10:26:28 guy Exp $
+ * $Id: packet-dcerpc-srvsvc.c,v 1.10 2002/05/27 04:11:06 sharpe Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -102,9 +102,9 @@ srvsvc_dissect_pointer_UNICODE_STRING(tvbuff_t *tvb, int offset,
}
static int
-srvsvc_dissect_SHARE_INFO_struct(tvbuff_t *tvb, int offset,
- packet_info *pinfo, proto_tree *tree,
- char *drep)
+srvsvc_dissect_SHARE_INFO_1_struct(tvbuff_t *tvb, int offset,
+ packet_info *pinfo, proto_tree *tree,
+ char *drep)
{
dcerpc_info *di = pinfo->private_data;
int level = *(int *)(di->private_data);
@@ -385,7 +385,7 @@ srvsvc_dissect_net_share_get_info_reply(tvbuff_t *tvb, int offset,
di->private_data = &level; /* Pass this on */
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
- srvsvc_dissect_SHARE_INFO_struct,
+ srvsvc_dissect_SHARE_INFO_1_struct,
NDR_POINTER_UNIQUE, "Info", -1, 0);
offset = dissect_ntstatus(tvb, offset, pinfo, tree, drep,
@@ -394,17 +394,35 @@ srvsvc_dissect_net_share_get_info_reply(tvbuff_t *tvb, int offset,
}
static int
-srvsvc_dissect_pointer_SHARE_INFO_CTR_struct(tvbuff_t *tvb, int offset,
- packet_info *pinfo,
- proto_tree *tree,
- char *drep)
+srvsvc_dissect_pointer_SHARE_INFO_item(tvbuff_t *tvb, int offset,
+ packet_info *pinfo,
+ proto_tree *tree,
+ char *drep)
{
dcerpc_info *di = pinfo->private_data;
srvsvc_info *si = di->private_data;
- if (si->num_entries == 0) { /* XXX - FIXME, num_pointers */
+ if (di->conformant_run) {
+
+ return offset;
+
+ }
+
+ fprintf(stderr, "Switch_value: %0X\n", si->switch_value);
+
+ switch (si->switch_value) {
+ case 1:
+ offset = srvsvc_dissect_SHARE_INFO_1_struct(tvb, offset, pinfo, tree,
+ drep);
+ break;
+
+ case 2:
+
+ break;
- return offset;
+ case 502:
+
+ break;
}
@@ -412,53 +430,107 @@ srvsvc_dissect_pointer_SHARE_INFO_CTR_struct(tvbuff_t *tvb, int offset,
}
static int
-srvsvc_dissect_ENUM_HANDLE(tvbuff_t *tvb, int offset,
- packet_info *pinfo, proto_tree *tree,
- char *drep)
+srvsvc_dissect_pointer_SHARE_INFO_array(tvbuff_t *tvb, int offset,
+ packet_info *pinfo,
+ proto_tree *tree,
+ char *drep)
{
+ dcerpc_info *di = pinfo->private_data;
+ srvsvc_info *si = di->private_data;
- offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
- hf_srvsvc_enum_handle, 0);
+ /* Now, dissect the rest of this structure ... */
+
+ fprintf(stderr, "Info Level: %0d\n", si->switch_value);
+
+ offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
+ srvsvc_dissect_pointer_SHARE_INFO_item);
+
return offset;
+}
+
+static int
+srvsvc_dissect_pointer_SHARE_INFO_struct(tvbuff_t *tvb, int offset,
+ packet_info *pinfo,
+ proto_tree *tree,
+ char *drep)
+{
+ dcerpc_info *di = pinfo->private_data;
+
+ if (di->conformant_run) {
+ return offset;
+
+ }
+ fprintf(stderr, "About to do the pointer for Info1\n");
+ offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
+ srvsvc_dissect_pointer_SHARE_INFO_array,
+ NDR_POINTER_UNIQUE, "Share Info1",
+ -1, 0);
+ return offset;
}
static int
-srvsvc_dissect_netshareenum_all_rqst(tvbuff_t *tvb, int offset,
- packet_info *pinfo, proto_tree *tree,
+srvsvc_dissect_SHARE_INFO_CTR_struct(tvbuff_t *tvb, int offset,
+ packet_info *pinfo,
+ proto_tree *tree,
char *drep)
{
guint32 num_entries = 0, num_pointers = 0, switch_value;
+ int i;
dcerpc_info *di = pinfo->private_data;
srvsvc_info *si = g_malloc(sizeof(srvsvc_info)); /* XXX - Fixme */
+
+ if (di->conformant_run) {
+
+ return offset;
+
+ }
di->private_data = si;
- offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
- srvsvc_dissect_pointer_UNICODE_STRING,
- NDR_POINTER_UNIQUE, "Share",
- hf_srvsvc_share, 0);
-
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_info_level, 0);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_switch_value, &switch_value);
+ si->switch_value = switch_value;
+
offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
- srvsvc_dissect_pointer_SHARE_INFO_CTR_struct,
- NDR_POINTER_UNIQUE, "Share Info",
- hf_srvsvc_share_info, 0);
+ srvsvc_dissect_pointer_SHARE_INFO_struct,
+ NDR_POINTER_PTR, "Share Info0",
+ -1, 0);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
- hf_srvsvc_num_entries, &num_entries);
+ hf_srvsvc_num_entries, &num_entries);
+ fprintf(stderr, "Done the num entries after Info 0\n");
+ return 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_num_pointers, &num_pointers);
+ hf_srvsvc_enum_handle, 0);
+ return offset;
- si->switch_value = switch_value;
- si->num_entries = num_entries;
- si->num_pointers = num_pointers;
+}
+
+static int
+srvsvc_dissect_netshareenum_all_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, "Share",
+ hf_srvsvc_share, 0);
+
+ offset = srvsvc_dissect_SHARE_INFO_CTR_struct(tvb, offset, pinfo, tree,
+ drep);
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_srvsvc_preferred_len, 0);
@@ -475,6 +547,20 @@ srvsvc_dissect_netshareenum_all_reply(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree,
char *drep)
{
+ int num_entries = 0;
+ dcerpc_info *di = pinfo->private_data;
+
+ offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
+ srvsvc_dissect_SHARE_INFO_CTR_struct,
+ NDR_POINTER_REF, "Shares", -1, 0);
+
+ fprintf(stderr, "About to do the second num entries\n");
+ offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
+ hf_srvsvc_num_entries, &num_entries);
+
+ offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
+ srvsvc_dissect_ENUM_HANDLE,
+ NDR_POINTER_REF, "Enum Handle", -1, 0);
return offset;
}
@@ -585,8 +671,8 @@ proto_register_dcerpc_srvsvc(void)
{ "Number of entries", "srvsvc.share.num_entries", FT_UINT32,
BASE_DEC, NULL, 0x0, "Number of Entries", HFILL}},
{ &hf_srvsvc_num_pointers,
- { "Number of pointers", "srvsvc.share.num_pointers", FT_UINT32,
- BASE_DEC, NULL, 0x0, "Number of Pointers", HFILL}},
+ { "Pointer entries", "srvsvc.share.pointer_entries", FT_UINT32,
+ BASE_DEC, NULL, 0x0, "Pointer Entries", HFILL}},
{ &hf_srvsvc_preferred_len,
{ "Preferred length", "srvsvc.preferred_len", FT_UINT32,
BASE_DEC, NULL, 0x0, "Preferred Length", HFILL}},