17#include <Library/BaseLib.h>
18#include <Library/BaseMemoryLib.h>
19#include <Library/BaseOverflowLib.h>
20#include <Library/DebugLib.h>
21#include <Library/MemoryAllocationLib.h>
22#include <Library/UefiBootServicesTableLib.h>
23#include <Library/UefiRuntimeServicesTableLib.h>
27#include <Guid/FileInfo.h>
35 IN EFI_FILE_PROTOCOL *This,
36 OUT EFI_FILE_PROTOCOL **NewHandle,
45 if ((This == NULL) || (NewHandle == NULL) || (FileName == NULL)) {
46 return EFI_INVALID_PARAMETER;
69 if (!EFI_ERROR (Status)) {
87 IN EFI_FILE_PROTOCOL *This
94 return EFI_INVALID_PARAMETER;
119 IN EFI_FILE_PROTOCOL *This
126 return EFI_INVALID_PARAMETER;
138 return EFI_WARN_DELETE_FAILURE;
153 IN EFI_FILE_PROTOCOL *This,
154 IN OUT UINTN *BufferSize,
160 UINTN ReadBufferSize;
163 || (BufferSize == NULL)
166 return EFI_INVALID_PARAMETER;
176 return EFI_DEVICE_ERROR;
181 if (*BufferSize >= ReadSize) {
182 *BufferSize = (UINTN)ReadSize;
183 ReadBufferSize = (UINTN)ReadSize;
185 ReadBufferSize = *BufferSize;
188 if (ReadBufferSize > 0) {
211 IN EFI_FILE_PROTOCOL *This,
212 IN OUT UINTN *BufferSize,
219 return EFI_INVALID_PARAMETER;
228 return EFI_WRITE_PROTECTED;
242 IN EFI_FILE_PROTOCOL *This,
249 return EFI_INVALID_PARAMETER;
255 if (Position == 0xFFFFFFFFFFFFFFFFULL) {
277 IN EFI_FILE_PROTOCOL *This,
284 || (Position == NULL))
286 return EFI_INVALID_PARAMETER;
306 IN EFI_FILE_PROTOCOL *This,
307 IN EFI_GUID *InformationType,
308 IN OUT UINTN *BufferSize,
316 EFI_FILE_INFO *FileInfo;
320 || (InformationType == NULL)
321 || (BufferSize == NULL))
323 return EFI_INVALID_PARAMETER;
331 sizeof (FileInfo->FileName) == sizeof (CHAR16),
332 "Header changed, flexible array member is now supported"
335 NameSize = StrSize (Data->
FileName);
336 InfoSize = SIZE_OF_EFI_FILE_INFO + NameSize;
337 Fits = *BufferSize >= InfoSize;
338 *BufferSize = InfoSize;
341 return EFI_BUFFER_TOO_SMALL;
345 return EFI_INVALID_PARAMETER;
348 FileInfo = (EFI_FILE_INFO *)
Buffer;
350 ZeroMem (FileInfo, InfoSize - NameSize);
351 FileInfo->Size = InfoSize;
352 FileInfo->FileSize = Data->
FileSize;
353 FileInfo->PhysicalSize = Data->
FileSize;
362 FileInfo->Attribute = EFI_FILE_READ_ONLY;
372 return EFI_UNSUPPORTED;
384 "Getting file info %g with now BufferSize %u mode gave - %r\n",
391 DEBUG ((DEBUG_VERBOSE,
"Got file size %u\n", (UINT32)((EFI_FILE_INFO *)
Buffer)->FileSize));
401 IN EFI_FILE_PROTOCOL *This,
402 IN EFI_GUID *InformationType,
410 return EFI_INVALID_PARAMETER;
419 return EFI_WRITE_PROTECTED;
434 IN EFI_FILE_PROTOCOL *This
440 return EFI_INVALID_PARAMETER;
449 return EFI_WRITE_PROTECTED;
461 IN EFI_FILE_PROTOCOL *This,
462 OUT EFI_FILE_PROTOCOL **NewHandle,
465 IN UINT64 Attributes,
466 IN OUT EFI_FILE_IO_TOKEN *Token
488 if (!EFI_ERROR (Status) && (Token->Event != NULL)) {
489 Token->Status = EFI_SUCCESS;
490 gBS->SignalEvent (Token->Event);
500 IN EFI_FILE_PROTOCOL *This,
501 IN OUT EFI_FILE_IO_TOKEN *Token
510 return EFI_INVALID_PARAMETER;
518 if (!EFI_ERROR (Status) && (Token->Event != NULL)) {
519 Token->Status = EFI_SUCCESS;
520 gBS->SignalEvent (Token->Event);
536 IN EFI_FILE_PROTOCOL *This,
537 IN OUT EFI_FILE_IO_TOKEN *Token
550 return EFI_WRITE_PROTECTED;
563 IN EFI_FILE_PROTOCOL *This,
564 IN OUT EFI_FILE_IO_TOKEN *Token
570 return EFI_INVALID_PARAMETER;
579 return EFI_WRITE_PROTECTED;
592 .Revision = EFI_FILE_PROTOCOL_REVISION2,
614 IN CONST EFI_TIME *ModificationTime OPTIONAL,
615 OUT EFI_FILE_PROTOCOL **File
620 ASSERT (FileName != NULL);
621 ASSERT (FileBuffer != NULL);
627 return EFI_OUT_OF_RESOURCES;
638 if (ModificationTime != NULL) {
651 IN CONST CHAR16 *FileName,
654 IN CONST EFI_TIME *ModificationTime OPTIONAL,
655 OUT EFI_FILE_PROTOCOL **File
659 CHAR16 *FileNameCopy;
661 ASSERT (FileName != NULL);
664 FileNameCopy = AllocateCopyPool (StrSize (FileName), FileName);
665 if (FileNameCopy == NULL) {
666 DEBUG ((DEBUG_WARN,
"OCVFS: Failed to allocate file name (%s) copy\n", FileName));
667 return EFI_OUT_OF_RESOURCES;
670 Status =
CreateVirtualFile (FileNameCopy, FileBuffer, FileSize, ModificationTime, File);
671 if (EFI_ERROR (Status)) {
672 DEBUG ((DEBUG_WARN,
"OCVFS: Failed to virtualise file (%s)\n", FileName));
673 FreePool (FileNameCopy);
674 return EFI_OUT_OF_RESOURCES;
684 IN EFI_FILE_OPEN OpenCallback
687 ZeroMem (Data,
sizeof (*Data));
689 Data->OpenCallback = OpenCallback;
695 IN EFI_FILE_PROTOCOL *OriginalFile OPTIONAL,
696 IN EFI_FILE_OPEN OpenCallback OPTIONAL,
697 IN BOOLEAN CloseOnFailure,
698 OUT EFI_FILE_PROTOCOL **File
708 if (CloseOnFailure) {
709 ASSERT (OriginalFile != NULL);
710 OriginalFile->Close (OriginalFile);
713 return EFI_OUT_OF_RESOURCES;
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
EFI_STATUS OcSafeFileOpen(IN CONST EFI_FILE_PROTOCOL *Directory, OUT EFI_FILE_PROTOCOL **NewHandle, IN CONST CHAR16 *FileName, IN CONST UINT64 OpenMode, IN CONST UINT64 Attributes)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_GUID gEfiFileInfoGuid
STATIC EFI_STATUS EFIAPI VirtualFileClose(IN EFI_FILE_PROTOCOL *This)
STATIC CONST EFI_FILE_PROTOCOL mVirtualFileProtocolTemplate
STATIC EFI_STATUS EFIAPI VirtualFileFlush(IN EFI_FILE_PROTOCOL *This)
STATIC EFI_STATUS EFIAPI VirtualFileWrite(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, IN VOID *Buffer)
STATIC EFI_STATUS EFIAPI VirtualFileWriteEx(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
STATIC EFI_STATUS EFIAPI VirtualFileSetInfo(IN EFI_FILE_PROTOCOL *This, IN EFI_GUID *InformationType, IN UINTN BufferSize, IN VOID *Buffer)
STATIC EFI_STATUS EFIAPI VirtualFileOpen(IN EFI_FILE_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes)
STATIC EFI_STATUS EFIAPI VirtualFileGetInfo(IN EFI_FILE_PROTOCOL *This, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
STATIC EFI_STATUS EFIAPI VirtualFileGetPosition(IN EFI_FILE_PROTOCOL *This, OUT UINT64 *Position)
EFI_STATUS CreateVirtualFile(IN CHAR16 *FileName, IN VOID *FileBuffer, IN UINT64 FileSize, IN CONST EFI_TIME *ModificationTime OPTIONAL, OUT EFI_FILE_PROTOCOL **File)
STATIC EFI_STATUS EFIAPI VirtualFileOpenEx(IN EFI_FILE_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes, IN OUT EFI_FILE_IO_TOKEN *Token)
STATIC VOID InternalInitVirtualVolumeData(IN OUT VIRTUAL_FILE_DATA *Data, IN EFI_FILE_OPEN OpenCallback)
STATIC EFI_STATUS EFIAPI VirtualFileSetPosition(IN EFI_FILE_PROTOCOL *This, IN UINT64 Position)
STATIC EFI_STATUS EFIAPI VirtualFileDelete(IN EFI_FILE_PROTOCOL *This)
STATIC EFI_STATUS EFIAPI VirtualFileRead(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
STATIC EFI_STATUS EFIAPI VirtualFileReadEx(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
STATIC EFI_STATUS EFIAPI VirtualFileFlushEx(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
EFI_STATUS CreateVirtualFileFileNameCopy(IN CONST CHAR16 *FileName, IN VOID *FileBuffer, IN UINT64 FileSize, IN CONST EFI_TIME *ModificationTime OPTIONAL, OUT EFI_FILE_PROTOCOL **File)
EFI_STATUS CreateRealFile(IN EFI_FILE_PROTOCOL *OriginalFile OPTIONAL, IN EFI_FILE_OPEN OpenCallback OPTIONAL, IN BOOLEAN CloseOnFailure, OUT EFI_FILE_PROTOCOL **File)
#define VIRTUAL_FILE_FROM_PROTOCOL(This)
#define VIRTUAL_FILE_DATA_SIGNATURE
EFI_TIME ModificationTime
EFI_FILE_PROTOCOL * OriginalProtocol
EFI_FILE_OPEN OpenCallback
EFI_FILE_PROTOCOL Protocol