> On Feb 5, 2016, at 6:44 AM, Michael Zimmermann <sigmaepsilo...@gmail.com> 
> wrote:
> 
> Lazlo,
> 
> using 'FileDevicePath' works perfectly, thx :)
> sth. else I stumbled on is this typedef:
> typedef EFI_DEVICE_PATH_PROTOCOL  EFI_DEVICE_PATH;
> 
> I tried to find a way to convert from EFI_DEVICE_PATH_PROTOCOL to
> EFI_DEVICE_PATH until I saw that it's just an alias :P
> 

Also EFI boots from removable media via spec defined file names. 
So if you search for BOOTX64.EFI you find:
 #define EFI_REMOVABLE_MEDIA_FILE_NAME_X64     L"\\EFI\\BOOT\\BOOTX64.EFI"
That leads you to:
#define EFI_REMOVABLE_MEDIA_FILE_NAME   EFI_REMOVABLE_MEDIA_FILE_NAME_X64
And that will point you to the BDS code that loads files from removable media:

~/work/src/edk2(master)>git grep EFI_REMOVABLE_MEDIA_FILE_NAME -- *.c
IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c:2081:        
FullDevicePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c:2376:        FilePath = 
FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c:3336:                   
EFI_REMOVABLE_MEDIA_FILE_NAME,
IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c:3720:                 
EFI_REMOVABLE_MEDIA_FILE_NAME,
MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c:1398:  by appending 
EFI_REMOVABLE_MEDIA_FILE_NAME.
MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c:1434:    TempDevicePath = 
FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c:1496:      TempDevicePath = 
FileDevicePath (SimpleFileSystemHandles[Index], EFI_REMOVABLE_MEDIA_FILE_NAME);
MdeModulePkg/Universal/BdsDxe/BdsEntry.c:724:  FilePath = FileDevicePath (NULL, 
EFI_REMOVABLE_MEDIA_FILE_NAME);
Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c:1308:                   
EFI_REMOVABLE_MEDIA_FILE_NAME,
Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c:2083:
        FullDevicePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c:2387:
        FilePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c:3351:
                   EFI_REMOVABLE_MEDIA_FILE_NAME,
Vlv2TbltDevicePkg/Override/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c:3837:
                 EFI_REMOVABLE_MEDIA_FILE_NAME,

Thanks,

Andrew Fish


> Thanks for everyone's help :)
> 
> Michael
> 
> On Fri, Feb 5, 2016 at 3:01 PM, Laszlo Ersek <ler...@redhat.com> wrote:
> 
>> On 02/05/16 14:26, Michael Zimmermann wrote:
>>> The problem is that there is no GUID for 'EFI_FILE_PROTOCOL' there's
>>> only 'EFI_SIMPLE_FILE_SYSTEM_PROTOCOL' which I already have.
>> 
>> Ah, sorry, I completely forgot about this. I've only ever worked with
>> EFI_SIMPLE_FILE_SYSTEM_PROTOCOL and EFI_FILE_PROTOCOL once, in git
>> commit 23d04b58e27b.
>> 
>>> I don't even understand the concept of a devicepath attached to a file
>>> since a file is not a device.
>> 
>> Okay, so I'm fuzzy on this, but the LoadImage() specification explains
>> it more or less. The idea is (/me hand-waving) that all but the last
>> device path nodes are used to locate the simple file system protocol
>> instance, and the last device path node, which is supposed to be of type
>> MEDIA_DEVICE_PATH, subtype MEDIA_FILEPATH_DP, carries the pathname of
>> the file within the simple file system.
>> 
>> The root directory of the file system would be opened with
>> EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.OpenVolume(), which returns an
>> EFI_FILE_PROTOCOL, standing for the root directory.
>> 
>> This is in turn used with EFI_FILE_PROTOCOL.Open(), passing in the
>> pathname from MEDIA_FILEPATH_DP, to get the EFI_FILE_PROTOCOL that
>> ultimately stands for the file.
>> 
>> So, what you need in this case is the following:
>> - the handle of the simple file system protocol that the file exists on
>> - the absolute pathname of the file within that file system.
>> 
>> If you don't already have access to the first, I don't know how you can
>> get it, starting from EFI_FILE_PROTOCOL.
>> 
>> The name of the file itself can be retrieved with
>> EFI_FILE_PROTOCOL.GetInfo(), passing in the EFI_FILE_INFO_ID GUID as
>> InformationType. However, I think this will only return the direct
>> filename, not the absolute pathname within the filesystem. So ultimately
>> I can't tell you how to get this piece of info either.
>> 
>> Assuming you have them both though, you can use the FileDevicePath()
>> library function, from the DevicePathLib class
>> (MdePkg/Include/Library/DevicePathLib.h), to create a device path that
>> you can pass to LoadImage().
>> 
>> See also EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL.
>> 
>> ... Hm, I think I just found an omission in the spec (2.6).
>> 
>> Namely, in my first reply, I actually wanted to propose to load the
>> entire contents of the file into memory (using
>> EFI_FILE_PROTOCOL.Read()), and then pass the contents to LoadImage(),
>> using the SourceBuffer and SourceSize parameters. Also setting the
>> DevicePath parameter to NULL.
>> 
>> Ultimately I didn't recommend this, because the spec doesn't mark the
>> DevicePath parameter of LoadImage() OPTIONAL. The LoadImage()
>> description *never* mentions that DevicePath can be NULL. This is the
>> omission.
>> 
>> Because, if you look at EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL, it says:
>> 
>>    [...] It is legal to call LoadImage() for a buffer in memory with a
>>    NULL DevicePath parameter. In this case, the Loaded Image Device
>>    Path Protocol is installed with a NULL interface pointer.
>> 
>>> How do the Shell or other boot manager load such files?
>> 
>> I don't think they ever start out with a bare EFI_FILE_PROTOCOL. But,
>> using the above method (load contents, pass buffer to LoadImage(), with
>> DevicePath=NULL), it should be possible.
>> 
>> Sorry, I made a huge detour here. My only excuse is that the only time I
>> worked with this was long ago, and that the LoadImage() specification
>> seems incomplete.
>> 
>> Thanks
>> Laszlo
>> 
>>> On Fri, Feb 5, 2016 at 1:17 PM, Laszlo Ersek <ler...@redhat.com
>>> <mailto:ler...@redhat.com>> wrote:
>>> 
>>>    On 02/05/16 12:44, Michael Zimmermann wrote:
>>>> Hi,
>>>> 
>>>> how can I boot a EFI application if I have it's
>> 'EFI_FILE_PROTOCOL'?
>>>> 'BdsStartEfiApplication' does only accept a 'EFI_DEVICE_PATH'.
>>> 
>>>    You could do the following:
>>>    - call LocateHandle() to find all handles that have EFI_FILE_PROTOCOL
>>>      installed
>>>    - on each handle returned, call OpenProtocol() with GET_PROTOCOL and
>>>      the EFI_FILE_PROTOCOL GUID, and see if the returned protocol
>>>      interface address matches the one that you already have
>>>    - if so, call OpenProtocol() with GET_PROTOCOL and the
>>>      EFI_DEVICE_PATH_PROTOCOL GUID on the same handle.
>>> 
>>>    Laszlo
>>> 
>>>> 
>>>> Michael
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org>
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>> 
>>> 
>>> 
>> 
>> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to