Thanks, Andrew, Laurie, Laszlo, Jaben, for quick help!! :) Regards, Keshava
On Tue 27 Sep, 2016 10:18 pm Andrew Fish, <[email protected]> wrote: > 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

