OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
VirtualFs.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
29STATIC EFI_HANDLE_PROTOCOL mOriginalHandleProtocol;
30STATIC EFI_LOCATE_PROTOCOL mOriginalLocateProtocol;
31STATIC EFI_FILE_OPEN mOpenCallback;
32STATIC UINT32 mEntranceCount;
33
34STATIC
35VOID
37 IN EFI_GUID *Protocol,
38 OUT VOID **Interface
39 )
40{
41 EFI_STATUS Status;
42 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;
43
45 return;
46 }
47
48 Status = CreateVirtualFs (*Interface, mOpenCallback, &FileSystem);
49 if (!EFI_ERROR (Status)) {
50 *Interface = FileSystem;
51 }
52}
53
54STATIC
55EFI_STATUS
56EFIAPI
58 IN EFI_HANDLE Handle,
59 IN EFI_GUID *Protocol,
60 OUT VOID **Interface
61 )
62{
63 EFI_STATUS Status;
64
65 Status = mOriginalHandleProtocol (Handle, Protocol, Interface);
66
67 if (!EFI_ERROR (Status) && (Interface != NULL) && (mEntranceCount == 0)) {
69 VirtualFsWrapProtocol (Protocol, Interface);
71 }
72
73 return Status;
74}
75
76STATIC
77EFI_STATUS
78EFIAPI
80 IN EFI_GUID *Protocol,
81 IN VOID *Registration OPTIONAL,
82 OUT VOID **Interface
83 )
84{
85 EFI_STATUS Status;
86
87 Status = mOriginalLocateProtocol (Protocol, Registration, Interface);
88
89 if (!EFI_ERROR (Status) && (Interface != NULL) && (mEntranceCount == 0)) {
91 VirtualFsWrapProtocol (Protocol, Interface);
93 }
94
95 return Status;
96}
97
98EFI_STATUS
100 IN OUT EFI_BOOT_SERVICES *BootServices,
101 IN EFI_FILE_OPEN OpenCallback
102 )
103{
104 if ( (mOriginalHandleProtocol != NULL)
105 || (BootServices->HandleProtocol == VirtualFsHandleProtocol))
106 {
107 return EFI_ALREADY_STARTED;
108 }
109
110 //
111 // Note, we should normally also hook OpenProtocol, but it results in freezes on APTIO IV and V.
112 //
113 mOpenCallback = OpenCallback;
114 mOriginalHandleProtocol = BootServices->HandleProtocol;
115 mOriginalLocateProtocol = BootServices->LocateProtocol;
116 BootServices->HandleProtocol = VirtualFsHandleProtocol;
117 BootServices->LocateProtocol = VirtualFsLocateProtocol;
118 BootServices->Hdr.CRC32 = 0;
119 BootServices->CalculateCrc32 (BootServices, BootServices->Hdr.HeaderSize, &BootServices->Hdr.CRC32);
120
121 return EFI_SUCCESS;
122}
123
124EFI_STATUS
126 IN OUT EFI_BOOT_SERVICES *BootServices
127 )
128{
129 if ( (mOriginalHandleProtocol == NULL)
130 || (BootServices->HandleProtocol != VirtualFsHandleProtocol))
131 {
132 return EFI_ALREADY_STARTED;
133 }
134
135 BootServices->HandleProtocol = mOriginalHandleProtocol;
136 BootServices->LocateProtocol = mOriginalLocateProtocol;
137 mOpenCallback = NULL;
140 BootServices->Hdr.CRC32 = 0;
141 BootServices->CalculateCrc32 (BootServices, BootServices->Hdr.HeaderSize, &BootServices->Hdr.CRC32);
142
143 return EFI_SUCCESS;
144}
APPLE_EVENT_HANDLE Handle
Definition OcTypingLib.h:45
EFI_STATUS CreateVirtualFs(IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *OriginalFileSystem, IN EFI_FILE_OPEN OpenCallback, OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **NewFileSystem)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
EFI_GUID gEfiSimpleFileSystemProtocolGuid
STATIC VOID VirtualFsWrapProtocol(IN EFI_GUID *Protocol, OUT VOID **Interface)
Definition VirtualFs.c:36
STATIC EFI_LOCATE_PROTOCOL mOriginalLocateProtocol
Definition VirtualFs.c:30
STATIC EFI_STATUS EFIAPI VirtualFsHandleProtocol(IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, OUT VOID **Interface)
Definition VirtualFs.c:57
STATIC EFI_HANDLE_PROTOCOL mOriginalHandleProtocol
Definition VirtualFs.c:29
STATIC EFI_STATUS EFIAPI VirtualFsLocateProtocol(IN EFI_GUID *Protocol, IN VOID *Registration OPTIONAL, OUT VOID **Interface)
Definition VirtualFs.c:79
STATIC UINT32 mEntranceCount
Definition VirtualFs.c:32
EFI_STATUS DisableVirtualFs(IN OUT EFI_BOOT_SERVICES *BootServices)
Definition VirtualFs.c:125
STATIC EFI_FILE_OPEN mOpenCallback
Definition VirtualFs.c:31
EFI_STATUS EnableVirtualFs(IN OUT EFI_BOOT_SERVICES *BootServices, IN EFI_FILE_OPEN OpenCallback)
Definition VirtualFs.c:99