【发布时间】:2021-08-07 23:04:58
【问题描述】:
在一个带有 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);
提前感谢您的解释。
【问题讨论】:
-
引用可以被强制转换成指针,并且指针总是可以相互强制的。可以使用
&mut x as *mut T as *mut core::ffi::c_void之类的东西获得一个 void 指针。 -
@RuifengXie:嗯,可以吗?
&mut ptr::null() as *mut c_void?但是,对于第二个参数,我真的不明白要返回什么。 -
我不明白。在提供的 C 代码中,您将指针的地址传递给
EFI_GRAPHICS_PROTOCOL(强制转换为void**)。但是现在你突然想要传递一个指向空指针的指针......我想在 Rust 中你也想要像let mut graphics_protocol: *<the corresponding Rust type> = ptr::null_mut(); &mut graphics_protocol as *mut *_ as *mut *c_void这样的东西。 -
好的明白了。感谢您的帮助!