* How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable @ 2016-10-18 17:18 Saqib Khan 2016-10-18 17:40 ` Laszlo Ersek 0 siblings, 1 reply; 7+ messages in thread From: Saqib Khan @ 2016-10-18 17:18 UTC (permalink / raw) To: edk2-devel Hi, I can not find structure of BOOTXXXX variable, Can any one help how to extract device path from BOOTXXXX variable. here is code i have attempt (rEFind) *UINT8 *Value;* *Status = gRT->GetVariable ((CHAR16 *)Name, &gEfiGlobalVariableGuid, NULL, &BootVariableSize, Value); //print attribute /*Check if device boot variable is legacy*/ Ptr = Value; Ptr += sizeof (UINT32); DevPathLen = *(UINT16 *) Ptr; Ptr += sizeof (UINT16); Ptr += StrSize ((UINT16 *) Ptr); DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr; Print (L"Paths: %s\n",ConvertDevicePathToText (DevicePath,TRUE,TRUE));* -- Regards Saqib ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable 2016-10-18 17:18 How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable Saqib Khan @ 2016-10-18 17:40 ` Laszlo Ersek 2016-10-18 18:37 ` Andrew Fish 0 siblings, 1 reply; 7+ messages in thread From: Laszlo Ersek @ 2016-10-18 17:40 UTC (permalink / raw) To: Saqib Khan; +Cc: edk2-devel On 10/18/16 19:18, Saqib Khan wrote: > Hi, > I can not find structure of BOOTXXXX variable, Can any one help how to > extract device path from BOOTXXXX variable. In UEFI-related questions, the UEFI specification has a fair chance to provide useful information. Please refer to "3.1.3 Load Options" in the UEFI v2.6 spec, available for download from <http://www.uefi.org/specifications>. Locating the matching structure definition in the edk2 tree is left as an exercise to the reader ;) Laszlo ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable 2016-10-18 17:40 ` Laszlo Ersek @ 2016-10-18 18:37 ` Andrew Fish 2016-10-19 18:17 ` Saqib Khan 0 siblings, 1 reply; 7+ messages in thread From: Andrew Fish @ 2016-10-18 18:37 UTC (permalink / raw) To: Laszlo Ersek; +Cc: Saqib Khan, edk2-devel > On Oct 18, 2016, at 10:40 AM, Laszlo Ersek <lersek@redhat.com> wrote: > > On 10/18/16 19:18, Saqib Khan wrote: >> Hi, >> I can not find structure of BOOTXXXX variable, Can any one help how to >> extract device path from BOOTXXXX variable. > > In UEFI-related questions, the UEFI specification has a fair chance to > provide useful information. > > Please refer to "3.1.3 Load Options" in the UEFI v2.6 spec, available > for download from <http://www.uefi.org/specifications>. > > Locating the matching structure definition in the edk2 tree is left as > an exercise to the reader ;) > Chapter 3 Boot Manager. The structure is EFI_LOAD_OPTION but some of the fields are variable length so you have to do math to figure stuff out. Thanks, Andrew Fish > Laszlo > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable 2016-10-18 18:37 ` Andrew Fish @ 2016-10-19 18:17 ` Saqib Khan 2016-10-19 20:41 ` Carsey, Jaben 0 siblings, 1 reply; 7+ messages in thread From: Saqib Khan @ 2016-10-19 18:17 UTC (permalink / raw) To: Andrew Fish; +Cc: Laszlo Ersek, edk2-devel Hi, so i have parsed the structure as follow : *BootVariable = mGetVariable(Name, &gEfiGlobalVariableGuid, &BootVariableSize, NULL);LDAttr = BootVariable[0];FilePathListLength = (BootVariable+2);Ptr = (BootVariable+3); // for description * *for FilePathList[] Ptr+= StrSize((CHAR16 *)Ptr); CopyMem (Ptr, DevicePath, *FilePathListLength);* I am able to get LDAttr ,FilePathListLength and description but when i try to check DevicePath->Type it always return 0x01( Hardware Device Path) for each device . I have hard drive with legacy OS(BBS_DEVICE_PATH). So it should not always return 0x01 .What i am doing wrong in parsing ? Thanks On Tue, Oct 18, 2016 at 11:37 PM, Andrew Fish <afish@apple.com> wrote: > > > On Oct 18, 2016, at 10:40 AM, Laszlo Ersek <lersek@redhat.com> wrote: > > > > On 10/18/16 19:18, Saqib Khan wrote: > >> Hi, > >> I can not find structure of BOOTXXXX variable, Can any one help how to > >> extract device path from BOOTXXXX variable. > > > > In UEFI-related questions, the UEFI specification has a fair chance to > > provide useful information. > > > > Please refer to "3.1.3 Load Options" in the UEFI v2.6 spec, available > > for download from <http://www.uefi.org/specifications>. > > > > Locating the matching structure definition in the edk2 tree is left as > > an exercise to the reader ;) > > > > Chapter 3 Boot Manager. > > The structure is EFI_LOAD_OPTION but some of the fields are variable > length so you have to do math to figure stuff out. > > Thanks, > > Andrew Fish > > > > Laszlo > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel > > -- Regards Saqib Ahmed Khanzada ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable 2016-10-19 18:17 ` Saqib Khan @ 2016-10-19 20:41 ` Carsey, Jaben 2016-10-20 7:29 ` Saqib Khan 0 siblings, 1 reply; 7+ messages in thread From: Carsey, Jaben @ 2016-10-19 20:41 UTC (permalink / raw) To: Saqib Khan, Andrew Fish Cc: edk2-devel@ml01.01.org, Laszlo Ersek, Carsey, Jaben Have you examined the BCFG command in the UEFI Shell? It does this exact behavior and the code is at: ShellPkg\Library\UefiBcfgCommandLib\bcfg.c. -Jaben > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of > Saqib Khan > Sent: Wednesday, October 19, 2016 11:18 AM > To: Andrew Fish <afish@apple.com> > Cc: edk2-devel@ml01.01.org; Laszlo Ersek <lersek@redhat.com> > Subject: Re: [edk2] How to get BBS_BBS_DEVICE_PATH from BOOTXXXX > variable > > Hi, so i have parsed the structure as follow : > > > > > > > > *BootVariable = mGetVariable(Name, &gEfiGlobalVariableGuid, > &BootVariableSize, NULL);LDAttr = BootVariable[0];FilePathListLength = > (BootVariable+2);Ptr = (BootVariable+3); // for description * > > > > *for FilePathList[] Ptr+= StrSize((CHAR16 *)Ptr); CopyMem (Ptr, > DevicePath, *FilePathListLength);* > > > I am able to get LDAttr ,FilePathListLength and description but > > when i try to check DevicePath->Type it always return 0x01( Hardware Device > Path) for each device . > > > I have hard drive with legacy OS(BBS_DEVICE_PATH). So it should not always > return 0x01 .What i am doing wrong in parsing ? > > Thanks > > On Tue, Oct 18, 2016 at 11:37 PM, Andrew Fish <afish@apple.com> wrote: > > > > > > On Oct 18, 2016, at 10:40 AM, Laszlo Ersek <lersek@redhat.com> wrote: > > > > > > On 10/18/16 19:18, Saqib Khan wrote: > > >> Hi, > > >> I can not find structure of BOOTXXXX variable, Can any one help how to > > >> extract device path from BOOTXXXX variable. > > > > > > In UEFI-related questions, the UEFI specification has a fair chance to > > > provide useful information. > > > > > > Please refer to "3.1.3 Load Options" in the UEFI v2.6 spec, available > > > for download from <http://www.uefi.org/specifications>. > > > > > > Locating the matching structure definition in the edk2 tree is left as > > > an exercise to the reader ;) > > > > > > > Chapter 3 Boot Manager. > > > > The structure is EFI_LOAD_OPTION but some of the fields are variable > > length so you have to do math to figure stuff out. > > > > Thanks, > > > > Andrew Fish > > > > > > > Laszlo > > > > > > _______________________________________________ > > > edk2-devel mailing list > > > edk2-devel@lists.01.org > > > https://lists.01.org/mailman/listinfo/edk2-devel > > > > > > > -- > Regards > Saqib Ahmed Khanzada > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable 2016-10-19 20:41 ` Carsey, Jaben @ 2016-10-20 7:29 ` Saqib Khan 2016-10-20 15:44 ` Carsey, Jaben 0 siblings, 1 reply; 7+ messages in thread From: Saqib Khan @ 2016-10-20 7:29 UTC (permalink / raw) To: Carsey, Jaben; +Cc: Andrew Fish, edk2-devel@ml01.01.org, Laszlo Ersek *BootVariable = mGetVariable(Name, &gEfiGlobalVariableGuid, &BootVariableSize, NULL);Ptr = (BootVariable+3); Print(L" %s",(CHAR16 *)(Ptr)); DevicePath =AllocateZeroPool (*FilePathListLength) ; Ptr+= StrSize((CHAR16 *)Ptr); CopyMem (DevicePath, Ptr, *FilePathListLength);* As Carsey suggested i used the same Math in order to get DevicePath but in my case it is not working As documentation this data structure is not aligned so i am assuming that just after description there should be FilePathList ,so if i CopyMem * (**FilePathListLength) bytes to DevicePath i should get the right value but i am getting garbage. On Thu, Oct 20, 2016 at 1:41 AM, Carsey, Jaben <jaben.carsey@intel.com> wrote: > Have you examined the BCFG command in the UEFI Shell? > > It does this exact behavior and the code is at: ShellPkg\Library\ > UefiBcfgCommandLib\bcfg.c. > > -Jaben > > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of > > Saqib Khan > > Sent: Wednesday, October 19, 2016 11:18 AM > > To: Andrew Fish <afish@apple.com> > > Cc: edk2-devel@ml01.01.org; Laszlo Ersek <lersek@redhat.com> > > Subject: Re: [edk2] How to get BBS_BBS_DEVICE_PATH from BOOTXXXX > > variable > > > > Hi, so i have parsed the structure as follow : > > > > > > > > > > > > > > > > *BootVariable = mGetVariable(Name, &gEfiGlobalVariableGuid, > > &BootVariableSize, NULL);LDAttr = BootVariable[0];FilePathListLength = > > (BootVariable+2);Ptr = (BootVariable+3); // for description * > > > > > > > > *for FilePathList[] Ptr+= StrSize((CHAR16 *)Ptr); CopyMem (Ptr, > > DevicePath, *FilePathListLength);* > > > > > > I am able to get LDAttr ,FilePathListLength and description but > > > > when i try to check DevicePath->Type it always return 0x01( Hardware > Device > > Path) for each device . > > > > > > I have hard drive with legacy OS(BBS_DEVICE_PATH). So it should not > always > > return 0x01 .What i am doing wrong in parsing ? > > > > Thanks > > > > On Tue, Oct 18, 2016 at 11:37 PM, Andrew Fish <afish@apple.com> wrote: > > > > > > > > > On Oct 18, 2016, at 10:40 AM, Laszlo Ersek <lersek@redhat.com> > wrote: > > > > > > > > On 10/18/16 19:18, Saqib Khan wrote: > > > >> Hi, > > > >> I can not find structure of BOOTXXXX variable, Can any one help how > to > > > >> extract device path from BOOTXXXX variable. > > > > > > > > In UEFI-related questions, the UEFI specification has a fair chance > to > > > > provide useful information. > > > > > > > > Please refer to "3.1.3 Load Options" in the UEFI v2.6 spec, available > > > > for download from <http://www.uefi.org/specifications>. > > > > > > > > Locating the matching structure definition in the edk2 tree is left > as > > > > an exercise to the reader ;) > > > > > > > > > > Chapter 3 Boot Manager. > > > > > > The structure is EFI_LOAD_OPTION but some of the fields are variable > > > length so you have to do math to figure stuff out. > > > > > > Thanks, > > > > > > Andrew Fish > > > > > > > > > > Laszlo > > > > > > > > _______________________________________________ > > > > edk2-devel mailing list > > > > edk2-devel@lists.01.org > > > > https://lists.01.org/mailman/listinfo/edk2-devel > > > > > > > > > > > > -- > > Regards > > Saqib Ahmed Khanzada > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel > -- Regards Saqib Ahmed Khanzada ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable 2016-10-20 7:29 ` Saqib Khan @ 2016-10-20 15:44 ` Carsey, Jaben 0 siblings, 0 replies; 7+ messages in thread From: Carsey, Jaben @ 2016-10-20 15:44 UTC (permalink / raw) To: Saqib Khan Cc: Andrew Fish, edk2-devel@ml01.01.org, Laszlo Ersek, Carsey, Jaben Have you examined the structure EFI_LOAD_OPTION from UefiSpec.h? I think that you are traversing the structure incorrectly. I cannot be sure since I am not certain what this mGetVariable function does specifically. I start by getting the correct size (BufferSize is zero at this first call): Status = gRT->GetVariable( VariableName, (EFI_GUID*)&gEfiGlobalVariableGuid, NULL, &BufferSize, Buffer); if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = AllocateZeroPool(BufferSize); Status = gRT->GetVariable( VariableName, (EFI_GUID*)&gEfiGlobalVariableGuid, NULL, &BufferSize, Buffer); } To parse the structure I divide it up using the structure. I think your +3 may be causing lots of issues. LoadOption = (EFI_LOAD_OPTION *)Buffer; Description = (CHAR16*)(Buffer + sizeof (EFI_LOAD_OPTION)); DescriptionSize = StrSize (Description); if (LoadOption->FilePathListLength != 0) { FilePathList = (UINT8 *)Description + DescriptionSize; } After this we can calculate the location of optional data. OptionalDataOffset = sizeof *LoadOption + DescriptionSize + LoadOption->FilePathListLength; The optional data would be found at: Buffer + OptionalDataOffset Note that all the pointer math is based on using UINT8* or the raw Buffer variable which is a UINT8*. Otherwise the size in bytes will not work out. -Jaben From: Saqib Khan [mailto:saqib.khan2011@gmail.com] Sent: Thursday, October 20, 2016 12:30 AM To: Carsey, Jaben <jaben.carsey@intel.com> Cc: Andrew Fish <afish@apple.com>; edk2-devel@ml01.01.org; Laszlo Ersek <lersek@redhat.com> Subject: Re: [edk2] How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable Importance: High BootVariable = mGetVariable(Name, &gEfiGlobalVariableGuid, &BootVariableSize, NULL); Ptr = (BootVariable+3); Print(L" %s",(CHAR16 *)(Ptr)); DevicePath =AllocateZeroPool (*FilePathListLength) ; Ptr+= StrSize((CHAR16 *)Ptr); CopyMem (DevicePath, Ptr, *FilePathListLength); As Carsey suggested i used the same Math in order to get DevicePath but in my case it is not working As documentation this data structure is not aligned so i am assuming that just after description there should be FilePathList ,so if i CopyMem (*FilePathListLength) bytes to DevicePath i should get the right value but i am getting garbage. On Thu, Oct 20, 2016 at 1:41 AM, Carsey, Jaben <jaben.carsey@intel.com<mailto:jaben.carsey@intel.com>> wrote: Have you examined the BCFG command in the UEFI Shell? It does this exact behavior and the code is at: ShellPkg\Library\UefiBcfgCommandLib\bcfg.c. -Jaben > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org<mailto:edk2-devel-bounces@lists.01.org>] On Behalf Of > Saqib Khan > Sent: Wednesday, October 19, 2016 11:18 AM > To: Andrew Fish <afish@apple.com<mailto:afish@apple.com>> > Cc: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>; Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>> > Subject: Re: [edk2] How to get BBS_BBS_DEVICE_PATH from BOOTXXXX > variable > > Hi, so i have parsed the structure as follow : > > > > > > > > *BootVariable = mGetVariable(Name, &gEfiGlobalVariableGuid, > &BootVariableSize, NULL);LDAttr = BootVariable[0];FilePathListLength = > (BootVariable+2);Ptr = (BootVariable+3); // for description * > > > > *for FilePathList[] Ptr+= StrSize((CHAR16 *)Ptr); CopyMem (Ptr, > DevicePath, *FilePathListLength);* > > > I am able to get LDAttr ,FilePathListLength and description but > > when i try to check DevicePath->Type it always return 0x01( Hardware Device > Path) for each device . > > > I have hard drive with legacy OS(BBS_DEVICE_PATH). So it should not always > return 0x01 .What i am doing wrong in parsing ? > > Thanks > > On Tue, Oct 18, 2016 at 11:37 PM, Andrew Fish <afish@apple.com<mailto:afish@apple.com>> wrote: > > > > > > On Oct 18, 2016, at 10:40 AM, Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>> wrote: > > > > > > On 10/18/16 19:18, Saqib Khan wrote: > > >> Hi, > > >> I can not find structure of BOOTXXXX variable, Can any one help how to > > >> extract device path from BOOTXXXX variable. > > > > > > In UEFI-related questions, the UEFI specification has a fair chance to > > > provide useful information. > > > > > > Please refer to "3.1.3 Load Options" in the UEFI v2.6 spec, available > > > for download from <http://www.uefi.org/specifications>. > > > > > > Locating the matching structure definition in the edk2 tree is left as > > > an exercise to the reader ;) > > > > > > > Chapter 3 Boot Manager. > > > > The structure is EFI_LOAD_OPTION but some of the fields are variable > > length so you have to do math to figure stuff out. > > > > Thanks, > > > > Andrew Fish > > > > > > > Laszlo > > > > > > _______________________________________________ > > > edk2-devel mailing list > > > edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> > > > https://lists.01.org/mailman/listinfo/edk2-devel > > > > > > > -- > Regards > Saqib Ahmed Khanzada > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> > https://lists.01.org/mailman/listinfo/edk2-devel -- Regards Saqib Ahmed Khanzada ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2016-10-20 15:44 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-10-18 17:18 How to get BBS_BBS_DEVICE_PATH from BOOTXXXX variable Saqib Khan 2016-10-18 17:40 ` Laszlo Ersek 2016-10-18 18:37 ` Andrew Fish 2016-10-19 18:17 ` Saqib Khan 2016-10-19 20:41 ` Carsey, Jaben 2016-10-20 7:29 ` Saqib Khan 2016-10-20 15:44 ` Carsey, Jaben
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox