MCPcopy Index your code
hub / github.com/RustPython/RustPython / EnumValue

Function EnumValue

crates/vm/src/stdlib/winreg.rs:456–545  ·  view source on GitHub ↗
(hkey: PyRef<PyHkey>, index: u32, vm: &VirtualMachine)

Source from the content-addressed store, hash-verified

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);

Callers 3

_read_test_dataMethod · 0.85
test_changing_valueMethod · 0.85
test_dynamic_keyMethod · 0.85

Calls 10

reg_to_pyFunction · 0.85
new_os_errorMethod · 0.80
as_mut_ptrMethod · 0.80
ErrClass · 0.50
loadMethod · 0.45
resizeMethod · 0.45
positionMethod · 0.45
iterMethod · 0.45
lenMethod · 0.45
new_tupleMethod · 0.45

Tested by 3

_read_test_dataMethod · 0.68
test_changing_valueMethod · 0.68
test_dynamic_keyMethod · 0.68