pub struct KeyValue<'h, B: SplitByteSlice> { /* private fields */ }
Expand description
A single value that belongs to a KeyNode
.
It has a name and attached data.
On-Disk Signature: vk
Implementations§
Source§impl<'h, B> KeyValue<'h, B>where
B: SplitByteSlice,
impl<'h, B> KeyValue<'h, B>where
B: SplitByteSlice,
Sourcepub fn data(&self) -> Result<KeyValueData<'h, B>>
pub fn data(&self) -> Result<KeyValueData<'h, B>>
Returns the raw data bytes as KeyValueData
.
Examples found in repository?
examples/readhive.rs (line 103)
40fn process_subkey<B>(key_node: KeyNode<B>, level: usize) -> Result<(), String>
41where
42 B: SplitByteSlice,
43{
44 // Print the names of subkeys of this node.
45 if let Some(subkeys) = key_node.subkeys() {
46 let subkeys = subkeys.map_err(|e| format!("Error getting subkeys: {e}"))?;
47
48 for key_node in subkeys {
49 let key_node = key_node.map_err(|e| format!("Error enumerating key: {e}"))?;
50 let key_name = key_node
51 .name()
52 .map_err(|e| format!("Error getting key name: {e}"))?;
53
54 print_indentation(level);
55 println!("● {key_name}");
56
57 if let Some(class_name) = key_node.class_name() {
58 let class_name =
59 class_name.map_err(|e| format!("Error getting class name: {e}"))?;
60 print_indentation(level);
61 println!(" Class Name: {class_name}");
62 }
63
64 // Print the names of the values of this node.
65 if let Some(value_iter) = key_node.values() {
66 let value_iter =
67 value_iter.map_err(|e| format!("Error creating value iterator: {e}"))?;
68
69 for value in value_iter {
70 let value = value.map_err(|e| format!("Error enumerating value: {e}"))?;
71
72 let mut value_name = value
73 .name()
74 .map_err(|e| format!("Error getting value name: {e}"))?
75 .to_string_lossy();
76 if value_name.is_empty() {
77 value_name.push_str("(Default)");
78 }
79
80 let value_type = value
81 .data_type()
82 .map_err(|e| format!("Error getting value type: {e}"))?;
83
84 let data_size = value.data_size();
85
86 // First line: Value Name, Data Type, and Data Size
87 print_indentation(level);
88 println!(" ○ {value_name} - {value_type:?} - {data_size}");
89
90 // Second line: The actual Value Data
91 print_indentation(level);
92 print!(" ");
93
94 match value_type {
95 KeyValueDataType::RegSZ | KeyValueDataType::RegExpandSZ => {
96 let string_data = value
97 .string_data()
98 .map_err(|e| format!("Error getting string data: {e}"))?;
99 println!("{string_data}")
100 }
101 KeyValueDataType::RegBinary => {
102 let binary_data = value
103 .data()
104 .map_err(|e| format!("Error getting binary data: {e}"))?;
105 match binary_data {
106 KeyValueData::Small(data) => println!("{data:?}"),
107 KeyValueData::Big(_iter) => println!("BIG DATA"),
108 }
109 }
110 KeyValueDataType::RegDWord | KeyValueDataType::RegDWordBigEndian => {
111 let dword_data = value
112 .dword_data()
113 .map_err(|e| format!("Error getting DWORD data: {e}"))?;
114 println!("{dword_data}")
115 }
116 KeyValueDataType::RegMultiSZ => {
117 let multi_string_data = value
118 .multi_string_data()
119 .map_err(|e| format!("Error getting multi string data: {e}"))?
120 .collect::<Result<Vec<_>>>()
121 .map_err(|e| {
122 format!("Error getting multi string element data: {e}")
123 })?;
124 println!("{multi_string_data:?}")
125 }
126 KeyValueDataType::RegQWord => {
127 let qword_data = value
128 .qword_data()
129 .map_err(|e| format!("Error getting QWORD data: {e}"))?;
130 println!("{qword_data}")
131 }
132 _ => println!(),
133 }
134 }
135 }
136
137 // Process subkeys.
138 process_subkey(key_node, level + 1)?;
139 }
140 }
141
142 Ok(())
143}
Sourcepub fn string_data(&'h self) -> Result<String>
pub fn string_data(&'h self) -> Result<String>
Checks if this is a REG_SZ
or REG_EXPAND_SZ
Key Value
and returns the data as a String
in that case.
Examples found in repository?
examples/readhive.rs (line 97)
40fn process_subkey<B>(key_node: KeyNode<B>, level: usize) -> Result<(), String>
41where
42 B: SplitByteSlice,
43{
44 // Print the names of subkeys of this node.
45 if let Some(subkeys) = key_node.subkeys() {
46 let subkeys = subkeys.map_err(|e| format!("Error getting subkeys: {e}"))?;
47
48 for key_node in subkeys {
49 let key_node = key_node.map_err(|e| format!("Error enumerating key: {e}"))?;
50 let key_name = key_node
51 .name()
52 .map_err(|e| format!("Error getting key name: {e}"))?;
53
54 print_indentation(level);
55 println!("● {key_name}");
56
57 if let Some(class_name) = key_node.class_name() {
58 let class_name =
59 class_name.map_err(|e| format!("Error getting class name: {e}"))?;
60 print_indentation(level);
61 println!(" Class Name: {class_name}");
62 }
63
64 // Print the names of the values of this node.
65 if let Some(value_iter) = key_node.values() {
66 let value_iter =
67 value_iter.map_err(|e| format!("Error creating value iterator: {e}"))?;
68
69 for value in value_iter {
70 let value = value.map_err(|e| format!("Error enumerating value: {e}"))?;
71
72 let mut value_name = value
73 .name()
74 .map_err(|e| format!("Error getting value name: {e}"))?
75 .to_string_lossy();
76 if value_name.is_empty() {
77 value_name.push_str("(Default)");
78 }
79
80 let value_type = value
81 .data_type()
82 .map_err(|e| format!("Error getting value type: {e}"))?;
83
84 let data_size = value.data_size();
85
86 // First line: Value Name, Data Type, and Data Size
87 print_indentation(level);
88 println!(" ○ {value_name} - {value_type:?} - {data_size}");
89
90 // Second line: The actual Value Data
91 print_indentation(level);
92 print!(" ");
93
94 match value_type {
95 KeyValueDataType::RegSZ | KeyValueDataType::RegExpandSZ => {
96 let string_data = value
97 .string_data()
98 .map_err(|e| format!("Error getting string data: {e}"))?;
99 println!("{string_data}")
100 }
101 KeyValueDataType::RegBinary => {
102 let binary_data = value
103 .data()
104 .map_err(|e| format!("Error getting binary data: {e}"))?;
105 match binary_data {
106 KeyValueData::Small(data) => println!("{data:?}"),
107 KeyValueData::Big(_iter) => println!("BIG DATA"),
108 }
109 }
110 KeyValueDataType::RegDWord | KeyValueDataType::RegDWordBigEndian => {
111 let dword_data = value
112 .dword_data()
113 .map_err(|e| format!("Error getting DWORD data: {e}"))?;
114 println!("{dword_data}")
115 }
116 KeyValueDataType::RegMultiSZ => {
117 let multi_string_data = value
118 .multi_string_data()
119 .map_err(|e| format!("Error getting multi string data: {e}"))?
120 .collect::<Result<Vec<_>>>()
121 .map_err(|e| {
122 format!("Error getting multi string element data: {e}")
123 })?;
124 println!("{multi_string_data:?}")
125 }
126 KeyValueDataType::RegQWord => {
127 let qword_data = value
128 .qword_data()
129 .map_err(|e| format!("Error getting QWORD data: {e}"))?;
130 println!("{qword_data}")
131 }
132 _ => println!(),
133 }
134 }
135 }
136
137 // Process subkeys.
138 process_subkey(key_node, level + 1)?;
139 }
140 }
141
142 Ok(())
143}
Sourcepub fn dword_data(&self) -> Result<u32>
pub fn dword_data(&self) -> Result<u32>
Checks if this is a REG_DWORD
or REG_DWORD_BIG_ENDIAN
Key Value
and returns the data as a u32
in that case.
Examples found in repository?
examples/readhive.rs (line 112)
40fn process_subkey<B>(key_node: KeyNode<B>, level: usize) -> Result<(), String>
41where
42 B: SplitByteSlice,
43{
44 // Print the names of subkeys of this node.
45 if let Some(subkeys) = key_node.subkeys() {
46 let subkeys = subkeys.map_err(|e| format!("Error getting subkeys: {e}"))?;
47
48 for key_node in subkeys {
49 let key_node = key_node.map_err(|e| format!("Error enumerating key: {e}"))?;
50 let key_name = key_node
51 .name()
52 .map_err(|e| format!("Error getting key name: {e}"))?;
53
54 print_indentation(level);
55 println!("● {key_name}");
56
57 if let Some(class_name) = key_node.class_name() {
58 let class_name =
59 class_name.map_err(|e| format!("Error getting class name: {e}"))?;
60 print_indentation(level);
61 println!(" Class Name: {class_name}");
62 }
63
64 // Print the names of the values of this node.
65 if let Some(value_iter) = key_node.values() {
66 let value_iter =
67 value_iter.map_err(|e| format!("Error creating value iterator: {e}"))?;
68
69 for value in value_iter {
70 let value = value.map_err(|e| format!("Error enumerating value: {e}"))?;
71
72 let mut value_name = value
73 .name()
74 .map_err(|e| format!("Error getting value name: {e}"))?
75 .to_string_lossy();
76 if value_name.is_empty() {
77 value_name.push_str("(Default)");
78 }
79
80 let value_type = value
81 .data_type()
82 .map_err(|e| format!("Error getting value type: {e}"))?;
83
84 let data_size = value.data_size();
85
86 // First line: Value Name, Data Type, and Data Size
87 print_indentation(level);
88 println!(" ○ {value_name} - {value_type:?} - {data_size}");
89
90 // Second line: The actual Value Data
91 print_indentation(level);
92 print!(" ");
93
94 match value_type {
95 KeyValueDataType::RegSZ | KeyValueDataType::RegExpandSZ => {
96 let string_data = value
97 .string_data()
98 .map_err(|e| format!("Error getting string data: {e}"))?;
99 println!("{string_data}")
100 }
101 KeyValueDataType::RegBinary => {
102 let binary_data = value
103 .data()
104 .map_err(|e| format!("Error getting binary data: {e}"))?;
105 match binary_data {
106 KeyValueData::Small(data) => println!("{data:?}"),
107 KeyValueData::Big(_iter) => println!("BIG DATA"),
108 }
109 }
110 KeyValueDataType::RegDWord | KeyValueDataType::RegDWordBigEndian => {
111 let dword_data = value
112 .dword_data()
113 .map_err(|e| format!("Error getting DWORD data: {e}"))?;
114 println!("{dword_data}")
115 }
116 KeyValueDataType::RegMultiSZ => {
117 let multi_string_data = value
118 .multi_string_data()
119 .map_err(|e| format!("Error getting multi string data: {e}"))?
120 .collect::<Result<Vec<_>>>()
121 .map_err(|e| {
122 format!("Error getting multi string element data: {e}")
123 })?;
124 println!("{multi_string_data:?}")
125 }
126 KeyValueDataType::RegQWord => {
127 let qword_data = value
128 .qword_data()
129 .map_err(|e| format!("Error getting QWORD data: {e}"))?;
130 println!("{qword_data}")
131 }
132 _ => println!(),
133 }
134 }
135 }
136
137 // Process subkeys.
138 process_subkey(key_node, level + 1)?;
139 }
140 }
141
142 Ok(())
143}
Sourcepub fn multi_string_data(&self) -> Result<RegMultiSZStrings<'h, B>>
pub fn multi_string_data(&self) -> Result<RegMultiSZStrings<'h, B>>
Checks if this is a REG_MULTI_SZ
Key Value
and returns an iterator over String
s for each line in that case.
Examples found in repository?
examples/readhive.rs (line 118)
40fn process_subkey<B>(key_node: KeyNode<B>, level: usize) -> Result<(), String>
41where
42 B: SplitByteSlice,
43{
44 // Print the names of subkeys of this node.
45 if let Some(subkeys) = key_node.subkeys() {
46 let subkeys = subkeys.map_err(|e| format!("Error getting subkeys: {e}"))?;
47
48 for key_node in subkeys {
49 let key_node = key_node.map_err(|e| format!("Error enumerating key: {e}"))?;
50 let key_name = key_node
51 .name()
52 .map_err(|e| format!("Error getting key name: {e}"))?;
53
54 print_indentation(level);
55 println!("● {key_name}");
56
57 if let Some(class_name) = key_node.class_name() {
58 let class_name =
59 class_name.map_err(|e| format!("Error getting class name: {e}"))?;
60 print_indentation(level);
61 println!(" Class Name: {class_name}");
62 }
63
64 // Print the names of the values of this node.
65 if let Some(value_iter) = key_node.values() {
66 let value_iter =
67 value_iter.map_err(|e| format!("Error creating value iterator: {e}"))?;
68
69 for value in value_iter {
70 let value = value.map_err(|e| format!("Error enumerating value: {e}"))?;
71
72 let mut value_name = value
73 .name()
74 .map_err(|e| format!("Error getting value name: {e}"))?
75 .to_string_lossy();
76 if value_name.is_empty() {
77 value_name.push_str("(Default)");
78 }
79
80 let value_type = value
81 .data_type()
82 .map_err(|e| format!("Error getting value type: {e}"))?;
83
84 let data_size = value.data_size();
85
86 // First line: Value Name, Data Type, and Data Size
87 print_indentation(level);
88 println!(" ○ {value_name} - {value_type:?} - {data_size}");
89
90 // Second line: The actual Value Data
91 print_indentation(level);
92 print!(" ");
93
94 match value_type {
95 KeyValueDataType::RegSZ | KeyValueDataType::RegExpandSZ => {
96 let string_data = value
97 .string_data()
98 .map_err(|e| format!("Error getting string data: {e}"))?;
99 println!("{string_data}")
100 }
101 KeyValueDataType::RegBinary => {
102 let binary_data = value
103 .data()
104 .map_err(|e| format!("Error getting binary data: {e}"))?;
105 match binary_data {
106 KeyValueData::Small(data) => println!("{data:?}"),
107 KeyValueData::Big(_iter) => println!("BIG DATA"),
108 }
109 }
110 KeyValueDataType::RegDWord | KeyValueDataType::RegDWordBigEndian => {
111 let dword_data = value
112 .dword_data()
113 .map_err(|e| format!("Error getting DWORD data: {e}"))?;
114 println!("{dword_data}")
115 }
116 KeyValueDataType::RegMultiSZ => {
117 let multi_string_data = value
118 .multi_string_data()
119 .map_err(|e| format!("Error getting multi string data: {e}"))?
120 .collect::<Result<Vec<_>>>()
121 .map_err(|e| {
122 format!("Error getting multi string element data: {e}")
123 })?;
124 println!("{multi_string_data:?}")
125 }
126 KeyValueDataType::RegQWord => {
127 let qword_data = value
128 .qword_data()
129 .map_err(|e| format!("Error getting QWORD data: {e}"))?;
130 println!("{qword_data}")
131 }
132 _ => println!(),
133 }
134 }
135 }
136
137 // Process subkeys.
138 process_subkey(key_node, level + 1)?;
139 }
140 }
141
142 Ok(())
143}
Sourcepub fn qword_data(&self) -> Result<u64>
pub fn qword_data(&self) -> Result<u64>
Checks if this is a REG_QWORD
Key Value
and returns the data as a u64
in that case.
Examples found in repository?
examples/readhive.rs (line 128)
40fn process_subkey<B>(key_node: KeyNode<B>, level: usize) -> Result<(), String>
41where
42 B: SplitByteSlice,
43{
44 // Print the names of subkeys of this node.
45 if let Some(subkeys) = key_node.subkeys() {
46 let subkeys = subkeys.map_err(|e| format!("Error getting subkeys: {e}"))?;
47
48 for key_node in subkeys {
49 let key_node = key_node.map_err(|e| format!("Error enumerating key: {e}"))?;
50 let key_name = key_node
51 .name()
52 .map_err(|e| format!("Error getting key name: {e}"))?;
53
54 print_indentation(level);
55 println!("● {key_name}");
56
57 if let Some(class_name) = key_node.class_name() {
58 let class_name =
59 class_name.map_err(|e| format!("Error getting class name: {e}"))?;
60 print_indentation(level);
61 println!(" Class Name: {class_name}");
62 }
63
64 // Print the names of the values of this node.
65 if let Some(value_iter) = key_node.values() {
66 let value_iter =
67 value_iter.map_err(|e| format!("Error creating value iterator: {e}"))?;
68
69 for value in value_iter {
70 let value = value.map_err(|e| format!("Error enumerating value: {e}"))?;
71
72 let mut value_name = value
73 .name()
74 .map_err(|e| format!("Error getting value name: {e}"))?
75 .to_string_lossy();
76 if value_name.is_empty() {
77 value_name.push_str("(Default)");
78 }
79
80 let value_type = value
81 .data_type()
82 .map_err(|e| format!("Error getting value type: {e}"))?;
83
84 let data_size = value.data_size();
85
86 // First line: Value Name, Data Type, and Data Size
87 print_indentation(level);
88 println!(" ○ {value_name} - {value_type:?} - {data_size}");
89
90 // Second line: The actual Value Data
91 print_indentation(level);
92 print!(" ");
93
94 match value_type {
95 KeyValueDataType::RegSZ | KeyValueDataType::RegExpandSZ => {
96 let string_data = value
97 .string_data()
98 .map_err(|e| format!("Error getting string data: {e}"))?;
99 println!("{string_data}")
100 }
101 KeyValueDataType::RegBinary => {
102 let binary_data = value
103 .data()
104 .map_err(|e| format!("Error getting binary data: {e}"))?;
105 match binary_data {
106 KeyValueData::Small(data) => println!("{data:?}"),
107 KeyValueData::Big(_iter) => println!("BIG DATA"),
108 }
109 }
110 KeyValueDataType::RegDWord | KeyValueDataType::RegDWordBigEndian => {
111 let dword_data = value
112 .dword_data()
113 .map_err(|e| format!("Error getting DWORD data: {e}"))?;
114 println!("{dword_data}")
115 }
116 KeyValueDataType::RegMultiSZ => {
117 let multi_string_data = value
118 .multi_string_data()
119 .map_err(|e| format!("Error getting multi string data: {e}"))?
120 .collect::<Result<Vec<_>>>()
121 .map_err(|e| {
122 format!("Error getting multi string element data: {e}")
123 })?;
124 println!("{multi_string_data:?}")
125 }
126 KeyValueDataType::RegQWord => {
127 let qword_data = value
128 .qword_data()
129 .map_err(|e| format!("Error getting QWORD data: {e}"))?;
130 println!("{qword_data}")
131 }
132 _ => println!(),
133 }
134 }
135 }
136
137 // Process subkeys.
138 process_subkey(key_node, level + 1)?;
139 }
140 }
141
142 Ok(())
143}
Sourcepub fn data_size(&self) -> u32
pub fn data_size(&self) -> u32
Returns the size of the raw data.
Examples found in repository?
examples/readhive.rs (line 84)
40fn process_subkey<B>(key_node: KeyNode<B>, level: usize) -> Result<(), String>
41where
42 B: SplitByteSlice,
43{
44 // Print the names of subkeys of this node.
45 if let Some(subkeys) = key_node.subkeys() {
46 let subkeys = subkeys.map_err(|e| format!("Error getting subkeys: {e}"))?;
47
48 for key_node in subkeys {
49 let key_node = key_node.map_err(|e| format!("Error enumerating key: {e}"))?;
50 let key_name = key_node
51 .name()
52 .map_err(|e| format!("Error getting key name: {e}"))?;
53
54 print_indentation(level);
55 println!("● {key_name}");
56
57 if let Some(class_name) = key_node.class_name() {
58 let class_name =
59 class_name.map_err(|e| format!("Error getting class name: {e}"))?;
60 print_indentation(level);
61 println!(" Class Name: {class_name}");
62 }
63
64 // Print the names of the values of this node.
65 if let Some(value_iter) = key_node.values() {
66 let value_iter =
67 value_iter.map_err(|e| format!("Error creating value iterator: {e}"))?;
68
69 for value in value_iter {
70 let value = value.map_err(|e| format!("Error enumerating value: {e}"))?;
71
72 let mut value_name = value
73 .name()
74 .map_err(|e| format!("Error getting value name: {e}"))?
75 .to_string_lossy();
76 if value_name.is_empty() {
77 value_name.push_str("(Default)");
78 }
79
80 let value_type = value
81 .data_type()
82 .map_err(|e| format!("Error getting value type: {e}"))?;
83
84 let data_size = value.data_size();
85
86 // First line: Value Name, Data Type, and Data Size
87 print_indentation(level);
88 println!(" ○ {value_name} - {value_type:?} - {data_size}");
89
90 // Second line: The actual Value Data
91 print_indentation(level);
92 print!(" ");
93
94 match value_type {
95 KeyValueDataType::RegSZ | KeyValueDataType::RegExpandSZ => {
96 let string_data = value
97 .string_data()
98 .map_err(|e| format!("Error getting string data: {e}"))?;
99 println!("{string_data}")
100 }
101 KeyValueDataType::RegBinary => {
102 let binary_data = value
103 .data()
104 .map_err(|e| format!("Error getting binary data: {e}"))?;
105 match binary_data {
106 KeyValueData::Small(data) => println!("{data:?}"),
107 KeyValueData::Big(_iter) => println!("BIG DATA"),
108 }
109 }
110 KeyValueDataType::RegDWord | KeyValueDataType::RegDWordBigEndian => {
111 let dword_data = value
112 .dword_data()
113 .map_err(|e| format!("Error getting DWORD data: {e}"))?;
114 println!("{dword_data}")
115 }
116 KeyValueDataType::RegMultiSZ => {
117 let multi_string_data = value
118 .multi_string_data()
119 .map_err(|e| format!("Error getting multi string data: {e}"))?
120 .collect::<Result<Vec<_>>>()
121 .map_err(|e| {
122 format!("Error getting multi string element data: {e}")
123 })?;
124 println!("{multi_string_data:?}")
125 }
126 KeyValueDataType::RegQWord => {
127 let qword_data = value
128 .qword_data()
129 .map_err(|e| format!("Error getting QWORD data: {e}"))?;
130 println!("{qword_data}")
131 }
132 _ => println!(),
133 }
134 }
135 }
136
137 // Process subkeys.
138 process_subkey(key_node, level + 1)?;
139 }
140 }
141
142 Ok(())
143}
Sourcepub fn data_type(&self) -> Result<KeyValueDataType>
pub fn data_type(&self) -> Result<KeyValueDataType>
Returns the data type of this Key Value.
Examples found in repository?
examples/readhive.rs (line 81)
40fn process_subkey<B>(key_node: KeyNode<B>, level: usize) -> Result<(), String>
41where
42 B: SplitByteSlice,
43{
44 // Print the names of subkeys of this node.
45 if let Some(subkeys) = key_node.subkeys() {
46 let subkeys = subkeys.map_err(|e| format!("Error getting subkeys: {e}"))?;
47
48 for key_node in subkeys {
49 let key_node = key_node.map_err(|e| format!("Error enumerating key: {e}"))?;
50 let key_name = key_node
51 .name()
52 .map_err(|e| format!("Error getting key name: {e}"))?;
53
54 print_indentation(level);
55 println!("● {key_name}");
56
57 if let Some(class_name) = key_node.class_name() {
58 let class_name =
59 class_name.map_err(|e| format!("Error getting class name: {e}"))?;
60 print_indentation(level);
61 println!(" Class Name: {class_name}");
62 }
63
64 // Print the names of the values of this node.
65 if let Some(value_iter) = key_node.values() {
66 let value_iter =
67 value_iter.map_err(|e| format!("Error creating value iterator: {e}"))?;
68
69 for value in value_iter {
70 let value = value.map_err(|e| format!("Error enumerating value: {e}"))?;
71
72 let mut value_name = value
73 .name()
74 .map_err(|e| format!("Error getting value name: {e}"))?
75 .to_string_lossy();
76 if value_name.is_empty() {
77 value_name.push_str("(Default)");
78 }
79
80 let value_type = value
81 .data_type()
82 .map_err(|e| format!("Error getting value type: {e}"))?;
83
84 let data_size = value.data_size();
85
86 // First line: Value Name, Data Type, and Data Size
87 print_indentation(level);
88 println!(" ○ {value_name} - {value_type:?} - {data_size}");
89
90 // Second line: The actual Value Data
91 print_indentation(level);
92 print!(" ");
93
94 match value_type {
95 KeyValueDataType::RegSZ | KeyValueDataType::RegExpandSZ => {
96 let string_data = value
97 .string_data()
98 .map_err(|e| format!("Error getting string data: {e}"))?;
99 println!("{string_data}")
100 }
101 KeyValueDataType::RegBinary => {
102 let binary_data = value
103 .data()
104 .map_err(|e| format!("Error getting binary data: {e}"))?;
105 match binary_data {
106 KeyValueData::Small(data) => println!("{data:?}"),
107 KeyValueData::Big(_iter) => println!("BIG DATA"),
108 }
109 }
110 KeyValueDataType::RegDWord | KeyValueDataType::RegDWordBigEndian => {
111 let dword_data = value
112 .dword_data()
113 .map_err(|e| format!("Error getting DWORD data: {e}"))?;
114 println!("{dword_data}")
115 }
116 KeyValueDataType::RegMultiSZ => {
117 let multi_string_data = value
118 .multi_string_data()
119 .map_err(|e| format!("Error getting multi string data: {e}"))?
120 .collect::<Result<Vec<_>>>()
121 .map_err(|e| {
122 format!("Error getting multi string element data: {e}")
123 })?;
124 println!("{multi_string_data:?}")
125 }
126 KeyValueDataType::RegQWord => {
127 let qword_data = value
128 .qword_data()
129 .map_err(|e| format!("Error getting QWORD data: {e}"))?;
130 println!("{qword_data}")
131 }
132 _ => println!(),
133 }
134 }
135 }
136
137 // Process subkeys.
138 process_subkey(key_node, level + 1)?;
139 }
140 }
141
142 Ok(())
143}
Sourcepub fn name(&self) -> Result<NtHiveNameString<'h>>
pub fn name(&self) -> Result<NtHiveNameString<'h>>
Returns the name of this Key Value.
Examples found in repository?
examples/readhive.rs (line 73)
40fn process_subkey<B>(key_node: KeyNode<B>, level: usize) -> Result<(), String>
41where
42 B: SplitByteSlice,
43{
44 // Print the names of subkeys of this node.
45 if let Some(subkeys) = key_node.subkeys() {
46 let subkeys = subkeys.map_err(|e| format!("Error getting subkeys: {e}"))?;
47
48 for key_node in subkeys {
49 let key_node = key_node.map_err(|e| format!("Error enumerating key: {e}"))?;
50 let key_name = key_node
51 .name()
52 .map_err(|e| format!("Error getting key name: {e}"))?;
53
54 print_indentation(level);
55 println!("● {key_name}");
56
57 if let Some(class_name) = key_node.class_name() {
58 let class_name =
59 class_name.map_err(|e| format!("Error getting class name: {e}"))?;
60 print_indentation(level);
61 println!(" Class Name: {class_name}");
62 }
63
64 // Print the names of the values of this node.
65 if let Some(value_iter) = key_node.values() {
66 let value_iter =
67 value_iter.map_err(|e| format!("Error creating value iterator: {e}"))?;
68
69 for value in value_iter {
70 let value = value.map_err(|e| format!("Error enumerating value: {e}"))?;
71
72 let mut value_name = value
73 .name()
74 .map_err(|e| format!("Error getting value name: {e}"))?
75 .to_string_lossy();
76 if value_name.is_empty() {
77 value_name.push_str("(Default)");
78 }
79
80 let value_type = value
81 .data_type()
82 .map_err(|e| format!("Error getting value type: {e}"))?;
83
84 let data_size = value.data_size();
85
86 // First line: Value Name, Data Type, and Data Size
87 print_indentation(level);
88 println!(" ○ {value_name} - {value_type:?} - {data_size}");
89
90 // Second line: The actual Value Data
91 print_indentation(level);
92 print!(" ");
93
94 match value_type {
95 KeyValueDataType::RegSZ | KeyValueDataType::RegExpandSZ => {
96 let string_data = value
97 .string_data()
98 .map_err(|e| format!("Error getting string data: {e}"))?;
99 println!("{string_data}")
100 }
101 KeyValueDataType::RegBinary => {
102 let binary_data = value
103 .data()
104 .map_err(|e| format!("Error getting binary data: {e}"))?;
105 match binary_data {
106 KeyValueData::Small(data) => println!("{data:?}"),
107 KeyValueData::Big(_iter) => println!("BIG DATA"),
108 }
109 }
110 KeyValueDataType::RegDWord | KeyValueDataType::RegDWordBigEndian => {
111 let dword_data = value
112 .dword_data()
113 .map_err(|e| format!("Error getting DWORD data: {e}"))?;
114 println!("{dword_data}")
115 }
116 KeyValueDataType::RegMultiSZ => {
117 let multi_string_data = value
118 .multi_string_data()
119 .map_err(|e| format!("Error getting multi string data: {e}"))?
120 .collect::<Result<Vec<_>>>()
121 .map_err(|e| {
122 format!("Error getting multi string element data: {e}")
123 })?;
124 println!("{multi_string_data:?}")
125 }
126 KeyValueDataType::RegQWord => {
127 let qword_data = value
128 .qword_data()
129 .map_err(|e| format!("Error getting QWORD data: {e}"))?;
130 println!("{qword_data}")
131 }
132 _ => println!(),
133 }
134 }
135 }
136
137 // Process subkeys.
138 process_subkey(key_node, level + 1)?;
139 }
140 }
141
142 Ok(())
143}
Trait Implementations§
Source§impl<B> PartialEq for KeyValue<'_, B>where
B: SplitByteSlice,
impl<B> PartialEq for KeyValue<'_, B>where
B: SplitByteSlice,
impl<B> Eq for KeyValue<'_, B>where
B: SplitByteSlice,
Auto Trait Implementations§
impl<'h, B> Freeze for KeyValue<'h, B>
impl<'h, B> RefUnwindSafe for KeyValue<'h, B>where
B: RefUnwindSafe,
impl<'h, B> Send for KeyValue<'h, B>where
B: Sync,
impl<'h, B> Sync for KeyValue<'h, B>where
B: Sync,
impl<'h, B> Unpin for KeyValue<'h, B>
impl<'h, B> UnwindSafe for KeyValue<'h, B>where
B: RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more