31  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
 
   33  IN  EFI_DISK_IO_PROTOCOL         *DiskIo,
 
   34  IN  EFI_DISK_IO2_PROTOCOL        *DiskIo2,
 
   35  IN  EFI_BLOCK_IO_PROTOCOL        *BlockIo,
 
   36  IN  EFI_BLOCK_IO2_PROTOCOL       *BlockIo2,
 
   37  IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath
 
   41  UINT64                         VolDescriptorOffset;
 
   43  EFI_BLOCK_IO_MEDIA             *Media;
 
   44  CDROM_VOLUME_DESCRIPTOR        *VolDescriptor;
 
   45  ELTORITO_CATALOG               *Catalog;
 
   51  CDROM_DEVICE_PATH              CdDev;
 
   56  EFI_PARTITION_INFO_PROTOCOL    PartitionInfo;
 
   59  Found = EFI_NOT_FOUND;
 
   60  Media = BlockIo->Media;
 
   71  if (((SIZE_2KB % Media->BlockSize) != 0) || (Media->BlockSize > SIZE_2KB)) {
 
   75  VolDescriptor = AllocatePool ((UINTN)SIZE_2KB);
 
   77  if (VolDescriptor == NULL) {
 
   81  Catalog = (ELTORITO_CATALOG *)VolDescriptor;
 
   87  for (VolDescriptorOffset = SIZE_32KB;
 
   88       VolDescriptorOffset <= 
MultU64x32 (Media->LastBlock, Media->BlockSize);
 
   89       VolDescriptorOffset += SIZE_2KB)
 
   91    Status = DiskIo->ReadDisk (
 
   98    if (EFI_ERROR (Status)) {
 
  106    if ((VolDescriptor->Unknown.Type == CDVOL_TYPE_END) ||
 
  107        (
CompareMem (VolDescriptor->Unknown.Id, CDVOL_ID, sizeof (VolDescriptor->Unknown.Id)) != 0)
 
  120    if (VolDescriptor->PrimaryVolume.Type == CDVOL_TYPE_CODED) {
 
  121      VolSpaceSize = VolDescriptor->PrimaryVolume.VolSpaceSize[0];
 
  127    if (
CompareMem (VolDescriptor->BootRecordVolume.SystemId, CDVOL_ELTORITO_ID, sizeof (CDVOL_ELTORITO_ID) - 1) != 0) {
 
  135    Lba2KB = 
UNPACK_INT32 (VolDescriptor->BootRecordVolume.EltCatalog);
 
  137    if (Lba2KB * (SIZE_2KB / Media->BlockSize) > Media->LastBlock) {
 
  141    Status = DiskIo->ReadDisk (
 
  148    if (EFI_ERROR (Status)) {
 
  149      DEBUG ((EFI_D_ERROR, 
"EltCheckDevice: error reading catalog %r\n", Status));
 
  157    if ((Catalog->Catalog.Indicator != ELTORITO_ID_CATALOG) || (Catalog->Catalog.Id55AA != 0xAA55)) {
 
  158      DEBUG ((EFI_D_ERROR, 
"EltCheckBootCatalog: El Torito boot catalog header IDs not correct\n"));
 
  163    CheckBuffer = (UINT16 *)Catalog;
 
  164    for (Index = 0; Index < 
sizeof (ELTORITO_CATALOG) / 
sizeof (UINT16); Index += 1) {
 
  165      Check += CheckBuffer[Index];
 
  168    if ((Check & 0xFFFF) != 0) {
 
  169      DEBUG ((EFI_D_ERROR, 
"EltCheckBootCatalog: El Torito boot catalog header checksum failed\n"));
 
  173    MaxIndex = Media->BlockSize / 
sizeof (ELTORITO_CATALOG);
 
  174    for (Index = 1, BootEntry = 1; Index < MaxIndex; Index += 1) {
 
  183      if ((Catalog->Boot.Indicator != ELTORITO_ID_SECTION_BOOTABLE) || (Catalog->Boot.Lba == 0)) {
 
  188      SectorCount  = Catalog->Boot.SectorCount;
 
  190      switch (Catalog->Boot.MediaType) {
 
  191        case ELTORITO_NO_EMULATION:
 
  192          SubBlockSize = Media->BlockSize;
 
  195        case ELTORITO_HARD_DISK:
 
  198        case ELTORITO_12_DISKETTE:
 
  199          SectorCount = 0x50 * 0x02 * 0x0F;
 
  202        case ELTORITO_14_DISKETTE:
 
  203          SectorCount = 0x50 * 0x02 * 0x12;
 
  206        case ELTORITO_28_DISKETTE:
 
  207          SectorCount = 0x50 * 0x02 * 0x24;
 
  211          DEBUG ((EFI_D_INIT, 
"EltCheckDevice: unsupported El Torito boot media type %x\n", Catalog->Boot.MediaType));
 
  213          SubBlockSize = Media->BlockSize;
 
  220      CdDev.Header.Type    = MEDIA_DEVICE_PATH;
 
  221      CdDev.Header.SubType = MEDIA_CDROM_DP;
 
  222      SetDevicePathNodeLength (&CdDev.Header, sizeof (CdDev));
 
  231      CdDev.BootEntry = (UINT32)BootEntry;
 
  233      CdDev.PartitionStart = Catalog->Boot.Lba * (SIZE_2KB / Media->BlockSize);
 
  234      if (SectorCount < 2) {
 
  238        if (VolSpaceSize * (SIZE_2KB / Media->BlockSize) > (Media->LastBlock + 1)) {
 
  239          CdDev.PartitionSize = (UINT32)(Media->LastBlock - Catalog->Boot.Lba * (SIZE_2KB / Media->BlockSize) + 1);
 
  241          CdDev.PartitionSize = (UINT32)(VolSpaceSize - Catalog->Boot.Lba) * (SIZE_2KB / Media->BlockSize);
 
  246                                  SectorCount * (SIZE_2KB / Media->BlockSize),
 
  248                                  ) + Media->BlockSize - 1,
 
  253      ZeroMem (&PartitionInfo, 
sizeof (EFI_PARTITION_INFO_PROTOCOL));
 
  254      PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;
 
  255      PartitionInfo.Type     = PARTITION_TYPE_OTHER;
 
  271                 (EFI_DEVICE_PATH_PROTOCOL *)&CdDev,
 
  274                 Catalog->Boot.Lba * (SIZE_2KB / Media->BlockSize),
 
  275                 Catalog->Boot.Lba * (SIZE_2KB / Media->BlockSize) + CdDev.
PartitionSize - 1,
 
  279      if (!EFI_ERROR (Status)) {
 
  285  FreePool (VolDescriptor);
 
 
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)