> On Jul 23, 2015, at 3:37 PM, Shubha Ramani <shubharam...@yahoo.com> wrote:
> 
> I actually do want the size of the entire SMBIOS structure. It should match 
> sizeof (GENERAL_INFORMATION) and it in fact does.
> That's why I'm confused. Maybe I need to AllocateZeroPool for foo and not 
> create it on the stack ? I don't see how that would make
> a difference but I'll try it.
>  

Looks like pointer corruption to me. You really should assume your code is 
broken 1st, and not start trying random other APIs. You may get lucky and leave 
a time bomb for the developer that ends up having to maintain the code in the 
future. 

The code should be either:
SmbiosRecord, SmbiosRecord->Length
&SmbiosRecord, SmbiosRecord.Lenght

or 

Just use:

https://github.com/tianocore/edk2/blob/master/MdePkg/Include/IndustryStandard/SmBios.h
 as it defined SMBIOS_STRUCTURE_POINTER. 

All the spec based data structures already have types, that have been tested. 

Thanks,

Andrew Fish

> Shubha D. Ramani
> shubharam...@gmail.com <mailto:shubharam...@gmail.com>
> shubharam...@yahoo.com <mailto:shubharam...@yahoo.com>
> 
> 
> On Thursday, July 23, 2015 3:31 PM, Andrew Fish <af...@apple.com> wrote:
> 
> 
> 
>> On Jul 23, 2015, at 3:13 PM, Shubha Ramani <shubharam...@yahoo.com 
>> <mailto: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 
>> <mailto:aaron....@congatec.com>" <aaron....@congatec.com 
>> <mailto: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 
>> <mailto: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 
>> <mailto:shubharam...@yahoo.com>> 
>> To:        "edk2-devel@lists.sourceforge.net 
>> <mailto:edk2-devel@lists.sourceforge.net>" <edk2-devel@lists.sourceforge.net 
>> <mailto: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 <mailto: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 <mailto: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

Reply via email to