| 454 | |
| 455 | #[pyfunction] |
| 456 | fn EnumValue(hkey: PyRef<PyHkey>, index: u32, vm: &VirtualMachine) -> PyResult { |
| 457 | // Query registry for the required buffer sizes. |
| 458 | let mut ret_value_size: u32 = 0; |
| 459 | let mut ret_data_size: u32 = 0; |
| 460 | let hkey: Registry::HKEY = hkey.hkey.load(); |
| 461 | let rc = unsafe { |
| 462 | Registry::RegQueryInfoKeyW( |
| 463 | hkey, |
| 464 | ptr::null_mut(), |
| 465 | ptr::null_mut(), |
| 466 | ptr::null_mut(), |
| 467 | ptr::null_mut(), |
| 468 | ptr::null_mut(), |
| 469 | ptr::null_mut(), |
| 470 | ptr::null_mut(), |
| 471 | &mut ret_value_size as *mut u32, |
| 472 | &mut ret_data_size as *mut u32, |
| 473 | ptr::null_mut(), |
| 474 | ptr::null_mut(), |
| 475 | ) |
| 476 | }; |
| 477 | if rc != 0 { |
| 478 | return Err(vm.new_os_error(format!("RegQueryInfoKeyW failed with error code {rc}"))); |
| 479 | } |
| 480 | |
| 481 | // Include room for null terminators. |
| 482 | ret_value_size += 1; |
| 483 | ret_data_size += 1; |
| 484 | let mut buf_value_size = ret_value_size; |
| 485 | let mut buf_data_size = ret_data_size; |
| 486 | |
| 487 | // Allocate buffers. |
| 488 | let mut ret_value_buf: Vec<u16> = vec![0; ret_value_size as usize]; |
| 489 | let mut ret_data_buf: Vec<u8> = vec![0; ret_data_size as usize]; |
| 490 | |
| 491 | // Loop to enumerate the registry value. |
| 492 | loop { |
| 493 | let mut current_value_size = ret_value_size; |
| 494 | let mut current_data_size = ret_data_size; |
| 495 | let mut reg_type: u32 = 0; |
| 496 | let rc = unsafe { |
| 497 | Registry::RegEnumValueW( |
| 498 | hkey, |
| 499 | index, |
| 500 | ret_value_buf.as_mut_ptr(), |
| 501 | &mut current_value_size as *mut u32, |
| 502 | ptr::null_mut(), |
| 503 | &mut reg_type as *mut u32, |
| 504 | ret_data_buf.as_mut_ptr(), |
| 505 | &mut current_data_size as *mut u32, |
| 506 | ) |
| 507 | }; |
| 508 | if rc == ERROR_MORE_DATA { |
| 509 | // Double the buffer sizes. |
| 510 | buf_data_size *= 2; |
| 511 | buf_value_size *= 2; |
| 512 | ret_data_buf.resize(buf_data_size as usize, 0); |
| 513 | ret_value_buf.resize(buf_value_size as usize, 0); |