8

我正在开发这个项目,以便在操作系统通过 EFI 应用程序启动后立即将文件写入本地文件系统。我需要知道这是否可能。如果是的话,请指导我一点。谢谢

4

1 回答 1

13

好的,我会好好提醒你...

  1. 首先,您枚举系统中的所有 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);
    
  2. 然后你遍历所有这些并为你找到的每个句柄打开 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);
    
  3. 您找到了您需要的分区的句柄。然后你打开卷。

    EFI_FILE_PROTOCOL* root = NULL;
    ...
    efiStatus = fs->OpenVolume(fs, &root);
    
  4. 有一些函数可以枚举文件和文件夹等...但是如果您知道正确的文件路径,您可以立即打开它。

    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 回答