Skip to content

Commit 1510b08

Browse files
boot: Add freestanding locate_device_path
1 parent 86727ee commit 1510b08

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

uefi/src/boot.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,40 @@ pub fn protocols_per_handle(handle: Handle) -> Result<ProtocolsPerHandle> {
557557
})
558558
}
559559

560+
/// Locates the handle of a device on the device path that supports the specified protocol.
561+
///
562+
/// The `device_path` is updated to point at the remaining part of the [`DevicePath`] after
563+
/// the part that matched the protocol. For example, it can be used with a device path
564+
/// that contains a file path to strip off the file system portion of the device path,
565+
/// leaving the file path and handle to the file system driver needed to access the file.
566+
///
567+
/// If the first node of `device_path` matches the protocol, the `device_path`
568+
/// is advanced to the device path terminator node. If `device_path` is a
569+
/// multi-instance device path, the function will operate on the first instance.
570+
///
571+
/// # Errors
572+
///
573+
/// * [`Status::NOT_FOUND`]: no matching handles.
574+
pub fn locate_device_path<P: ProtocolPointer + ?Sized>(
575+
device_path: &mut &DevicePath,
576+
) -> Result<Handle> {
577+
let bt = boot_services_raw_panicking();
578+
let bt = unsafe { bt.as_ref() };
579+
580+
let mut handle = ptr::null_mut();
581+
let mut device_path_ptr: *const uefi_raw::protocol::device_path::DevicePathProtocol =
582+
device_path.as_ffi_ptr().cast();
583+
unsafe {
584+
(bt.locate_device_path)(&P::GUID, &mut device_path_ptr, &mut handle).to_result_with_val(
585+
|| {
586+
*device_path = DevicePath::from_ffi_ptr(device_path_ptr.cast());
587+
// OK to unwrap: handle is non-null for Status::SUCCESS.
588+
Handle::from_ptr(handle).unwrap()
589+
},
590+
)
591+
}
592+
}
593+
560594
/// Returns an array of handles that support the requested protocol in a
561595
/// pool-allocated buffer.
562596
///

0 commit comments

Comments
 (0)