1个不稳定版本

0.1.0 2024年5月30日

#641 in 编码

MIT许可证

51KB
1K SLoC

Regashii

Regashii是一个Rust包,允许您反序列化Windows Regedit *.reg文件。

设计

  • 此包旨在尽可能与Regedit本身一样具有容错性。Regedit通常会忽略它无法处理的行,甚至在某些位置忽略垃圾信息(例如,键名之后)。当您使用此包解析*.reg文件时,输出应包括Regedit实际导入的键/值。

  • 另一方面,如果Regedit会忽略某些文本,那么此包不会将其包括在解析输出中。此包不保留格式或注释。

  • 此包可以从字符串数据(反)序列化,或者它可以为您读取/写入文件。Regedit根据导出格式使用UTF-8或UTF-16,此包会相应地自动处理。

  • 此包尝试以与Regedit兼容的方式处理各种边缘情况。这包括

    • 保留Regedit愿意导入的无效值(例如,具有错误字节数的4字节hex(4) dword值)
    • 如果字符串值包含非法字符,则将其序列化为hex(1)字节
    • 处理可能或可能不空终止的字符串

    如果您发现处理不当的边缘情况,请报告。

示例

读取

use regashii::{Key, Registry, Value};

let registry = Registry::deserialize_file("sample.reg").unwrap();
for (key_name, key) in registry.keys() {
    match key {
        Key::Delete => {
            // On import, Regedit would delete this key
        },
        Key::Add(values) => {
            // On import, Regedit would add this key and its values
            for (value_name, value) in values {
                match value {
                    Value::Delete => { /* This value would be deleted */ },
                    Value::Sz(string) => { /* This value would be added */ }
                    _ => { /* and so on */},
                }
            }
        },
        Key::Replace(values) => {
            // On import, Regedit would delete and re-add this key and its values
            for (value_name, value) in values {
                // ...
            }
        },
    }
}

写入

use regashii::{Format, Key, Registry, Value, ValueName};

let registry = Registry::new(Format::Regedit5)
    .with(
        r"HKEY_CURRENT_USER\Software\Foo",
        Key::new()
            .with(ValueName::Default, Value::Sz("some string".to_string()))
            .with("this is a dword", Value::Dword(255)),
    );

registry.serialize_file("sample.reg").unwrap();

依赖关系

~3–4.5MB
~83K SLoC