OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
VirtualFile.c
Go to the documentation of this file.
1
15#include <Uefi.h>
16
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>
24#include <Library/OcFileLib.h>
26
27#include <Guid/FileInfo.h>
28
29#include "VirtualFsInternal.h"
30
31STATIC
32EFI_STATUS
33EFIAPI
35 IN EFI_FILE_PROTOCOL *This,
36 OUT EFI_FILE_PROTOCOL **NewHandle,
37 IN CHAR16 *FileName,
38 IN UINT64 OpenMode,
39 IN UINT64 Attributes
40 )
41{
42 EFI_STATUS Status;
44
45 if ((This == NULL) || (NewHandle == NULL) || (FileName == NULL)) {
46 return EFI_INVALID_PARAMETER;
47 }
48
49 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
50
51 if (Data->OpenCallback != NULL) {
52 return Data->OpenCallback (
53 Data->OriginalProtocol,
54 NewHandle,
55 FileName,
56 OpenMode,
57 Attributes
58 );
59 }
60
61 if (Data->OriginalProtocol != NULL) {
62 Status = OcSafeFileOpen (
63 Data->OriginalProtocol,
64 NewHandle,
65 FileName,
66 OpenMode,
67 Attributes
68 );
69 if (!EFI_ERROR (Status)) {
70 return CreateRealFile (*NewHandle, NULL, TRUE, NewHandle);
71 }
72
73 return Status;
74 }
75
76 //
77 // Virtual files are not directories and cannot be reopened.
78 // TODO: May want to handle parent directory paths.
79 //
80 return EFI_NOT_FOUND;
81}
82
83STATIC
84EFI_STATUS
85EFIAPI
87 IN EFI_FILE_PROTOCOL *This
88 )
89{
90 EFI_STATUS Status;
92
93 if (This == NULL) {
94 return EFI_INVALID_PARAMETER;
95 }
96
97 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
98
99 if (Data->OriginalProtocol == NULL) {
100 FreePool (Data->FileBuffer);
101 FreePool (Data->FileName);
102 FreePool (Data);
103
104 return EFI_SUCCESS;
105 }
106
107 Status = Data->OriginalProtocol->Close (
108 Data->OriginalProtocol
109 );
110 FreePool (Data);
111
112 return Status;
113}
114
115STATIC
116EFI_STATUS
117EFIAPI
119 IN EFI_FILE_PROTOCOL *This
120 )
121{
122 EFI_STATUS Status;
123 VIRTUAL_FILE_DATA *Data;
124
125 if (This == NULL) {
126 return EFI_INVALID_PARAMETER;
127 }
128
129 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
130
131 if (Data->OriginalProtocol == NULL) {
132 FreePool (Data->FileBuffer);
133 FreePool (Data->FileName);
134 FreePool (Data);
135 //
136 // Virtual files cannot be deleted.
137 //
138 return EFI_WARN_DELETE_FAILURE;
139 }
140
141 Status = Data->OriginalProtocol->Close (
142 Data->OriginalProtocol
143 );
144 FreePool (Data);
145
146 return Status;
147}
148
149STATIC
150EFI_STATUS
151EFIAPI
153 IN EFI_FILE_PROTOCOL *This,
154 IN OUT UINTN *BufferSize,
155 OUT VOID *Buffer
156 )
157{
158 VIRTUAL_FILE_DATA *Data;
159 UINT64 ReadSize;
160 UINTN ReadBufferSize;
161
162 if ( (This == NULL)
163 || (BufferSize == NULL)
164 || (Buffer == NULL))
165 {
166 return EFI_INVALID_PARAMETER;
167 }
168
169 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
170
171 if (Data->OriginalProtocol == NULL) {
172 if (Data->FilePosition > Data->FileSize) {
173 //
174 // On entry, the current file position is beyond the end of the file.
175 //
176 return EFI_DEVICE_ERROR;
177 }
178
179 ReadSize = (Data->FileSize - Data->FilePosition);
180
181 if (*BufferSize >= ReadSize) {
182 *BufferSize = (UINTN)ReadSize;
183 ReadBufferSize = (UINTN)ReadSize;
184 } else {
185 ReadBufferSize = *BufferSize;
186 }
187
188 if (ReadBufferSize > 0) {
189 CopyMem (Buffer, &Data->FileBuffer[Data->FilePosition], ReadBufferSize);
190 Data->FilePosition += ReadBufferSize;
191 }
192
193 return EFI_SUCCESS;
194 }
195
196 //
197 // TODO: we may want to provide ReadCallback for directory info update.
198 //
199
200 return Data->OriginalProtocol->Read (
201 Data->OriginalProtocol,
202 BufferSize,
203 Buffer
204 );
205}
206
207STATIC
208EFI_STATUS
209EFIAPI
211 IN EFI_FILE_PROTOCOL *This,
212 IN OUT UINTN *BufferSize,
213 IN VOID *Buffer
214 )
215{
216 VIRTUAL_FILE_DATA *Data;
217
218 if (This == NULL) {
219 return EFI_INVALID_PARAMETER;
220 }
221
222 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
223
224 if (Data->OriginalProtocol == NULL) {
225 //
226 // Virtual files are not writeable.
227 //
228 return EFI_WRITE_PROTECTED;
229 }
230
231 return Data->OriginalProtocol->Write (
232 Data->OriginalProtocol,
233 BufferSize,
234 Buffer
235 );
236}
237
238STATIC
239EFI_STATUS
240EFIAPI
242 IN EFI_FILE_PROTOCOL *This,
243 IN UINT64 Position
244 )
245{
246 VIRTUAL_FILE_DATA *Data;
247
248 if (This == NULL) {
249 return EFI_INVALID_PARAMETER;
250 }
251
252 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
253
254 if (Data->OriginalProtocol == NULL) {
255 if (Position == 0xFFFFFFFFFFFFFFFFULL) {
256 Data->FilePosition = Data->FileSize;
257 } else {
258 //
259 // Seeking past the end of the file is allowed.
260 //
261 Data->FilePosition = Position;
262 }
263
264 return EFI_SUCCESS;
265 }
266
267 return Data->OriginalProtocol->SetPosition (
268 Data->OriginalProtocol,
269 Position
270 );
271}
272
273STATIC
274EFI_STATUS
275EFIAPI
277 IN EFI_FILE_PROTOCOL *This,
278 OUT UINT64 *Position
279 )
280{
281 VIRTUAL_FILE_DATA *Data;
282
283 if ( (This == NULL)
284 || (Position == NULL))
285 {
286 return EFI_INVALID_PARAMETER;
287 }
288
289 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
290
291 if (Data->OriginalProtocol == NULL) {
292 *Position = Data->FilePosition;
293 return EFI_SUCCESS;
294 }
295
296 return Data->OriginalProtocol->GetPosition (
297 Data->OriginalProtocol,
298 Position
299 );
300}
301
302STATIC
303EFI_STATUS
304EFIAPI
306 IN EFI_FILE_PROTOCOL *This,
307 IN EFI_GUID *InformationType,
308 IN OUT UINTN *BufferSize,
309 OUT VOID *Buffer
310 )
311{
312 EFI_STATUS Status;
313 VIRTUAL_FILE_DATA *Data;
314 UINTN InfoSize;
315 UINTN NameSize;
316 EFI_FILE_INFO *FileInfo;
317 BOOLEAN Fits;
318
319 if ( (This == NULL)
320 || (InformationType == NULL)
321 || (BufferSize == NULL))
322 {
323 return EFI_INVALID_PARAMETER;
324 }
325
326 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
327
328 if (Data->OriginalProtocol == NULL) {
329 if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
331 sizeof (FileInfo->FileName) == sizeof (CHAR16),
332 "Header changed, flexible array member is now supported"
333 );
334
335 NameSize = StrSize (Data->FileName);
336 InfoSize = SIZE_OF_EFI_FILE_INFO + NameSize;
337 Fits = *BufferSize >= InfoSize;
338 *BufferSize = InfoSize;
339
340 if (!Fits) {
341 return EFI_BUFFER_TOO_SMALL;
342 }
343
344 if (Buffer == NULL) {
345 return EFI_INVALID_PARAMETER;
346 }
347
348 FileInfo = (EFI_FILE_INFO *)Buffer;
349
350 ZeroMem (FileInfo, InfoSize - NameSize);
351 FileInfo->Size = InfoSize;
352 FileInfo->FileSize = Data->FileSize;
353 FileInfo->PhysicalSize = Data->FileSize;
354
355 CopyMem (&FileInfo->CreateTime, &Data->ModificationTime, sizeof (FileInfo->ModificationTime));
356 CopyMem (&FileInfo->LastAccessTime, &Data->ModificationTime, sizeof (FileInfo->ModificationTime));
357 CopyMem (&FileInfo->ModificationTime, &Data->ModificationTime, sizeof (FileInfo->ModificationTime));
358
359 //
360 // Return zeroes for timestamps.
361 //
362 FileInfo->Attribute = EFI_FILE_READ_ONLY;
363 CopyMem (&FileInfo->FileName[0], Data->FileName, NameSize);
364
365 return EFI_SUCCESS;
366 }
367
368 //
369 // TODO: return some dummy data for EFI_FILE_SYSTEM_INFO?
370 //
371
372 return EFI_UNSUPPORTED;
373 }
374
375 Status = Data->OriginalProtocol->GetInfo (
376 Data->OriginalProtocol,
377 InformationType,
378 BufferSize,
379 Buffer
380 );
381
382 DEBUG ((
383 DEBUG_VERBOSE,
384 "Getting file info %g with now BufferSize %u mode gave - %r\n",
385 InformationType,
386 (UINT32)*BufferSize,
387 Status
388 ));
389
390 if (!EFI_ERROR (Status) && CompareGuid (InformationType, &gEfiFileInfoGuid)) {
391 DEBUG ((DEBUG_VERBOSE, "Got file size %u\n", (UINT32)((EFI_FILE_INFO *)Buffer)->FileSize));
392 }
393
394 return Status;
395}
396
397STATIC
398EFI_STATUS
399EFIAPI
401 IN EFI_FILE_PROTOCOL *This,
402 IN EFI_GUID *InformationType,
403 IN UINTN BufferSize,
404 IN VOID *Buffer
405 )
406{
407 VIRTUAL_FILE_DATA *Data;
408
409 if (This == NULL) {
410 return EFI_INVALID_PARAMETER;
411 }
412
413 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
414
415 if (Data->OriginalProtocol == NULL) {
416 //
417 // Virtual files are not writeable, this applies to info.
418 //
419 return EFI_WRITE_PROTECTED;
420 }
421
422 return Data->OriginalProtocol->SetInfo (
423 Data->OriginalProtocol,
424 InformationType,
425 BufferSize,
426 Buffer
427 );
428}
429
430STATIC
431EFI_STATUS
432EFIAPI
434 IN EFI_FILE_PROTOCOL *This
435 )
436{
437 VIRTUAL_FILE_DATA *Data;
438
439 if (This == NULL) {
440 return EFI_INVALID_PARAMETER;
441 }
442
443 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
444
445 if (Data->OriginalProtocol == NULL) {
446 //
447 // Virtual files are not writeable.
448 //
449 return EFI_WRITE_PROTECTED;
450 }
451
452 return Data->OriginalProtocol->Flush (
453 Data->OriginalProtocol
454 );
455}
456
457STATIC
458EFI_STATUS
459EFIAPI
461 IN EFI_FILE_PROTOCOL *This,
462 OUT EFI_FILE_PROTOCOL **NewHandle,
463 IN CHAR16 *FileName,
464 IN UINT64 OpenMode,
465 IN UINT64 Attributes,
466 IN OUT EFI_FILE_IO_TOKEN *Token
467 )
468{
469 EFI_STATUS Status;
470
471 //
472 // Ignore asynchronous interface for now.
473 //
474 // Virtual files are not directories and cannot be reopened.
475 // TODO: May want to handle parent directory paths.
476 // WARN: Unlike Open for OpenEx UEFI 2.7A explicitly dicates EFI_NO_MEDIA for
477 // "The specified file could not be found on the device." error case.
478 // We do not care for simplicity.
479 //
480 Status = VirtualFileOpen (
481 This,
482 NewHandle,
483 FileName,
484 OpenMode,
485 Attributes
486 );
487
488 if (!EFI_ERROR (Status) && (Token->Event != NULL)) {
489 Token->Status = EFI_SUCCESS;
490 gBS->SignalEvent (Token->Event);
491 }
492
493 return Status;
494}
495
496STATIC
497EFI_STATUS
498EFIAPI
500 IN EFI_FILE_PROTOCOL *This,
501 IN OUT EFI_FILE_IO_TOKEN *Token
502 )
503{
504 EFI_STATUS Status;
505 VIRTUAL_FILE_DATA *Data;
506
507 if ( (This == NULL)
508 || (Token == NULL))
509 {
510 return EFI_INVALID_PARAMETER;
511 }
512
513 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
514
515 if (Data->OriginalProtocol == NULL) {
516 Status = VirtualFileRead (This, Token->Buffer, &Token->BufferSize);
517
518 if (!EFI_ERROR (Status) && (Token->Event != NULL)) {
519 Token->Status = EFI_SUCCESS;
520 gBS->SignalEvent (Token->Event);
521 }
522 } else {
523 Status = Data->OriginalProtocol->ReadEx (
524 This,
525 Token
526 );
527 }
528
529 return Status;
530}
531
532STATIC
533EFI_STATUS
534EFIAPI
536 IN EFI_FILE_PROTOCOL *This,
537 IN OUT EFI_FILE_IO_TOKEN *Token
538 )
539{
540 VIRTUAL_FILE_DATA *Data;
541
542 ASSERT (This != NULL);
543
544 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
545
546 if (Data->OriginalProtocol == NULL) {
547 //
548 // Virtual files are not writeable.
549 //
550 return EFI_WRITE_PROTECTED;
551 }
552
553 return Data->OriginalProtocol->WriteEx (
554 This,
555 Token
556 );
557}
558
559STATIC
560EFI_STATUS
561EFIAPI
563 IN EFI_FILE_PROTOCOL *This,
564 IN OUT EFI_FILE_IO_TOKEN *Token
565 )
566{
567 VIRTUAL_FILE_DATA *Data;
568
569 if (This == NULL) {
570 return EFI_INVALID_PARAMETER;
571 }
572
573 Data = VIRTUAL_FILE_FROM_PROTOCOL (This);
574
575 if (Data->OriginalProtocol == NULL) {
576 //
577 // Virtual files are not writeable.
578 //
579 return EFI_WRITE_PROTECTED;
580 }
581
582 return Data->OriginalProtocol->FlushEx (
583 This,
584 Token
585 );
586}
587
588STATIC
589CONST
590EFI_FILE_PROTOCOL
592 .Revision = EFI_FILE_PROTOCOL_REVISION2,
593 .Open = VirtualFileOpen,
594 .Close = VirtualFileClose,
595 .Delete = VirtualFileDelete,
596 .Read = VirtualFileRead,
597 .Write = VirtualFileWrite,
598 .GetPosition = VirtualFileGetPosition,
599 .SetPosition = VirtualFileSetPosition,
600 .GetInfo = VirtualFileGetInfo,
601 .SetInfo = VirtualFileSetInfo,
602 .Flush = VirtualFileFlush,
603 .OpenEx = VirtualFileOpenEx,
604 .ReadEx = VirtualFileReadEx,
605 .WriteEx = VirtualFileWriteEx,
606 .FlushEx = VirtualFileFlushEx
607};
608
609EFI_STATUS
611 IN CHAR16 *FileName,
612 IN VOID *FileBuffer,
613 IN UINT64 FileSize,
614 IN CONST EFI_TIME *ModificationTime OPTIONAL,
615 OUT EFI_FILE_PROTOCOL **File
616 )
617{
618 VIRTUAL_FILE_DATA *Data;
619
620 ASSERT (FileName != NULL);
621 ASSERT (FileBuffer != NULL);
622 ASSERT (File != NULL);
623
624 Data = AllocatePool (sizeof (VIRTUAL_FILE_DATA));
625
626 if (Data == NULL) {
627 return EFI_OUT_OF_RESOURCES;
628 }
629
631 Data->FileName = FileName;
632 Data->FileBuffer = FileBuffer;
633 Data->FileSize = FileSize;
634 Data->FilePosition = 0;
635 Data->OpenCallback = NULL;
636 Data->OriginalProtocol = NULL;
637 CopyMem (&Data->Protocol, &mVirtualFileProtocolTemplate, sizeof (Data->Protocol));
638 if (ModificationTime != NULL) {
639 CopyMem (&Data->ModificationTime, ModificationTime, sizeof (*ModificationTime));
640 } else {
641 ZeroMem (&Data->ModificationTime, sizeof (*ModificationTime));
642 }
643
644 *File = &Data->Protocol;
645
646 return EFI_SUCCESS;
647}
648
649EFI_STATUS
651 IN CONST CHAR16 *FileName,
652 IN VOID *FileBuffer,
653 IN UINT64 FileSize,
654 IN CONST EFI_TIME *ModificationTime OPTIONAL,
655 OUT EFI_FILE_PROTOCOL **File
656 )
657{
658 EFI_STATUS Status;
659 CHAR16 *FileNameCopy;
660
661 ASSERT (FileName != NULL);
662 ASSERT (File != NULL);
663
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;
668 }
669
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;
675 }
676
677 return Status;
678}
679
680STATIC
681VOID
683 IN OUT VIRTUAL_FILE_DATA *Data,
684 IN EFI_FILE_OPEN OpenCallback
685 )
686{
687 ZeroMem (Data, sizeof (*Data));
688 Data->Signature = VIRTUAL_FILE_DATA_SIGNATURE;
689 Data->OpenCallback = OpenCallback;
690 CopyMem (&Data->Protocol, &mVirtualFileProtocolTemplate, sizeof (Data->Protocol));
691}
692
693EFI_STATUS
695 IN EFI_FILE_PROTOCOL *OriginalFile OPTIONAL,
696 IN EFI_FILE_OPEN OpenCallback OPTIONAL,
697 IN BOOLEAN CloseOnFailure,
698 OUT EFI_FILE_PROTOCOL **File
699 )
700{
701 VIRTUAL_FILE_DATA *Data;
702
703 ASSERT (File != NULL);
704
705 Data = AllocatePool (sizeof (VIRTUAL_FILE_DATA));
706
707 if (Data == NULL) {
708 if (CloseOnFailure) {
709 ASSERT (OriginalFile != NULL);
710 OriginalFile->Close (OriginalFile);
711 }
712
713 return EFI_OUT_OF_RESOURCES;
714 }
715
716 InternalInitVirtualVolumeData (Data, OpenCallback);
717 Data->OriginalProtocol = OriginalFile;
718
719 *File = &Data->Protocol;
720
721 return EFI_SUCCESS;
722}
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
EFI_BOOT_SERVICES * gBS
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)
Definition OpenFile.c:29
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
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)
Definition VirtualFile.c:86
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)
Definition VirtualFile.c:34
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
#define ASSERT(x)
Definition coder.h:55
EFI_FILE_PROTOCOL * OriginalProtocol
EFI_FILE_OPEN OpenCallback
EFI_FILE_PROTOCOL Protocol