MCPcopy Index your code
hub / github.com/ColinFinck/ntfs

github.com/ColinFinck/ntfs @0.4.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release 0.4.0 ↗ · + Follow
413 symbols 1,059 edges 34 files 179 documented · 43%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

ntfs Rust crate

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

by Colin Finck <colin@reactos.org>

A low-level NTFS filesystem library implemented in Rust.

NTFS is the primary filesystem in all versions of Windows (since Windows NT 3.1 in 1993). This crate is geared towards the NTFS 3.x versions used in Windows 2000 up to the current Windows 11. However, the basics are expected to be compatible to even earlier versions.

The crate is no_std-compatible and therefore usable from firmware-level code up to user-mode applications.

ntfs-shell

ntfs-shell demo

The ntfs-shell example comes with this crate to demonstrate all library features. Use it to explore the internal structures of an NTFS filesystem at any detail level, even of your running Windows partition. No artificial security restrictions will block you from accessing files and folders, extracting their data or Alternate Data Streams. The filesystem is opened read-only, so you can safely browse even a mounted filesystem without worrying about data corruption. That is also helpful to get an idea of the Windows NTFS driver, e.g. to find out when its lazy writer actually updates the data on disk.

I originally wrote ntfs-shell for myself to comfortably develop the library in user-mode before running the code in production in kernel-mode.

To build ntfs-shell, just clone this repo and call

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

To run it, pass the path to an NTFS image (on all operating systems) or to a partition (like \\.\C:, on Windows only with administrative privileges) to the resulting ntfs-shell binary.

Calling help gives you a list of all supported commands. help COMMAND details the syntax of that command.

Most commands that take a filename also take an NTFS File Record Number (if prepended by /). This File Record Number may be decimal or hexadecimal (if prepended by 0x). Some examples:

fileinfo Windows
fileinfo /146810
fileinfo /0x23d7a

Library Features

  • For the impatient: Convenience functions to treat NTFS like any other filesystem and just read files and directories using Read/Seek traits. At your option, you may also explore the filesystem at any detail level.
  • Reading arbitrary resident and non-resident attributes, attributes in Attribute Lists, and attributes connected over multiple Attribute List entries, including sparse attribute data. All of this together enables reading file data and Alternate Data Streams of any size and on-disk structure.
  • Iterating over a flattened "data-centric" view of the NTFS Attributes, abstracting away any nested Attribute List.
  • Efficiently finding files in a directory, adhering to the filesystem's $Upcase Table for case-insensitive search.
  • In-order iteration of directory contents at O(1).
  • Leveraging Rust's typesystem to handle the various types of NTFS indexes in a typesafe way.
  • Error propagation through a custom NtfsError type that implements Display. Where it makes sense, variants have additional fields to pinpoint any error to a specific location.
  • Full functionality even in a no_std environment with alloc.
  • No usage of unsafe anywhere. Checked arithmetic where needed.
  • Platform and endian independence.

Not yet supported

  • Any write support
  • Caching for better performance
  • Compression
  • Encryption
  • Journaling
  • Quotas
  • Reparse Points
  • Security Descriptors

Examples

The following example dumps the names of all files and folders in the root directory of a given NTFS filesystem.
The list is directly taken from the NTFS index, hence it's sorted in ascending order with respect to NTFS's understanding of case-insensitive string comparison.

```rust,no_run 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()); } ```

Check out the docs, the tests, and the supplied ntfs-shell application for more examples on how to use the ntfs library.

License

This crate is licensed under either of

at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Further Resources

Extension points exported contracts — how you extend this code

NtfsStructuredValue (Interface)
Trait implemented by every NTFS attribute structured value. [8 implementers]
src/structured_values/mod.rs
NtfsReadSeek (Interface)
Trait to read/seek in a source by the help of a temporarily passed mutable reference to the filesystem reader. By requi [5 …
src/traits.rs
UpcaseOrd (Interface)
Trait for a case-insensitive ordering with respect to the $UpCase table read from the filesystem. [3 implementers]
src/upcase_table.rs
NtfsIndexEntryType (Interface)
Trait implemented by structures that describe Index Entry types. See also [`NtfsIndex`] and [`NtfsIndexEntry`], and [`N [1 …
src/indexes/mod.rs
NtfsStructuredValueFromResidentAttributeValue (Interface)
Trait implemented by NTFS Attribute structured values that are always in resident attributes. [5 implementers]
src/structured_values/mod.rs
NtfsIndexEntryKey (Interface)
Trait implemented by a structure that describes an Index Entry key. [1 implementers]
src/indexes/mod.rs
NtfsIndexEntryHasFileReference (Interface)
Indicates that the Index Entry type has a file reference. This trait and [`NtfsIndexEntryHasData`] are mutually exclusi [1 …
src/indexes/mod.rs
NtfsIndexEntryHasData (Interface)
Indicates that the Index Entry type has additional data (of [`NtfsIndexEntryData`] datatype). This trait and [`NtfsInde
src/indexes/mod.rs

Core symbols most depended-on inside this repo

len
called by 23
src/attribute_value/mod.rs
data_position
called by 21
src/attribute_value/mod.rs
len
called by 20
src/record.rs
record_data
called by 17
src/file.rs
value
called by 16
src/types.rs
data
called by 16
src/file.rs
position
called by 15
src/file.rs
is_empty
called by 13
src/attribute_value/mod.rs

Shape

Method 301
Class 64
Function 33
Interface 9
Enum 6

Languages

Rust100%

Modules by API surface

src/attribute.rs41 symbols
src/attribute_value/non_resident.rs37 symbols
src/file.rs27 symbols
src/structured_values/file_name.rs22 symbols
src/structured_values/attribute_list.rs22 symbols
src/index_entry.rs21 symbols
src/structured_values/standard_information.rs19 symbols
src/ntfs.rs17 symbols
examples/ntfs-shell/main.rs16 symbols
src/structured_values/index_root.rs15 symbols
src/attribute_value/attribute_list_non_resident.rs15 symbols
src/record.rs14 symbols

For agents

$ claude mcp add ntfs \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact