我正在研究这个项目,一旦操作系统通过EFI应用程序启动,就将文件写入本地文件系统。我需要知道是否可能。如果是,那么请指导我一点。 感谢
答案 0 :(得分:8)
好的,我会给你一个好头像......
首先列举系统中的所有FS协议。
EFI_BOOT_SERVICES* bs = ...;
EFI_GUID sfspGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID;
EFI_HANDLE* handles = NULL;
UINTN handleCount = 0;
efiStatus = bs->LocateHandleBuffer(ByProtocol,
&sfspGuid,
NULL,
&handleCount,
&handles);
然后,您浏览所有这些并为您找到的每个句柄打开EFI_SIMPLE_FILE_SYSTEM_PROTOCOL,然后您可以从句柄中获取设备路径并找出它是什么设备,哪个分区等。如果驱动器/分区不是您要查找的内容,请跳过它并转到下一个句柄。或者如果你不想弄乱DP解析它,你可以简单地尝试在每个分区(句柄)上打开你的文件,直到操作成功。
for (index = 0; index < (int)handleCount; ++ index)
{
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* fs = NULL;
efiStatus = bs->HandleProtocol(
handles[index],
&sfspGuid,
(void**)&fs);
您找到了所需分区的句柄。然后打开音量。
EFI_FILE_PROTOCOL* root = NULL;
...
efiStatus = fs->OpenVolume(fs, &root);
有一些函数可以枚举文件和文件夹等...但如果您知道正确的文件路径,则可以立即打开它。
EFI_FILE_PROTOCOL* token = NULL;
efiStatus = root->Open(
root,
&token,
L"myfolder\\token.bin",
EFI_FILE_MODE_READ,
EFI_FILE_READ_ONLY | EFI_FILE_HIDDEN | EFI_FILE_SYSTEM);
在EFI_FILE_PROTOCOL下,您可以使用大量函数来处理文件:
EFI_FILE_OPEN Open;
EFI_FILE_CLOSE Close;
EFI_FILE_DELETE Delete;
EFI_FILE_READ Read;
EFI_FILE_WRITE Write;
EFI_FILE_GET_POSITION GetPosition;
EFI_FILE_SET_POSITION SetPosition;
EFI_FILE_GET_INFO GetInfo;
EFI_FILE_SET_INFO SetInfo;
EFI_FILE_FLUSH Flush;