From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-x236.google.com (mail-it0-x236.google.com [IPv6:2607:f8b0:4001:c0b::236]) (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 9DC4E1A1E0B for ; Tue, 27 Sep 2016 03:46:30 -0700 (PDT) Received: by mail-it0-x236.google.com with SMTP id j69so10420056itb.0 for ; Tue, 27 Sep 2016 03:46:30 -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=rN5gMb1om0PHkEgIlCwyopRCA66c414gETa0xzfUBA0=; b=FFGKViKaoUjNtQl/FZHnDhLPClTYo/2zi7/uMZuUL7/re2ITxlra1efT7m5TkgdIm4 bfFfwn3vjoRxolsJRXbEicnDtJsEVJV4ES6H5RGGZHmOzp52/EmMr4JGEmHqKnoy8xDK y4PqeiARuUCGx+bKmFQi8klc0EwV7P1Cj2r/axwSET5mPyJRaE0CZRkdK2c9AYXjydyR 0eGDo1ejcMsfXZ7EEm+hc8kCLNxVkB0xRllRfyC6QMlYSFa2qAjX4NnLQQLzpu1ybfb4 5pnzsCJz1iOm0ko7Un/MuNyMhspBvNrz/q9lbLU2pwbRepRBHLA/375DptYiyjydROwo +WKg== 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=rN5gMb1om0PHkEgIlCwyopRCA66c414gETa0xzfUBA0=; b=AYRUa0EVpOazwgzL0VXz9nN4cbS7HrWnXKM+yD2VBnMqH+tXNrQM17VxSojCtnyK/j PGLCJznLyw8ifcO/XGBaUIUHpQY/ag99jXMQX44II7yJKPW7QJ82gmRwmL0B13Tm2qat X0XcTGlZ4xs0rXFk6HPh1c9oHawIIBR+jCgG5q84NRTTrYN8x0cJC4Y/bLwH/E5AEZr2 xugT8QBb3qvyyOcZInGuxqgyCZuFMPRLshiELGg87Tp0nqG1IDL3sr0iDRcnWLuOBaDL aWKLVSLPKvRzxH/8m+py0YY6lct7i3661hWKG90hed5pl8WQVPLCpQqW9BzJFefhrFjb Ey7w== X-Gm-Message-State: AA6/9Rln6TF9waH4P5u785PIeGDqvwhoRNmRbQ9xrMg06nM6YJiqRJ6q4zn/th1seEz36Jby+JuC2oTAurKrmQ== X-Received: by 10.36.20.204 with SMTP id 195mr3350288itg.83.1474973189880; Tue, 27 Sep 2016 03:46:29 -0700 (PDT) MIME-Version: 1.0 References: <765021a6-cea7-ba5f-58cf-5e8fce05bbf2@redhat.com> In-Reply-To: <765021a6-cea7-ba5f-58cf-5e8fce05bbf2@redhat.com> From: GN Keshava Date: Tue, 27 Sep 2016 10:46:19 +0000 Message-ID: To: Laszlo Ersek Cc: "edk2-devel@lists.01.org" 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 10:46:30 -0000 Content-Type: text/plain; charset=UTF-8 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)? Considering option #2, How I can find device path programatically from my C file? 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 > > > >