5 个版本 (3 个破坏性更新)

0.4.0 2023年6月13日
0.3.1 2023年2月1日
0.3.0 2023年1月25日
0.2.0 2022年4月14日
0.1.0 2022年1月14日

#275 in Windows APIs

Download history 2605/week @ 2024-03-14 2005/week @ 2024-03-21 2452/week @ 2024-03-28 3418/week @ 2024-04-04 1843/week @ 2024-04-11 2858/week @ 2024-04-18 3062/week @ 2024-04-25 1482/week @ 2024-05-02 1887/week @ 2024-05-09 1921/week @ 2024-05-16 1675/week @ 2024-05-23 2646/week @ 2024-05-30 2366/week @ 2024-06-06 1691/week @ 2024-06-13 1590/week @ 2024-06-20 605/week @ 2024-06-27

6,728 每月下载次数
3 个 Crates 中使用 (2 个直接使用)

MIT/Apache

725KB
5K SLoC

ntfs Rust crate

crates.io docs.rs license: MIT OR Apache-2.0

由 Colin Finck <[email protected]>

使用 Rust 实现的低级 NTFS 文件系统库。

NTFS 是自 1993 年 Windows NT 3.1 版本以来所有 Windows 版本的默认文件系统。该 crate 面向 Windows 2000 一直到当前 Windows 11 中使用的 NTFS 3.x 版本。然而,预期基本功能与更早的版本兼容。

该 crate 与 no_std 兼容,因此可以从固件级别的代码使用到用户模式的应用程序。

ntfs-shell

ntfs-shell demo

此 crate 中的 ntfs-shell 示例用于演示所有库功能。使用它可以在任何细节级别上探索 NTFS 文件系统的内部结构,甚至包括您正在运行的 Windows 分区。没有任何人为的安全限制会阻止您访问文件和文件夹,提取它们的数据或备用数据流。该文件系统以只读方式打开,因此您可以安全地浏览挂载的文件系统,而不用担心数据损坏。这对于了解 Windows NTFS 驱动程序也很有帮助,例如找出其懒写器何时实际更新磁盘上的数据。

我最初编写 ntfs-shell 是为了自己舒适地在用户模式下开发库,然后在内核模式下运行代码之前在生产环境中运行代码。

要构建 ntfs-shell,只需克隆此仓库并调用

cargo build --example ntfs-shell --all-features

要运行它,请传递NTFS镜像路径(适用于所有操作系统)或分区路径(例如,在Windows上,只有具有管理员权限时才能使用 \\.\C:)到生成的 ntfs-shell 二进制文件。

调用 help 会显示所有支持的命令列表。使用 help COMMAND 可以查看该命令的语法。

大多数接受文件名的命令也接受NTFS文件记录号(如果以 / 预先加上)。此文件记录号可以是十进制或十六进制(如果以 0x 预先加上)。以下是一些示例

fileinfo Windows
fileinfo /146810
fileinfo /0x23d7a

库功能

  • 对于耐心不足的用户:方便的函数,可以将NTFS当作其他文件系统来处理,并使用 Read/Seek 特性来读取文件和目录。根据您的选择,您还可以在任何细节级别上探索文件系统。
  • 读取任意驻留和非驻留属性、属性列表中的属性以及通过多个属性列表条目连接的属性,包括稀疏属性数据。所有这些加在一起,可以读取任意大小和磁盘结构的文件数据和交替数据流。
  • 遍历NTFS属性的扁平“数据中心”视图,抽象出任何嵌套的属性列表。
  • 有效地在目录中查找文件,遵循文件系统的$Upcase表进行不区分大小写的搜索。
  • 按顺序迭代目录内容,时间复杂度为O(1)。
  • 利用Rust的类型系统以类型安全的方式处理各种NTFS索引。
  • 通过实现 Display 的自定义 NtfsError 类型来传播错误。在合理的地方,变体具有额外的字段,可以将任何错误定位到特定位置。
  • 即使在 no_std 环境中,也使用 alloc 实现了完整的功能。
  • 任何地方都没有使用 unsafe。需要时进行检查运算。
  • 平台和字节序无关性。

尚未支持

  • 任何写支持
  • 缓存以获得更好的性能
  • 压缩
  • 加密
  • 日志记录
  • 配额
  • 重解析点
  • 安全描述符

示例

以下示例将给定NTFS文件系统根目录中所有文件和文件夹的名称输出。
列表直接取自NTFS索引,因此按照NTFS理解的不区分大小写的字符串比较进行排序。

let mut ntfs = Ntfs::new(&mut fs).unwrap();
let root_dir = ntfs.root_directory(&mut fs).unwrap();
let index = root_dir.directory_index(&mut fs).unwrap();
let mut iter = index.entries();

while let Some(entry) = iter.next(&mut fs) {
    let entry = entry.unwrap();
    let file_name = entry.key().unwrap();
    println!("{}", file_name.name());
}

有关如何使用 ntfs 库的更多示例,请参阅 文档、测试和提供的 ntfs-shell 应用程序。

许可证

此crate受以下任一许可证的许可:

由您选择。

除非您明确说明,否则您有意提交给作品包含在内的任何贡献,根据Apache-2.0许可证定义,应按上述方式双许可,而无需任何额外的条款或条件。

其他资源

依赖项

~1.6–2.3MB
~43K SLoC