Keshava, Attached Sample code is an example that will open a file name passed through the command line using the Shell. thanks, Laurie   laurie.jarlstrom@intel.com Intel SSG/STO/EBP (503) 712-9395 -----Original Message----- From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of GN Keshava Sent: Tuesday, September 27, 2016 4:52 AM To: Laszlo Ersek Cc: edk2-devel@lists.01.org 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 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 > > 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 > > > > >> 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 edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel