35 IN MASTER_BOOT_RECORD *Mbr,
46 if (Mbr->Signature != MBR_SIGNATURE) {
54 for (Index1 = 0; Index1 < MAX_MBR_PARTITIONS; Index1++) {
55 if ((Mbr->Partition[Index1].OSIndicator == 0x00) || (
UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) == 0)) {
60 StartingLBA =
UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA);
61 EndingLBA = StartingLBA +
UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) - 1;
62 if (EndingLBA > LastLba) {
75 DEBUG ((EFI_D_INFO,
"PartitionValidMbr: Bad MBR partition size EndingLBA(%1x) > LastLBA(%1x)\n", EndingLBA, LastLba));
80 for (Index2 = Index1 + 1; Index2 < MAX_MBR_PARTITIONS; Index2++) {
81 if ((Mbr->Partition[Index2].OSIndicator == 0x00) || (
UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) == 0)) {
86 if ((NewEndingLBA >= StartingLBA) && (
UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) <= EndingLBA)) {
119 IN EFI_DRIVER_BINDING_PROTOCOL *This,
121 IN EFI_DISK_IO_PROTOCOL *DiskIo,
122 IN EFI_DISK_IO2_PROTOCOL *DiskIo2,
123 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
124 IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,
125 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
129 MASTER_BOOT_RECORD *Mbr;
130 UINT32 ExtMbrStartingLba;
132 HARDDRIVE_DEVICE_PATH HdDev;
133 HARDDRIVE_DEVICE_PATH ParentHdDev;
135 EFI_DEVICE_PATH_PROTOCOL *DevicePathNode;
136 EFI_DEVICE_PATH_PROTOCOL *LastDevicePathNode;
140 EFI_PARTITION_INFO_PROTOCOL PartitionInfo;
143 Found = EFI_NOT_FOUND;
146 MediaId = BlockIo->Media->MediaId;
155 if (
BlockSize <
sizeof (MASTER_BOOT_RECORD)) {
156 return EFI_NOT_FOUND;
164 Status = DiskIo->ReadDisk (
171 if (EFI_ERROR (Status)) {
186 LastDevicePathNode = NULL;
187 ZeroMem (&ParentHdDev,
sizeof (ParentHdDev));
188 DevicePathNode = DevicePath;
189 while (!IsDevicePathEnd (DevicePathNode)) {
190 LastDevicePathNode = DevicePathNode;
191 DevicePathNode = NextDevicePathNode (DevicePathNode);
194 if (LastDevicePathNode != NULL) {
195 if ((DevicePathType (LastDevicePathNode) == MEDIA_DEVICE_PATH) &&
196 (DevicePathSubType (LastDevicePathNode) == MEDIA_HARDDRIVE_DP)
199 CopyMem (&ParentHdDev, LastDevicePathNode,
sizeof (ParentHdDev));
201 LastDevicePathNode = NULL;
205 ZeroMem (&HdDev,
sizeof (HdDev));
206 HdDev.Header.Type = MEDIA_DEVICE_PATH;
207 HdDev.Header.SubType = MEDIA_HARDDRIVE_DP;
208 SetDevicePathNodeLength (&HdDev.Header, sizeof (HdDev));
209 HdDev.MBRType = MBR_TYPE_PCAT;
210 HdDev.SignatureType = SIGNATURE_TYPE_MBR;
212 if (LastDevicePathNode == NULL) {
216 for (Index = 0; Index < MAX_MBR_PARTITIONS; Index++) {
217 if ((Mbr->Partition[Index].OSIndicator == 0x00) || (
UNPACK_UINT32 (Mbr->Partition[Index].SizeInLBA) == 0)) {
224 if (Mbr->Partition[Index].OSIndicator == PMBR_GPT_PARTITION) {
234 HdDev.PartitionNumber = Index + 1;
235 HdDev.PartitionStart =
UNPACK_UINT32 (Mbr->Partition[Index].StartingLBA);
236 HdDev.PartitionSize =
UNPACK_UINT32 (Mbr->Partition[Index].SizeInLBA);
237 CopyMem (HdDev.Signature, &(Mbr->UniqueMbrSignature[0]), sizeof (Mbr->UniqueMbrSignature));
239 ZeroMem (&PartitionInfo,
sizeof (EFI_PARTITION_INFO_PROTOCOL));
240 PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;
241 PartitionInfo.Type = PARTITION_TYPE_MBR;
242 if (Mbr->Partition[Index].OSIndicator == EFI_PARTITION) {
243 PartitionInfo.System = 1;
246 CopyMem (&PartitionInfo.Info.Mbr, &Mbr->Partition[Index], sizeof (MBR_PARTITION_RECORD));
250 ApplePartitionInfo.
MBRType = HdDev.MBRType;
255 CopyMem (&ApplePartitionInfo.
Signature, &(HdDev.Signature[0]), sizeof (UINT32));
256 CopyMem (&ApplePartitionInfo.
PartitionType, &Mbr->Partition[Index].OSIndicator, sizeof (UINT8));
266 (EFI_DEVICE_PATH_PROTOCOL *)&HdDev,
270 HdDev.PartitionStart + HdDev.PartitionSize - 1,
272 ((Mbr->Partition[Index].OSIndicator == EFI_PARTITION) ? &gEfiPartTypeSystemPartGuid : NULL)
275 if (!EFI_ERROR (Status)) {
285 ExtMbrStartingLba = 0;
288 Status = DiskIo->ReadDisk (
295 if (EFI_ERROR (Status)) {
304 if ((Mbr->Partition[0].OSIndicator == EXTENDED_DOS_PARTITION) ||
305 (Mbr->Partition[0].OSIndicator == EXTENDED_WINDOWS_PARTITION))
307 ExtMbrStartingLba =
UNPACK_UINT32 (Mbr->Partition[0].StartingLBA);
311 HdDev.PartitionNumber = ++Index;
312 HdDev.PartitionStart =
UNPACK_UINT32 (Mbr->Partition[0].StartingLBA) + ExtMbrStartingLba + ParentHdDev.PartitionStart;
313 HdDev.PartitionSize =
UNPACK_UINT32 (Mbr->Partition[0].SizeInLBA);
314 if ((HdDev.PartitionStart + HdDev.PartitionSize - 1 >= ParentHdDev.PartitionStart + ParentHdDev.PartitionSize) ||
315 (HdDev.PartitionStart <= ParentHdDev.PartitionStart))
323 *((UINT32 *)&HdDev.Signature[0]) = 0;
325 ZeroMem (&PartitionInfo,
sizeof (EFI_PARTITION_INFO_PROTOCOL));
326 PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;
327 PartitionInfo.Type = PARTITION_TYPE_MBR;
328 if (Mbr->Partition[0].OSIndicator == EFI_PARTITION) {
329 PartitionInfo.System = 1;
332 CopyMem (&PartitionInfo.Info.Mbr, &Mbr->Partition[0], sizeof (MBR_PARTITION_RECORD));
336 ApplePartitionInfo.
MBRType = HdDev.MBRType;
341 CopyMem (&ApplePartitionInfo.
Signature, &(HdDev.Signature[0]), sizeof (UINT32));
352 (EFI_DEVICE_PATH_PROTOCOL *)&HdDev,
356 HdDev.PartitionStart - ParentHdDev.PartitionStart + HdDev.PartitionSize - 1,
358 ((Mbr->Partition[0].OSIndicator == EFI_PARTITION) ? &gEfiPartTypeSystemPartGuid : NULL)
360 if (!EFI_ERROR (Status)) {
364 if ((Mbr->Partition[1].OSIndicator != EXTENDED_DOS_PARTITION) &&
365 (Mbr->Partition[1].OSIndicator != EXTENDED_WINDOWS_PARTITION)
371 ExtMbrStartingLba =
UNPACK_UINT32 (Mbr->Partition[1].StartingLBA);
375 if (ExtMbrStartingLba == 0) {
378 }
while (ExtMbrStartingLba < ParentHdDev.PartitionSize);
EFI_STATUS PartitionInstallChildHandle(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ParentHandle, IN EFI_DISK_IO_PROTOCOL *ParentDiskIo, IN EFI_DISK_IO2_PROTOCOL *ParentDiskIo2, IN EFI_BLOCK_IO_PROTOCOL *ParentBlockIo, IN EFI_BLOCK_IO2_PROTOCOL *ParentBlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, IN EFI_PARTITION_INFO_PROTOCOL *PartitionInfo, IN APPLE_PARTITION_INFO_PROTOCOL *ApplePartitionInfo, IN EFI_LBA Start, IN EFI_LBA End, IN UINT32 BlockSize, IN EFI_GUID *TypeGuid)