From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-x233.google.com (mail-it0-x233.google.com [IPv6:2607:f8b0:4001:c0b::233]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 732D51A1DF5 for ; Tue, 27 Sep 2016 09:56:55 -0700 (PDT) Received: by mail-it0-x233.google.com with SMTP id u134so47566797itb.1 for ; Tue, 27 Sep 2016 09:56:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=FBlJh+a+fPo4ndD15nBIlKbnkiKXneDkvomTKyytEfc=; b=ds3APIqX6NHxJjNptscggGMV/fKo/rlRlXuUwQG57mJjpiHggblax+RrsH+XGhjqMn OS/YV5pGBpzBDKIR1hA6jX4pdU2e5VgP5ogu+6gMezfPPyL5E851jwCVBwmetmuFQ2MO Hx/XHLNB0r9ITaBMpR6mG0CZBEvJW+tspN1k5RNbrjRyDalAUgihrGXRfySSHVbmgB1J ieT98KiV/qtI79NHvweaiYl95gsj8a1pRjdZ6EsVthhknT05u+7VU+AhQgTAaviqQgxU XJL45n78jJch3R2bwv70T69UBka9qq6uKvXNxQmd5wOupU84UU2OEbI2Qq5ypnyAqf/h TQmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=FBlJh+a+fPo4ndD15nBIlKbnkiKXneDkvomTKyytEfc=; b=mlNZas2DC5QFyxNvuXsdEYS75VnPEvDhr+bXgTR4Lda2Kuh/iq+zZ1KDPrq+6i9Hxr Bfiaj7aE0OCj9erpgtEpR3zCJsIqhveDWqtQQdKsXUcmaerdFuGu9OFm7Nox/VzM2gao Lk26NulS+Atcr44WLyhcC3zITggmUMVTEOWHa1z2tlkb8vpjkFrpVtfUrVS9qPibj+wS G+DmHCzZ75/dmmEpwja7o0ZYTdXe3nAXbDD9WzwOpVEdGhv4yGwr/voMOpXgIo0/sUbt re6PllkgxU8cg9HJis2iz8tziT7gO9kuaOMqphJ/TtU15WIA67sjzSuAm5wZhnUi2Kj6 k+Dw== X-Gm-Message-State: AA6/9RkQHu18r6RM/3RfgcCSYuawBkp+DCwLBnuH2b0HgazHFuleg2NIuYicBZx+BmDmbZ3r//ZPHxLLV5ExsA== X-Received: by 10.36.112.11 with SMTP id f11mr5507675itc.57.1474995414719; Tue, 27 Sep 2016 09:56:54 -0700 (PDT) MIME-Version: 1.0 References: <765021a6-cea7-ba5f-58cf-5e8fce05bbf2@redhat.com> <87d54199-6065-47e4-b3f8-04fd6f93220f@redhat.com> <10380531DF222B45964BE3E93EFE5F045D229577@fmsmsx104.amr.corp.intel.com> In-Reply-To: From: GN Keshava Date: Tue, 27 Sep 2016 16:56:40 +0000 Message-ID: To: Andrew Fish , "edk2-devel@lists.01.org" Cc: Laszlo Ersek , Laurie Jarlstrom X-Content-Filtered-By: Mailman/MimeDel 2.1.21 Subject: Re: How to open a file by it's full path in UEFI X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Sep 2016 16:56:55 -0000 Content-Type: text/plain; charset=UTF-8 Thanks, Andrew, Laurie, Laszlo, Jaben, for quick help!! :) Regards, Keshava On Tue 27 Sep, 2016 10:18 pm Andrew Fish, 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 < > laurie.jarlstrom@intel.com> wrote: > > > > 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 > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel > >