mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-18 15:27:48 +01:00
1216 lines
44 KiB
C
1216 lines
44 KiB
C
|
/** @file
|
||
|
UDF/ECMA-167 file system driver.
|
||
|
|
||
|
Copyright (C) 2014-2017 Paulo Alcantara <pcacjr@zytor.com>
|
||
|
Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
|
||
|
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
**/
|
||
|
|
||
|
#ifndef _UDF_H_
|
||
|
#define _UDF_H_
|
||
|
|
||
|
#include <Uefi.h>
|
||
|
#include <Base.h>
|
||
|
|
||
|
#include <Protocol/BlockIo.h>
|
||
|
#include <Protocol/ComponentName.h>
|
||
|
#include <Protocol/DevicePath.h>
|
||
|
#include <Protocol/DriverBinding.h>
|
||
|
#include <Protocol/DiskIo.h>
|
||
|
#include <Protocol/SimpleFileSystem.h>
|
||
|
|
||
|
#include <Guid/FileInfo.h>
|
||
|
#include <Guid/FileSystemInfo.h>
|
||
|
#include <Guid/FileSystemVolumeLabelInfo.h>
|
||
|
|
||
|
#include <Library/DebugLib.h>
|
||
|
#include <Library/UefiDriverEntryPoint.h>
|
||
|
#include <Library/BaseLib.h>
|
||
|
#include <Library/UefiLib.h>
|
||
|
#include <Library/BaseMemoryLib.h>
|
||
|
#include <Library/MemoryAllocationLib.h>
|
||
|
#include <Library/UefiBootServicesTableLib.h>
|
||
|
#include <Library/DevicePathLib.h>
|
||
|
|
||
|
#include <IndustryStandard/ElTorito.h>
|
||
|
#include <IndustryStandard/Udf.h>
|
||
|
|
||
|
//
|
||
|
// C5BD4D42-1A76-4996-8956-73CDA326CD0A
|
||
|
//
|
||
|
#define EFI_UDF_DEVICE_PATH_GUID \
|
||
|
{ 0xC5BD4D42, 0x1A76, 0x4996, \
|
||
|
{ 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } \
|
||
|
}
|
||
|
|
||
|
#define FE_ICB_FILE_TYPE(_Ptr) \
|
||
|
(UDF_FILE_ENTRY_TYPE)( \
|
||
|
((UDF_DESCRIPTOR_TAG *)(_Ptr))->TagIdentifier == UdfFileEntry ? \
|
||
|
((UDF_FILE_ENTRY *)(_Ptr))->IcbTag.FileType : \
|
||
|
((UDF_EXTENDED_FILE_ENTRY *)(_Ptr))->IcbTag.FileType)
|
||
|
|
||
|
typedef enum {
|
||
|
UdfFileEntryDirectory = 4,
|
||
|
UdfFileEntryStandardFile = 5,
|
||
|
UdfFileEntrySymlink = 12,
|
||
|
} UDF_FILE_ENTRY_TYPE;
|
||
|
|
||
|
#define HIDDEN_FILE (1 << 0)
|
||
|
#define DIRECTORY_FILE (1 << 1)
|
||
|
#define DELETED_FILE (1 << 2)
|
||
|
#define PARENT_FILE (1 << 3)
|
||
|
|
||
|
#define IS_FID_HIDDEN_FILE(_Fid) \
|
||
|
(BOOLEAN)((_Fid)->FileCharacteristics & HIDDEN_FILE)
|
||
|
#define IS_FID_DIRECTORY_FILE(_Fid) \
|
||
|
(BOOLEAN)((_Fid)->FileCharacteristics & DIRECTORY_FILE)
|
||
|
#define IS_FID_DELETED_FILE(_Fid) \
|
||
|
(BOOLEAN)((_Fid)->FileCharacteristics & DELETED_FILE)
|
||
|
#define IS_FID_PARENT_FILE(_Fid) \
|
||
|
(BOOLEAN)((_Fid)->FileCharacteristics & PARENT_FILE)
|
||
|
#define IS_FID_NORMAL_FILE(_Fid) \
|
||
|
(BOOLEAN)(!IS_FID_DIRECTORY_FILE (_Fid) && \
|
||
|
!IS_FID_PARENT_FILE (_Fid))
|
||
|
|
||
|
typedef enum {
|
||
|
ShortAdsSequence,
|
||
|
LongAdsSequence,
|
||
|
ExtendedAdsSequence,
|
||
|
InlineData
|
||
|
} UDF_FE_RECORDING_FLAGS;
|
||
|
|
||
|
#define GET_FE_RECORDING_FLAGS(_Fe) \
|
||
|
((UDF_FE_RECORDING_FLAGS)((UDF_ICB_TAG *)( \
|
||
|
(UINT8 *)(_Fe) + \
|
||
|
sizeof (UDF_DESCRIPTOR_TAG)))->Flags & 0x07)
|
||
|
|
||
|
typedef enum {
|
||
|
ExtentRecordedAndAllocated,
|
||
|
ExtentNotRecordedButAllocated,
|
||
|
ExtentNotRecordedNotAllocated,
|
||
|
ExtentIsNextExtent,
|
||
|
} UDF_EXTENT_FLAGS;
|
||
|
|
||
|
#define AD_LENGTH(_RecFlags) \
|
||
|
((_RecFlags) == ShortAdsSequence ? \
|
||
|
((UINT64)(sizeof (UDF_SHORT_ALLOCATION_DESCRIPTOR))) : \
|
||
|
((UINT64)(sizeof (UDF_LONG_ALLOCATION_DESCRIPTOR))))
|
||
|
|
||
|
#define GET_EXTENT_FLAGS(_RecFlags, _Ad) \
|
||
|
((_RecFlags) == ShortAdsSequence ? \
|
||
|
((UDF_EXTENT_FLAGS)((((UDF_SHORT_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength >> \
|
||
|
30) & 0x3)) : \
|
||
|
((UDF_EXTENT_FLAGS)((((UDF_LONG_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength >> \
|
||
|
30) & 0x3)))
|
||
|
|
||
|
#define GET_EXTENT_LENGTH(_RecFlags, _Ad) \
|
||
|
((_RecFlags) == ShortAdsSequence ? \
|
||
|
((UINT32)((((UDF_SHORT_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength & \
|
||
|
~0xC0000000UL))) : \
|
||
|
((UINT32)((((UDF_LONG_ALLOCATION_DESCRIPTOR *)(_Ad))->ExtentLength & \
|
||
|
~0xC0000000UL))))
|
||
|
|
||
|
#define UDF_FILENAME_LENGTH 128
|
||
|
#define UDF_PATH_LENGTH 512
|
||
|
|
||
|
#define GET_FID_FROM_ADS(_Data, _Offs) \
|
||
|
((UDF_FILE_IDENTIFIER_DESCRIPTOR *)((UINT8 *)(_Data) + (_Offs)))
|
||
|
|
||
|
#define IS_VALID_COMPRESSION_ID(_CompId) \
|
||
|
((BOOLEAN)((_CompId) == 8 || (_CompId) == 16))
|
||
|
|
||
|
#define UDF_STANDARD_IDENTIFIER_LENGTH 5
|
||
|
|
||
|
#pragma pack(1)
|
||
|
|
||
|
typedef struct {
|
||
|
UINT8 StandardIdentifier[UDF_STANDARD_IDENTIFIER_LENGTH];
|
||
|
} UDF_STANDARD_IDENTIFIER;
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
typedef enum {
|
||
|
ReadFileGetFileSize,
|
||
|
ReadFileAllocateAndRead,
|
||
|
ReadFileSeekAndRead,
|
||
|
} UDF_READ_FILE_FLAGS;
|
||
|
|
||
|
typedef struct {
|
||
|
VOID *FileData;
|
||
|
UDF_READ_FILE_FLAGS Flags;
|
||
|
UINT64 FileDataSize;
|
||
|
UINT64 FilePosition;
|
||
|
UINT64 FileSize;
|
||
|
UINT64 ReadLength;
|
||
|
} UDF_READ_FILE_INFO;
|
||
|
|
||
|
#pragma pack(1)
|
||
|
|
||
|
typedef struct {
|
||
|
UINT16 TypeAndTimezone;
|
||
|
INT16 Year;
|
||
|
UINT8 Month;
|
||
|
UINT8 Day;
|
||
|
UINT8 Hour;
|
||
|
UINT8 Minute;
|
||
|
UINT8 Second;
|
||
|
UINT8 Centiseconds;
|
||
|
UINT8 HundredsOfMicroseconds;
|
||
|
UINT8 Microseconds;
|
||
|
} UDF_TIMESTAMP;
|
||
|
|
||
|
typedef struct {
|
||
|
UDF_DESCRIPTOR_TAG DescriptorTag;
|
||
|
UINT32 PrevAllocationExtentDescriptor;
|
||
|
UINT32 LengthOfAllocationDescriptors;
|
||
|
} UDF_ALLOCATION_EXTENT_DESCRIPTOR;
|
||
|
|
||
|
typedef struct {
|
||
|
UINT8 StructureType;
|
||
|
UINT8 StandardIdentifier[UDF_STANDARD_IDENTIFIER_LENGTH];
|
||
|
UINT8 StructureVersion;
|
||
|
UINT8 Reserved;
|
||
|
UINT8 StructureData[2040];
|
||
|
} UDF_VOLUME_DESCRIPTOR;
|
||
|
|
||
|
typedef struct {
|
||
|
UDF_DESCRIPTOR_TAG DescriptorTag;
|
||
|
UDF_TIMESTAMP RecordingDateTime;
|
||
|
UINT32 IntegrityType;
|
||
|
UDF_EXTENT_AD NextIntegrityExtent;
|
||
|
UINT8 LogicalVolumeContentsUse[32];
|
||
|
UINT32 NumberOfPartitions;
|
||
|
UINT32 LengthOfImplementationUse;
|
||
|
UINT8 Data[0];
|
||
|
} UDF_LOGICAL_VOLUME_INTEGRITY;
|
||
|
|
||
|
typedef struct {
|
||
|
UDF_DESCRIPTOR_TAG DescriptorTag;
|
||
|
UINT32 VolumeDescriptorSequenceNumber;
|
||
|
UINT16 PartitionFlags;
|
||
|
UINT16 PartitionNumber;
|
||
|
UDF_ENTITY_ID PartitionContents;
|
||
|
UINT8 PartitionContentsUse[128];
|
||
|
UINT32 AccessType;
|
||
|
UINT32 PartitionStartingLocation;
|
||
|
UINT32 PartitionLength;
|
||
|
UDF_ENTITY_ID ImplementationIdentifier;
|
||
|
UINT8 ImplementationUse[128];
|
||
|
UINT8 Reserved[156];
|
||
|
} UDF_PARTITION_DESCRIPTOR;
|
||
|
|
||
|
typedef struct {
|
||
|
UDF_DESCRIPTOR_TAG DescriptorTag;
|
||
|
UDF_TIMESTAMP RecordingDateAndTime;
|
||
|
UINT16 InterchangeLevel;
|
||
|
UINT16 MaximumInterchangeLevel;
|
||
|
UINT32 CharacterSetList;
|
||
|
UINT32 MaximumCharacterSetList;
|
||
|
UINT32 FileSetNumber;
|
||
|
UINT32 FileSetDescriptorNumber;
|
||
|
UDF_CHAR_SPEC LogicalVolumeIdentifierCharacterSet;
|
||
|
UINT8 LogicalVolumeIdentifier[128];
|
||
|
UDF_CHAR_SPEC FileSetCharacterSet;
|
||
|
UINT8 FileSetIdentifier[32];
|
||
|
UINT8 CopyrightFileIdentifier[32];
|
||
|
UINT8 AbstractFileIdentifier[32];
|
||
|
UDF_LONG_ALLOCATION_DESCRIPTOR RootDirectoryIcb;
|
||
|
UDF_ENTITY_ID DomainIdentifier;
|
||
|
UDF_LONG_ALLOCATION_DESCRIPTOR NextExtent;
|
||
|
UDF_LONG_ALLOCATION_DESCRIPTOR SystemStreamDirectoryIcb;
|
||
|
UINT8 Reserved[32];
|
||
|
} UDF_FILE_SET_DESCRIPTOR;
|
||
|
|
||
|
typedef struct {
|
||
|
UINT32 ExtentLength;
|
||
|
UINT32 ExtentPosition;
|
||
|
} UDF_SHORT_ALLOCATION_DESCRIPTOR;
|
||
|
|
||
|
typedef struct {
|
||
|
UDF_DESCRIPTOR_TAG DescriptorTag;
|
||
|
UINT16 FileVersionNumber;
|
||
|
UINT8 FileCharacteristics;
|
||
|
UINT8 LengthOfFileIdentifier;
|
||
|
UDF_LONG_ALLOCATION_DESCRIPTOR Icb;
|
||
|
UINT16 LengthOfImplementationUse;
|
||
|
UINT8 Data[0];
|
||
|
} UDF_FILE_IDENTIFIER_DESCRIPTOR;
|
||
|
|
||
|
typedef struct {
|
||
|
UINT32 PriorRecordNumberOfDirectEntries;
|
||
|
UINT16 StrategyType;
|
||
|
UINT16 StrategyParameter;
|
||
|
UINT16 MaximumNumberOfEntries;
|
||
|
UINT8 Reserved;
|
||
|
UINT8 FileType;
|
||
|
UDF_LB_ADDR ParentIcbLocation;
|
||
|
UINT16 Flags;
|
||
|
} UDF_ICB_TAG;
|
||
|
|
||
|
typedef struct {
|
||
|
UDF_DESCRIPTOR_TAG DescriptorTag;
|
||
|
UDF_ICB_TAG IcbTag;
|
||
|
UINT32 Uid;
|
||
|
UINT32 Gid;
|
||
|
UINT32 Permissions;
|
||
|
UINT16 FileLinkCount;
|
||
|
UINT8 RecordFormat;
|
||
|
UINT8 RecordDisplayAttributes;
|
||
|
UINT32 RecordLength;
|
||
|
UINT64 InformationLength;
|
||
|
UINT64 LogicalBlocksRecorded;
|
||
|
UDF_TIMESTAMP AccessTime;
|
||
|
UDF_TIMESTAMP ModificationTime;
|
||
|
UDF_TIMESTAMP AttributeTime;
|
||
|
UINT32 CheckPoint;
|
||
|
UDF_LONG_ALLOCATION_DESCRIPTOR ExtendedAttributeIcb;
|
||
|
UDF_ENTITY_ID ImplementationIdentifier;
|
||
|
UINT64 UniqueId;
|
||
|
UINT32 LengthOfExtendedAttributes;
|
||
|
UINT32 LengthOfAllocationDescriptors;
|
||
|
UINT8 Data[0]; // L_EA + L_AD
|
||
|
} UDF_FILE_ENTRY;
|
||
|
|
||
|
typedef struct {
|
||
|
UDF_DESCRIPTOR_TAG DescriptorTag;
|
||
|
UDF_ICB_TAG IcbTag;
|
||
|
UINT32 Uid;
|
||
|
UINT32 Gid;
|
||
|
UINT32 Permissions;
|
||
|
UINT16 FileLinkCount;
|
||
|
UINT8 RecordFormat;
|
||
|
UINT8 RecordDisplayAttributes;
|
||
|
UINT32 RecordLength;
|
||
|
UINT64 InformationLength;
|
||
|
UINT64 ObjectSize;
|
||
|
UINT64 LogicalBlocksRecorded;
|
||
|
UDF_TIMESTAMP AccessTime;
|
||
|
UDF_TIMESTAMP ModificationTime;
|
||
|
UDF_TIMESTAMP CreationTime;
|
||
|
UDF_TIMESTAMP AttributeTime;
|
||
|
UINT32 CheckPoint;
|
||
|
UINT32 Reserved;
|
||
|
UDF_LONG_ALLOCATION_DESCRIPTOR ExtendedAttributeIcb;
|
||
|
UDF_LONG_ALLOCATION_DESCRIPTOR StreamDirectoryIcb;
|
||
|
UDF_ENTITY_ID ImplementationIdentifier;
|
||
|
UINT64 UniqueId;
|
||
|
UINT32 LengthOfExtendedAttributes;
|
||
|
UINT32 LengthOfAllocationDescriptors;
|
||
|
UINT8 Data[0]; // L_EA + L_AD
|
||
|
} UDF_EXTENDED_FILE_ENTRY;
|
||
|
|
||
|
typedef struct {
|
||
|
UINT8 ComponentType;
|
||
|
UINT8 LengthOfComponentIdentifier;
|
||
|
UINT16 ComponentFileVersionNumber;
|
||
|
UINT8 ComponentIdentifier[0];
|
||
|
} UDF_PATH_COMPONENT;
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
//
|
||
|
// UDF filesystem driver's private data
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT64 MainVdsStartLocation;
|
||
|
UDF_LOGICAL_VOLUME_DESCRIPTOR LogicalVolDesc;
|
||
|
UDF_PARTITION_DESCRIPTOR PartitionDesc;
|
||
|
UDF_FILE_SET_DESCRIPTOR FileSetDesc;
|
||
|
UINTN FileEntrySize;
|
||
|
} UDF_VOLUME_INFO;
|
||
|
|
||
|
typedef struct {
|
||
|
VOID *FileEntry;
|
||
|
UDF_FILE_IDENTIFIER_DESCRIPTOR *FileIdentifierDesc;
|
||
|
} UDF_FILE_INFO;
|
||
|
|
||
|
typedef struct {
|
||
|
VOID *DirectoryData;
|
||
|
UINT64 DirectoryLength;
|
||
|
UINT64 FidOffset;
|
||
|
} UDF_READ_DIRECTORY_INFO;
|
||
|
|
||
|
#define PRIVATE_UDF_FILE_DATA_SIGNATURE SIGNATURE_32 ('U', 'd', 'f', 'f')
|
||
|
|
||
|
#define PRIVATE_UDF_FILE_DATA_FROM_THIS(a) \
|
||
|
CR ( \
|
||
|
a, \
|
||
|
PRIVATE_UDF_FILE_DATA, \
|
||
|
FileIo, \
|
||
|
PRIVATE_UDF_FILE_DATA_SIGNATURE \
|
||
|
)
|
||
|
|
||
|
typedef struct {
|
||
|
UINTN Signature;
|
||
|
BOOLEAN IsRootDirectory;
|
||
|
UDF_FILE_INFO *Root;
|
||
|
UDF_FILE_INFO File;
|
||
|
UDF_READ_DIRECTORY_INFO ReadDirInfo;
|
||
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;
|
||
|
EFI_FILE_PROTOCOL FileIo;
|
||
|
CHAR16 AbsoluteFileName[UDF_PATH_LENGTH];
|
||
|
CHAR16 FileName[UDF_FILENAME_LENGTH];
|
||
|
UINT64 FileSize;
|
||
|
UINT64 FilePosition;
|
||
|
} PRIVATE_UDF_FILE_DATA;
|
||
|
|
||
|
#define PRIVATE_UDF_SIMPLE_FS_DATA_SIGNATURE SIGNATURE_32 ('U', 'd', 'f', 's')
|
||
|
|
||
|
#define PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS(a) \
|
||
|
CR ( \
|
||
|
a, \
|
||
|
PRIVATE_UDF_SIMPLE_FS_DATA, \
|
||
|
SimpleFs, \
|
||
|
PRIVATE_UDF_SIMPLE_FS_DATA_SIGNATURE \
|
||
|
)
|
||
|
|
||
|
typedef struct {
|
||
|
UINTN Signature;
|
||
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||
|
EFI_DISK_IO_PROTOCOL *DiskIo;
|
||
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFs;
|
||
|
UDF_VOLUME_INFO Volume;
|
||
|
UDF_FILE_INFO Root;
|
||
|
UINTN OpenFiles;
|
||
|
EFI_HANDLE Handle;
|
||
|
} PRIVATE_UDF_SIMPLE_FS_DATA;
|
||
|
|
||
|
//
|
||
|
// Global Variables
|
||
|
//
|
||
|
extern EFI_DRIVER_BINDING_PROTOCOL gUdfDriverBinding;
|
||
|
extern EFI_COMPONENT_NAME_PROTOCOL gUdfComponentName;
|
||
|
extern EFI_COMPONENT_NAME2_PROTOCOL gUdfComponentName2;
|
||
|
|
||
|
//
|
||
|
// Function Prototypes
|
||
|
//
|
||
|
|
||
|
/**
|
||
|
Open the root directory on a volume.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param Root Returns an Open file handle for the root directory
|
||
|
|
||
|
@retval EFI_SUCCESS The device was opened.
|
||
|
@retval EFI_UNSUPPORTED This volume does not support the file system.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_ACCESS_DENIED The service denied access to the file.
|
||
|
@retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfOpenVolume (
|
||
|
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
||
|
OUT EFI_FILE_PROTOCOL **Root
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Opens a new file relative to the source file's location.
|
||
|
|
||
|
@param This The protocol instance pointer.
|
||
|
@param NewHandle Returns File Handle for FileName.
|
||
|
@param FileName Null terminated string. "\", ".", and ".." are supported.
|
||
|
@param OpenMode Open mode for file.
|
||
|
@param Attributes Only used for EFI_FILE_MODE_CREATE.
|
||
|
|
||
|
@retval EFI_SUCCESS The device was opened.
|
||
|
@retval EFI_NOT_FOUND The specified file could not be found on the device.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_MEDIA_CHANGED The media has changed.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_ACCESS_DENIED The service denied access to the file.
|
||
|
@retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
|
||
|
@retval EFI_VOLUME_FULL The volume is full.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfOpen (
|
||
|
IN EFI_FILE_PROTOCOL *This,
|
||
|
OUT EFI_FILE_PROTOCOL **NewHandle,
|
||
|
IN CHAR16 *FileName,
|
||
|
IN UINT64 OpenMode,
|
||
|
IN UINT64 Attributes
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Read data from the file.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param BufferSize On input size of buffer, on output amount of data in buffer.
|
||
|
@param Buffer The buffer in which data is read.
|
||
|
|
||
|
@retval EFI_SUCCESS Data was read.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains required size.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfRead (
|
||
|
IN EFI_FILE_PROTOCOL *This,
|
||
|
IN OUT UINTN *BufferSize,
|
||
|
OUT VOID *Buffer
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Close the file handle.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
|
||
|
@retval EFI_SUCCESS The file was closed.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfClose (
|
||
|
IN EFI_FILE_PROTOCOL *This
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Close and delete the file handle.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
|
||
|
@retval EFI_SUCCESS The file was closed and deleted.
|
||
|
@retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was not
|
||
|
deleted.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfDelete (
|
||
|
IN EFI_FILE_PROTOCOL *This
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Write data to a file.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param BufferSize On input size of buffer, on output amount of data in buffer.
|
||
|
@param Buffer The buffer in which data to write.
|
||
|
|
||
|
@retval EFI_SUCCESS Data was written.
|
||
|
@retval EFI_UNSUPPORTED Writes to Open directory are not supported.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_DEVICE_ERROR An attempt was made to write to a deleted file.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_WRITE_PROTECTED The device is write protected.
|
||
|
@retval EFI_ACCESS_DENIED The file was open for read only.
|
||
|
@retval EFI_VOLUME_FULL The volume is full.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfWrite (
|
||
|
IN EFI_FILE_PROTOCOL *This,
|
||
|
IN OUT UINTN *BufferSize,
|
||
|
IN VOID *Buffer
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get file's current position.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param Position Byte position from the start of the file.
|
||
|
|
||
|
@retval EFI_SUCCESS Position was updated.
|
||
|
@retval EFI_UNSUPPORTED Seek request for directories is not valid.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfGetPosition (
|
||
|
IN EFI_FILE_PROTOCOL *This,
|
||
|
OUT UINT64 *Position
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Set file's current position.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param Position Byte position from the start of the file.
|
||
|
|
||
|
@retval EFI_SUCCESS Position was updated.
|
||
|
@retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfSetPosition (
|
||
|
IN EFI_FILE_PROTOCOL *This,
|
||
|
IN UINT64 Position
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get information about a file.
|
||
|
|
||
|
@attention This is boundary function that may receive untrusted input.
|
||
|
@attention The input is from FileSystem.
|
||
|
|
||
|
The File Set Descriptor is external input, so this routine will do basic
|
||
|
validation for File Set Descriptor and report status.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param InformationType Type of information to return in Buffer.
|
||
|
@param BufferSize On input size of buffer, on output amount of data in
|
||
|
buffer.
|
||
|
@param Buffer The buffer to return data.
|
||
|
|
||
|
@retval EFI_SUCCESS Data was returned.
|
||
|
@retval EFI_UNSUPPORTED InformationType is not supported.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_WRITE_PROTECTED The device is write protected.
|
||
|
@retval EFI_ACCESS_DENIED The file was open for read only.
|
||
|
@retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in
|
||
|
BufferSize.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfGetInfo (
|
||
|
IN EFI_FILE_PROTOCOL *This,
|
||
|
IN EFI_GUID *InformationType,
|
||
|
IN OUT UINTN *BufferSize,
|
||
|
OUT VOID *Buffer
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Set information about a file.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param InformationType Type of information in Buffer.
|
||
|
@param BufferSize Size of buffer.
|
||
|
@param Buffer The data to write.
|
||
|
|
||
|
@retval EFI_SUCCESS Data was set.
|
||
|
@retval EFI_UNSUPPORTED InformationType is not supported.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_WRITE_PROTECTED The device is write protected.
|
||
|
@retval EFI_ACCESS_DENIED The file was open for read only.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfSetInfo (
|
||
|
IN EFI_FILE_PROTOCOL *This,
|
||
|
IN EFI_GUID *InformationType,
|
||
|
IN UINTN BufferSize,
|
||
|
IN VOID *Buffer
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Flush data back for the file handle.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
|
||
|
@retval EFI_SUCCESS Data was flushed.
|
||
|
@retval EFI_UNSUPPORTED Writes to Open directory are not supported.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_WRITE_PROTECTED The device is write protected.
|
||
|
@retval EFI_ACCESS_DENIED The file was open for read only.
|
||
|
@retval EFI_VOLUME_FULL The volume is full.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfFlush (
|
||
|
IN EFI_FILE_PROTOCOL *This
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Read volume information on a medium which contains a valid UDF file system.
|
||
|
|
||
|
@param[in] BlockIo BlockIo interface.
|
||
|
@param[in] DiskIo DiskIo interface.
|
||
|
@param[out] Volume UDF volume information structure.
|
||
|
|
||
|
@retval EFI_SUCCESS Volume information read.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The volume was not read due to lack of resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
ReadUdfVolumeInformation (
|
||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
||
|
OUT UDF_VOLUME_INFO *Volume
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Find the root directory on an UDF volume.
|
||
|
|
||
|
@param[in] BlockIo BlockIo interface.
|
||
|
@param[in] DiskIo DiskIo interface.
|
||
|
@param[in] Volume UDF volume information structure.
|
||
|
@param[out] File Root directory file.
|
||
|
|
||
|
@retval EFI_SUCCESS Root directory found.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The root directory was not found due to lack of
|
||
|
resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
FindRootDirectory (
|
||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
||
|
IN UDF_VOLUME_INFO *Volume,
|
||
|
OUT UDF_FILE_INFO *File
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Find either a File Entry or a Extended File Entry from a given ICB.
|
||
|
|
||
|
@param[in] BlockIo BlockIo interface.
|
||
|
@param[in] DiskIo DiskIo interface.
|
||
|
@param[in] Volume UDF volume information structure.
|
||
|
@param[in] Icb ICB of the FID.
|
||
|
@param[out] FileEntry File Entry or Extended File Entry.
|
||
|
|
||
|
@retval EFI_SUCCESS File Entry or Extended File Entry found.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The FE/EFE entry was not found due to lack of
|
||
|
resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
FindFileEntry (
|
||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
||
|
IN UDF_VOLUME_INFO *Volume,
|
||
|
IN UDF_LONG_ALLOCATION_DESCRIPTOR *Icb,
|
||
|
OUT VOID **FileEntry
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Find a file given its absolute path on an UDF volume.
|
||
|
|
||
|
@param[in] BlockIo BlockIo interface.
|
||
|
@param[in] DiskIo DiskIo interface.
|
||
|
@param[in] Volume UDF volume information structure.
|
||
|
@param[in] FilePath File's absolute path.
|
||
|
@param[in] Root Root directory file.
|
||
|
@param[in] Parent Parent directory file.
|
||
|
@param[in] Icb ICB of Parent.
|
||
|
@param[out] File Found file.
|
||
|
|
||
|
@retval EFI_SUCCESS FilePath was found.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The FilePath file was not found due to lack of
|
||
|
resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
FindFile (
|
||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
||
|
IN UDF_VOLUME_INFO *Volume,
|
||
|
IN CHAR16 *FilePath,
|
||
|
IN UDF_FILE_INFO *Root,
|
||
|
IN UDF_FILE_INFO *Parent,
|
||
|
IN UDF_LONG_ALLOCATION_DESCRIPTOR *Icb,
|
||
|
OUT UDF_FILE_INFO *File
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Read a directory entry at a time on an UDF volume.
|
||
|
|
||
|
@param[in] BlockIo BlockIo interface.
|
||
|
@param[in] DiskIo DiskIo interface.
|
||
|
@param[in] Volume UDF volume information structure.
|
||
|
@param[in] ParentIcb ICB of the parent file.
|
||
|
@param[in] FileEntryData FE/EFE of the parent file.
|
||
|
@param[in, out] ReadDirInfo Next read directory listing structure
|
||
|
information.
|
||
|
@param[out] FoundFid File Identifier Descriptor pointer.
|
||
|
|
||
|
@retval EFI_SUCCESS Directory entry read.
|
||
|
@retval EFI_UNSUPPORTED Extended Allocation Descriptors not supported.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The directory entry was not read due to lack of
|
||
|
resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
ReadDirectoryEntry (
|
||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
||
|
IN UDF_VOLUME_INFO *Volume,
|
||
|
IN UDF_LONG_ALLOCATION_DESCRIPTOR *ParentIcb,
|
||
|
IN VOID *FileEntryData,
|
||
|
IN OUT UDF_READ_DIRECTORY_INFO *ReadDirInfo,
|
||
|
OUT UDF_FILE_IDENTIFIER_DESCRIPTOR **FoundFid
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get a filename (encoded in OSTA-compressed format) from a File Identifier
|
||
|
Descriptor on an UDF volume.
|
||
|
|
||
|
@attention This is boundary function that may receive untrusted input.
|
||
|
@attention The input is from FileSystem.
|
||
|
|
||
|
The File Identifier Descriptor is external input, so this routine will do
|
||
|
basic validation for File Identifier Descriptor and report status.
|
||
|
|
||
|
@param[in] FileIdentifierDesc File Identifier Descriptor pointer.
|
||
|
@param[in] CharMax The maximum number of FileName Unicode char,
|
||
|
including terminating null char.
|
||
|
@param[out] FileName Decoded filename.
|
||
|
|
||
|
@retval EFI_SUCCESS Filename decoded and read.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_BUFFER_TOO_SMALL The string buffer FileName cannot hold the
|
||
|
decoded filename.
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
GetFileNameFromFid (
|
||
|
IN UDF_FILE_IDENTIFIER_DESCRIPTOR *FileIdentifierDesc,
|
||
|
IN UINTN CharMax,
|
||
|
OUT CHAR16 *FileName
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Resolve a symlink file on an UDF volume.
|
||
|
|
||
|
@attention This is boundary function that may receive untrusted input.
|
||
|
@attention The input is from FileSystem.
|
||
|
|
||
|
The Path Component is external input, so this routine will do basic
|
||
|
validation for Path Component and report status.
|
||
|
|
||
|
@param[in] BlockIo BlockIo interface.
|
||
|
@param[in] DiskIo DiskIo interface.
|
||
|
@param[in] Volume UDF volume information structure.
|
||
|
@param[in] Parent Parent file.
|
||
|
@param[in] FileEntryData FE/EFE structure pointer.
|
||
|
@param[out] File Resolved file.
|
||
|
|
||
|
@retval EFI_SUCCESS Symlink file resolved.
|
||
|
@retval EFI_UNSUPPORTED Extended Allocation Descriptors not supported.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The symlink file was not resolved due to lack of
|
||
|
resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
ResolveSymlink (
|
||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
||
|
IN UDF_VOLUME_INFO *Volume,
|
||
|
IN UDF_FILE_INFO *Parent,
|
||
|
IN VOID *FileEntryData,
|
||
|
OUT UDF_FILE_INFO *File
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Clean up in-memory UDF file information.
|
||
|
|
||
|
@param[in] File File information pointer.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
CleanupFileInformation (
|
||
|
IN UDF_FILE_INFO *File
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Find a file from its absolute path on an UDF volume.
|
||
|
|
||
|
@param[in] BlockIo BlockIo interface.
|
||
|
@param[in] DiskIo DiskIo interface.
|
||
|
@param[in] Volume UDF volume information structure.
|
||
|
@param[in] File File information structure.
|
||
|
@param[out] Size Size of the file.
|
||
|
|
||
|
@retval EFI_SUCCESS File size calculated and set in Size.
|
||
|
@retval EFI_UNSUPPORTED Extended Allocation Descriptors not supported.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The file size was not calculated due to lack of
|
||
|
resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
GetFileSize (
|
||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
||
|
IN UDF_VOLUME_INFO *Volume,
|
||
|
IN UDF_FILE_INFO *File,
|
||
|
OUT UINT64 *Size
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Set information about a file on an UDF volume.
|
||
|
|
||
|
@param[in] File File pointer.
|
||
|
@param[in] FileSize Size of the file.
|
||
|
@param[in] FileName Filename of the file.
|
||
|
@param[in, out] BufferSize Size of the returned file infomation.
|
||
|
@param[out] Buffer Data of the returned file information.
|
||
|
|
||
|
@retval EFI_SUCCESS File information set.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The file information was not set due to lack of
|
||
|
resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
SetFileInfo (
|
||
|
IN UDF_FILE_INFO *File,
|
||
|
IN UINT64 FileSize,
|
||
|
IN CHAR16 *FileName,
|
||
|
IN OUT UINTN *BufferSize,
|
||
|
OUT VOID *Buffer
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get volume label of an UDF volume.
|
||
|
|
||
|
@attention This is boundary function that may receive untrusted input.
|
||
|
@attention The input is from FileSystem.
|
||
|
|
||
|
The File Set Descriptor is external input, so this routine will do basic
|
||
|
validation for File Set Descriptor and report status.
|
||
|
|
||
|
@param[in] Volume Volume information pointer.
|
||
|
@param[in] CharMax The maximum number of Unicode char in String,
|
||
|
including terminating null char.
|
||
|
@param[out] String String buffer pointer to store the volume label.
|
||
|
|
||
|
@retval EFI_SUCCESS Volume label is returned.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_BUFFER_TOO_SMALL The string buffer String cannot hold the
|
||
|
volume label.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
GetVolumeLabel (
|
||
|
IN UDF_VOLUME_INFO *Volume,
|
||
|
IN UINTN CharMax,
|
||
|
OUT CHAR16 *String
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Get volume and free space size information of an UDF volume.
|
||
|
|
||
|
@attention This is boundary function that may receive untrusted input.
|
||
|
@attention The input is from FileSystem.
|
||
|
|
||
|
The Logical Volume Descriptor and the Logical Volume Integrity Descriptor are
|
||
|
external inputs, so this routine will do basic validation for both descriptors
|
||
|
and report status.
|
||
|
|
||
|
@param[in] BlockIo BlockIo interface.
|
||
|
@param[in] DiskIo DiskIo interface.
|
||
|
@param[in] Volume UDF volume information structure.
|
||
|
@param[out] VolumeSize Volume size.
|
||
|
@param[out] FreeSpaceSize Free space size.
|
||
|
|
||
|
@retval EFI_SUCCESS Volume and free space size calculated.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The volume and free space size were not
|
||
|
calculated due to lack of resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
GetVolumeSize (
|
||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
||
|
IN UDF_VOLUME_INFO *Volume,
|
||
|
OUT UINT64 *VolumeSize,
|
||
|
OUT UINT64 *FreeSpaceSize
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Seek a file and read its data into memory on an UDF volume.
|
||
|
|
||
|
@param[in] BlockIo BlockIo interface.
|
||
|
@param[in] DiskIo DiskIo interface.
|
||
|
@param[in] Volume UDF volume information structure.
|
||
|
@param[in] File File information structure.
|
||
|
@param[in] FileSize Size of the file.
|
||
|
@param[in, out] FilePosition File position.
|
||
|
@param[in, out] Buffer File data.
|
||
|
@param[in, out] BufferSize Read size.
|
||
|
|
||
|
@retval EFI_SUCCESS File seeked and read.
|
||
|
@retval EFI_UNSUPPORTED Extended Allocation Descriptors not supported.
|
||
|
@retval EFI_NO_MEDIA The device has no media.
|
||
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
||
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
||
|
@retval EFI_OUT_OF_RESOURCES The file's recorded data was not read due to lack
|
||
|
of resources.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
ReadFileData (
|
||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||
|
IN EFI_DISK_IO_PROTOCOL *DiskIo,
|
||
|
IN UDF_VOLUME_INFO *Volume,
|
||
|
IN UDF_FILE_INFO *File,
|
||
|
IN UINT64 FileSize,
|
||
|
IN OUT UINT64 *FilePosition,
|
||
|
IN OUT VOID *Buffer,
|
||
|
IN OUT UINT64 *BufferSize
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Check if ControllerHandle supports an UDF file system.
|
||
|
|
||
|
@param[in] This Protocol instance pointer.
|
||
|
@param[in] ControllerHandle Handle of device to test.
|
||
|
|
||
|
@retval EFI_SUCCESS UDF file system found.
|
||
|
@retval EFI_UNSUPPORTED UDF file system not found.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
SupportUdfFileSystem (
|
||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||
|
IN EFI_HANDLE ControllerHandle
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Mangle a filename by cutting off trailing whitespaces, "\\", "." and "..".
|
||
|
|
||
|
@param[in] FileName Filename.
|
||
|
|
||
|
@retval The mangled Filename.
|
||
|
|
||
|
**/
|
||
|
CHAR16 *
|
||
|
MangleFileName (
|
||
|
IN CHAR16 *FileName
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Test to see if this driver supports ControllerHandle. Any ControllerHandle
|
||
|
than contains a BlockIo and DiskIo protocol can be supported.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param ControllerHandle Handle of device to test
|
||
|
@param RemainingDevicePath Optional parameter use to pick a specific child
|
||
|
device to start.
|
||
|
|
||
|
@retval EFI_SUCCESS This driver supports this device
|
||
|
@retval EFI_ALREADY_STARTED This driver is already running on this device
|
||
|
@retval other This driver does not support this device
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfDriverBindingSupported (
|
||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||
|
IN EFI_HANDLE ControllerHandle,
|
||
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Start this driver on ControllerHandle by opening a Block IO and Disk IO
|
||
|
protocol, reading Device Path, and creating a child handle with a
|
||
|
Disk IO and device path protocol.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param ControllerHandle Handle of device to bind driver to
|
||
|
@param RemainingDevicePath Optional parameter use to pick a specific child
|
||
|
device to start.
|
||
|
|
||
|
@retval EFI_SUCCESS This driver is added to ControllerHandle
|
||
|
@retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
|
||
|
@retval other This driver does not support this device
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfDriverBindingStart (
|
||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||
|
IN EFI_HANDLE ControllerHandle,
|
||
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Stop this driver on ControllerHandle. Support stopping any child handles
|
||
|
created by this driver.
|
||
|
|
||
|
@param This Protocol instance pointer.
|
||
|
@param ControllerHandle Handle of device to stop driver on
|
||
|
@param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
|
||
|
children is zero stop the entire bus driver.
|
||
|
@param ChildHandleBuffer List of Child Handles to Stop.
|
||
|
|
||
|
@retval EFI_SUCCESS This driver is removed ControllerHandle
|
||
|
@retval other This driver was not removed from this device
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfDriverBindingStop (
|
||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||
|
IN EFI_HANDLE ControllerHandle,
|
||
|
IN UINTN NumberOfChildren,
|
||
|
IN EFI_HANDLE *ChildHandleBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// EFI Component Name Functions
|
||
|
//
|
||
|
/**
|
||
|
Retrieves a Unicode string that is the user readable name of the driver.
|
||
|
|
||
|
This function retrieves the user readable name of a driver in the form of a
|
||
|
Unicode string. If the driver specified by This has a user readable name in
|
||
|
the language specified by Language, then a pointer to the driver name is
|
||
|
returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
|
||
|
by This does not support the language specified by Language,
|
||
|
then EFI_UNSUPPORTED is returned.
|
||
|
|
||
|
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||
|
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||
|
|
||
|
@param Language[in] A pointer to a Null-terminated ASCII string
|
||
|
array indicating the language. This is the
|
||
|
language of the driver name that the caller is
|
||
|
requesting, and it must match one of the
|
||
|
languages specified in SupportedLanguages. The
|
||
|
number of languages supported by a driver is up
|
||
|
to the driver writer. Language is specified
|
||
|
in RFC 4646 or ISO 639-2 language code format.
|
||
|
|
||
|
@param DriverName[out] A pointer to the Unicode string to return.
|
||
|
This Unicode string is the name of the
|
||
|
driver specified by This in the language
|
||
|
specified by Language.
|
||
|
|
||
|
@retval EFI_SUCCESS The Unicode string for the Driver specified by
|
||
|
This and the language specified by Language was
|
||
|
returned in DriverName.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER DriverName is NULL.
|
||
|
|
||
|
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||
|
the language specified by Language.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfComponentNameGetDriverName (
|
||
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||
|
IN CHAR8 *Language,
|
||
|
OUT CHAR16 **DriverName
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
Retrieves a Unicode string that is the user readable name of the controller
|
||
|
that is being managed by a driver.
|
||
|
|
||
|
This function retrieves the user readable name of the controller specified by
|
||
|
ControllerHandle and ChildHandle in the form of a Unicode string. If the
|
||
|
driver specified by This has a user readable name in the language specified by
|
||
|
Language, then a pointer to the controller name is returned in ControllerName,
|
||
|
and EFI_SUCCESS is returned. If the driver specified by This is not currently
|
||
|
managing the controller specified by ControllerHandle and ChildHandle,
|
||
|
then EFI_UNSUPPORTED is returned. If the driver specified by This does not
|
||
|
support the language specified by Language, then EFI_UNSUPPORTED is returned.
|
||
|
|
||
|
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||
|
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||
|
|
||
|
@param ControllerHandle[in] The handle of a controller that the driver
|
||
|
specified by This is managing. This handle
|
||
|
specifies the controller whose name is to be
|
||
|
returned.
|
||
|
|
||
|
@param ChildHandle[in] The handle of the child controller to retrieve
|
||
|
the name of. This is an optional parameter that
|
||
|
may be NULL. It will be NULL for device
|
||
|
drivers. It will also be NULL for a bus drivers
|
||
|
that wish to retrieve the name of the bus
|
||
|
controller. It will not be NULL for a bus
|
||
|
driver that wishes to retrieve the name of a
|
||
|
child controller.
|
||
|
|
||
|
@param Language[in] A pointer to a Null-terminated ASCII string
|
||
|
array indicating the language. This is the
|
||
|
language of the driver name that the caller is
|
||
|
requesting, and it must match one of the
|
||
|
languages specified in SupportedLanguages. The
|
||
|
number of languages supported by a driver is up
|
||
|
to the driver writer. Language is specified in
|
||
|
RFC 4646 or ISO 639-2 language code format.
|
||
|
|
||
|
@param ControllerName[out] A pointer to the Unicode string to return.
|
||
|
This Unicode string is the name of the
|
||
|
controller specified by ControllerHandle and
|
||
|
ChildHandle in the language specified by
|
||
|
Language from the point of view of the driver
|
||
|
specified by This.
|
||
|
|
||
|
@retval EFI_SUCCESS The Unicode string for the user readable name in
|
||
|
the language specified by Language for the
|
||
|
driver specified by This was returned in
|
||
|
DriverName.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
|
||
|
EFI_HANDLE.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
|
||
|
|
||
|
@retval EFI_UNSUPPORTED The driver specified by This is not currently
|
||
|
managing the controller specified by
|
||
|
ControllerHandle and ChildHandle.
|
||
|
|
||
|
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||
|
the language specified by Language.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
UdfComponentNameGetControllerName (
|
||
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||
|
IN EFI_HANDLE ControllerHandle,
|
||
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||
|
IN CHAR8 *Language,
|
||
|
OUT CHAR16 **ControllerName
|
||
|
);
|
||
|
|
||
|
#endif // _UDF_H_
|