OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
VirtualVolume.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>
24
25#include <Guid/FileInfo.h>
26
27#include "VirtualFsInternal.h"
28
29//
30// Mere reallocatable array, never freed (cannot be, unless protocol uninstallation is hooked).
31//
35
36STATIC
37EFI_STATUS
38EFIAPI
40 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
41 OUT EFI_FILE_PROTOCOL **Root
42 )
43{
44 EFI_STATUS Status;
46 EFI_FILE_PROTOCOL *NewFile;
47
49
50 Status = Data->OriginalFileSystem->OpenVolume (
52 &NewFile
53 );
54
55 if (!EFI_ERROR (Status)) {
56 return CreateRealFile (NewFile, Data->OpenCallback, TRUE, Root);
57 }
58
59 return Status;
60}
61
62STATIC
63CONST
64EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
66 .Revision = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
67 .OpenVolume = VirtualFsOpenVolume
68};
69
70EFI_STATUS
72 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *OriginalFileSystem,
73 IN EFI_FILE_OPEN OpenCallback,
74 OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **NewFileSystem
75 )
76{
77 UINTN Index;
78 VIRTUAL_FILESYSTEM_DATA **NewVirtualFileSystems;
80
81 //
82 // Return cached data first.
83 //
84 for (Index = 0; Index < mVirtualFileSystemsUsed; ++Index) {
85 if (mVirtualFileSystems[Index]->OriginalFileSystem == OriginalFileSystem) {
86 *NewFileSystem = &mVirtualFileSystems[Index]->FileSystem;
87 return EFI_SUCCESS;
88 }
89 }
90
91 //
92 // Allocate more slots.
93 //
95 NewVirtualFileSystems = AllocatePool (
97 );
98 if (NewVirtualFileSystems == NULL) {
99 return EFI_OUT_OF_RESOURCES;
100 }
101
102 if (mVirtualFileSystems != NULL) {
103 CopyMem (
104 &NewVirtualFileSystems[0],
107 );
108 FreePool (mVirtualFileSystems);
109 }
110
112 mVirtualFileSystems = NewVirtualFileSystems;
113 }
114
115 Data = AllocatePool (sizeof (*Data));
116 if (Data == NULL) {
117 return EFI_OUT_OF_RESOURCES;
118 }
119
121 Data->OriginalFileSystem = OriginalFileSystem;
122 Data->OpenCallback = OpenCallback;
124
127
128 *NewFileSystem = &Data->FileSystem;
129
130 return EFI_SUCCESS;
131}
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)
#define VIRTUAL_VOLUME_FROM_FILESYSTEM_PROTOCOL(This)
#define VIRTUAL_VOLUME_DATA_SIGNATURE
STATIC VIRTUAL_FILESYSTEM_DATA ** mVirtualFileSystems
EFI_STATUS CreateVirtualFs(IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *OriginalFileSystem, IN EFI_FILE_OPEN OpenCallback, OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **NewFileSystem)
STATIC CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL mVirtualFileSystemProtocolTemplate
STATIC UINTN mVirtualFileSystemsUsed
STATIC EFI_STATUS EFIAPI VirtualFsOpenVolume(IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **Root)
STATIC UINTN mVirtualFileSystemsAllocated
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL FileSystem
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * OriginalFileSystem