我正在研究这个项目,一旦操作系统通过EFI应用程序启动,就将文件写入本地文件系统.我需要知道是否可能.如果是,那么请指导我一点.谢谢
好的,我会给你一个好的抬头......
首先列举系统中的所有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);
Run Code Online (Sandbox Code Playgroud)然后,您浏览所有这些并为找到的每个句柄打开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);
Run Code Online (Sandbox Code Playgroud)您找到了所需分区的句柄.然后打开音量.
EFI_FILE_PROTOCOL* root = NULL;
...
efiStatus = fs->OpenVolume(fs, &root);
Run Code Online (Sandbox Code Playgroud)有一些函数可以枚举文件和文件夹等...但是如果您知道正确的文件路径,则可以立即打开它.
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);
Run Code Online (Sandbox Code Playgroud)在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;
Run Code Online (Sandbox Code Playgroud)