MCPcopy Create free account
hub / github.com/PowerShell/DSC / get_data_value

Function get_data_value

archive/ntreg/src/registry_value.rs:150–212  ·  view source on GitHub ↗
(value_information: PKEY_VALUE_FULL_INFORMATION)

Source from the content-addressed store, hash-verified

148}
149
150fn get_data_value(value_information: PKEY_VALUE_FULL_INFORMATION) -> RegistryValueData {
151 let data_length = unsafe {
152 (*value_information).DataLength as usize
153 };
154
155 let data_ptr = unsafe {
156 (value_information as *const u8).add((*value_information).DataOffset as usize)
157 };
158
159 let data = unsafe {
160 std::slice::from_raw_parts(data_ptr, data_length)
161 };
162
163 match unsafe { (*value_information).Type } {
164 1 => RegistryValueData::String(String::from_utf16_lossy(unsafe {
165 // remove null terminator
166 std::slice::from_raw_parts(data_ptr as *const u16, (data_length / size_of::<u16>()) - 1)
167 })),
168 2 => RegistryValueData::ExpandString(String::from_utf16_lossy(unsafe {
169 // remove null terminator
170 std::slice::from_raw_parts(data_ptr as *const u16, (data_length / size_of::<u16>()) - 1)
171 })),
172 3 => RegistryValueData::Binary(data.to_vec()),
173 4 => RegistryValueData::DWord(unsafe {
174 *(data_ptr as *const u32)
175 }),
176 6 => RegistryValueData::Link(String::from_utf16_lossy(unsafe {
177 // remove null terminator
178 std::slice::from_raw_parts(data_ptr as *const u16, (data_length / size_of::<u16>()) - 1)
179 })),
180 7 => {
181 let mut multi_string: Vec<String> = Vec::new();
182 let mut offset = 0;
183 while offset < data_length {
184 let mut string_length = 0;
185 while offset + string_length < data_length && unsafe { *(data_ptr.add(offset + string_length) as *mut u16) } != 0 {
186 string_length += size_of::<u16>();
187 }
188
189 let string = String::from_utf16_lossy(unsafe {
190 std::slice::from_raw_parts(data_ptr.add(offset) as *const u16, string_length / size_of::<u16>())
191 });
192
193 if string.is_empty() {
194 // end of multi string null terminator
195 break;
196 }
197
198 multi_string.push(string);
199 offset += string_length + size_of::<u16>();
200 }
201
202 RegistryValueData::MultiString(multi_string)
203 },
204 8 => RegistryValueData::ResourceList(data.to_vec()),
205 9 => RegistryValueData::FullResourceDescriptor(data.to_vec()),
206 10 => RegistryValueData::ResourceRequirementsList(data.to_vec()),
207 11 => RegistryValueData::QWord(unsafe {

Callers 2

queryMethod · 0.85
nextMethod · 0.85

Calls 2

newFunction · 0.50
is_emptyMethod · 0.45

Tested by

no test coverage detected