Struct nt_hive2::Hive

source ·
pub struct Hive<B, S>
where B: BinReaderExt, S: HiveStatus,
{ pub data: MemOverlay<B>, /* private fields */ }
Expand description

Represents a registry hive file.

Because most offsets in a registry hive file are relative to the start of the hive bins data, this struct provides a own Seek and Read implementation, which can work directly with those kinds of offsets. You don’t know where the hive bins data starts, because Hive knows it (this information is stored in the hive base block). To parse data from within the hive bins data, use Hive as reader and use offsets read from the hive data structures.

The structure of hive files is documented at https://github.com/msuhanov/regf/blob/master/Windows%20registry%20file%20format%20specification.md#format-of-primary-files

Fields§

§data: MemOverlay<B>

Implementations§

source§

impl<B, S> Hive<B, S>
where B: BinReaderExt, S: HiveStatus,

source

pub fn new(data: B, parse_mode: HiveParseMode) -> BinResult<Self>

creates a new Hive object. This includes parsing the HiveBaseBlock and determining the start of the hive bins data.

source

pub fn write_baseblock<W: Write>(&self, writer: &mut W) -> Result<()>

write the baseblock to some writer

This method ignores any patches to the base block which might be introduced by log files, because the apply_transaction_log() method takes care of the base block and handles all necessary changes

source

pub fn is_checksum_valid(&self) -> Option<bool>

source§

impl<B> Hive<B, DirtyHive>
where B: BinReaderExt,

source§

impl<B> Hive<B, CleanHive>
where B: BinReaderExt,

source

pub fn is_primary_file(&self) -> bool

source

pub fn enum_subkeys( &mut self, callback: fn(_: &mut Self, _: &KeyNode) -> BinResult<()> ) -> BinResult<()>

Is this really needed???

source

pub fn root_key_node(&mut self) -> BinResult<KeyNode>

returns the root key of this registry hive file

source

pub fn read_structure<T>(&mut self, offset: Offset) -> BinResult<T>
where T: BinRead<Args = ()> + From<Cell<T, ()>>,

reads a data structure from the given offset. Read the documentation of Cell for a detailled discussion

§Usage
use nt_hive2::*;

let my_node: KeyNodeWithMagic = hive.read_structure(offset)?;
source

pub fn data_offset(&self) -> u32

returns the start of the hive bins data

source

pub fn root_cell_offset(&self) -> Offset

returns the offset of the root cell

source

pub fn find_root_celloffset(self) -> Option<Offset>

source

pub fn reset_cursor(&mut self) -> Result<()>

source

pub fn hivebins(self) -> impl Iterator<Item = HiveBin<B>>

source

pub fn data_size(&self) -> u32

Trait Implementations§

source§

impl<B, S> BaseBlock for Hive<B, S>
where B: BinReaderExt, S: HiveStatus,

source§

fn base_block(&self) -> Option<&HiveBaseBlock>

source§

impl<B> ContainsHive<B> for Hive<B, DirtyHive>
where B: BinReaderExt,

source§

impl<B, S> Debug for Hive<B, S>
where B: BinReaderExt + Debug, S: HiveStatus + Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<B> Read for Hive<B, CleanHive>
where B: BinReaderExt,

source§

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

Pull some bytes from this source into the specified buffer, returning how many bytes were read. Read more
1.36.0 · source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored implementation. Read more
1.0.0 · source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Read all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Read all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Read the exact number of bytes required to fill buf. Read more
source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Read the exact number of bytes required to fill cursor. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · source§

fn bytes(self) -> Bytes<Self>
where Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where R: Read, Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · source§

fn take(self, limit: u64) -> Take<Self>
where Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
source§

impl<B> Seek for Hive<B, CleanHive>
where B: BinReaderExt,

This Seek implementation hides the base block, because the offsets used in hive files are relative to the end of the base block.

If you want to read the base block, don’t use seek() and read(), but write_baseblock() instead

source§

fn seek(&mut self, pos: SeekFrom) -> Result<u64>

