(&mut self)
| 80 | impl Iterator for RegistryValues { |
| 81 | type Item = RegistryValue; |
| 82 | fn next(&mut self) -> Option<Self::Item> { |
| 83 | if self.index >= self.key.sub_key_count { |
| 84 | return None; |
| 85 | } |
| 86 | |
| 87 | let max_value_len = self.key.max_value_name_len + 1; |
| 88 | let max_data_len = self.key.max_data_len + 1; |
| 89 | let buf_len = size_of::<KEY_VALUE_FULL_INFORMATION>() as u32 + max_value_len + max_data_len; |
| 90 | let mut len: u32 = buf_len; |
| 91 | let buf: Vec<u8> = vec![0; len as usize]; |
| 92 | let value_information: PKEY_VALUE_FULL_INFORMATION = buf.as_ptr() as PKEY_VALUE_FULL_INFORMATION; |
| 93 | let status = unsafe { |
| 94 | ntregapi::NtEnumerateValueKey( |
| 95 | self.key.handle, |
| 96 | self.index, |
| 97 | ntregapi::KeyValueFullInformation, |
| 98 | value_information as *mut c_void, |
| 99 | len, |
| 100 | &mut len |
| 101 | ) |
| 102 | }; |
| 103 | |
| 104 | if status == ERROR_NO_MORE_ITEMS { |
| 105 | return None; |
| 106 | } |
| 107 | |
| 108 | if !NT_SUCCESS(status) { |
| 109 | return None; |
| 110 | } |
| 111 | |
| 112 | let name_length = unsafe { |
| 113 | ((*value_information).NameLength / size_of::<u16>() as u32) as usize |
| 114 | }; |
| 115 | |
| 116 | let reg_value_name = String::from_utf16_lossy( unsafe { |
| 117 | std::slice::from_raw_parts((*value_information).Name.as_ptr(), name_length) |
| 118 | }); |
| 119 | |
| 120 | self.index += 1; |
| 121 | |
| 122 | Some(RegistryValue { |
| 123 | key_path: self.key.path.clone(), |
| 124 | name: if name_length > 0 { reg_value_name } else { "".to_string() }, |
| 125 | data: get_data_value(value_information), |
| 126 | }) |
| 127 | } |
| 128 | } |
| 129 | |
| 130 | impl fmt::Display for RegistryValueData { |
nothing calls this directly
no test coverage detected