Age | Commit message (Collapse) | Author |
|
|
|
This is where things get dirty. As NTFS requires us to fix up records, we can't continue our previous design of avoiding dynamic allocations and reading everything on demand via `io::Read`.
Instead, we now read an entire record (usually not larger than 4 KiB), fix it up, and store it in a `Vec`.
This required changes almost everywhere.
It should be noted that many non-resident attributes are not part of a record, which is why structured values are now implemented differently depending on the attribute type.
On the plus side, many structures need less borrowing now, which makes them more comfortable to use.
I have also added missing sanity checks with precise errors where appropriate.
|
|
|
|
This introduces a hard dependency on alloc for a core feature.
It is required as long as we don't know the B-tree depth in advance, and need to maintain a stack with elements per layer during traversal.
|
|
We reuse the former name for something else in the next commit.
|
|
|
|
|
|
|
|
This enables all structured values to access filesystem-wide information such as the cluster size, which will soon be needed for `NtfsIndexAllocation`.
|
|
|
|
This allows iterating through all nodes of an arbitrary index.
Tested with a filesystem that has 512 directories in the root.
Still lacks functions to traverse an index in-order or find an item efficiently.
|
|
The LCN offset of a data run is relative to the previous one.
We need to read it as a _signed_ variable-length integer and turn it into an absolute LCN position.
|
|
This translates `SeekFrom::Start(n)` into a more efficient `SeekFrom::Current` if n >= self.stream_position.
We don't need to traverse data runs from the very beginning then.
|
|
|
|
This introduces a `NewNtfsStructuredValue` trait for the `new` function of all structured values.
Indexes later need that to return the structured value specified by a type parameter.
We also have to pass an explicit length and can't just rely on the end of the passed `NtfsAttributeValue`/`NtfsAttributeValueAttached`.
For structured values of non-resident attributes, we have to store an `NtfsAttributeValue` instead of an absolute byte position, in order to let a structured value read additional data (e.g. the name of an `NtfsFileName`).
The `NtfsAttributeValue` properly moves between data runs while reading.
|
|
|
|
|
|
refactor many affected parts.
|
|
|
|
|
|
All functions prefixed with "read" take a buffer to read into, and this is not the case here.
|
|
|
|
|
|
|
|
|
|
|
|
files, resident attributes, StandardInformation and FileName structures, string and time parsing, with real filesystem tests for all of that.
|