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