在一个有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
}