我可以使用EFI在本地文件系统上编写

时间:2015-09-01 05:25:34

标签: filesystems uefi

我正在研究这个项目,一旦操作系统通过EFI应用程序启动,就将文件写入本地文件系统。我需要知道是否可能。如果是,那么请指导我一点。 感谢

1 个答案:

答案 0 :(得分:8)

好的,我会给你一个好头像......

  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);
    
  5. 在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;