a.rs: 定义宏
#[derive(Debug,PartialEq)]
pub struct SmbResponseReadAndXRecord<'a> {
pub len: u32,
pub data: &'a[u8],
}
named!(pub parse_smb_read_andx_response_record<SmbResponseReadAndXRecord>,
do_parse!(
wct: le_u8
>> andx_command: le_u8 // 问题1:这里的>>是什么意思?
>> take!(1) // reserved
>> andx_offset: le_u16
>> take!(6)
>> data_len_low: le_u16
>> data_offset: le_u16
>> data_len_high: le_u32
>> take!(6) // reserved
>> bcc: le_u16
>> padding: cond!(bcc > data_len_low, take!(bcc - data_len_low)) // TODO figure out how this works with data_len_high
>> file_data: rest
>> (SmbResponseReadAndXRecord { // 这里应该是生成一个SmbResponseReadAndXRecord类型的变量,并初始化其中的2个字段
len: (((data_len_high as u32) << 16)|data_len_low as u32),
data:file_data,
}))
);
b.rs: 调用宏
pub fn smb1_read_response_record<'b>(state: &mut SMBState, r: &SmbRecord<'b>)
{
let mut events : Vec<SMBEvent> = Vec::new();
if r.nt_status == SMB_NTSTATUS_SUCCESS {
match parse_smb_read_andx_response_record(r.data) { // 调用了前面定义的宏
IResult::Done(_, rd) => { // 问题2:这里的rd分别对应上面宏定义中最后一个>>部分的生成的SmbResponseReadAndXRecord类型的变量。rd前面的通配符_是什么用法?
SCLogDebug!("SMBv1: read response => {:?}", rd);
let fid_key = SMBCommonHdr::from1(r, SMBHDR_TYPE_OFFSET);
let (offset, file_fid) = match state.ssn2vecoffset_map.remove(&fid_key) {
Some(o) => (o.offset, o.guid),
None => {
SCLogDebug!("SMBv1 READ response: reply to unknown request: left {} {:?}",
rd.len - rd.data.len() as u32, rd);
state.set_skip(STREAM_TOCLIENT, rd.len, rd.data.len() as u32);
return;
},
};
1
共 2 条评论, 1 页
评论区
写评论非常感谢。 对以下内容的回复:
这是这个宏的自定义语法。跟rust没关系,你去查这个宏的文档,或者实现。