我正在开发这个项目,以便在操作系统通过 EFI 应用程序启动后立即将文件写入本地文件系统。我需要知道这是否可能。如果是的话,请指导我一点。谢谢
6472 次
1 回答
13
好的,我会好好提醒你...
首先,您枚举系统中的所有 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;
于 2015-09-03T17:42:09.007 回答