Seek to an offset, in bytes, in a stream. Read more
1.55.0 · source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.51.0 · source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
source§

fn seek_relative(&mut self, offset: i64) -> Result<(), Error>

🔬This is a nightly-only experimental API. (seek_seek_relative)
Seeks relative to the current position. Read more

Auto Trait Implementations§

§

impl<B, S> Freeze for Hive<B, S>
where B: Freeze,

§

impl<B, S> RefUnwindSafe for Hive<B, S>

§

impl<B, S> Send for Hive<B, S>
where B: Send, S: Send,

§

impl<B, S> Sync for Hive<B, S>
where B: Sync, S: Sync,

§

impl<B, S> Unpin for Hive<B, S>
where B: Unpin, S: Unpin,

§

impl<B, S> UnwindSafe for Hive<B, S>
where B: UnwindSafe, S: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<R> BinReaderExt for R
where R: Read + Seek,

source§

fn read_type<T>(&mut self, endian: Endian) -> Result<T, Error>
where T: BinRead,

Read the given type from the reader using the given endianness.
source§

fn read_be<T>(&mut self) -> Result<T, Error>
where T: BinRead,

Read the given type from the reader with big endian byteorder
source§

fn read_le<T>(&mut self) -> Result<T, Error>
where T: BinRead,

Read the given type from the reader with little endian byteorder
source§

fn read_ne<T>(&mut self) -> Result<T, Error>
where T: BinRead,

Read the given type from the reader with the native byteorder
source§

fn read_type_args<T>( &mut self, endian: Endian, args: <T as BinRead>::Args ) -> Result<T, Error>
where T: BinRead,

Read T from the reader with the given byte order and arguments.
source§

fn read_be_args<T>(&mut self, args: <T as BinRead>::Args) -> Result<T, Error>
where T: BinRead,

Read T from the reader, assuming big-endian byte order, using the given arguments.
source§

fn read_le_args<T>(&mut self, args: <T as BinRead>::Args) -> Result<T, Error>
where T: BinRead,

Read T from the reader, assuming little-endian byte order, using the given arguments.
source§

fn read_ne_args<T>(&mut self, args: <T as BinRead>::Args) -> Result<T, Error>
where T: BinRead,

Read T from the reader, assuming native-endian byte order, using the given arguments.
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<R> ReadBytesExt for R
where R: Read + ?Sized,

source§

fn read_u8(&mut self) -> Result<u8, Error>

Reads an unsigned 8 bit integer from the underlying reader. Read more
source§

fn read_i8(&mut self) -> Result<i8, Error>

Reads a signed 8 bit integer from the underlying reader. Read more
source§

fn read_u16<T>(&mut self) -> Result<u16, Error>
where T: ByteOrder,

Reads an unsigned 16 bit integer from the underlying reader. Read more
source§

fn read_i16<T>(&mut self) -> Result<i16, Error>
where T: ByteOrder,

Reads a signed 16 bit integer from the underlying reader. Read more
source§

fn read_u24<T>(&mut self) -> Result<u32, Error>
where T: ByteOrder,

Reads an unsigned 24 bit integer from the underlying reader. Read more
source§

fn read_i24<T>(&mut self) -> Result<i32, Error>
where T: ByteOrder,

Reads a signed 24 bit integer from the underlying reader. Read more
source§

fn read_u32<T>(&mut self) -> Result<u32, Error>
where T: ByteOrder,

Reads an unsigned 32 bit integer from the underlying reader. Read more
source§

fn read_i32<T>(&mut self) -> Result<i32, Error>
where T: ByteOrder,

Reads a signed 32 bit integer from the underlying reader. Read more
source§

fn read_u48<T>(&mut self) -> Result<u64, Error>
where T: ByteOrder,

Reads an unsigned 48 bit integer from the underlying reader. Read more
source§

fn read_i48<T>(&mut self) -> Result<i64, Error>
where T: ByteOrder,

