GOPを楽に取得する
コード
uefi-rsを使用しています.
fn fetch_gop<'a>(system_table: &'a SystemTable<Boot>) -> &'a mut gop::GraphicsOutput<'a> { let gop = system_table .boot_services() .locate_protocol::<gop::GraphicsOutput>() .expect_success("Your computer does not support Graphics Output Protocol!"); unsafe { &mut *gop.get() } }
解説
使用しているlocate_protocolメソッドは,UEFIで提供されているLocateProtocol関数のラッパです.
今までは以下のように,LocateHandleBuffer関数とOpenProtocol関数を使用していたのですが,LocateProtocol関数だけで十分だということが分かりました.以下のコードはC++です.
EFI_STATUS FetchGop(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE* SystemTable, OUT EFI_GRAPHICS_OUTPUT_PROTOCOL** gop)
{
// Don't replace handle_count with NULL. It won't work.
UINTN handle_count = 0;
EFI_HANDLE* handle_buffer;
EFI_STATUS status = SystemTable->BootServices->LocateHandleBuffer(ByProtocol, &kEfiGraphicsOutputProtocolGuid, NULL, &handle_count, &handle_buffer);
if (EFI_ERROR(status)) {
return status;
}
return SystemTable->BootServices->OpenProtocol(handle_buffer[0], &kEfiGraphicsOutputProtocolGuid, (VOID**)gop, ImageHandle, NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
}
参考
uefi-rs/gop.rs at 0c3999e6ee9b7d8a69edb19bde73c798b696c799 · rust-osdev/uefi-rs · GitHub