我想知道是否有任何方法可以使用UEFI rs Rust包装器读取UEFI中的用户输入。(或者我可以通过Rust在UEFI中收集用户输入的任何其他方式(
我对read_key这个键事件尝试了很多不同的方法,其中一种甚至没有编译,另一种只打印零。我还浏览了几十个GitHub存储库,但似乎没有一个使用这些方法。
第一种方法(读取密钥(:
let bs = st.boot_services();
let read_key = st.stdin().read_key();
let unwrap = read_key.unwrap();
if unwrap.is_some() {
st.stdout().write_str(&unwrap.expect("Error").fmt(&mut fmt::Formatter).to_string()).expect("Failed to write to the console.");
}
第二种方法(等待事件(:
let mut binding = st.unsafe_clone();
key_event = binding.stdin().wait_for_key_event();
let result = bs.wait_for_event(&mut [key_event.unsafe_clone()]);
let usize = result.unwrap();
st.stdout().write_str(&usize.to_string()).expect("Failed to write to the console.");
那里可能有很多初学者的错误,因为我对Rust没有太多的经验。我做了几个项目,现在我发现了这个,所以我想尝试一下。在Assembly中,用户输入是一件相对容易的事情。(根据我迄今为止对Rust的经验(
如果有人知道我可以检查的存储库,或者知道答案,请帮忙。我已经为此工作了好几个小时了。
板条箱文档链接:https://docs.rs/uefi/latest/uefi/源代码:https://github.com/rust-osdev/uefi-rs
这里有一个简短的示例,用于在用户按下"ESC"之前读取输入。
#![no_main]
#![no_std]
#![feature(abi_efiapi)]
use core::fmt::{Write};
use uefi::{prelude::*, proto::console::text::ScanCode, Char16};
#[entry]
fn main(_handle: Handle, mut st: SystemTable<Boot>) -> Status {
uefi_services::init(&mut st).unwrap();
let mut exit_flag = false;
while !exit_flag {
let key = st.stdin().read_key().expect("Expected input");
let _ = match key {
Some(k) => {
match k {
uefi::proto::console::text::Key::Printable(p) => {
write!(st.stdout(), "A printable key was entered: {:?}rn", p).expect("Write failed");
if p == Char16::try_from(27u16).expect("Unable to convert the ESC ascii code to Char16") {
exit_flag = true;
}
}
uefi::proto::console::text::Key::Special(s) => {
write!(st.stdout(), "A special key was entered: {:?}rn", s).expect("Write failed");
if s == ScanCode::ESCAPE {
exit_flag = true;
}
}
};
},
None => {}
};
}
Status::SUCCESS
}
我以前从未使用过uefi rs,可能有更好的解决方案来处理这个机箱的输入。
以模板为起点,替换main.rs。使用:cargo +nightly build --target x86_64-unknown-uefi
构建