2个不稳定版本
0.2.0 | 2021年11月10日 |
---|---|
0.1.0 | 2021年2月21日 |
#120 in Windows API
每月561次下载
160KB
4K SLoC
nt-hive
作者:Colin Finck <[email protected]>
nt-hive Rust包提供了一种舒适且安全的接口,用于访问存储在hive文件中的键、值和数据。Hive文件位于 C:\Windows\system32\config
,并存储通常称为Windows注册表的内容。此包支持从Windows NT 4.0到当前Windows 10所使用的hive格式。
nt-hive作为Rust引导加载程序项目的一部分进行了开发。因此,其当前的功能集与ReactOS/Windows引导加载程序的需求相一致。
功能
- 支持从包含hive数据的任何字节数组(即实现了
zerocopy::ByteSlice
)中读取键、值和数据。 - 基本内存中的hive数据修改(如引导加载程序所需的)。
- 键和值的迭代器,以实现惯用的Rust代码。
- 函数以尽可能高效的方式查找特定子键、子键路径或值(利用二分搜索键)。
- 通过实现
Display
的自定义NtHiveError
类型进行错误传播。
由于引导加载程序可能会在某些时候遇到损坏的hive文件,nt-hive在所有地方都输出精确的错误,这些错误引用了有问题的数据字节。 - 即使在
no_std
环境中也提供完整的功能(带有alloc
,没有alloc
有一些限制)。 - 在所有地方进行静态借用检查。没有互斥锁或运行时借用。
- 尽可能使用零拷贝数据表示。
- 在任何地方都不使用
unsafe
。在需要的地方进行受检算术。 - 平台和字节序无关。
非目标
目前对nt-hive来说,完全的写入支持不是一个目标。这需要完全不同的架构,其中nt-hive将hive加载到链接的内存数据结构中,跟踪更改,并将更改写回磁盘(可能扩展磁盘上的文件)。目前对只读访问的侧重允许有更简单的架构。
示例
以下示例从SYSTEM hive的ControlSet001\Control\ServiceGroupOrder子键中读取List值,这是启动过程中实际发生的事情。
let mut buffer = Vec::new();
File::open("SYSTEM").unwrap().read_to_end(&mut buffer).unwrap();
let hive = Hive::new(buffer.as_ref()).unwrap();
let root_key_node = hive.root_key_node().unwrap();
let key_node = root_key_node.subpath("ControlSet001\\Control\\ServiceGroupOrder").unwrap().unwrap();
let key_value = key_node.value("List").unwrap().unwrap();
let multi_sz_data = key_value.multi_string_data();
if let Ok(vec) = multi_sz_data {
println!("Vector of REG_MULTI_SZ lines: {:?}", vec);
}
查看文档、测试和提供的readhive示例应用程序,了解更多关于如何使用nt-hive的想法。
贡献和许可证
目前更倾向于以错误报告的形式进行贡献。如果您遇到错误、意外的panic或潜在的不安全计算,请提交错误报告。
nt-hive在GNU通用公共许可证2.0版或(根据您的选择)任何更新版本下可用。这个许可证非常适合我计划使用nt-hive的项目,并且应该允许集成到任何开源项目中。
但是,如果您给我一个合理的理由,我可能会稍后将其置于更宽松的许可证之下。
由于重新授权需要每个贡献者的许可,我只接受明确置于创意共享零(CC0)下的代码贡献。如果您没有这个选择,您仍然非常欢迎在错误报告中提出您的更改建议。
其他资源
依赖关系
~1.2–1.8MB
~31K SLoC