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

Asa*_*sak 6 filesystems uefi

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

Ale*_*lex 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);
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您找到了所需分区的句柄.然后打开音量.

    EFI_FILE_PROTOCOL* root = NULL;
    ...
    efiStatus = fs->OpenVolume(fs, &root);
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    
    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)