windows_registry/
key_iterator.rs1use super::*;
2
3pub 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}