如何在带有 r_efi crate 的 rust 项目中使用 UEFI locate_protocol

How use UEFI locate_protocol in a rust project with r_efi crate

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

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

r_efi::system::BootServices::locate_protocol

定义为:

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

我的问题是这 2 个参数:

_: *mut c_void

_: *mut *mut c_void

我不知道 return 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
}