What information are you trying to get? The GPT UniquePartitionGUID is
discoverable from the DevicePath.
The partition driver has created BlockIo protocol instances for each partition.
So LBA 0 is the first LBA of the partition that start at LBA N on the disk. If
you are looking for that BlockIo instance then you should be searching the
device paths. That would be change your gBS->HandleProtocol (Handle[i],
&gEfiBlockIoProtocolGuid, &BlockIo) over to gEfiDevicePathProtocolGuid and
search the devices path for the UniquePartitionGUID.
If you need to discover if a drive contains GPT and read the GPT header you
should look at the algorithm in the partition driver. You can not assume that a
BlockIo device contains GPT, it could be MBR, FAT, ISO-9660, ... A robust
detection is a non trivial chunk of code, so you are better off using the
device path if all you need to do is match GPT UniquePartitionGUID.
Andrew Fish
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdeModulePkg/Universal/Disk/PartitionDxe/Gpt.c
This is the code in the PartitionDriver, for GPT, that is building the device
path node that will get appended to the physical BlockIo devices device path.
This device path is placed on the handle that contains the BlockIo instance for
the partition.
EFI_PARTITION_ENTRY *Entry;
HARDDRIVE_DEVICE_PATH HdDev;
ZeroMem (&HdDev, sizeof (HdDev));
HdDev.Header.Type = MEDIA_DEVICE_PATH;
HdDev.Header.SubType = MEDIA_HARDDRIVE_DP;
SetDevicePathNodeLength (&HdDev.Header, sizeof (HdDev));
HdDev.PartitionNumber = (UINT32) Index + 1;
HdDev.MBRType = MBR_TYPE_EFI_PARTITION_TABLE_HEADER;
HdDev.SignatureType = SIGNATURE_TYPE_GUID;
HdDev.PartitionStart = Entry->StartingLBA;
HdDev.PartitionSize = Entry->EndingLBA - Entry->StartingLBA + 1;
CopyMem (HdDev.Signature, &Entry->UniquePartitionGUID, sizeof (EFI_GUID));
On Oct 5, 2012, at 7:05 AM, Michael Lorer wrote:
> Hello,
>
> I’ve got a harddisk with a GPT and different partitions on it.
> Now I want to get the GUID of every partition (because I’m looking for a
> specific GUID).
>
> I tried it that way:
> // Get all BlockIO-protocols
> Status = gBS->LocateHandleBuffer(
> ByProtocol,
> &gEfiBlockIoProtocolGuid,
> NULL,
> &Count,
> &Handle);
>
> // Loop through it
> for( i=0; i<Count; i++ )
> {
> Status = gBS->HandleProtocol(Handle[i],
> &gEfiBlockIoProtocolGuid, &BlockIo);
>
> if (!BlockIo->Media->LogicalPartition)
> continue;
>
> Size=sizeof(GPT_HEADER);
> AdjustBufferSize(BlockIo, &Size);
>
> // Allocate memory to hold the data GPT header
> Status = gBS->AllocatePool(EfiBootServicesData, Size, &Gpt);
>
> // Read primary GPT
> BlockIo->ReadBlocks(BlockIo, BlockIo->Media->MediaId, 1,
> Size, Gpt);
>
> // Right now I should get a good value for
> Gpt->NumberOfPartitionEntries
> // but that is not the case.
> // In most cases Gpt->NumberOfPartitionEntries is empty and
> the only other value
> // is far too big to be the actual number of partitions
> // All other entries in the Gpt structure have the same
> disturbing values…
>
> }
>
> I had a look here:
> http://feishare.com/efimail/messages/20101023-0646-Re__edk2__Need_pointers_on_how_to_handle_GPT_disk_in_EDK2-Andrew_Fish.html
> And I think I’ve done it exactly as suggested. What am I missing?
>
> Thank you.
>
> Regards,
> Michael
> ------------------------------------------------------------------------------
> Don't let slow site performance ruin your business. Deploy New Relic APM
> Deploy New Relic app performance management and know exactly
> what is happening inside your Ruby, Python, PHP, Java, and .NET app
> Try New Relic at no cost today and get our sweet Data Nerd shirt too!
> http://p.sf.net/sfu/newrelic-dev2dev_______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel