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