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;
59 if (!EFI_ERROR (Status)) {
76 IN EFI_FILE_PROTOCOL *This
83 return EFI_INVALID_PARAMETER;
92 if (EFI_ERROR (Status)) {
106 IN EFI_FILE_PROTOCOL *This
112 if (EFI_ERROR (Status)) {
119 return EFI_WARN_DELETE_FAILURE;
126 IN EFI_FILE_PROTOCOL *This,
127 IN OUT UINTN *BufferSize,
133 LIST_ENTRY *DirEntryLink;
139 || (BufferSize == NULL))
141 return EFI_INVALID_PARAMETER;
149 ReadSize = *BufferSize;
157 if (EFI_ERROR (Status) || (*BufferSize != 0)) {
165 if (IsListEmpty (&Data->
Entries)) {
180 *BufferSize = ReadSize;
187 if (DirEntry->
FileInfo->Size < SIZE_OF_EFI_FILE_INFO) {
188 return EFI_DEVICE_ERROR;
194 FileStrSize = StrSize (DirEntry->
FileInfo->FileName);
195 if (BaseOverflowAddUN (SIZE_OF_EFI_FILE_INFO, FileStrSize, &ReadSize) || (ReadSize != DirEntry->
FileInfo->Size)) {
196 return EFI_DEVICE_ERROR;
199 if (*BufferSize < ReadSize) {
200 *BufferSize = ReadSize;
201 return EFI_BUFFER_TOO_SMALL;
205 return EFI_INVALID_PARAMETER;
212 *BufferSize = ReadSize;
222 IN EFI_FILE_PROTOCOL *This,
223 IN OUT UINTN *BufferSize,
230 return EFI_UNSUPPORTED;
237 IN EFI_FILE_PROTOCOL *This,
245 return EFI_INVALID_PARAMETER;
254 return EFI_UNSUPPORTED;
257 Status = EFI_SUCCESS;
265 if (!EFI_ERROR (Status)) {
276 IN EFI_FILE_PROTOCOL *This,
283 return EFI_UNSUPPORTED;
290 IN EFI_FILE_PROTOCOL *This,
291 IN EFI_GUID *InformationType,
292 IN OUT UINTN *BufferSize,
299 EFI_FILE_INFO *FileInfo;
303 || (InformationType == NULL)
304 || (BufferSize == NULL))
306 return EFI_INVALID_PARAMETER;
316 sizeof (FileInfo->FileName) == sizeof (CHAR16),
317 "Header changed, flexible array member is now supported"
320 NameSize = StrSize (Data->
FileName);
321 InfoSize = SIZE_OF_EFI_FILE_INFO + NameSize;
322 Fits = *BufferSize >= InfoSize;
323 *BufferSize = InfoSize;
326 return EFI_BUFFER_TOO_SMALL;
330 return EFI_INVALID_PARAMETER;
333 FileInfo = (EFI_FILE_INFO *)
Buffer;
335 ZeroMem (FileInfo, InfoSize - NameSize);
336 FileInfo->Size = InfoSize;
345 FileInfo->Attribute = EFI_FILE_READ_ONLY | EFI_FILE_DIRECTORY;
351 return EFI_UNSUPPORTED;
358 IN EFI_FILE_PROTOCOL *This,
359 IN EFI_GUID *InformationType,
367 return EFI_WRITE_PROTECTED;
374 IN EFI_FILE_PROTOCOL *This
380 return EFI_WRITE_PROTECTED;
387 IN EFI_FILE_PROTOCOL *This,
388 OUT EFI_FILE_PROTOCOL **NewHandle,
391 IN UINT64 Attributes,
392 IN OUT EFI_FILE_IO_TOKEN *Token
412 if (!EFI_ERROR (Status) && (Token->Event != NULL)) {
413 Token->Status = EFI_SUCCESS;
414 gBS->SignalEvent (Token->Event);
424 IN EFI_FILE_PROTOCOL *This,
425 IN OUT EFI_FILE_IO_TOKEN *Token
433 return EFI_INVALID_PARAMETER;
436 Status =
VirtualDirRead (This, Token->Buffer, &Token->BufferSize);
438 if (!EFI_ERROR (Status) && (Token->Event != NULL)) {
439 Token->Status = EFI_SUCCESS;
440 gBS->SignalEvent (Token->Event);
450 IN EFI_FILE_PROTOCOL *This,
451 IN OUT EFI_FILE_IO_TOKEN *Token
457 return EFI_UNSUPPORTED;
464 IN EFI_FILE_PROTOCOL *This,
465 IN OUT EFI_FILE_IO_TOKEN *Token
471 return EFI_WRITE_PROTECTED;
478 .Revision = EFI_FILE_PROTOCOL_REVISION2,
498 IN CONST EFI_TIME *ModificationTime OPTIONAL,
499 IN EFI_FILE_PROTOCOL *UnderlyingFile OPTIONAL,
500 OUT EFI_FILE_PROTOCOL **File
505 ASSERT (FileName != NULL);
511 return EFI_OUT_OF_RESOURCES;
518 InitializeListHead (&Data->
Entries);
520 if (ModificationTime != NULL) {
532 IN CONST CHAR16 *FileName,
533 IN CONST EFI_TIME *ModificationTime OPTIONAL,
534 IN EFI_FILE_PROTOCOL *UnderlyingFile OPTIONAL,
535 OUT EFI_FILE_PROTOCOL **File
539 CHAR16 *FileNameCopy;
541 ASSERT (FileName != NULL);
544 FileNameCopy = AllocateCopyPool (StrSize (FileName), FileName);
545 if (FileNameCopy == NULL) {
546 DEBUG ((DEBUG_WARN,
"OCVFS: Failed to allocate directory name (%a) copy\n", FileName));
547 return EFI_OUT_OF_RESOURCES;
551 if (EFI_ERROR (Status)) {
552 DEBUG ((DEBUG_WARN,
"OCVFS: Failed to virtualise directory (%a)\n", FileName));
553 FreePool (FileNameCopy);
554 return EFI_OUT_OF_RESOURCES;
562 IN EFI_FILE_PROTOCOL *This,
563 IN EFI_FILE_INFO *FileInfo
570 ASSERT (FileInfo != NULL);
574 NewEntry = AllocateZeroPool (
sizeof (*NewEntry));
575 if (NewEntry == NULL) {
576 return EFI_OUT_OF_RESOURCES;
588 IN EFI_FILE_PROTOCOL *This
592 LIST_ENTRY *DirEntryLink;
599 while (!IsListEmpty (&Data->
Entries)) {
600 DirEntryLink = GetFirstNode (&Data->
Entries);
602 RemoveEntryList (DirEntryLink);
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
EFI_STATUS CreateRealFile(IN EFI_FILE_PROTOCOL *OriginalFile OPTIONAL, IN EFI_FILE_OPEN OpenCallback OPTIONAL, IN BOOLEAN CloseOnFailure, OUT EFI_FILE_PROTOCOL **File)
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
EFI_STATUS VirtualDirAddEntry(IN EFI_FILE_PROTOCOL *This, IN EFI_FILE_INFO *FileInfo)
EFI_STATUS VirtualDirCreateOverlay(IN CHAR16 *FileName, IN CONST EFI_TIME *ModificationTime OPTIONAL, IN EFI_FILE_PROTOCOL *UnderlyingFile OPTIONAL, OUT EFI_FILE_PROTOCOL **File)
STATIC EFI_STATUS EFIAPI VirtualDirSetInfo(IN EFI_FILE_PROTOCOL *This, IN EFI_GUID *InformationType, IN UINTN BufferSize, IN VOID *Buffer)
STATIC EFI_STATUS EFIAPI VirtualDirFlush(IN EFI_FILE_PROTOCOL *This)
STATIC EFI_STATUS EFIAPI VirtualDirOpenEx(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 EFI_STATUS EFIAPI VirtualDirWriteEx(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
STATIC EFI_STATUS EFIAPI VirtualDirGetPosition(IN EFI_FILE_PROTOCOL *This, OUT UINT64 *Position)
STATIC EFI_STATUS EFIAPI VirtualDirReadEx(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
STATIC EFI_STATUS EFIAPI VirtualDirSetPosition(IN EFI_FILE_PROTOCOL *This, IN UINT64 Position)
STATIC EFI_STATUS EFIAPI VirtualDirWrite(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, IN VOID *Buffer)
EFI_STATUS VirtualDirCreateOverlayFileNameCopy(IN CONST CHAR16 *FileName, IN CONST EFI_TIME *ModificationTime OPTIONAL, IN EFI_FILE_PROTOCOL *UnderlyingFile OPTIONAL, OUT EFI_FILE_PROTOCOL **File)
VOID VirtualDirFree(IN EFI_FILE_PROTOCOL *This)
STATIC CONST EFI_FILE_PROTOCOL mVirtualDirProtocolTemplate
STATIC EFI_STATUS EFIAPI VirtualDirOpen(IN EFI_FILE_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes)
STATIC EFI_STATUS EFIAPI VirtualDirGetInfo(IN EFI_FILE_PROTOCOL *This, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
STATIC EFI_STATUS EFIAPI VirtualDirClose(IN EFI_FILE_PROTOCOL *This)
STATIC EFI_STATUS EFIAPI VirtualDirRead(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
STATIC EFI_STATUS EFIAPI VirtualDirFlushEx(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
STATIC EFI_STATUS EFIAPI VirtualDirDelete(IN EFI_FILE_PROTOCOL *This)
#define VIRTUAL_DIR_DATA_SIGNATURE
#define GET_VIRTUAL_DIR_ENTRY_FROM_LINK(This)
#define VIRTUAL_DIR_ENTRY_SIGNATURE
#define VIRTUAL_DIR_FROM_PROTOCOL(This)
EFI_FILE_PROTOCOL Protocol
LIST_ENTRY * CurrentEntry
EFI_FILE_PROTOCOL * UnderlyingProtocol
EFI_TIME ModificationTime