> On Jul 23, 2015, at 3:13 PM, Shubha Ramani <[email protected]> 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
> [email protected] <mailto:[email protected]>
> [email protected] <mailto:[email protected]>
>
>
> On Thursday, July 23, 2015 2:08 PM, "[email protected]"
> <[email protected]> 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: [email protected]
>
> <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 <[email protected]>
> To: "[email protected]"
> <[email protected]>,
> 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
> [email protected] <mailto:[email protected]>
> [email protected]
> <mailto:[email protected]>------------------------------------------------------------------------------
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> <https://lists.sourceforge.net/lists/listinfo/edk2-devel>
>
>
>
>
> <Mail
> Attachment.gif>------------------------------------------------------------------------------
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel