| 148 | } |
| 149 | |
| 150 | fn 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 { |