如何在带有 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
}
在一个使用 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
}