1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use std::{error, fmt, result};

#[derive(Debug)]
pub enum Error {
    /// 越界错误

    /// 比如:

    /// rva 没有出现在 headers 和 sections 中

    Bounds,
    /// 零填充区错误

    /// 这个发生在 pe 文件中 VirtualSize > SizeOfRawData 时,

    /// 在 ImageBuffer 状态下, 系统拉伸 pe 文件, VirtualSize 多出来的部分被 0 填充.

    /// 我们去引用这部分的地址时就触发这个错误.

    /// 可以看下 Pe trait 中的 rva_to_foa() 方法

    ZeroFill,
    /// 溢出错误

    Overflow,
    /// 地址无法映射错误

    /// 一般出现在 foa 转 rva 时, 当文件地址指向 VirtualSize 和 SizeOfRawData 之间时,

    /// 这块地方是和内存映像没有映射关系的.

    Unmapped,
}

impl Error {
    fn to_str(&self) -> &'static str {
        match self {
            Error::Bounds => "Error::Bounds 越界错误",
            Error::ZeroFill => "Error::ZeroFill 零填充区错误",
            Error::Overflow => "Error::Overflow 溢出错误",
            Error::Unmapped => "Error::Unmapped 无法映射错误",
        }
    }
}

impl fmt::Display for Error {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.write_str(self.to_str())
    }
}

impl error::Error for Error {}

pub type Result<T> = result::Result<T, Error>;