2 Handle operations in files and directories from UDF/ECMA-167 file systems.
4 Copyright (C) 2014-2017 Paulo Alcantara <pcacjr@zytor.com>
6 This program and the accompanying materials are licensed and made available
7 under the terms and conditions of the BSD License which accompanies this
8 distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
12 WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 EFI_FILE_PROTOCOL gUdfFileIoOps
= {
18 EFI_FILE_PROTOCOL_REVISION
,
35 #define _ROOT_FILE(_PrivData) (_PrivData)->Root
36 #define _PARENT_FILE(_PrivData) \
37 ((_PrivData)->IsRootDirectory ? (_PrivData)->Root : &(_PrivData)->File)
38 #define _FILE(_PrivData) _PARENT_FILE(_PrivData)
41 Open the root directory on a volume.
43 @param This Protocol instance pointer.
44 @param Root Returns an Open file handle for the root directory
46 @retval EFI_SUCCESS The device was opened.
47 @retval EFI_UNSUPPORTED This volume does not support the file system.
48 @retval EFI_NO_MEDIA The device has no media.
49 @retval EFI_DEVICE_ERROR The device reported an error.
50 @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
51 @retval EFI_ACCESS_DENIED The service denied access to the file.
52 @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
59 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
*This
,
60 OUT EFI_FILE_PROTOCOL
**Root
65 PRIVATE_UDF_SIMPLE_FS_DATA
*PrivFsData
;
66 PRIVATE_UDF_FILE_DATA
*PrivFileData
;
68 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
70 if (This
== NULL
|| Root
== NULL
) {
71 Status
= EFI_INVALID_PARAMETER
;
72 goto Error_Invalid_Params
;
75 PrivFsData
= PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (This
);
77 if (PrivFsData
->OpenFiles
== 0) {
79 // There is no more open files. Read volume information again since it was
80 // cleaned up on the last UdfClose() call.
82 Status
= ReadUdfVolumeInformation (
87 if (EFI_ERROR (Status
)) {
88 goto Error_Read_Udf_Volume
;
92 CleanupFileInformation (&PrivFsData
->Root
);
95 // Find root directory file.
97 Status
= FindRootDirectory (
103 if (EFI_ERROR (Status
)) {
104 goto Error_Find_Root_Dir
;
108 (PRIVATE_UDF_FILE_DATA
*) AllocateZeroPool (sizeof (PRIVATE_UDF_FILE_DATA
));
109 if (PrivFileData
== NULL
) {
110 Status
= EFI_OUT_OF_RESOURCES
;
111 goto Error_Alloc_Priv_File_Data
;
114 PrivFileData
->Signature
= PRIVATE_UDF_FILE_DATA_SIGNATURE
;
115 PrivFileData
->SimpleFs
= This
;
116 PrivFileData
->Root
= &PrivFsData
->Root
;
117 PrivFileData
->IsRootDirectory
= TRUE
;
119 CopyMem ((VOID
*)&PrivFileData
->FileIo
, (VOID
*)&gUdfFileIoOps
,
120 sizeof (EFI_FILE_PROTOCOL
));
122 *Root
= &PrivFileData
->FileIo
;
124 PrivFsData
->OpenFiles
++;
126 gBS
->RestoreTPL (OldTpl
);
130 Error_Alloc_Priv_File_Data
:
131 CleanupFileInformation (&PrivFsData
->Root
);
134 CleanupVolumeInformation (&PrivFsData
->Volume
);
136 Error_Read_Udf_Volume
:
137 Error_Invalid_Params
:
138 gBS
->RestoreTPL (OldTpl
);
144 Opens a new file relative to the source file's location.
146 @param This The protocol instance pointer.
147 @param NewHandle Returns File Handle for FileName.
148 @param FileName Null terminated string. "\", ".", and ".." are supported.
149 @param OpenMode Open mode for file.
150 @param Attributes Only used for EFI_FILE_MODE_CREATE.
152 @retval EFI_SUCCESS The device was opened.
153 @retval EFI_NOT_FOUND The specified file could not be found on the
155 @retval EFI_NO_MEDIA The device has no media.
156 @retval EFI_MEDIA_CHANGED The media has changed.
157 @retval EFI_DEVICE_ERROR The device reported an error.
158 @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
159 @retval EFI_ACCESS_DENIED The service denied access to the file.
160 @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
162 @retval EFI_VOLUME_FULL The volume is full.
168 IN EFI_FILE_PROTOCOL
*This
,
169 OUT EFI_FILE_PROTOCOL
**NewHandle
,
177 PRIVATE_UDF_FILE_DATA
*PrivFileData
;
178 PRIVATE_UDF_SIMPLE_FS_DATA
*PrivFsData
;
179 CHAR16 FilePath
[UDF_PATH_LENGTH
];
181 PRIVATE_UDF_FILE_DATA
*NewPrivFileData
;
182 CHAR16
*TempFileName
;
184 ZeroMem (FilePath
, sizeof FilePath
);
185 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
187 if (This
== NULL
|| NewHandle
== NULL
|| FileName
== NULL
) {
188 Status
= EFI_INVALID_PARAMETER
;
189 goto Error_Invalid_Params
;
192 if (OpenMode
!= EFI_FILE_MODE_READ
) {
193 Status
= EFI_WRITE_PROTECTED
;
194 goto Error_Invalid_Params
;
197 PrivFileData
= PRIVATE_UDF_FILE_DATA_FROM_THIS (This
);
199 PrivFsData
= PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (PrivFileData
->SimpleFs
);
204 if (*FileName
== L
'\\') {
205 StrCpyS (FilePath
, UDF_PATH_LENGTH
, FileName
);
207 StrCpyS (FilePath
, UDF_PATH_LENGTH
, PrivFileData
->AbsoluteFileName
);
208 StrCatS (FilePath
, UDF_PATH_LENGTH
, L
"\\");
209 StrCatS (FilePath
, UDF_PATH_LENGTH
, FileName
);
212 MangleFileName (FilePath
);
213 if (FilePath
[0] == L
'\0') {
214 Status
= EFI_NOT_FOUND
;
215 goto Error_Bad_FileName
;
223 _ROOT_FILE (PrivFileData
),
224 _PARENT_FILE (PrivFileData
),
225 &_PARENT_FILE(PrivFileData
)->FileIdentifierDesc
->Icb
,
228 if (EFI_ERROR (Status
)) {
229 goto Error_Find_File
;
233 (PRIVATE_UDF_FILE_DATA
*)AllocateZeroPool (sizeof (PRIVATE_UDF_FILE_DATA
));
234 if (NewPrivFileData
== NULL
) {
235 Status
= EFI_OUT_OF_RESOURCES
;
236 goto Error_Alloc_New_Priv_File_Data
;
239 CopyMem ((VOID
*)NewPrivFileData
, (VOID
*)PrivFileData
,
240 sizeof (PRIVATE_UDF_FILE_DATA
));
241 CopyMem ((VOID
*)&NewPrivFileData
->File
, &File
, sizeof (UDF_FILE_INFO
));
243 NewPrivFileData
->IsRootDirectory
= FALSE
;
245 StrCpyS (NewPrivFileData
->AbsoluteFileName
, UDF_PATH_LENGTH
, FilePath
);
246 FileName
= NewPrivFileData
->AbsoluteFileName
;
248 while ((TempFileName
= StrStr (FileName
, L
"\\")) != NULL
) {
249 FileName
= TempFileName
+ 1;
252 StrCpyS (NewPrivFileData
->FileName
, UDF_PATH_LENGTH
, FileName
);
254 Status
= GetFileSize (
258 &NewPrivFileData
->File
,
259 &NewPrivFileData
->FileSize
261 ASSERT_EFI_ERROR (Status
);
262 if (EFI_ERROR (Status
)) {
263 goto Error_Get_File_Size
;
266 NewPrivFileData
->FilePosition
= 0;
267 ZeroMem ((VOID
*)&NewPrivFileData
->ReadDirInfo
,
268 sizeof (UDF_READ_DIRECTORY_INFO
));
270 *NewHandle
= &NewPrivFileData
->FileIo
;
272 PrivFsData
->OpenFiles
++;
274 gBS
->RestoreTPL (OldTpl
);
279 FreePool ((VOID
*)NewPrivFileData
);
281 Error_Alloc_New_Priv_File_Data
:
282 CleanupFileInformation (&File
);
286 Error_Invalid_Params
:
287 gBS
->RestoreTPL (OldTpl
);
293 Read data from the file.
295 @param This Protocol instance pointer.
296 @param BufferSize On input size of buffer, on output amount of data in
298 @param Buffer The buffer in which data is read.
300 @retval EFI_SUCCESS Data was read.
301 @retval EFI_NO_MEDIA The device has no media.
302 @retval EFI_DEVICE_ERROR The device reported an error.
303 @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
304 @retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains
311 IN EFI_FILE_PROTOCOL
*This
,
312 IN OUT UINTN
*BufferSize
,
318 PRIVATE_UDF_FILE_DATA
*PrivFileData
;
319 PRIVATE_UDF_SIMPLE_FS_DATA
*PrivFsData
;
320 UDF_VOLUME_INFO
*Volume
;
321 UDF_FILE_INFO
*Parent
;
322 UDF_READ_DIRECTORY_INFO
*ReadDirInfo
;
323 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
324 EFI_DISK_IO_PROTOCOL
*DiskIo
;
325 UDF_FILE_INFO FoundFile
;
326 UDF_FILE_IDENTIFIER_DESCRIPTOR
*NewFileIdentifierDesc
;
327 VOID
*NewFileEntryData
;
328 CHAR16 FileName
[UDF_FILENAME_LENGTH
];
330 UINT64 BufferSizeUint64
;
332 ZeroMem (FileName
, sizeof FileName
);
333 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
335 if (This
== NULL
|| BufferSize
== NULL
|| (*BufferSize
!= 0 &&
337 Status
= EFI_INVALID_PARAMETER
;
338 goto Error_Invalid_Params
;
341 PrivFileData
= PRIVATE_UDF_FILE_DATA_FROM_THIS (This
);
342 PrivFsData
= PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (PrivFileData
->SimpleFs
);
344 BlockIo
= PrivFsData
->BlockIo
;
345 DiskIo
= PrivFsData
->DiskIo
;
346 Volume
= &PrivFsData
->Volume
;
347 ReadDirInfo
= &PrivFileData
->ReadDirInfo
;
348 NewFileIdentifierDesc
= NULL
;
349 NewFileEntryData
= NULL
;
351 Parent
= _PARENT_FILE (PrivFileData
);
353 Status
= EFI_VOLUME_CORRUPTED
;
355 if (IS_FID_NORMAL_FILE (Parent
->FileIdentifierDesc
)) {
356 if (PrivFileData
->FilePosition
> PrivFileData
->FileSize
) {
358 // File's position is beyond the EOF
360 Status
= EFI_DEVICE_ERROR
;
361 goto Error_File_Beyond_The_Eof
;
364 if (PrivFileData
->FilePosition
== PrivFileData
->FileSize
) {
366 Status
= EFI_SUCCESS
;
370 BufferSizeUint64
= *BufferSize
;
372 Status
= ReadFileData (
377 PrivFileData
->FileSize
,
378 &PrivFileData
->FilePosition
,
382 ASSERT (BufferSizeUint64
<= MAX_UINTN
);
383 *BufferSize
= (UINTN
)BufferSizeUint64
;
384 } else if (IS_FID_DIRECTORY_FILE (Parent
->FileIdentifierDesc
)) {
385 if (ReadDirInfo
->FidOffset
== 0 && PrivFileData
->FilePosition
> 0) {
386 Status
= EFI_DEVICE_ERROR
;
392 Status
= ReadDirectoryEntry (
396 &Parent
->FileIdentifierDesc
->Icb
,
399 &NewFileIdentifierDesc
401 if (EFI_ERROR (Status
)) {
402 if (Status
== EFI_DEVICE_ERROR
) {
403 FreePool (ReadDirInfo
->DirectoryData
);
404 ZeroMem ((VOID
*)ReadDirInfo
, sizeof (UDF_READ_DIRECTORY_INFO
));
407 Status
= EFI_SUCCESS
;
413 if (!IS_FID_PARENT_FILE (NewFileIdentifierDesc
)) {
417 FreePool ((VOID
*)NewFileIdentifierDesc
);
420 Status
= FindFileEntry (
424 &NewFileIdentifierDesc
->Icb
,
427 if (EFI_ERROR (Status
)) {
431 if (IS_FE_SYMLINK (NewFileEntryData
)) {
432 Status
= ResolveSymlink (
440 if (EFI_ERROR (Status
)) {
441 goto Error_Resolve_Symlink
;
444 FreePool ((VOID
*)NewFileEntryData
);
445 NewFileEntryData
= FoundFile
.FileEntry
;
447 Status
= GetFileNameFromFid (NewFileIdentifierDesc
, FileName
);
448 if (EFI_ERROR (Status
)) {
449 FreePool ((VOID
*)FoundFile
.FileIdentifierDesc
);
450 goto Error_Get_FileName
;
453 FreePool ((VOID
*)NewFileIdentifierDesc
);
454 NewFileIdentifierDesc
= FoundFile
.FileIdentifierDesc
;
456 FoundFile
.FileIdentifierDesc
= NewFileIdentifierDesc
;
457 FoundFile
.FileEntry
= NewFileEntryData
;
459 Status
= GetFileNameFromFid (FoundFile
.FileIdentifierDesc
, FileName
);
460 if (EFI_ERROR (Status
)) {
461 goto Error_Get_FileName
;
465 Status
= GetFileSize (
472 if (EFI_ERROR (Status
)) {
473 goto Error_Get_File_Size
;
476 Status
= SetFileInfo (
483 if (EFI_ERROR (Status
)) {
484 goto Error_Set_File_Info
;
487 PrivFileData
->FilePosition
++;
488 Status
= EFI_SUCCESS
;
489 } else if (IS_FID_DELETED_FILE (Parent
->FileIdentifierDesc
)) {
490 Status
= EFI_DEVICE_ERROR
;
496 Error_Resolve_Symlink
:
497 if (NewFileEntryData
!= NULL
) {
498 FreePool (NewFileEntryData
);
502 if (NewFileIdentifierDesc
!= NULL
) {
503 FreePool ((VOID
*)NewFileIdentifierDesc
);
507 Error_File_Beyond_The_Eof
:
508 Error_Invalid_Params
:
509 gBS
->RestoreTPL (OldTpl
);
515 Close the file handle.
517 @param This Protocol instance pointer.
519 @retval EFI_SUCCESS The file was closed.
525 IN EFI_FILE_PROTOCOL
*This
530 PRIVATE_UDF_FILE_DATA
*PrivFileData
;
531 PRIVATE_UDF_SIMPLE_FS_DATA
*PrivFsData
;
533 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
535 Status
= EFI_SUCCESS
;
538 Status
= EFI_INVALID_PARAMETER
;
542 PrivFileData
= PRIVATE_UDF_FILE_DATA_FROM_THIS (This
);
544 PrivFsData
= PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (PrivFileData
->SimpleFs
);
546 if (!PrivFileData
->IsRootDirectory
) {
547 CleanupFileInformation (&PrivFileData
->File
);
549 if (PrivFileData
->ReadDirInfo
.DirectoryData
!= NULL
) {
550 FreePool (PrivFileData
->ReadDirInfo
.DirectoryData
);
554 if (--PrivFsData
->OpenFiles
== 0) {
555 CleanupVolumeInformation (&PrivFsData
->Volume
);
558 FreePool ((VOID
*)PrivFileData
);
561 gBS
->RestoreTPL (OldTpl
);
567 Close and delete the file handle.
569 @param This Protocol instance pointer.
571 @retval EFI_SUCCESS The file was closed and deleted.
572 @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was not
579 IN EFI_FILE_PROTOCOL
*This
582 PRIVATE_UDF_FILE_DATA
*PrivFileData
;
585 return EFI_INVALID_PARAMETER
;
588 PrivFileData
= PRIVATE_UDF_FILE_DATA_FROM_THIS (This
);
590 (VOID
)PrivFileData
->FileIo
.Close(This
);
592 return EFI_WARN_DELETE_FAILURE
;
596 Write data to a file.
598 @param This Protocol instance pointer.
599 @param BufferSize On input size of buffer, on output amount of data in
601 @param Buffer The buffer in which data to write.
603 @retval EFI_SUCCESS Data was written.
604 @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
605 @retval EFI_NO_MEDIA The device has no media.
606 @retval EFI_DEVICE_ERROR The device reported an error.
607 @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted file.
608 @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
609 @retval EFI_WRITE_PROTECTED The device is write protected.
610 @retval EFI_ACCESS_DENIED The file was open for read only.
611 @retval EFI_VOLUME_FULL The volume is full.
617 IN EFI_FILE_PROTOCOL
*This
,
618 IN OUT UINTN
*BufferSize
,
622 return EFI_UNSUPPORTED
;
626 Get file's current position.
628 @param This Protocol instance pointer.
629 @param Position Byte position from the start of the file.
631 @retval EFI_SUCCESS Position was updated.
632 @retval EFI_UNSUPPORTED Seek request for directories is not valid.
638 IN EFI_FILE_PROTOCOL
*This
,
642 PRIVATE_UDF_FILE_DATA
*PrivFileData
;
644 if (This
== NULL
|| Position
== NULL
) {
645 return EFI_INVALID_PARAMETER
;
648 PrivFileData
= PRIVATE_UDF_FILE_DATA_FROM_THIS (This
);
651 // As per UEFI spec, if the file handle is a directory, then the current file
652 // position has no meaning and the operation is not supported.
654 if (IS_FID_DIRECTORY_FILE (&PrivFileData
->File
.FileIdentifierDesc
)) {
655 return EFI_UNSUPPORTED
;
659 // The file is not a directory. So, return its position.
661 *Position
= PrivFileData
->FilePosition
;
667 Set file's current position.
669 @param This Protocol instance pointer.
670 @param Position Byte position from the start of the file.
672 @retval EFI_SUCCESS Position was updated.
673 @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
679 IN EFI_FILE_PROTOCOL
*This
,
684 PRIVATE_UDF_FILE_DATA
*PrivFileData
;
685 UDF_FILE_IDENTIFIER_DESCRIPTOR
*FileIdentifierDesc
;
688 return EFI_INVALID_PARAMETER
;
691 Status
= EFI_UNSUPPORTED
;
693 PrivFileData
= PRIVATE_UDF_FILE_DATA_FROM_THIS (This
);
695 FileIdentifierDesc
= PrivFileData
->File
.FileIdentifierDesc
;
696 if (IS_FID_DIRECTORY_FILE (FileIdentifierDesc
)) {
698 // If the file handle is a directory, the _only_ position that may be set is
699 // zero. This has no effect of starting the read proccess of the directory
703 PrivFileData
->FilePosition
= Position
;
704 PrivFileData
->ReadDirInfo
.FidOffset
= 0;
705 Status
= EFI_SUCCESS
;
707 } else if (IS_FID_NORMAL_FILE (FileIdentifierDesc
)) {
709 // Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to be
712 if (Position
== 0xFFFFFFFFFFFFFFFF) {
713 PrivFileData
->FilePosition
= PrivFileData
->FileSize
- 1;
715 PrivFileData
->FilePosition
= Position
;
718 Status
= EFI_SUCCESS
;
725 Get information about a file.
727 @param This Protocol instance pointer.
728 @param InformationType Type of information to return in Buffer.
729 @param BufferSize On input size of buffer, on output amount of data in
731 @param Buffer The buffer to return data.
733 @retval EFI_SUCCESS Data was returned.
734 @retval EFI_UNSUPPORTED InformationType is not supported.
735 @retval EFI_NO_MEDIA The device has no media.
736 @retval EFI_DEVICE_ERROR The device reported an error.
737 @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
738 @retval EFI_WRITE_PROTECTED The device is write protected.
739 @retval EFI_ACCESS_DENIED The file was open for read only.
740 @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in
747 IN EFI_FILE_PROTOCOL
*This
,
748 IN EFI_GUID
*InformationType
,
749 IN OUT UINTN
*BufferSize
,
754 PRIVATE_UDF_FILE_DATA
*PrivFileData
;
755 PRIVATE_UDF_SIMPLE_FS_DATA
*PrivFsData
;
756 EFI_FILE_SYSTEM_INFO
*FileSystemInfo
;
757 UINTN FileSystemInfoLength
;
759 UDF_FILE_SET_DESCRIPTOR
*FileSetDesc
;
761 UINT8
*OstaCompressed
;
764 UINT64 FreeSpaceSize
;
765 CHAR16 VolumeLabel
[64];
767 if (This
== NULL
|| InformationType
== NULL
|| BufferSize
== NULL
||
768 (*BufferSize
!= 0 && Buffer
== NULL
)) {
769 return EFI_INVALID_PARAMETER
;
772 PrivFileData
= PRIVATE_UDF_FILE_DATA_FROM_THIS (This
);
774 PrivFsData
= PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (PrivFileData
->SimpleFs
);
776 Status
= EFI_UNSUPPORTED
;
778 if (CompareGuid (InformationType
, &gEfiFileInfoGuid
)) {
779 Status
= SetFileInfo (
780 _FILE (PrivFileData
),
781 PrivFileData
->FileSize
,
782 PrivFileData
->FileName
,
786 } else if (CompareGuid (InformationType
, &gEfiFileSystemInfoGuid
)) {
787 String
= VolumeLabel
;
789 FileSetDesc
= PrivFsData
->Volume
.FileSetDescs
[0];
791 OstaCompressed
= &FileSetDesc
->LogicalVolumeIdentifier
[0];
793 CompressionId
= OstaCompressed
[0];
794 if (!IS_VALID_COMPRESSION_ID (CompressionId
)) {
795 return EFI_VOLUME_CORRUPTED
;
798 for (Index
= 1; Index
< 128; Index
++) {
799 if (CompressionId
== 16) {
800 *String
= *(UINT8
*)(OstaCompressed
+ Index
) << 8;
807 *String
|= *(UINT8
*)(OstaCompressed
+ Index
);
811 // Unlike FID Identifiers, Logical Volume Identifier is stored in a
812 // NULL-terminated OSTA compressed format, so we must check for the NULL
815 if (*String
== L
'\0') {
824 FileSystemInfoLength
= StrSize (VolumeLabel
) +
825 sizeof (EFI_FILE_SYSTEM_INFO
);
826 if (*BufferSize
< FileSystemInfoLength
) {
827 *BufferSize
= FileSystemInfoLength
;
828 return EFI_BUFFER_TOO_SMALL
;
831 FileSystemInfo
= (EFI_FILE_SYSTEM_INFO
*)Buffer
;
832 StrCpyS (FileSystemInfo
->VolumeLabel
, ARRAY_SIZE (VolumeLabel
),
834 Status
= GetVolumeSize (
841 if (EFI_ERROR (Status
)) {
845 FileSystemInfo
->Size
= FileSystemInfoLength
;
846 FileSystemInfo
->ReadOnly
= TRUE
;
847 FileSystemInfo
->BlockSize
=
848 LV_BLOCK_SIZE (&PrivFsData
->Volume
, UDF_DEFAULT_LV_NUM
);
849 FileSystemInfo
->VolumeSize
= VolumeSize
;
850 FileSystemInfo
->FreeSpace
= FreeSpaceSize
;
852 *BufferSize
= FileSystemInfoLength
;
853 Status
= EFI_SUCCESS
;
860 Set information about a file.
862 @param File Protocol instance pointer.
863 @param InformationType Type of information in Buffer.
864 @param BufferSize Size of buffer.
865 @param Buffer The data to write.
867 @retval EFI_SUCCESS Data was set.
868 @retval EFI_UNSUPPORTED InformationType is not supported.
869 @retval EFI_NO_MEDIA The device has no media.
870 @retval EFI_DEVICE_ERROR The device reported an error.
871 @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
872 @retval EFI_WRITE_PROTECTED The device is write protected.
873 @retval EFI_ACCESS_DENIED The file was open for read only.
879 IN EFI_FILE_PROTOCOL
*This
,
880 IN EFI_GUID
*InformationType
,
885 return EFI_WRITE_PROTECTED
;
889 Flush data back for the file handle.
891 @param This Protocol instance pointer.
893 @retval EFI_SUCCESS Data was flushed.
894 @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
895 @retval EFI_NO_MEDIA The device has no media.
896 @retval EFI_DEVICE_ERROR The device reported an error.
897 @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
898 @retval EFI_WRITE_PROTECTED The device is write protected.
899 @retval EFI_ACCESS_DENIED The file was open for read only.
900 @retval EFI_VOLUME_FULL The volume is full.
906 IN EFI_FILE_PROTOCOL
*This
909 return EFI_WRITE_PROTECTED
;