如何在带有r_efi机箱的rust项目中使用UEFI locate_procol



在一个有rust和crate r_efi且没有rust标准库的交叉编译教育项目中,我想为UEFI系统制作一个小程序。目前的目标是能够使用图形输出协议。

通过使用r_efi机箱,我首先用系统模块定位GOP

r_efi::system::BootServices::locate_procol

定义是:

locate_protocol: extern "win64" fn(_: *mut Guid, _: *mut c_void, _: *mut *mut c_void) -> Status

我的问题是这2个参数:

_: *mut c_void

_: *mut *mut c_void

我不知道如何返回core::ffi::c_void参数,比如在c代码中:

EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systemTable) {
EFI_BOOT_SERVICES *bs = systemTable->BootServices;
EFI_GRAPHICS_OUTPUT_PROTOCOL *graphicsProtocol;
EFI_STATUS status;
status = bs->LocateProtocol(&GraphicsOutputProtocolGUID, NULL, (void**)&graphicsProtocol);

提前感谢您的解释。

好吧,这里有一个代码解决方案(在virtualbox上工作(来定位带有r_efi板条箱的图形输出协议:

#[export_name = "efi_main"]
pub extern fn main(_h: efi::Handle, st: *mut efi::SystemTable) -> efi::Status {
let mut gop: *mut efi::protocols::graphics_output::Protocol = ptr::null_mut();
let mut guid_gop: efi::Guid = efi::protocols::graphics_output::PROTOCOL_GUID;
let stats = unsafe { ((*(*st).boot_services).locate_protocol)(
&mut guid_gop as *mut _,
ptr::null_mut(),
&mut gop as *mut _ as *mut *mut core::ffi::c_void,
)};
match stats {
efi::Status::SUCCESS => {...},
efi::Status::NOT_FOUND => {...},
}
efi::Status::SUCCESS
}

最新更新