diff options
author | Richard Sharpe <rsharpe@samba.org> | 2015-07-26 20:13:57 -0700 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2015-10-02 03:19:23 +0000 |
commit | b6d03e5b2672df9c81221e399702cb8af026745a (patch) | |
tree | 755ee96fed68ecf57894c6a6bbbe9f4a826d1362 /epan/dissectors | |
parent | 8976b783928df51db7045745102fe3ced864821d (diff) |
Add support for the FSCTL_QUERY_FILE_REGION FSCTL.
Found when looking at support for HyperV under Samba.
Change-Id: I78d7d0c68c7821c952316beb6fc34cd047d146aa
Reviewed-on: https://code.wireshark.org/review/9803
Reviewed-by: Michael Mann <mmann78@netscape.net>
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-smb2.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/epan/dissectors/packet-smb2.c b/epan/dissectors/packet-smb2.c index 10b366b517..7c8d19cee9 100644 --- a/epan/dissectors/packet-smb2.c +++ b/epan/dissectors/packet-smb2.c @@ -168,6 +168,11 @@ static int hf_smb2_write_remaining = -1; static int hf_smb2_read_length = -1; static int hf_smb2_read_remaining = -1; static int hf_smb2_file_offset = -1; +static int hf_smb2_qfr_length = -1; +static int hf_smb2_qfr_usage = -1; +static int hf_smb2_qfr_flags = -1; +static int hf_smb2_qfr_total_region_entry_count = -1; +static int hf_smb2_qfr_region_entry_count = -1; static int hf_smb2_read_data = -1; static int hf_smb2_disposition_delete_on_close = -1; static int hf_smb2_create_disposition = -1; @@ -459,6 +464,7 @@ static gint ett_smb2_lock_flags = -1; static gint ett_smb2_transform_enc_alg = -1; static gint ett_smb2_buffercode = -1; static gint ett_smb2_ioctl_network_interface_capabilities = -1; +static gint ett_qfr_entry = -1; static expert_field ei_smb2_invalid_length = EI_INIT; static expert_field ei_smb2_bad_response = EI_INIT; @@ -1272,6 +1278,11 @@ static const true_false_string tfs_smb2_ioctl_network_interface_capability_rdma "This interface does not support RDMA" }; +static const value_string file_region_usage_vals[] = { + { 0x00000001, "FILE_REGION_USAGE_VALID_CACHED_DATA" }, + { 0, NULL } +}; + static const value_string originator_flags_vals[] = { { 1, "SVHDX_ORIGINATOR_PVHDPARSER" }, { 4, "SVHDX_ORIGINATOR_VHDMP" }, @@ -4651,6 +4662,60 @@ dissect_smb2_FSCTL_PIPE_WAIT(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree } static void +dissect_smb2_FSCTL_QUERY_FILE_REGIONS(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int offset _U_, gboolean data_in) +{ + + if (data_in) { + proto_tree_add_item(tree, hf_smb2_file_offset, tvb, offset, 8, ENC_LITTLE_ENDIAN); + offset += 8; + + proto_tree_add_item(tree, hf_smb2_qfr_length, tvb, offset, 8, ENC_LITTLE_ENDIAN); + offset += 8; + + proto_tree_add_item(tree, hf_smb2_qfr_usage, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + + proto_tree_add_item(tree, hf_smb2_reserved, tvb, offset, 4, ENC_NA); + offset += 4; + } else { + guint32 entry_count = 0; + + proto_tree_add_item(tree, hf_smb2_qfr_flags, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + + proto_tree_add_item(tree, hf_smb2_qfr_total_region_entry_count, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + + proto_tree_add_item_ret_uint(tree, hf_smb2_qfr_region_entry_count, tvb, offset, 4, ENC_LITTLE_ENDIAN, &entry_count); + offset += 4; + + proto_tree_add_item(tree, hf_smb2_reserved, tvb, offset, 4, ENC_NA); + offset += 4; + + while (entry_count && tvb_reported_length_remaining(tvb, offset)) { + proto_tree *sub_tree; + proto_item *sub_item; + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, 24, ett_qfr_entry, &sub_item, "Entry"); + + proto_tree_add_item(sub_tree, hf_smb2_file_offset, tvb, offset, 8, ENC_LITTLE_ENDIAN); + offset += 8; + + proto_tree_add_item(sub_tree, hf_smb2_qfr_length, tvb, offset, 8, ENC_LITTLE_ENDIAN); + offset += 8; + + proto_tree_add_item(sub_tree, hf_smb2_qfr_usage, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + + proto_tree_add_item(sub_tree, hf_smb2_reserved, tvb, offset, 4, ENC_NA); + offset += 4; + + entry_count--; + } + } +} + +static void dissect_smb2_FSCTL_LMR_REQUEST_RESILIENCY(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean data_in) { /* There is no out data */ @@ -5202,6 +5267,9 @@ dissect_smb2_ioctl_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro case 0x0009C040: /* FSCTL_SET_COMPRESSION */ dissect_smb2_FSCTL_SET_COMPRESSION(tvb, pinfo, tree, 0, data_in); break; + case 0x00090284: /* FSCTL_QUERY_FILE_REGIONS */ + dissect_smb2_FSCTL_QUERY_FILE_REGIONS(tvb, pinfo, tree, 0, data_in); + break; case 0x0009C280: /* FSCTL_SET_INTEGRITY_INFORMATION request or response */ dissect_smb2_FSCTL_SET_INTEGRITY_INFORMATION(tvb, pinfo, tree, 0, data_in); break; @@ -7906,6 +7974,26 @@ proto_register_smb2(void) { "File Offset", "smb2.file_offset", FT_UINT64, BASE_DEC, NULL, 0, NULL, HFILL }}, + { &hf_smb2_qfr_length, + { "Length", "smb2.qfr_length", FT_UINT64, BASE_DEC, + NULL, 0, NULL, HFILL }}, + + { &hf_smb2_qfr_usage, + { "Desired Usage", "smb2.qfr_usage", FT_UINT32, BASE_HEX, + VALS(file_region_usage_vals), 0, NULL, HFILL }}, + + { &hf_smb2_qfr_flags, + { "Flags", "smb2.qfr_flags", FT_UINT32, BASE_HEX, + NULL, 0, NULL, HFILL }}, + + { &hf_smb2_qfr_total_region_entry_count, + { "Total Region Entry Count", "smb2.qfr_tot_region_entry_count", FT_UINT32, BASE_HEX, + NULL, 0, NULL, HFILL }}, + + { &hf_smb2_qfr_region_entry_count, + { "Region Entry Count", "smb2.qfr_region_entry_count", FT_UINT32, BASE_HEX, + NULL, 0, NULL, HFILL }}, + { &hf_smb2_security_blob, { "Security Blob", "smb2.security_blob", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }}, @@ -9059,6 +9147,7 @@ proto_register_smb2(void) &ett_smb2_transform_enc_alg, &ett_smb2_buffercode, &ett_smb2_ioctl_network_interface_capabilities, + &ett_qfr_entry, }; static ei_register_info ei[] = { |