如何解决如何在带有 r_efi crate 的 Rust 项目中使用 UEFI locate_protocol
在一个带有 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
我的问题是这两个参数:
_: *mut c_void
和
_: *mut *mut c_void
我不知道如何像在 C 代码中一样返回 core::ffi::c_void 参数:
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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。