UDF/ECMA-167 file system driver.\r
\r
Copyright (C) 2014-2017 Paulo Alcantara <pcacjr@zytor.com>\r
+ Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
\r
- This program and the accompanying materials are licensed and made available\r
- under the terms and conditions of the BSD License which accompanies this\r
- distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
- WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
**/\r
\r
#ifndef _UDF_H_\r
{ 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } \\r
}\r
\r
-#define UDF_DEFAULT_LV_NUM 0\r
-\r
-#define IS_PVD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 1))\r
-#define IS_PD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 5))\r
-#define IS_LVD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 6))\r
-#define IS_TD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 8))\r
-#define IS_FSD(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 256))\r
-#define IS_FE(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 261))\r
-#define IS_EFE(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 266))\r
-#define IS_FID(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 257))\r
-#define IS_AED(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 258))\r
-#define IS_LVID(_Pointer) \\r
- ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 9))\r
-\r
-#define _GET_FILETYPE(_Pointer) \\r
- (IS_FE (_Pointer) ? \\r
- (((UDF_FILE_ENTRY *)(_Pointer))->IcbTag.FileType) \\r
- : \\r
- (((UDF_EXTENDED_FILE_ENTRY *)(_Pointer))->IcbTag.FileType))\r
-\r
-#define IS_FE_DIRECTORY(_Pointer) \\r
- ((BOOLEAN)(_GET_FILETYPE (_Pointer) == 4))\r
-#define IS_FE_STANDARD_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILETYPE (_Pointer) == 5))\r
-#define IS_FE_SYMLINK(_Pointer) \\r
- ((BOOLEAN)(_GET_FILETYPE (_Pointer) == 12))\r
+#define FE_ICB_FILE_TYPE(_Ptr) \\r
+ (UDF_FILE_ENTRY_TYPE)( \\r
+ ((UDF_DESCRIPTOR_TAG *)(_Ptr))->TagIdentifier == UdfFileEntry ? \\r
+ ((UDF_FILE_ENTRY *)(_Ptr))->IcbTag.FileType : \\r
+ ((UDF_EXTENDED_FILE_ENTRY *)(_Ptr))->IcbTag.FileType)\r
+\r
+typedef enum {\r
+ UdfFileEntryDirectory = 4,\r
+ UdfFileEntryStandardFile = 5,\r
+ UdfFileEntrySymlink = 12,\r
+} UDF_FILE_ENTRY_TYPE;\r
\r
#define HIDDEN_FILE (1 << 0)\r
#define DIRECTORY_FILE (1 << 1)\r
#define DELETED_FILE (1 << 2)\r
#define PARENT_FILE (1 << 3)\r
\r
-#define _GET_FILE_CHARS(_Pointer) \\r
- (((UDF_FILE_IDENTIFIER_DESCRIPTOR *)(_Pointer))->FileCharacteristics)\r
-\r
-#define IS_FID_HIDDEN_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & HIDDEN_FILE))\r
-#define IS_FID_DIRECTORY_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & DIRECTORY_FILE))\r
-#define IS_FID_DELETED_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & DELETED_FILE))\r
-#define IS_FID_PARENT_FILE(_Pointer) \\r
- ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & PARENT_FILE))\r
-#define IS_FID_NORMAL_FILE(_Pointer) \\r
- ((BOOLEAN)(!IS_FID_DIRECTORY_FILE (_Pointer) && \\r
- !IS_FID_PARENT_FILE (_Pointer)))\r
+#define IS_FID_HIDDEN_FILE(_Fid) \\r
+ (BOOLEAN)((_Fid)->FileCharacteristics & HIDDEN_FILE)\r
+#define IS_FID_DIRECTORY_FILE(_Fid) \\r
+ (BOOLEAN)((_Fid)->FileCharacteristics & DIRECTORY_FILE)\r
+#define IS_FID_DELETED_FILE(_Fid) \\r
+ (BOOLEAN)((_Fid)->FileCharacteristics & DELETED_FILE)\r
+#define IS_FID_PARENT_FILE(_Fid) \\r
+ (BOOLEAN)((_Fid)->FileCharacteristics & PARENT_FILE)\r
+#define IS_FID_NORMAL_FILE(_Fid) \\r
+ (BOOLEAN)(!IS_FID_DIRECTORY_FILE (_Fid) && \\r
+ !IS_FID_PARENT_FILE (_Fid))\r
\r
typedef enum {\r
- SHORT_ADS_SEQUENCE,\r
- LONG_ADS_SEQUENCE,\r
- EXTENDED_ADS_SEQUENCE,\r
- INLINE_DATA\r
+ ShortAdsSequence,\r
+ LongAdsSequence,\r
+ ExtendedAdsSequence,\r
+ InlineData\r
} UDF_FE_RECORDING_FLAGS;\r
\r
#define GET_FE_RECORDING_FLAGS(_Fe) \\r
sizeof (UDF_DESCRIPTOR_TAG)))->Flags & 0x07)\r
\r
typedef enum {\r
- EXTENT_RECORDED_AND_ALLOCATED,\r
- EXTENT_NOT_RECORDED_BUT_ALLOCATED,\r
- EXTENT_NOT_RECORDED_NOT_ALLOCATED,\r
- EXTENT_IS_NEXT_EXTENT,\r
+ ExtentRecordedAndAllocated,\r
+ ExtentNotRecordedButAllocated,\r
+ ExtentNotRecordedNotAllocated,\r
+ ExtentIsNextExtent,\r
} UDF_EXTENT_FLAGS;\r
\r
#define AD_LENGTH(_RecFlags) \\r
- ((_RecFlags) == SHORT_ADS_SEQUENCE ? \\r
+ ((_RecFlags) == ShortAdsSequence ? \\r
((UINT64)(sizeof (UDF_SHORT_ALLOCATION_DESCRIPTOR))) : \\r
((UINT64)(sizeof (UDF_LONG_ALLOCATION_DESCRIPTOR))))\r
\r
#define GET_EXTENT_FLAGS(_RecFlags, _Ad) \\r
- ((_RecFlags) == SHORT_ADS_SEQUENCE ? \\r
+ ((_RecFlags) == ShortAdsSequence ? \\r
((UDF_EXTENT_FLAGS)((((UDF_SHORT_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength >> \\r
30) & 0x3)) : \\r
((UDF_EXTENT_FLAGS)((((UDF_LONG_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength >> \\r
30) & 0x3)))\r
\r
#define GET_EXTENT_LENGTH(_RecFlags, _Ad) \\r
- ((_RecFlags) == SHORT_ADS_SEQUENCE ? \\r
+ ((_RecFlags) == ShortAdsSequence ? \\r
((UINT32)((((UDF_SHORT_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength & \\r
~0xC0000000UL))) : \\r
((UINT32)((((UDF_LONG_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength & \\r
#define IS_VALID_COMPRESSION_ID(_CompId) \\r
((BOOLEAN)((_CompId) == 8 || (_CompId) == 16))\r
\r
-#define LV_BLOCK_SIZE(_Vol, _LvNum) \\r
- (_Vol)->LogicalVolDescs[(_LvNum)]->LogicalBlockSize\r
-\r
-#define UDF_STANDARD_IDENTIFIER_LENGTH 5\r
-\r
-#define LV_UDF_REVISION(_Lv) \\r
- *(UINT16 *)(UINTN)(_Lv)->DomainIdentifier.IdentifierSuffix\r
+#define UDF_STANDARD_IDENTIFIER_LENGTH 5\r
\r
#pragma pack(1)\r
\r
typedef struct {\r
- UINT8 StandardIdentifier[UDF_STANDARD_IDENTIFIER_LENGTH];\r
+ UINT8 StandardIdentifier[UDF_STANDARD_IDENTIFIER_LENGTH];\r
} UDF_STANDARD_IDENTIFIER;\r
\r
#pragma pack()\r
\r
typedef enum {\r
- READ_FILE_GET_FILESIZE,\r
- READ_FILE_ALLOCATE_AND_READ,\r
- READ_FILE_SEEK_AND_READ,\r
+ ReadFileGetFileSize,\r
+ ReadFileAllocateAndRead,\r
+ ReadFileSeekAndRead,\r
} UDF_READ_FILE_FLAGS;\r
\r
typedef struct {\r
- VOID *FileData;\r
- UDF_READ_FILE_FLAGS Flags;\r
- UINT64 FileDataSize;\r
- UINT64 FilePosition;\r
- UINT64 FileSize;\r
- UINT64 ReadLength;\r
+ VOID *FileData;\r
+ UDF_READ_FILE_FLAGS Flags;\r
+ UINT64 FileDataSize;\r
+ UINT64 FilePosition;\r
+ UINT64 FileSize;\r
+ UINT64 ReadLength;\r
} UDF_READ_FILE_INFO;\r
\r
#pragma pack(1)\r
\r
typedef struct {\r
- UINT8 CharacterSetType;\r
- UINT8 CharacterSetInfo[63];\r
-} UDF_CHAR_SPEC;\r
-\r
-typedef struct {\r
- UINT8 Flags;\r
- UINT8 Identifier[23];\r
- UINT8 IdentifierSuffix[8];\r
-} UDF_ENTITY_ID;\r
-\r
-typedef struct {\r
- UINT16 TypeAndTimezone;\r
- INT16 Year;\r
- UINT8 Month;\r
- UINT8 Day;\r
- UINT8 Hour;\r
- UINT8 Minute;\r
- UINT8 Second;\r
- UINT8 Centiseconds;\r
- UINT8 HundredsOfMicroseconds;\r
- UINT8 Microseconds;\r
+ UINT16 TypeAndTimezone;\r
+ INT16 Year;\r
+ UINT8 Month;\r
+ UINT8 Day;\r
+ UINT8 Hour;\r
+ UINT8 Minute;\r
+ UINT8 Second;\r
+ UINT8 Centiseconds;\r
+ UINT8 HundredsOfMicroseconds;\r
+ UINT8 Microseconds;\r
} UDF_TIMESTAMP;\r
\r
typedef struct {\r
- UINT32 LogicalBlockNumber;\r
- UINT16 PartitionReferenceNumber;\r
-} UDF_LB_ADDR;\r
-\r
-typedef struct {\r
- UINT32 ExtentLength;\r
- UDF_LB_ADDR ExtentLocation;\r
- UINT8 ImplementationUse[6];\r
-} UDF_LONG_ALLOCATION_DESCRIPTOR;\r
-\r
-typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UINT32 PrevAllocationExtentDescriptor;\r
- UINT32 LengthOfAllocationDescriptors;\r
+ UDF_DESCRIPTOR_TAG DescriptorTag;\r
+ UINT32 PrevAllocationExtentDescriptor;\r
+ UINT32 LengthOfAllocationDescriptors;\r
} UDF_ALLOCATION_EXTENT_DESCRIPTOR;\r
\r
typedef struct {\r
- UINT8 StructureType;\r
- UINT8 StandardIdentifier[UDF_STANDARD_IDENTIFIER_LENGTH];\r
- UINT8 StructureVersion;\r
- UINT8 Reserved;\r
- UINT8 StructureData[2040];\r
+ UINT8 StructureType;\r
+ UINT8 StandardIdentifier[UDF_STANDARD_IDENTIFIER_LENGTH];\r
+ UINT8 StructureVersion;\r
+ UINT8 Reserved;\r
+ UINT8 StructureData[2040];\r
} UDF_VOLUME_DESCRIPTOR;\r
\r
typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UINT32 VolumeDescriptorSequenceNumber;\r
- UINT16 PartitionFlags;\r
- UINT16 PartitionNumber;\r
- UDF_ENTITY_ID PartitionContents;\r
- UINT8 PartitionContentsUse[128];\r
- UINT32 AccessType;\r
- UINT32 PartitionStartingLocation;\r
- UINT32 PartitionLength;\r
- UDF_ENTITY_ID ImplementationIdentifier;\r
- UINT8 ImplementationUse[128];\r
- UINT8 Reserved[156];\r
-} UDF_PARTITION_DESCRIPTOR;\r
-\r
-typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UINT32 VolumeDescriptorSequenceNumber;\r
- UDF_CHAR_SPEC DescriptorCharacterSet;\r
- UINT8 LogicalVolumeIdentifier[128];\r
- UINT32 LogicalBlockSize;\r
- UDF_ENTITY_ID DomainIdentifier;\r
- UDF_LONG_ALLOCATION_DESCRIPTOR LogicalVolumeContentsUse;\r
- UINT32 MapTableLength;\r
- UINT32 NumberOfPartitionMaps;\r
- UDF_ENTITY_ID ImplementationIdentifier;\r
- UINT8 ImplementationUse[128];\r
- UDF_EXTENT_AD IntegritySequenceExtent;\r
- UINT8 PartitionMaps[6];\r
-} UDF_LOGICAL_VOLUME_DESCRIPTOR;\r
+ UDF_DESCRIPTOR_TAG DescriptorTag;\r
+ UDF_TIMESTAMP RecordingDateTime;\r
+ UINT32 IntegrityType;\r
+ UDF_EXTENT_AD NextIntegrityExtent;\r
+ UINT8 LogicalVolumeContentsUse[32];\r
+ UINT32 NumberOfPartitions;\r
+ UINT32 LengthOfImplementationUse;\r
+ UINT8 Data[0];\r
+} UDF_LOGICAL_VOLUME_INTEGRITY;\r
\r
typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UDF_TIMESTAMP RecordingDateTime;\r
- UINT32 IntegrityType;\r
- UDF_EXTENT_AD NextIntegrityExtent;\r
- UINT8 LogicalVolumeContentsUse[32];\r
- UINT32 NumberOfPartitions;\r
- UINT32 LengthOfImplementationUse;\r
- UINT8 Data[0];\r
-} UDF_LOGICAL_VOLUME_INTEGRITY;\r
+ UDF_DESCRIPTOR_TAG DescriptorTag;\r
+ UINT32 VolumeDescriptorSequenceNumber;\r
+ UINT16 PartitionFlags;\r
+ UINT16 PartitionNumber;\r
+ UDF_ENTITY_ID PartitionContents;\r
+ UINT8 PartitionContentsUse[128];\r
+ UINT32 AccessType;\r
+ UINT32 PartitionStartingLocation;\r
+ UINT32 PartitionLength;\r
+ UDF_ENTITY_ID ImplementationIdentifier;\r
+ UINT8 ImplementationUse[128];\r
+ UINT8 Reserved[156];\r
+} UDF_PARTITION_DESCRIPTOR;\r
\r
typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UDF_TIMESTAMP RecordingDateAndTime;\r
- UINT16 InterchangeLevel;\r
- UINT16 MaximumInterchangeLevel;\r
- UINT32 CharacterSetList;\r
- UINT32 MaximumCharacterSetList;\r
- UINT32 FileSetNumber;\r
- UINT32 FileSetDescriptorNumber;\r
- UDF_CHAR_SPEC LogicalVolumeIdentifierCharacterSet;\r
- UINT8 LogicalVolumeIdentifier[128];\r
- UDF_CHAR_SPEC FileSetCharacterSet;\r
- UINT8 FileSetIdentifier[32];\r
- UINT8 CopyrightFileIdentifier[32];\r
- UINT8 AbstractFileIdentifier[32];\r
- UDF_LONG_ALLOCATION_DESCRIPTOR RootDirectoryIcb;\r
- UDF_ENTITY_ID DomainIdentifier;\r
- UDF_LONG_ALLOCATION_DESCRIPTOR NextExtent;\r
- UDF_LONG_ALLOCATION_DESCRIPTOR SystemStreamDirectoryIcb;\r
- UINT8 Reserved[32];\r
+ UDF_DESCRIPTOR_TAG DescriptorTag;\r
+ UDF_TIMESTAMP RecordingDateAndTime;\r
+ UINT16 InterchangeLevel;\r
+ UINT16 MaximumInterchangeLevel;\r
+ UINT32 CharacterSetList;\r
+ UINT32 MaximumCharacterSetList;\r
+ UINT32 FileSetNumber;\r
+ UINT32 FileSetDescriptorNumber;\r
+ UDF_CHAR_SPEC LogicalVolumeIdentifierCharacterSet;\r
+ UINT8 LogicalVolumeIdentifier[128];\r
+ UDF_CHAR_SPEC FileSetCharacterSet;\r
+ UINT8 FileSetIdentifier[32];\r
+ UINT8 CopyrightFileIdentifier[32];\r
+ UINT8 AbstractFileIdentifier[32];\r
+ UDF_LONG_ALLOCATION_DESCRIPTOR RootDirectoryIcb;\r
+ UDF_ENTITY_ID DomainIdentifier;\r
+ UDF_LONG_ALLOCATION_DESCRIPTOR NextExtent;\r
+ UDF_LONG_ALLOCATION_DESCRIPTOR SystemStreamDirectoryIcb;\r
+ UINT8 Reserved[32];\r
} UDF_FILE_SET_DESCRIPTOR;\r
\r
typedef struct {\r
- UINT32 ExtentLength;\r
- UINT32 ExtentPosition;\r
+ UINT32 ExtentLength;\r
+ UINT32 ExtentPosition;\r
} UDF_SHORT_ALLOCATION_DESCRIPTOR;\r
\r
typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UINT16 FileVersionNumber;\r
- UINT8 FileCharacteristics;\r
- UINT8 LengthOfFileIdentifier;\r
- UDF_LONG_ALLOCATION_DESCRIPTOR Icb;\r
- UINT16 LengthOfImplementationUse;\r
- UINT8 Data[0];\r
+ UDF_DESCRIPTOR_TAG DescriptorTag;\r
+ UINT16 FileVersionNumber;\r
+ UINT8 FileCharacteristics;\r
+ UINT8 LengthOfFileIdentifier;\r
+ UDF_LONG_ALLOCATION_DESCRIPTOR Icb;\r
+ UINT16 LengthOfImplementationUse;\r
+ UINT8 Data[0];\r
} UDF_FILE_IDENTIFIER_DESCRIPTOR;\r
\r
typedef struct {\r
- UINT32 PriorRecordNumberOfDirectEntries;\r
- UINT16 StrategyType;\r
- UINT16 StrategyParameter;\r
- UINT16 MaximumNumberOfEntries;\r
- UINT8 Reserved;\r
- UINT8 FileType;\r
- UDF_LB_ADDR ParentIcbLocation;\r
- UINT16 Flags;\r
+ UINT32 PriorRecordNumberOfDirectEntries;\r
+ UINT16 StrategyType;\r
+ UINT16 StrategyParameter;\r
+ UINT16 MaximumNumberOfEntries;\r
+ UINT8 Reserved;\r
+ UINT8 FileType;\r
+ UDF_LB_ADDR ParentIcbLocation;\r
+ UINT16 Flags;\r
} UDF_ICB_TAG;\r
\r
typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UDF_ICB_TAG IcbTag;\r
- UINT32 Uid;\r
- UINT32 Gid;\r
- UINT32 Permissions;\r
- UINT16 FileLinkCount;\r
- UINT8 RecordFormat;\r
- UINT8 RecordDisplayAttributes;\r
- UINT32 RecordLength;\r
- UINT64 InformationLength;\r
- UINT64 LogicalBlocksRecorded;\r
- UDF_TIMESTAMP AccessTime;\r
- UDF_TIMESTAMP ModificationTime;\r
- UDF_TIMESTAMP AttributeTime;\r
- UINT32 CheckPoint;\r
- UDF_LONG_ALLOCATION_DESCRIPTOR ExtendedAttributeIcb;\r
- UDF_ENTITY_ID ImplementationIdentifier;\r
- UINT64 UniqueId;\r
- UINT32 LengthOfExtendedAttributes;\r
- UINT32 LengthOfAllocationDescriptors;\r
- UINT8 Data[0]; // L_EA + L_AD\r
+ UDF_DESCRIPTOR_TAG DescriptorTag;\r
+ UDF_ICB_TAG IcbTag;\r
+ UINT32 Uid;\r
+ UINT32 Gid;\r
+ UINT32 Permissions;\r
+ UINT16 FileLinkCount;\r
+ UINT8 RecordFormat;\r
+ UINT8 RecordDisplayAttributes;\r
+ UINT32 RecordLength;\r
+ UINT64 InformationLength;\r
+ UINT64 LogicalBlocksRecorded;\r
+ UDF_TIMESTAMP AccessTime;\r
+ UDF_TIMESTAMP ModificationTime;\r
+ UDF_TIMESTAMP AttributeTime;\r
+ UINT32 CheckPoint;\r
+ UDF_LONG_ALLOCATION_DESCRIPTOR ExtendedAttributeIcb;\r
+ UDF_ENTITY_ID ImplementationIdentifier;\r
+ UINT64 UniqueId;\r
+ UINT32 LengthOfExtendedAttributes;\r
+ UINT32 LengthOfAllocationDescriptors;\r
+ UINT8 Data[0]; // L_EA + L_AD\r
} UDF_FILE_ENTRY;\r
\r
typedef struct {\r
- UDF_DESCRIPTOR_TAG DescriptorTag;\r
- UDF_ICB_TAG IcbTag;\r
- UINT32 Uid;\r
- UINT32 Gid;\r
- UINT32 Permissions;\r
- UINT16 FileLinkCount;\r
- UINT8 RecordFormat;\r
- UINT8 RecordDisplayAttributes;\r
- UINT32 RecordLength;\r
- UINT64 InformationLength;\r
- UINT64 ObjectSize;\r
- UINT64 LogicalBlocksRecorded;\r
- UDF_TIMESTAMP AccessTime;\r
- UDF_TIMESTAMP ModificationTime;\r
- UDF_TIMESTAMP CreationTime;\r
- UDF_TIMESTAMP AttributeTime;\r
- UINT32 CheckPoint;\r
- UINT32 Reserved;\r
- UDF_LONG_ALLOCATION_DESCRIPTOR ExtendedAttributeIcb;\r
- UDF_LONG_ALLOCATION_DESCRIPTOR StreamDirectoryIcb;\r
- UDF_ENTITY_ID ImplementationIdentifier;\r
- UINT64 UniqueId;\r
- UINT32 LengthOfExtendedAttributes;\r
- UINT32 LengthOfAllocationDescriptors;\r
- UINT8 Data[0]; // L_EA + L_AD\r
+ UDF_DESCRIPTOR_TAG DescriptorTag;\r
+ UDF_ICB_TAG IcbTag;\r
+ UINT32 Uid;\r
+ UINT32 Gid;\r
+ UINT32 Permissions;\r
+ UINT16 FileLinkCount;\r
+ UINT8 RecordFormat;\r
+ UINT8 RecordDisplayAttributes;\r
+ UINT32 RecordLength;\r
+ UINT64 InformationLength;\r
+ UINT64 ObjectSize;\r
+ UINT64 LogicalBlocksRecorded;\r
+ UDF_TIMESTAMP AccessTime;\r
+ UDF_TIMESTAMP ModificationTime;\r
+ UDF_TIMESTAMP CreationTime;\r
+ UDF_TIMESTAMP AttributeTime;\r
+ UINT32 CheckPoint;\r
+ UINT32 Reserved;\r
+ UDF_LONG_ALLOCATION_DESCRIPTOR ExtendedAttributeIcb;\r
+ UDF_LONG_ALLOCATION_DESCRIPTOR StreamDirectoryIcb;\r
+ UDF_ENTITY_ID ImplementationIdentifier;\r
+ UINT64 UniqueId;\r
+ UINT32 LengthOfExtendedAttributes;\r
+ UINT32 LengthOfAllocationDescriptors;\r
+ UINT8 Data[0]; // L_EA + L_AD\r
} UDF_EXTENDED_FILE_ENTRY;\r
\r
typedef struct {\r
- UINT8 ComponentType;\r
- UINT8 LengthOfComponentIdentifier;\r
- UINT16 ComponentFileVersionNumber;\r
- UINT8 ComponentIdentifier[0];\r
+ UINT8 ComponentType;\r
+ UINT8 LengthOfComponentIdentifier;\r
+ UINT16 ComponentFileVersionNumber;\r
+ UINT8 ComponentIdentifier[0];\r
} UDF_PATH_COMPONENT;\r
\r
#pragma pack()\r
// UDF filesystem driver's private data\r
//\r
typedef struct {\r
- UDF_LOGICAL_VOLUME_DESCRIPTOR **LogicalVolDescs;\r
- UINTN LogicalVolDescsNo;\r
- UDF_PARTITION_DESCRIPTOR **PartitionDescs;\r
- UINTN PartitionDescsNo;\r
- UDF_FILE_SET_DESCRIPTOR **FileSetDescs;\r
- UINTN FileSetDescsNo;\r
- UINTN FileEntrySize;\r
+ UINT64 MainVdsStartLocation;\r
+ UDF_LOGICAL_VOLUME_DESCRIPTOR LogicalVolDesc;\r
+ UDF_PARTITION_DESCRIPTOR PartitionDesc;\r
+ UDF_FILE_SET_DESCRIPTOR FileSetDesc;\r
+ UINTN FileEntrySize;\r
} UDF_VOLUME_INFO;\r
\r
typedef struct {\r
- VOID *FileEntry;\r
- UDF_FILE_IDENTIFIER_DESCRIPTOR *FileIdentifierDesc;\r
+ VOID *FileEntry;\r
+ UDF_FILE_IDENTIFIER_DESCRIPTOR *FileIdentifierDesc;\r
} UDF_FILE_INFO;\r
\r
typedef struct {\r
- VOID *DirectoryData;\r
- UINT64 DirectoryLength;\r
- UINT64 FidOffset;\r
+ VOID *DirectoryData;\r
+ UINT64 DirectoryLength;\r
+ UINT64 FidOffset;\r
} UDF_READ_DIRECTORY_INFO;\r
\r
-#define PRIVATE_UDF_FILE_DATA_SIGNATURE SIGNATURE_32 ('U', 'd', 'f', 'f')\r
+#define PRIVATE_UDF_FILE_DATA_SIGNATURE SIGNATURE_32 ('U', 'd', 'f', 'f')\r
\r
#define PRIVATE_UDF_FILE_DATA_FROM_THIS(a) \\r
CR ( \\r
)\r
\r
typedef struct {\r
- UINTN Signature;\r
- BOOLEAN IsRootDirectory;\r
- UDF_FILE_INFO *Root;\r
- UDF_FILE_INFO File;\r
- UDF_READ_DIRECTORY_INFO ReadDirInfo;\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
- EFI_FILE_PROTOCOL FileIo;\r
- CHAR16 AbsoluteFileName[UDF_PATH_LENGTH];\r
- CHAR16 FileName[UDF_FILENAME_LENGTH];\r
- UINT64 FileSize;\r
- UINT64 FilePosition;\r
+ UINTN Signature;\r
+ BOOLEAN IsRootDirectory;\r
+ UDF_FILE_INFO *Root;\r
+ UDF_FILE_INFO File;\r
+ UDF_READ_DIRECTORY_INFO ReadDirInfo;\r
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
+ EFI_FILE_PROTOCOL FileIo;\r
+ CHAR16 AbsoluteFileName[UDF_PATH_LENGTH];\r
+ CHAR16 FileName[UDF_FILENAME_LENGTH];\r
+ UINT64 FileSize;\r
+ UINT64 FilePosition;\r
} PRIVATE_UDF_FILE_DATA;\r
\r
-#define PRIVATE_UDF_SIMPLE_FS_DATA_SIGNATURE SIGNATURE_32 ('U', 'd', 'f', 's')\r
+#define PRIVATE_UDF_SIMPLE_FS_DATA_SIGNATURE SIGNATURE_32 ('U', 'd', 'f', 's')\r
\r
#define PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS(a) \\r
CR ( \\r
)\r
\r
typedef struct {\r
- UINTN Signature;\r
- EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
- EFI_DISK_IO_PROTOCOL *DiskIo;\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFs;\r
- UDF_VOLUME_INFO Volume;\r
- UDF_FILE_INFO Root;\r
- UINTN OpenFiles;\r
- EFI_HANDLE Handle;\r
+ UINTN Signature;\r
+ EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+ EFI_DISK_IO_PROTOCOL *DiskIo;\r
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFs;\r
+ UDF_VOLUME_INFO Volume;\r
+ UDF_FILE_INFO Root;\r
+ UINTN OpenFiles;\r
+ EFI_HANDLE Handle;\r
} PRIVATE_UDF_SIMPLE_FS_DATA;\r
\r
//\r
EFI_STATUS\r
EFIAPI\r
UdfClose (\r
- IN EFI_FILE_PROTOCOL *This\r
+ IN EFI_FILE_PROTOCOL *This\r
);\r
\r
/**\r
/**\r
Get information about a file.\r
\r
+ @attention This is boundary function that may receive untrusted input.\r
+ @attention The input is from FileSystem.\r
+\r
+ The File Set Descriptor is external input, so this routine will do basic\r
+ validation for File Set Descriptor and report status.\r
+\r
@param This Protocol instance pointer.\r
@param InformationType Type of information to return in Buffer.\r
- @param BufferSize On input size of buffer, on output amount of data in buffer.\r
+ @param BufferSize On input size of buffer, on output amount of data in\r
+ buffer.\r
@param Buffer The buffer to return data.\r
\r
@retval EFI_SUCCESS Data was returned.\r
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
@retval EFI_WRITE_PROTECTED The device is write protected.\r
@retval EFI_ACCESS_DENIED The file was open for read only.\r
- @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in BufferSize.\r
+ @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in\r
+ BufferSize.\r
\r
**/\r
EFI_STATUS\r
/**\r
Set information about a file.\r
\r
- @param File Protocol instance pointer.\r
+ @param This Protocol instance pointer.\r
@param InformationType Type of information in Buffer.\r
@param BufferSize Size of buffer.\r
@param Buffer The data to write.\r
EFI_STATUS\r
EFIAPI\r
UdfFlush (\r
- IN EFI_FILE_PROTOCOL *This\r
+ IN EFI_FILE_PROTOCOL *This\r
);\r
\r
/**\r
@param[in] FilePath File's absolute path.\r
@param[in] Root Root directory file.\r
@param[in] Parent Parent directory file.\r
+ @param[in] Icb ICB of Parent.\r
@param[out] File Found file.\r
\r
- @retval EFI_SUCCESS @p FilePath was found.\r
+ @retval EFI_SUCCESS FilePath was found.\r
@retval EFI_NO_MEDIA The device has no media.\r
@retval EFI_DEVICE_ERROR The device reported an error.\r
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
- @retval EFI_OUT_OF_RESOURCES The @p FilePath file was not found due to lack of\r
+ @retval EFI_OUT_OF_RESOURCES The FilePath file was not found due to lack of\r
resources.\r
\r
**/\r
@param[in] Volume UDF volume information structure.\r
@param[in] ParentIcb ICB of the parent file.\r
@param[in] FileEntryData FE/EFE of the parent file.\r
- @param[in out] ReadDirInfo Next read directory listing structure\r
+ @param[in, out] ReadDirInfo Next read directory listing structure\r
information.\r
@param[out] FoundFid File Identifier Descriptor pointer.\r
\r
Get a filename (encoded in OSTA-compressed format) from a File Identifier\r
Descriptor on an UDF volume.\r
\r
+ @attention This is boundary function that may receive untrusted input.\r
+ @attention The input is from FileSystem.\r
+\r
+ The File Identifier Descriptor is external input, so this routine will do\r
+ basic validation for File Identifier Descriptor and report status.\r
+\r
@param[in] FileIdentifierDesc File Identifier Descriptor pointer.\r
+ @param[in] CharMax The maximum number of FileName Unicode char,\r
+ including terminating null char.\r
@param[out] FileName Decoded filename.\r
\r
@retval EFI_SUCCESS Filename decoded and read.\r
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_BUFFER_TOO_SMALL The string buffer FileName cannot hold the\r
+ decoded filename.\r
**/\r
EFI_STATUS\r
GetFileNameFromFid (\r
IN UDF_FILE_IDENTIFIER_DESCRIPTOR *FileIdentifierDesc,\r
+ IN UINTN CharMax,\r
OUT CHAR16 *FileName\r
);\r
\r
/**\r
Resolve a symlink file on an UDF volume.\r
\r
+ @attention This is boundary function that may receive untrusted input.\r
+ @attention The input is from FileSystem.\r
+\r
+ The Path Component is external input, so this routine will do basic\r
+ validation for Path Component and report status.\r
+\r
@param[in] BlockIo BlockIo interface.\r
@param[in] DiskIo DiskIo interface.\r
@param[in] Volume UDF volume information structure.\r
OUT UDF_FILE_INFO *File\r
);\r
\r
-/**\r
- Clean up in-memory UDF volume information.\r
-\r
- @param[in] Volume Volume information pointer.\r
-\r
-**/\r
-VOID\r
-CleanupVolumeInformation (\r
- IN UDF_VOLUME_INFO *Volume\r
- );\r
-\r
/**\r
Clean up in-memory UDF file information.\r
\r
**/\r
VOID\r
CleanupFileInformation (\r
- IN UDF_FILE_INFO *File\r
+ IN UDF_FILE_INFO *File\r
);\r
\r
/**\r
@param[in] File File information structure.\r
@param[out] Size Size of the file.\r
\r
- @retval EFI_SUCCESS File size calculated and set in @p Size.\r
+ @retval EFI_SUCCESS File size calculated and set in Size.\r
@retval EFI_UNSUPPORTED Extended Allocation Descriptors not supported.\r
@retval EFI_NO_MEDIA The device has no media.\r
@retval EFI_DEVICE_ERROR The device reported an error.\r
@param[in] File File pointer.\r
@param[in] FileSize Size of the file.\r
@param[in] FileName Filename of the file.\r
- @param[in out] BufferSize Size of the returned file infomation.\r
+ @param[in, out] BufferSize Size of the returned file infomation.\r
@param[out] Buffer Data of the returned file information.\r
\r
@retval EFI_SUCCESS File information set.\r
OUT VOID *Buffer\r
);\r
\r
+/**\r
+ Get volume label of an UDF volume.\r
+\r
+ @attention This is boundary function that may receive untrusted input.\r
+ @attention The input is from FileSystem.\r
+\r
+ The File Set Descriptor is external input, so this routine will do basic\r
+ validation for File Set Descriptor and report status.\r
+\r
+ @param[in] Volume Volume information pointer.\r
+ @param[in] CharMax The maximum number of Unicode char in String,\r
+ including terminating null char.\r
+ @param[out] String String buffer pointer to store the volume label.\r
+\r
+ @retval EFI_SUCCESS Volume label is returned.\r
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+ @retval EFI_BUFFER_TOO_SMALL The string buffer String cannot hold the\r
+ volume label.\r
+\r
+**/\r
+EFI_STATUS\r
+GetVolumeLabel (\r
+ IN UDF_VOLUME_INFO *Volume,\r
+ IN UINTN CharMax,\r
+ OUT CHAR16 *String\r
+ );\r
+\r
/**\r
Get volume and free space size information of an UDF volume.\r
\r
+ @attention This is boundary function that may receive untrusted input.\r
+ @attention The input is from FileSystem.\r
+\r
+ The Logical Volume Descriptor and the Logical Volume Integrity Descriptor are\r
+ external inputs, so this routine will do basic validation for both descriptors\r
+ and report status.\r
+\r
@param[in] BlockIo BlockIo interface.\r
@param[in] DiskIo DiskIo interface.\r
@param[in] Volume UDF volume information structure.\r
@param[in] Volume UDF volume information structure.\r
@param[in] File File information structure.\r
@param[in] FileSize Size of the file.\r
- @param[in out] FilePosition File position.\r
- @param[in out] Buffer File data.\r
- @param[in out] BufferSize Read size.\r
+ @param[in, out] FilePosition File position.\r
+ @param[in, out] Buffer File data.\r
+ @param[in, out] BufferSize Read size.\r
\r
@retval EFI_SUCCESS File seeked and read.\r
@retval EFI_UNSUPPORTED Extended Allocation Descriptors not supported.\r
\r
@param[in] FileName Filename.\r
\r
- @retval @p FileName Filename mangled.\r
+ @retval The mangled Filename.\r
\r
**/\r
CHAR16 *\r
MangleFileName (\r
- IN CHAR16 *FileName\r
+ IN CHAR16 *FileName\r
);\r
\r
/**\r
EFI_STATUS\r
EFIAPI\r
UdfDriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
);\r
\r
//\r
// EFI Component Name Functions\r
//\r
+\r
/**\r
Retrieves a Unicode string that is the user readable name of the driver.\r
\r