4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* $Id$ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Apple.c
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (C) 2012 Oracle Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The contents of this file may alternatively be used under the terms
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * of the Common Development and Distribution License Version 1.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution, in which case the provisions of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CDDL are applicable instead of those of the GPL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * You may elect to license modified versions of this file under the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * terms and conditions of either the GPL or the CDDL or both.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Partition.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DPISTRLEN 32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack(1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct APPLE_PT_HEADER {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 sbSig; /* must be BE 0x4552 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 sbBlkSize; /* block size of device */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 sbBlkCount; /* number of blocks on device */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 sbDevType; /* device type */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 sbDevId; /* device id */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 sbData; /* not used */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 sbDrvrCount; /* driver descriptor count */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 sbMap[247]; /* descriptor map */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} APPLE_PT_HEADER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct APPLE_PT_ENTRY {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 signature ; /* must be BE 0x504D for new style PT */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 reserved_1 ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 map_entries ; /* how many PT entries are there */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 pblock_start ; /* first physical block */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 pblocks ; /* number of physical blocks */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char name[DPISTRLEN] ; /* name of partition */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char type[DPISTRLEN] ; /* type of partition */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Some more data we don't really need */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} APPLE_PT_ENTRY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#pragma pack()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic UINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbe16_to_cpu(UINT16 x)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SwapBytes16(x);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic UINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbe32_to_cpu(UINT32 x)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SwapBytes32(x);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Install child handles if the Handle supports Apple partition table format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Calling context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle Parent Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DiskIo Parent DiskIo interface
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BlockIo Parent BlockIo interface
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DevicePath Parent Device Path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Child handle(s) was added
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_MEDIA_CHANGED Media changed Detected
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other no child handle was added
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPartitionInstallAppleChildHandles (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DRIVER_BINDING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DISK_IO_PROTOCOL *DiskIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Lba;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BLOCK_IO_MEDIA *Media;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Block;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //UINTN MaxIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /** @todo: wrong, as this PT can be on both HDD or CD */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CDROM_DEVICE_PATH CdDev;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //EFI_DEVICE_PATH_PROTOCOL Dev;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Found;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Partition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 PartitionEntries;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 VolSpaceSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 SubBlockSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 BlkPerSec;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
76a9bce2b9ca58813ae03900c71fa04b93a04f1avboxsync VBoxLogFlowFuncMarkDP(DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Media = BlockIo->Media;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VolSpaceSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Block = AllocatePool ((UINTN) Media->BlockSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Block == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync APPLE_PT_HEADER * Header;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* read PT header first */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Lba = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = DiskIo->ReadDisk (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DiskIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Media->MediaId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MultU64x32 (Lba, Media->BlockSize),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Media->BlockSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Block
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Header = (APPLE_PT_HEADER *)Block;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (be16_to_cpu(Header->sbSig) != 0x4552)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubBlockSize = be16_to_cpu(Header->sbBlkSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlkPerSec = Media->BlockSize / SubBlockSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Fail if media block size isn't an exact multiple */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Media->BlockSize != SubBlockSize * BlkPerSec)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Now iterate over PT entries and install child handles */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PartitionEntries = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Partition = 1; Partition <= PartitionEntries; Partition++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync APPLE_PT_ENTRY * Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 StartLba;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 SizeLbs;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = DiskIo->ReadDisk (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DiskIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Media->MediaId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MultU64x32 (Partition, SubBlockSize),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubBlockSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Block
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto done; /* would break, but ... */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Entry = (APPLE_PT_ENTRY *)Block;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (be16_to_cpu(Entry->signature) != 0x504D)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print(L"Not a new PT entry: %x", Entry->signature);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* First partition contains partitions count */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Partition == 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PartitionEntries = be32_to_cpu(Entry->map_entries);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartLba = be32_to_cpu(Entry->pblock_start);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeLbs = be32_to_cpu(Entry->pblocks);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (0 && CompareMem("Apple_HFS", Entry->type, 10) == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print(L"HFS partition (%d of %d) at LBA 0x%x size=%dM\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Partition, PartitionEntries, StartLba,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32)(MultU64x32(SizeLbs, SubBlockSize) / (1024 * 1024)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&CdDev, sizeof (CdDev));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdDev.Header.Type = MEDIA_DEVICE_PATH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdDev.Header.SubType = MEDIA_CDROM_DP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathNodeLength (&CdDev.Header, sizeof (CdDev));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdDev.BootEntry = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Convert from partition to media blocks */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdDev.PartitionStart = StartLba / BlkPerSec; /* start, LBA */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdDev.PartitionSize = SizeLbs / BlkPerSec; /* size, LBs */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PartitionInstallChildHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DiskIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockIo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockIo2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_DEVICE_PATH_PROTOCOL *) &CdDev,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdDev.PartitionStart,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CdDev.PartitionStart + CdDev.PartitionSize - 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubBlockSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync done:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Block);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Found;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}