Reads a signed 48 bit integer from the underlying reader. Read more
source§

fn read_u64<T>(&mut self) -> Result<u64, Error>
where T: ByteOrder,

Reads an unsigned 64 bit integer from the underlying reader. Read more
source§

fn read_i64<T>(&mut self) -> Result<i64, Error>
where T: ByteOrder,

Reads a signed 64 bit integer from the underlying reader. Read more
source§

fn read_u128<T>(&mut self) -> Result<u128, Error>
where T: ByteOrder,

Reads an unsigned 128 bit integer from the underlying reader. Read more
source§

fn read_i128<T>(&mut self) -> Result<i128, Error>
where T: ByteOrder,

Reads a signed 128 bit integer from the underlying reader. Read more
source§

fn read_uint<T>(&mut self, nbytes: usize) -> Result<u64, Error>
where T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader. Read more
source§

fn read_int<T>(&mut self, nbytes: usize) -> Result<i64, Error>
where T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader. Read more
source§

fn read_uint128<T>(&mut self, nbytes: usize) -> Result<u128, Error>
where T: ByteOrder,

Reads an unsigned n-bytes integer from the underlying reader.
source§

fn read_int128<T>(&mut self, nbytes: usize) -> Result<i128, Error>
where T: ByteOrder,

Reads a signed n-bytes integer from the underlying reader.
source§

fn read_f32<T>(&mut self) -> Result<f32, Error>
where T: ByteOrder,

Reads a IEEE754 single-precision (4 bytes) floating point number from the underlying reader. Read more
source§

fn read_f64<T>(&mut self) -> Result<f64, Error>
where T: ByteOrder,

Reads a IEEE754 double-precision (8 bytes) floating point number from the underlying reader. Read more
source§

fn read_u16_into<T>(&mut self, dst: &mut [u16]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of unsigned 16 bit integers from the underlying reader. Read more
source§

fn read_u32_into<T>(&mut self, dst: &mut [u32]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of unsigned 32 bit integers from the underlying reader. Read more
source§

fn read_u64_into<T>(&mut self, dst: &mut [u64]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of unsigned 64 bit integers from the underlying reader. Read more
source§

fn read_u128_into<T>(&mut self, dst: &mut [u128]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of unsigned 128 bit integers from the underlying reader. Read more
source§

fn read_i8_into(&mut self, dst: &mut [i8]) -> Result<(), Error>

Reads a sequence of signed 8 bit integers from the underlying reader. Read more
source§

fn read_i16_into<T>(&mut self, dst: &mut [i16]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of signed 16 bit integers from the underlying reader. Read more
source§

fn read_i32_into<T>(&mut self, dst: &mut [i32]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of signed 32 bit integers from the underlying reader. Read more
source§

fn read_i64_into<T>(&mut self, dst: &mut [i64]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of signed 64 bit integers from the underlying reader. Read more
source§

fn read_i128_into<T>(&mut self, dst: &mut [i128]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of signed 128 bit integers from the underlying reader. Read more
source§

fn read_f32_into<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of IEEE754 single-precision (4 bytes) floating point numbers from the underlying reader. Read more
source§

fn read_f32_into_unchecked<T>(&mut self, dst: &mut [f32]) -> Result<(), Error>
where T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f32_into instead
DEPRECATED. Read more
source§

fn read_f64_into<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where T: ByteOrder,

Reads a sequence of IEEE754 double-precision (8 bytes) floating point numbers from the underlying reader. Read more
source§

fn read_f64_into_unchecked<T>(&mut self, dst: &mut [f64]) -> Result<(), Error>
where T: ByteOrder,

👎Deprecated since 1.2.0: please use read_f64_into instead
DEPRECATED. Read more
source§

impl<T> ReadSeek for T
where T: Read + Seek,

source§

fn tell(&mut self) -> Result<u64, Error>

source§

impl<T> StreamPosition for T
where T: Seek,

source§

fn stream_pos(&mut self) -> Result<u64, Error>

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.