< 返回版块

Syllinia 发表于 2020-05-18 16:21

Tags:宏

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;
                    },
                };

评论区

写评论
作者 Syllinia 2020-05-18 17:57

非常感谢。 对以下内容的回复:

Mike Tang 2020-05-18 17:26

这是这个宏的自定义语法。跟rust没关系,你去查这个宏的文档,或者实现。

1 共 2 条评论, 1 页