I was kind of surprised that an example like this did not exist in: https://github.com/tianocore/edk2/tree/master/ShellPkg/Application
Thanks, Andrew Fish > On Sep 27, 2016, at 9:44 AM, Jarlstrom, Laurie <[email protected]> > wrote: > > Keshava, > Attached Sample code is an example that will open a file name passed through > the command line using the Shell. > > > thanks, > Laurie > > [email protected] > > Intel SSG/STO/EBP > (503) 712-9395 > > > > -----Original Message----- > From: edk2-devel [mailto:[email protected]] On Behalf Of GN > Keshava > Sent: Tuesday, September 27, 2016 4:52 AM > To: Laszlo Ersek > Cc: [email protected] > Subject: Re: [edk2] How to open a file by it's full path in UEFI > > Thank you Laszlo. > > I'll check it out. :) > > Thanks again. > Regards, > Keshava > > On Tue, 27 Sep 2016 at 16:47 Laszlo Ersek <[email protected]> wrote: > >> On 09/27/16 12:46, GN Keshava wrote: >>> Hi Laszlo, >>> >>> Thank you for the answer. It was helpful. >>> >>> Considering option #1, can you give some more details (a small >>> example or any reference link would be helpful), how I can use Shell >>> APIs in my C file (which will compile to my .efi app)? >> >> Hmmm, I don't have hands-on experience with this, but you might want >> to try the ShellOpenFileByName() function, from >> "ShellPkg/Include/Library/ShellLib.h". >> >> You can find examples for UEFI applications that use the Shell library >> with: >> >> git grep -w ShellLib -- '*inf' >> >> or just grep the tree for ShellOpenFileByName(). >> >> See also "AppPkg/ReadMe.txt". >> >>> Considering option #2, How I can find device path programatically >>> from my C file? >> >> The EFI_SHELL_PROTOCOL.GetDevicePathFromMap() member function seems >> relevant -- it is specified in the UEFI Shell spec --, but I would >> definitely try ShellOpenFileByName() first. >> >> Thanks >> Laszlo >> >>> Thanks again for the help. :) >>> With regards, >>> Keshava >>> >>> On Tue, 27 Sep 2016 at 15:19 Laszlo Ersek <[email protected] >>> <mailto:[email protected]>> wrote: >>> >>> On 09/27/16 11:25, GN Keshava wrote: >>>> Hi Laszlo, >>>> >>>> Thanks for the reply. I meant I have complete file path. I >>> believe >> the >>>> "device path" is different. Is it possible to obtain DevicePath >>> using my >>>> full file path? >>> >>> The pathname you seem to have (as "complete") is specific to a given >>> simple FS, so system-wide it cannot be considered complete >>> (there >> can be >>> multiple filesystems). >>> >>> In your original email I missed that you started with "FS1:". >> Andrew's >>> answer covers that case. >>> >>> In summary, you can do three things: >>> - have a pathname that starts with FSx: (which is a shell-specific >>> mapping), and use Andrew's recommendation, >>> - have a complete UEFI device path, and then use what I recommended, >>> - have no information for selecting the filesystem (from the many >>> possible), and use your current iteration. >>> >>> Options #1 and #2 actually correspond to each other, considering >>> "expressive power" / information content (as long as you are in the >>> shell); please see the MAP shell command. >>> >>> Thanks >>> Laszlo >>> >>>> On Tue, 27 Sep 2016 at 14:46 Laszlo Ersek <[email protected] >>> <mailto:[email protected]> >>>> <mailto:[email protected] <mailto:[email protected]>>> wrote: >>>> >>>> On 09/27/16 11:03, GN Keshava wrote: >>>>> Hi all, >>>>> >>>>> >>>>> I'm trying to open a file from my UEFI application. The path >> of >>>> file is >>>>> >>>>> fs1:/myfolder/myfile.txt >>>>> >>>>> The code : >>>>> >>>>> efiStatus = bs->LocateHandleBuffer(ByProtocol, >>>>> &sfspGuid, >>>>> NULL, >>>>> &handleCount, >>>>> &handles); >>>>> >>>>> for (index = 0; index < (int)handleCount; ++ index) >>>>> { >>>>> EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* fs = NULL; >>>>> >>>>> efiStatus = bs->HandleProtocol( >>>>> handles[index], >>>>> &sfspGuid, >>>>> (void**)&fs); >>>>> >>>>> EFI_FILE_PROTOCOL* root = NULL; >>>>> ... >>>>> efiStatus = fs->OpenVolume(fs, &root); >>>>> >>>>> EFI_FILE_PROTOCOL* token = NULL; >>>>> >>>>> efiStatus = root->Open( >>>>> root, >>>>> &token, >>>>> L"myfolder\\myfile.txt", >>>>> EFI_FILE_MODE_READ, >>>>> EFI_FILE_READ_ONLY | EFI_FILE_HIDDEN | >> EFI_FILE_SYSTEM); >>>>> } >>>>> >>>>> But using this method, I can only go through all the file >> system >>>> handles >>>>> and open each volume and try opening my file. >>>>> >>>>> But I want to give full path to my file and open it in it's >>> volume. >>>>> >>>>> How can I acheive this? >>>>> Thanks. >>>> >>>> If you have a complete device path, you can use >>> gBS->LocateDevicePath() >>>> with gEfiSimpleFileSystemProtocolGuid, to locate the handle >>> with the >>>> most specific device path (--> the longest device path prefix) >>> with the >>>> simple FS protocol installed on it. Then you can check if the >>> remaining >>>> device path (returned by the service) consist of nothing but >>> one File >>>> Path Media Device Path node. If so, you can open the simple FS >>> protocol >>>> on the handle found, then use that to open the file by >> pathname. >>>> >>>> Laszlo >>>> >>> >> >> > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel > <SFA.inf.txt><SFA.c.txt>_______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

