> On Jul 23, 2015, at 3:13 PM, Shubha Ramani <shubharam...@yahoo.com> wrote: > > Thank You ! You are right. My pointer was incorrect and your correction fixed > it Aaron. Next question. I'm trying to use CopyMem. > Can I do something like this ? It's not working right. Type, Length and > Handle in my custom struct are exactly the same types as in (from Smbios.h) >
You are probably corrupting the stack with a buffer overflow on foo. CopyMem ((VOID *)&foo, (VOID *)&SmbiosRecord, MIN (SmbiosRecord->Length, sizeof (GENERAL_INFORMATION)); EFI_SMBIOS_TABLE_HEADER.Length is the length of the entire SMBIOS structure, not the header. If you just want the header it would we be sizeof (EFI_SMBIOS_TABLE_HEADER). Sp just standard C bugs. Thanks, Andrew Fish > typedef struct { > EFI_SMBIOS_TYPE Type; > UINT8 Length; > EFI_SMBIOS_HANDLE Handle; > } EFI_SMBIOS_TABLE_HEADER; > > > My custom struct: > > #pragma pack(1) > > typedef struct _GENERAL_INFORMATION{ > UINT8 Type; > UINT8 Length; > UINT16 Handle; > UINT16 MemberIdentifier; > UINT8 MemberName; > UINT8 Field_A > UINT8 Field_B; > UINT8 Field_C; > UINT8 FIeld_D, > UINT8 Field_E; > } GENERAL_INFORMATION; > > #pragma pack() > > GENERAL_INFORMATION foo; > > CopyMem ((VOID *)&foo, (VOID *)&SmbiosRecord, SmbiosRecord->Length); > > Shubha D. Ramani > shubharam...@gmail.com <mailto:shubharam...@gmail.com> > shubharam...@yahoo.com <mailto:shubharam...@yahoo.com> > > > On Thursday, July 23, 2015 2:08 PM, "aaron....@congatec.com" > <aaron....@congatec.com> wrote: > > > Your usage of pointers was incorrect. Please see corrected code below: > > > EFI_STATUS > EFIAPI > SmbiosMain ( > IN EFI_HANDLE ImageHandle, > IN EFI_SYSTEM_TABLE *SystemTable > ) > { > > EFI_SMBIOS_PROTOCOL *Smb; > EFI_STATUS Status = EFI_SUCCESS; > EFI_SMBIOS_HANDLE InSmbiosHandle = 0xFFFE; > EFI_SMBIOS_TYPE Type=160; > EFI_SMBIOS_TABLE_HEADER *SmbiosRecord = NULL; > KNL_GENERAL_INFORMATION knl; > UINT16 size = 0; > > Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **) > &Smb); > > if (EFI_ERROR (Status)) { > return Status; > } > > Print(L"Status after gBS->LocateProtocol: %r\n", Status); > > SmbiosRecord = AllocateZeroPool (sizeof(EFI_SMBIOS_TABLE_HEADER)); > > Status = Smb->GetNext (Smb, &InSmbiosHandle, &Type, &SmbiosRecord, NULL); > > Print(L"Status after SmbiosProtocol->GetNext: %r\n", Status); > > > > if (EFI_ERROR (Status)) { > return Status; > } > > > Print(L"Smbios In Handle: %d\n", InSmbiosHandle); > Print(L"SmbiosRecord Address : 0X%llx\n", &SmbiosRecord); > Print(L"SmbiosRecord->Type : %d\n", SmbiosRecord->Type); > Print(L"SmbiosRecord->Length : %d\n\n", SmbiosRecord->Length); > Print(L"SmbiosRecord->Handle : %d\n\n", SmbiosRecord->Handle); > Print(L"Sizeof SmbiosRecord : %d\n", sizeof(SmbiosRecord)); > > > FreePool (SmbiosRecord); > > return EFI_SUCCESS; > > > Best Personal Regards, > > Aaron Pop > Senior Software Engineer > > Phone: +1 858-457-2600 Ext. 318 > Fax: +1 858-457-2602 | Email: aaron....@congatec.com > > <Mail Attachment.gif> > congatec, Inc. | 6262 Ferris Square | San Diego CA 92121 | USA | > www.congatec.us <http://www.congatec.us/> > > Any e-mail sent from congatec may contain information which is confidential. > If you are not the intended recipient, you may not > disclose, copy or use it; please notify the sender immediately and delete > this e-mail and any copies from your systems. > > > > > From: Shubha Ramani <shubharam...@yahoo.com> > To: "edk2-devel@lists.sourceforge.net" > <edk2-devel@lists.sourceforge.net>, > Date: 07/23/2015 02:02 PM > Subject: [edk2] GetNext of Smbios protocol not working > > > Please see corrected code below: > > > EFI_STATUS > EFIAPI > SmbiosMain ( > IN EFI_HANDLE ImageHandle, > IN EFI_SYSTEM_TABLE *SystemTable > ) > { > > EFI_SMBIOS_PROTOCOL *Smb; > EFI_STATUS Status = EFI_SUCCESS; > EFI_SMBIOS_HANDLE InSmbiosHandle = 0xFFFE; > EFI_SMBIOS_TYPE Type=160; > EFI_SMBIOS_TABLE_HEADER *SmbiosRecord = NULL; > KNL_GENERAL_INFORMATION knl; > UINT16 size = 0; > > Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **) > &Smb); > > if (EFI_ERROR (Status)) { > return Status; > } > > Print(L"Status after gBS->LocateProtocol: %r\n", Status); > > SmbiosRecord = AllocateZeroPool (sizeof(EFI_SMBIOS_TABLE_HEADER)); > > Status = Smb->GetNext (&Smb, &InSmbiosHandle, &Type, &SmbiosRecord, NULL); > > Print(L"Status after SmbiosProtocol->GetNext: %r\n", Status); > > > > if (EFI_ERROR (Status)) { > return Status; > } > > > Print(L"Smbios In Handle: %d\n", InSmbiosHandle); > Print(L"SmbiosRecord Address : 0X%llx\n", &SmbiosRecord); > Print(L"SmbiosRecord->Type : %d\n", SmbiosRecord->Type); > Print(L"SmbiosRecord->Length : %d\n\n", SmbiosRecord->Length); > Print(L"SmbiosRecord->Handle : %d\n\n", SmbiosRecord->Handle); > Print(L"Sizeof SmbiosRecord : %d\n", sizeof(SmbiosRecord)); > > > FreePool (SmbiosRecord); > > return EFI_SUCCESS; > > > > > Please see my code below. > > If you’ll notice, I’m passing > In EFI_SMBIOS_HANDLE InSmbiosHandle = 0xFFFE; EFI_SMBIOS_TYPE Type=160; > Which is as the header file “Smbios.h” and the protocol implementation > “SmbiosDxe.c” > Instruct. According to my understanding, GetNext should return the address of > the > First table whose Type=160. I used SmbiosView.efi and saw that indeed such a > table > with Type=160 is present. I tried other valid Types too, though and the > result is the same. > > What I expect to be returned is the EFI_STATUS of “Success” and the correct > Address for the SmbiosRecord with type=160. I’m getting neither. I’m getting > an EFI_STATUS > Code of 0xB58FBD02. At the very least, I would expect EFI_NOT_FOUND. > According > To the protocol, this weird 0xB58FBD02 should not be returned for EFI_STATUS. > > I did search archives however, and it seems that others have had problems > with Smbios GetNext, > With no resolution that I saw. > > The following two paths are the Smbios Protocol implementation in the latest > EDK2 repo: > > C:\edk2\MyWorkspace\MdeModulePkg\Universal\SmbiosDxe\SmbiosDxe.c > > C:\edk2\MyWorkspace\MdeModulePkg\Universal\SmbiosDxe\Smbios.h > > There is also a shell tool > C:\edk2\MyWorkspace\ShellPkg\Library\UefiShellDebug1CommandsLib\Sm > biosView which does not use the Smbios protocol at all. It seems to use a > backdoor approach of > internal data structures. I wonder why ? Is this because the Smbios protocol > doesn’t work ? > > We would like to use the Smbios Protocol because it’s simple and provides > what we need. > We would like to avoid the backdoor approach embraced by Smbiosview if > possible. > > Can someone comment on my issue ? Am I using GetNext incorrectly ? > > EFI_STATUS > EFIAPI > SmbiosMain ( > IN EFI_HANDLE ImageHandle, > IN EFI_SYSTEM_TABLE *SystemTable > ) > { > > EFI_SMBIOS_PROTOCOL Smb; > EFI_STATUS Status = EFI_SUCCESS; > EFI_SMBIOS_HANDLE InSmbiosHandle = 0xFFFE; > EFI_SMBIOS_TYPE Type=160; > EFI_SMBIOS_TABLE_HEADER *SmbiosRecord = NULL; > KNL_GENERAL_INFORMATION knl; > UINT16 size = 0; > > Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **) > &Smb); > > if (EFI_ERROR (Status)) { > return Status; > } > > Print(L"Status after gBS->LocateProtocol: %r\n", Status); > > SmbiosRecord = AllocateZeroPool (sizeof(EFI_SMBIOS_TABLE_HEADER)); > > Status = Smb.GetNext (&Smb, &InSmbiosHandle, &Type, &SmbiosRecord, NULL); > > Print(L"Status after SmbiosProtocol->GetNext: %r\n", Status); > > > > if (EFI_ERROR (Status)) { > return Status; > } > > > Print(L"Smbios In Handle: %d\n", InSmbiosHandle); > Print(L"SmbiosRecord Address : 0X%llx\n", &SmbiosRecord); > Print(L"SmbiosRecord->Type : %d\n", SmbiosRecord->Type); > Print(L"SmbiosRecord->Length : %d\n\n", SmbiosRecord->Length); > Print(L"SmbiosRecord->Handle : %d\n\n", SmbiosRecord->Handle); > Print(L"Sizeof SmbiosRecord : %d\n", sizeof(SmbiosRecord)); > > > FreePool (SmbiosRecord); > > return EFI_SUCCESS; > > Shubha D. Ramani > shubharam...@gmail.com <mailto:shubharam...@gmail.com> > shubharam...@yahoo.com > <mailto:shubharam...@yahoo.com>------------------------------------------------------------------------------ > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel > <https://lists.sourceforge.net/lists/listinfo/edk2-devel> > > > > > <Mail > Attachment.gif>------------------------------------------------------------------------------ > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
_______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel