windows_registry/
key_iterator.rs

1use super::*;
2
3/// An iterator of registry key names.
4pub struct KeyIterator<'a> {
5    key: &'a Key,
6    range: core::ops::Range<usize>,
7    name: Vec<u16>,
8}
9
10impl<'a> KeyIterator<'a> {
11    pub(crate) fn new(key: &'a Key) -> Result<Self> {
12        let mut count = 0;
13        let mut max_len = 0;
14
15        let result = unsafe {
16            RegQueryInfoKeyW(
17                key.0,
18                null_mut(),
19                null_mut(),
20                null_mut(),
21                &mut count,
22                &mut max_len,
23                null_mut(),
24                null_mut(),
25                null_mut(),
26                null_mut(),
27                null_mut(),
28                null_mut(),
29            )
30        };
31
32        win32_error(result).map(|_| Self {
33            key,
34            range: 0..count as usize,
35            name: vec![0; max_len as usize + 1],
36        })
37    }
38}
39
40impl Iterator for KeyIterator<'_> {
41    type Item = String;
42
43    fn next(&mut self) -> Option<Self::Item> {
44        self.range.next().and_then(|index| {
45            let mut len = self.name.len() as u32;
46
47            let result = unsafe {
48                RegEnumKeyExW(
49                    self.key.0,
50                    index as u32,
51                    self.name.as_mut_ptr(),
52                    &mut len,
53                    null(),
54                    null_mut(),
55                    null_mut(),
56                    null_mut(),
57                )
58            };
59
60            if result != 0 {
61                debug_assert_eq!(result, ERROR_NO_MORE_ITEMS);
62                None
63            } else {
64                Some(String::from_utf16_lossy(&self.name[0..len as usize]))
65            }
66        })
67    }
68}