Of all the gin joints in all the towns in all the world, John Davis had to 
walk into mine at 10:30:59 on Wednesday 26 February 2014 and say:

> Hello
> 
> Is there an example someplace for accessing a file in the filesystem?  I
> would like to be able to read a file into a buffer as a simple exercise. I
> saw the earlier notes about doing this via stdlib/posix api calls.  I
> figure there is a similar method to do this via uefi api.  Later I want to
> be able to locate a .fv file for use by the firmware volume routines.

I would start by reading up on SimpleFileSystemProtocol. From an application, 
you can use it to access files in a supported filesystem (typically FAT32). 
You need a handle to use it. When you application is executed, you can get a 
handle for the device it was loaded from, or you can search for all handles 
that support SimpleFileSystemProtocol that the firmware currently knows about.

In the former case, you can use BS->HandleProtocol() to get an 
EFI_LOADED_IMAGE protocol handle from your image pointer (which is passed to 
you via UefiMain().

    EFI_LOADED_IMAGE li;
    EFI_HANDLE handle;

    gBS->HandleProtocol (image, &gEfiLoadedImageProtocolGuid, (void *)&li);
    handle = li->DeviceHandle;
    
In the latter case, you can use BS->LocateHandle with the ByProtocol flag to 
search for all handles that support SimpleFileSystemProtocol. If you do it 
this way and there's more than one handle that can be accessed via 
SimpleFileSystemProtocol, you need to make a decision to choose one.

    UINTN handleSize = 0;
    EFI_HANDLE * handles = NULL;

    gBS->LocateHandle (ByProtocol, &gEfiLoadedImageProtocolGuid, NULL,
        &handleSize, handles);

    /* Remember to free this later. */
    handles = AllocatePool (handleSize);

    gBS->LocateHandle (ByProtocol, &gEfiLoadedImageProtocolGuid, NULL,
        &handleSize, handles);

Once you have your device handle, you can start reading a file from it:

    EFI_FILE_IO_INTERFACE * vol;
    EFI_FILE_HANDLE root;
    EFI_FILE_HANDLE fp;
    EFI_FILE_INFO * info;
    UINTN s;
    UINT8 * buf;

    gBS->HandleProtocol (handle, gEfiSimpleFileSystemProtocolGuid,
       (void **)&vol);

    /* Open root directory of the volume. */
    vol->OpenVolume (vol, &root);
    root->Open (root, &fp, L"FileName", EFI_FILE_MODE_READ, 0);

    /* Get the file size. */
    s = 0;
    fp->GetInfo (fp, gEfiFileInfoGuid, &s, NULL);
    info = AllocatePool(s);
    fp->GetInfo (fp, gEfiFileInfoGuid, &s, info);
    s = (UINTN)info->filesSize;
    FreePool (info);

    /* Read the file */
    buf = AllocatePool (s);
    fp->Read (fp, &s, buf);

    fp->Close (fp);

That's my understanding anyway. There are probably various examples out there.

Note that there are a lot of service routines that expect you to provide them 
with a buffer big enough to contain the results. If you give them a buffer 
that's too small (or 0), they return EFI_BUFFER_TOO_SMALL and set the size to 
indicate how much is needed. You then allocate the required memory and call 
the functions again. That's what's happening with the LocateHandle() and 
GetInfo() calls above. You should add error checking to confirm that they 
return EFI_BUFFER_TOO_SMALL rather than some other error before proceeding.

> On a related note, how do you folks find routines? I'm doing massive greps
> though the header files trying to find routines which have a similar name
> to what I am doing.  I'm also using google to search but that is hit and
> miss.  For example, google "UEFI file open" gives me results about opening
> a .efi file via explorer.  That is not what I want to do.

For searching for things in the EDKII source, I cheat. I go to the github 
mirror at https://github.com/tianocore/edk2 and search the source tree from 
there (where it says "Search or type a command").

As for what things are supported, from an application standpoint, the 
definitive list of supported services is the UEFI specification itself. It 
describes all the supported boot services and runtime services. Anything not 
described in the spec is a library function provided by the EDK itself.

-Bill

-- 
=============================================================================
-Bill Paul            (510) 749-2329 | Senior Member of Technical Staff,
                 wp...@windriver.com | Master of Unix-Fu - Wind River Systems
=============================================================================
   "I put a dollar in a change machine. Nothing changed." - George Carlin
=============================================================================

------------------------------------------------------------------------------
Flow-based real-time traffic analytics software. Cisco certified tool.
Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer
Customize your own dashboards, set traffic alerts and generate reports.
Network behavioral analysis & security monitoring. All-in-one tool.
http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to