Andrew,  no exact answer till now. Need dig into it further. I suppose it 
should be something resembling Eltorito or hard drive device node.

Paulo, in your patch, you only handle BEA01, NSR02 and NSR03 volumes. And from 
UDF 2.6 spec, looks like BOOT2 is not supported yet. Then how UDF supports 
bootable cd/dvd?

Thanks
Feng

-----Original Message-----
From: Andrew Fish [mailto:[email protected]] 
Sent: Thursday, October 30, 2014 13:24
To: [email protected]
Subject: Re: [edk2] [PATCH RFC] MdeModulePkg/PartitionDxe: Add UDF/ECMA-167 
filesystem support


> On Oct 29, 2014, at 10:08 PM, Tian, Feng <[email protected]> wrote:
> 
> Thanks for your great contribution, Paulo.
> 
> For the device path issue, my personal idea is vendor device path may not be 
> a good idea and I prefer to introduce a new UDF device path node. But let's 
> us wait other's comments at first.
> 

What information would need to be present in an UDF device path node?

Thanks,

Andrew Fish

> Thanks
> Feng
> 
> -----Original Message-----
> From: Paulo Alcantara [mailto:[email protected]]
> Sent: Thursday, October 30, 2014 10:53
> To: [email protected]
> Subject: [edk2] [PATCH RFC] MdeModulePkg/PartitionDxe: Add 
> UDF/ECMA-167 filesystem support
> 
> This patch adds support to finding UDF/ECMA-167 volumes on disks by looking 
> at the UDF Standard Identifiers (BEA01, NSR02/NSR03, TEA01) and the Anchor 
> Volume Descriptor Pointer (AVDP) at LBAs 256, N - 256 or N.
> 
> A new PcdsFeatureFlags (PcdUdfFileSystemSupport) has been added to 
> enable/disable such support -- it's disabled by default.
> 
> I'm currently using VENDOR_DEVICE_PATH for UDF since there isn't any defined 
> for it yet. Should we create one specific for it? Or should we keep using 
> VENDOR_DEVICE_PATH?
> 
> The tests were run under QEMU + OVMF:
> $ qemu-kvm -m 1024 -L . -hda fat:hdd \  
> file=/dev/sdb,if=virtio,media=disk,cache=writeback \  -net none
> 
> Where /dev/sdb is a external HDD previously formatted as an UDF filesystem 
> through the following command:
> 
> $ mkudffs -b 512 --media-type=hd /dev/sdb
> 
> Besides, I've made a good progress on the filesystem driver (UdfDxe). 
> It now supports symlinks, handle inodes which are either File Entry or 
> Extended File Entry, handle both long and short allocation 
> descriptors, as well as the usual
> things: open, read and list files. I'm not going to send it now 
> because I need to test it more, rework the commit messages and a few 
> cleanups which are always good :-)
> 
> My development branches:
> git://git.zytor.com/users/pcacjr/edk2.git partitiondxe (PartitionDxe) 
> git://git.zytor.com/users/pcacjr/edk2.git udf-next (UdfDxe)
> 
> Thanks,
> 
>    -pcacjr
> 
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Paulo Alcantara <[email protected]>
> ---
> MdeModulePkg/MdeModulePkg.dec                      |   6 +
> .../Universal/Disk/PartitionDxe/Partition.c        |   1 +
> .../Universal/Disk/PartitionDxe/Partition.h        |  29 +++
> .../Universal/Disk/PartitionDxe/PartitionDxe.inf   |   9 +-
> MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c     | 277 +++++++++++++++++++++
> MdePkg/Include/IndustryStandard/Udf.h              |  88 +++++++
> 6 files changed, 409 insertions(+), 1 deletion(-)  create mode 100644 
> MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c
> create mode 100644 MdePkg/Include/IndustryStandard/Udf.h
> 
> diff --git a/MdeModulePkg/MdeModulePkg.dec 
> b/MdeModulePkg/MdeModulePkg.dec index 60fb209..e320e1b 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -597,6 +597,12 @@
>   # @Prompt Enable S3 performance data support.
>   
> gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwarePerformanceDataTableS3Suppor
> t|TRUE|BOOLEAN|0x00010064
> 
> +  ## Indicates if UDF/ECMA-167 filesystem will be supported.<BR><BR>
> +  #   TRUE  -  UDF/ECMA-167 filesystem will be supported.<BR>
> +  #   FALSE - UDF/ECMA-167 filesystem will not be supported.<BR>
> +  # @Prompt Enable UDF/ECMA-167 filesystem support.
> +  
> + gEfiMdeModulePkgTokenSpaceGuid.PcdUdfFileSystemSupport|FALSE|BOOLEAN
> + |0
> + x00010069
> +
> [PcdsFeatureFlag.IA32, PcdsFeatureFlag.X64]
>   ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
>   #  It is assumed that 64-bit DxeCore is built in firmware if it is 
> true; otherwise 32-bit DxeCore diff --git 
> a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c 
> b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c
> index 28639b0..27e460f 100644
> --- a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c
> +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c
> @@ -45,6 +45,7 @@ PARTITION_DETECT_ROUTINE mPartitionDetectRoutineTable[] = {
>   PartitionInstallGptChildHandles,
>   PartitionInstallElToritoChildHandles,
>   PartitionInstallMbrChildHandles,
> +  PartitionInstallUdfChildHandles,
>   NULL
> };
> 
> diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.h 
> b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.h
> index 06470f6..26107f0 100644
> --- a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.h
> +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.h
> @@ -38,6 +38,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
> EXPRESS OR IMPLIED.
> 
> #include <IndustryStandard/Mbr.h>
> #include <IndustryStandard/ElTorito.h>
> +#include <IndustryStandard/Udf.h>
> 
> 
> //
> @@ -428,6 +429,34 @@ PartitionInstallMbrChildHandles (
>   IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath
>   );
> 
> +/**
> +  Install child handles if the Handle supports UDF/ECMA-167 volume format.
> +
> +  @param[in]  This        Calling context.
> +  @param[in]  Handle      Parent Handle.
> +  @param[in]  DiskIo      Parent DiskIo interface.
> +  @param[in]  DiskIo2     Parent DiskIo2 interface.
> +  @param[in]  BlockIo     Parent BlockIo interface.
> +  @param[in]  BlockIo2    Parent BlockIo2 interface.
> +  @param[in]  DevicePath  Parent Device Path
> +
> +
> +  @retval EFI_SUCCESS         Child handle(s) was added.
> +  @retval EFI_MEDIA_CHANGED   Media changed Detected.
> +  @retval other               no child handle was added.
> +
> +**/
> +EFI_STATUS
> +PartitionInstallUdfChildHandles (
> +  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
> +  IN  EFI_HANDLE                   Handle,
> +  IN  EFI_DISK_IO_PROTOCOL         *DiskIo,
> +  IN  EFI_DISK_IO2_PROTOCOL        *DiskIo2,
> +  IN  EFI_BLOCK_IO_PROTOCOL        *BlockIo,
> +  IN  EFI_BLOCK_IO2_PROTOCOL       *BlockIo2,
> +  IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath
> +  );
> +
> typedef
> EFI_STATUS
> (*PARTITION_DETECT_ROUTINE) (
> diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf 
> b/MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
> index 6806263..1ce9b44 100644
> --- a/MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
> +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
> @@ -46,13 +46,14 @@
>   Mbr.c
>   Gpt.c
>   ElTorito.c
> +  Udf.c
>   Partition.c
>   Partition.h
> 
> 
> [Packages]
>   MdePkg/MdePkg.dec
> -
> +  MdeModulePkg/MdeModulePkg.dec
> 
> [LibraryClasses]
>   DevicePathLib
> @@ -63,6 +64,7 @@
>   BaseLib
>   UefiDriverEntryPoint
>   DebugLib
> +  PcdLib
> 
> 
> [Guids]
> @@ -85,5 +87,10 @@
>   gEfiDiskIoProtocolGuid                        ## TO_START
>   gEfiDiskIo2ProtocolGuid                       ## TO_START
> 
> +
> +[FeaturePcd]
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUdfFileSystemSupport  ## CONSUMES
> +
> +
> [UserExtensions.TianoCore."ExtraFiles"]
>   PartitionDxeExtra.uni
> diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c 
> b/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c
> new file mode 100644
> index 0000000..4c2fc4f
> --- /dev/null
> +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c
> @@ -0,0 +1,277 @@
> +/** @file
> +  Decode an UDF/ECMA-167 formatted medium
> +
> +Copyright (c) 2014 Paulo Alcantara <[email protected]><BR> This 
> +program and the accompanying materials are licensed and made 
> +available under the terms and conditions of the BSD License which 
> +accompanies this distribution.  The full text of the license may be 
> +found at http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +
> +#include "Partition.h"
> +
> +
> +EFI_GUID gUdfVolumeSignatureGuid = {
> +  0xC5BD4D42, 0x1A76, 0x4996,
> +  { 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } };
> +
> +UDF_STANDARD_IDENTIFIER
> +gUdfStandardIdentifiers[NR_STANDARD_IDENTIFIERS] = {
> +  { { 'B', 'E', 'A', '0', '1' } },
> +  { { 'N', 'S', 'R', '0', '2' } },
> +  { { 'N', 'S', 'R', '0', '3' } },
> +  { { 'T', 'E', 'A', '0', '1' } },
> +};
> +
> +typedef struct {
> +  VENDOR_DEVICE_PATH         DevicePath;
> +  EFI_DEVICE_PATH_PROTOCOL   End;
> +} UDF_DEVICE_PATH;
> +
> +//
> +// C5BD4D42-1A76-4996-8956-73CDA326CD0A
> +//
> +#define EFI_UDF_DEVICE_PATH_GUID \
> +  { 0xC5BD4D42, 0x1A76, 0x4996, \
> +    { 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } \
> +  }
> +
> +UDF_DEVICE_PATH gUdfDevicePath = {
> +  { { MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP,
> +      { sizeof (VENDOR_DEVICE_PATH), 0 } },
> +    EFI_UDF_DEVICE_PATH_GUID
> +  },
> +  { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
> +    { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
> +  }
> +};
> +
> +EFI_STATUS
> +FindAnchorVolumeDescriptorPointer (
> +  IN  EFI_BLOCK_IO_PROTOCOL                  *BlockIo,
> +  IN  EFI_DISK_IO_PROTOCOL                   *DiskIo,
> +  OUT UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER   *AnchorPoint
> +  )
> +{
> +  EFI_STATUS   Status;
> +  UINT32       BlockSize;
> +  EFI_LBA      EndLBA;
> +
> +  BlockSize = BlockIo->Media->BlockSize;
> +  EndLBA = BlockIo->Media->LastBlock;
> +  Status = DiskIo->ReadDisk (
> +                       DiskIo,
> +                       BlockIo->Media->MediaId,
> +                    MultU64x32 (0x100ULL, BlockSize),
> +                       sizeof (UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER),
> +                       (VOID *) AnchorPoint
> +                       );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +  Status = EFI_VOLUME_CORRUPTED;
> +  if (IS_AVDP (AnchorPoint)) {
> +    Status = EFI_SUCCESS;
> +    goto Exit;
> +  }
> +
> +  Status = DiskIo->ReadDisk (
> +                       DiskIo,
> +                       BlockIo->Media->MediaId,
> +                    MultU64x32 (EndLBA - 0x100ULL, BlockSize),
> +                       sizeof (UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER),
> +                       (VOID *) AnchorPoint
> +                       );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +  if (IS_AVDP (AnchorPoint)) {
> +    Status = EFI_SUCCESS;
> +    goto Exit;
> +  }
> +
> +  Status = DiskIo->ReadDisk (
> +                       DiskIo,
> +                       BlockIo->Media->MediaId,
> +                    MultU64x32 (EndLBA, BlockSize),
> +                       sizeof (UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER),
> +                       (VOID *) AnchorPoint
> +                       );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +  if (IS_AVDP (AnchorPoint)) {
> +    Status = EFI_SUCCESS;
> +  }
> +
> +Exit:
> +  return Status;
> +}
> +
> +EFI_STATUS
> +IsSupportedUdfVolume (
> +  IN  EFI_BLOCK_IO_PROTOCOL   *BlockIo,
> +  IN  EFI_DISK_IO_PROTOCOL    *DiskIo,
> +  OUT BOOLEAN                 *Supported
> +  )
> +{
> +  EFI_STATUS                             Status;
> +  UDF_NSR_DESCRIPTOR                     NsrDescriptor;
> +  UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER   AnchorPoint;
> +
> +  *Supported = FALSE;
> +  //
> +  // Start Volume Recognition Sequence
> +  //
> +  Status = DiskIo->ReadDisk (
> +                       DiskIo,
> +                       BlockIo->Media->MediaId,
> +                       BEA_DESCRIPTOR_LSN_OFFSET,
> +                       sizeof (UDF_NSR_DESCRIPTOR),
> +                       (VOID *) &NsrDescriptor
> +                       );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +  if (CompareMem (
> +     (VOID *) &NsrDescriptor.StandardIdentifier,
> +     (VOID *) &gUdfStandardIdentifiers[BEA_IDENTIFIER],
> +     UDF_STANDARD_IDENTIFIER_LENGTH
> +     )
> +    ) {
> +    goto Exit;
> +  }
> +  Status = DiskIo->ReadDisk (
> +                       DiskIo,
> +                       BlockIo->Media->MediaId,
> +                       BEA_DESCRIPTOR_LSN_OFFSET + LOGICAL_SECTOR_SIZE,
> +                       sizeof (UDF_NSR_DESCRIPTOR),
> +                       (VOID *) &NsrDescriptor
> +                       );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +  if (CompareMem (
> +     (VOID *) &NsrDescriptor.StandardIdentifier,
> +     (VOID *) &gUdfStandardIdentifiers[VSD_IDENTIFIER_0],
> +     UDF_STANDARD_IDENTIFIER_LENGTH
> +     )
> +      &&
> +      CompareMem (
> +     (VOID *) &NsrDescriptor.StandardIdentifier,
> +     (VOID *) &gUdfStandardIdentifiers[VSD_IDENTIFIER_1],
> +     UDF_STANDARD_IDENTIFIER_LENGTH
> +        )
> +    ) {
> +    goto Exit;
> +  }
> +  Status = DiskIo->ReadDisk (
> +                       DiskIo,
> +                       BlockIo->Media->MediaId,
> +                       BEA_DESCRIPTOR_LSN_OFFSET + (LOGICAL_SECTOR_SIZE << 
> 1),
> +                       sizeof (UDF_NSR_DESCRIPTOR),
> +                       (VOID *)&NsrDescriptor
> +                       );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +  if (CompareMem (
> +     (VOID *) &NsrDescriptor.StandardIdentifier,
> +     (VOID *) &gUdfStandardIdentifiers[TEA_IDENTIFIER],
> +     UDF_STANDARD_IDENTIFIER_LENGTH
> +     )
> +    ) {
> +    goto Exit;
> +  }
> +
> +  Status = FindAnchorVolumeDescriptorPointer (BlockIo, DiskIo, 
> + &AnchorPoint);  if (!EFI_ERROR (Status)) {
> +    *Supported = TRUE;
> +  }
> +
> +Exit:
> +  return Status;
> +}
> +
> +/**
> +  Install child handles if the Handle supports UDF/ECMA-167 volume format.
> +
> +  @param[in]  This        Calling context.
> +  @param[in]  Handle      Parent Handle.
> +  @param[in]  DiskIo      Parent DiskIo interface.
> +  @param[in]  DiskIo2     Parent DiskIo2 interface.
> +  @param[in]  BlockIo     Parent BlockIo interface.
> +  @param[in]  BlockIo2    Parent BlockIo2 interface.
> +  @param[in]  DevicePath  Parent Device Path
> +
> +
> +  @retval EFI_SUCCESS         Child handle(s) was added.
> +  @retval EFI_MEDIA_CHANGED   Media changed Detected.
> +  @retval other               no child handle was added.
> +
> +**/
> +EFI_STATUS
> +PartitionInstallUdfChildHandles (
> +  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
> +  IN  EFI_HANDLE                   Handle,
> +  IN  EFI_DISK_IO_PROTOCOL         *DiskIo,
> +  IN  EFI_DISK_IO2_PROTOCOL        *DiskIo2,
> +  IN  EFI_BLOCK_IO_PROTOCOL        *BlockIo,
> +  IN  EFI_BLOCK_IO2_PROTOCOL       *BlockIo2,
> +  IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath
> +  )
> +{
> +  EFI_STATUS                Status;
> +  BOOLEAN                   Supported;
> +  EFI_DEVICE_PATH_PROTOCOL  *LastDevicePathNode;
> +  EFI_DEVICE_PATH_PROTOCOL  *DevicePathNode;
> +  EFI_GUID                  *VendorDevGuid;
> +  EFI_GUID                  UdfDevGuid = EFI_UDF_DEVICE_PATH_GUID;
> +
> +  if (!FeaturePcdGet (PcdUdfFileSystemSupport)) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = IsSupportedUdfVolume (BlockIo, DiskIo, &Supported);  if 
> + (EFI_ERROR (Status) || !Supported) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  LastDevicePathNode = NULL;
> +  DevicePathNode = DevicePath;
> +  while (!IsDevicePathEnd (DevicePathNode)) {
> +    LastDevicePathNode  = DevicePathNode;
> +    DevicePathNode      = NextDevicePathNode (DevicePathNode);
> +  }
> +  if (LastDevicePathNode) {
> +    VendorDevGuid = (EFI_GUID *) ((UINT8 *) LastDevicePathNode + OFFSET_OF 
> (VENDOR_DEVICE_PATH, Guid));
> +    if (DevicePathSubType (LastDevicePathNode) == MEDIA_VENDOR_DP &&
> +     CompareGuid (VendorDevGuid, &UdfDevGuid)) {
> +      return EFI_NOT_FOUND;
> +    }
> +  }
> +
> +  Status = PartitionInstallChildHandle (
> +                                    This,
> +                                 Handle,
> +                                 DiskIo,
> +                                 DiskIo2,
> +                                    BlockIo,
> +                                 BlockIo2,
> +                                 DevicePath,
> +                                 (EFI_DEVICE_PATH_PROTOCOL *) 
> &gUdfDevicePath,
> +                                 0,
> +                                 BlockIo->Media->LastBlock,
> +                                 BlockIo->Media->BlockSize,
> +                                 FALSE
> +                                    );
> +  if (!EFI_ERROR (Status)) {
> +    Status = EFI_NOT_FOUND;
> +  }
> +  return Status;
> +}
> diff --git a/MdePkg/Include/IndustryStandard/Udf.h 
> b/MdePkg/Include/IndustryStandard/Udf.h
> new file mode 100644
> index 0000000..8b41d05
> --- /dev/null
> +++ b/MdePkg/Include/IndustryStandard/Udf.h
> @@ -0,0 +1,88 @@
> +/** @file
> +  UDF/ECMA-167 Volume and File Structure Format Definition.
> +
> +Copyright (c) 2014 Paulo Alcantara <[email protected]><BR> This 
> +program and the accompanying materials are licensed and made 
> +available under the terms and conditions of the BSD License which 
> +accompanies this distribution.  The full text of the license may be 
> +found at http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef _UDF_H_
> +#define _UDF_H_
> +
> +//
> +// As specified in ECMA-167 specification, the logical sector size 
> +shall be // 2048 bytes.
> +//
> +#define LOGICAL_SECTOR_SIZE             ((UINT64) 0x0000000000000800ULL)
> +#define FIRST_ANCHOR_POINT_LSN          ((UINT64) 0x0000000000000100ULL)
> +#define BEA_DESCRIPTOR_LSN_OFFSET       ((UINT64) 0x0000000000008000ULL)
> +#define UDF_STANDARD_IDENTIFIER_LENGTH  5
> +
> +#define _GET_TAG_ID(_Pointer) \
> +  (((UDF_DESCRIPTOR_TAG *) (_Pointer))->TagIdentifier)
> +
> +#define IS_PVD(_Pointer) \
> +  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 1)) #define IS_AVDP(_Pointer) 
> +\
> +  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 2))
> +
> +typedef struct {
> +  UINT8   StandardIdentifier[UDF_STANDARD_IDENTIFIER_LENGTH];
> +} UDF_STANDARD_IDENTIFIER;
> +
> +enum {
> +  BEA_IDENTIFIER,
> +  VSD_IDENTIFIER_0,
> +  VSD_IDENTIFIER_1,
> +  TEA_IDENTIFIER,
> +  NR_STANDARD_IDENTIFIERS,
> +};
> +
> +#pragma pack(1)
> +
> +typedef struct {
> +  UINT16   TagIdentifier;
> +  UINT16   DescriptorVersion;
> +  UINT8    TagChecksum;
> +  UINT8    Reserved;
> +  UINT16   TagSerialNumber; // Ignored. Intended for disaster recovery.
> +  UINT16   DescriptorCRC;
> +  UINT16   DescriptorCRCLength;
> +  UINT32   TagLocation;
> +} UDF_DESCRIPTOR_TAG;
> +
> +//
> +// ECMA 167 3/7.1
> +//
> +typedef struct {
> +  UINT32   ExtentLength;
> +  UINT32   ExtentLocation;
> +} UDF_EXTENT_AD;
> +
> +//
> +// ECMA 167 3/9.1
> +//
> +typedef struct {
> +  UINT8   StructureType;
> +  UINT8   StandardIdentifier[5];
> +  UINT8   StructureVersion;
> +  UINT8   Reserved;
> +  UINT8   StructureData[2040];
> +} UDF_NSR_DESCRIPTOR;
> +
> +typedef struct {
> +  UDF_DESCRIPTOR_TAG   DescriptorTag;
> +  UDF_EXTENT_AD        MainVolumeDescriptorSequenceExtent;
> +  UDF_EXTENT_AD        ReserveVolumeDescriptorSequenceExtent;
> +  UINT8                Reserved[480];
> +} UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER;
> +
> +#pragma pack()
> +
> +#endif // _UDF_H_
> --
> 1.9.3
> 
> 
> ----------------------------------------------------------------------
> -------- _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> 
> ----------------------------------------------------------------------
> -------- _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to