#异常 #硬件 #处理程序 #Windows #SEH

no-std microseh

结构化异常处理(SEH)的Rust实现

6个版本 (稳定版)

1.0.3 2024年2月22日
1.0.2 2024年2月12日
1.0.0 2023年12月13日
0.2.0 2023年9月21日
0.1.1 2022年10月26日

#93操作系统 分类中

Download history 2751/week @ 2024-03-13 1840/week @ 2024-03-20 2326/week @ 2024-03-27 1581/week @ 2024-04-03 2434/week @ 2024-04-10 1447/week @ 2024-04-17 2424/week @ 2024-04-24 2040/week @ 2024-05-01 2683/week @ 2024-05-08 3621/week @ 2024-05-15 5641/week @ 2024-05-22 5331/week @ 2024-05-29 3199/week @ 2024-06-05 2885/week @ 2024-06-12 2764/week @ 2024-06-19 2849/week @ 2024-06-26

每月 12,213 次下载

MIT 协议

24KB
488

MicroSEH 🔴


MicroSEH 是一个小型库,实现了Rust中的结构化异常处理(SEH),可以捕获和处理硬件异常。

为什么?

硬件异常是针对特定用例的非常强大的工具。其中一个用例是在运行时检测和处理非法指令。

实现

事实证明,在纯Rust中实现SEH有其自身的问题(如NAMAZSO在这篇文章中所述:https://engineering.zeroitlab.com/2022/03/13/rust-seh

此库采用不同的、更简单的方法,即使用一个调用Rust的 C 桩,并用 __try __except 块包装调用。

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
microseh = "1.0"

最小示例:在程序崩溃的情况下引用无效指针,并返回处理后的异常。

fn guarded() -> Result<(), Box<dyn Error>> {
    
    
    microseh::try_seh(|| unsafe {
        // Read from an unallocated memory region. (we create an aligned not-null
        // pointer to skip the checks in read_volatile that would raise a panic)
        core::ptr::read_volatile(core::mem::align_of::<i32>() as *const i32);
    })?;
}

访问异常数据:您可以获取异常的地址和寄存器转储。

if let Err(ex) = microseh::try_seh(|| unsafe {
    // *questionable life choices go here*
}) {
    println!("address: {:x}", ex.address());
    println!("rax: {:x}", ex.registers().rax());
}

有关更多示例和实际用例,请访问示例 目录!

可移植性

SEH 是由Microsoft开发的C语言的扩展,在Microsoft Visual C++(MSVC)使用时仅在Windows上可用。

MicroSEH 与以下架构的Windows平台兼容并已过测试: x86x86_64aarch64

无运行时依赖

~180KB