OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcFirmwareVolumeLib.c
Go to the documentation of this file.
1
19#include <Library/BaseMemoryLib.h>
21#include <Library/UefiBootServicesTableLib.h>
22#include <Protocol/FirmwareVolume2.h>
23
25
26//
27// Original functions from FirmwareVolume protocol
28//
35
36STATIC
37EFI_STATUS
38EFIAPI
41 OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes
42 )
43{
44 EFI_STATUS Status;
45
46 if (mGetVolumeAttributes != NULL) {
47 Status = mGetVolumeAttributes (This, Attributes);
48 } else {
49 //
50 // The firmware volume is configured to disallow reads.
51 // UEFI PI Specification 1.6, page 90
52 //
53 Status = EFI_SUCCESS;
54 }
55
56 return Status;
57}
58
59STATIC
60EFI_STATUS
61EFIAPI
64 IN OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes
65 )
66{
67 EFI_STATUS Status;
68
69 if (mSetVolumeAttributes != NULL) {
70 Status = mSetVolumeAttributes (This, Attributes);
71 } else {
72 //
73 // The firmware volume is configured to disallow reads.
74 // UEFI PI Specification 1.6, page 96
75 //
76 Status = EFI_INVALID_PARAMETER;
77 }
78
79 return Status;
80}
81
82STATIC
83EFI_STATUS
84EFIAPI
87 IN EFI_GUID *NameGuid,
88 IN OUT VOID **Buffer,
89 IN OUT UINTN *BufferSize,
90 OUT EFI_FV_FILETYPE *FoundType,
91 OUT EFI_FV_FILE_ATTRIBUTES *FileAttributes,
92 OUT UINT32 *AuthenticationStatus
93 )
94{
95 EFI_STATUS Status;
96
97 if (mReadFile != NULL) {
98 Status = mReadFile (
99 This,
100 NameGuid,
101 Buffer,
102 BufferSize,
103 FoundType,
104 FileAttributes,
105 AuthenticationStatus
106 );
107 } else {
108 //
109 // The firmware volume is configured to disallow reads.
110 // UEFI PI Specification 1.6, page 98
111 //
112 Status = EFI_ACCESS_DENIED;
113 }
114
115 return Status;
116}
117
118STATIC
119EFI_STATUS
120EFIAPI
123 IN EFI_GUID *NameGuid,
124 IN EFI_SECTION_TYPE SectionType,
125 IN UINTN SectionInstance,
126 IN OUT VOID **Buffer,
127 IN OUT UINTN *BufferSize,
128 OUT UINT32 *AuthenticationStatus
129 )
130{
131 EFI_STATUS Status;
132
133 if (!Buffer || !BufferSize || !AuthenticationStatus) {
134 return EFI_INVALID_PARAMETER;
135 }
136
137 if (CompareGuid (NameGuid, &gAppleArrowCursorImageGuid)) {
138 *BufferSize = sizeof (mAppleArrowCursorImage);
139 Status = gBS->AllocatePool (EfiBootServicesData, *BufferSize, (VOID **)Buffer);
140 if (!EFI_ERROR (Status)) {
141 gBS->CopyMem (*Buffer, &mAppleArrowCursorImage, *BufferSize);
142 }
143
144 *AuthenticationStatus = 0;
145 return Status;
146 } else if (CompareGuid (NameGuid, &gAppleArrowCursor2xImageGuid)) {
147 *BufferSize = sizeof (mAppleArrowCursor2xImage);
148 Status = gBS->AllocatePool (EfiBootServicesData, *BufferSize, (VOID **)Buffer);
149 if (!EFI_ERROR (Status)) {
150 gBS->CopyMem (*Buffer, &mAppleArrowCursor2xImage, *BufferSize);
151 }
152
153 *AuthenticationStatus = 0;
154 return Status;
155 } else if (CompareGuid (NameGuid, &gAppleImageListGuid)) {
156 *BufferSize = sizeof (mAppleImageTable);
157 Status = gBS->AllocatePool (EfiBootServicesData, *BufferSize, (VOID **)Buffer);
158 if (!EFI_ERROR (Status)) {
159 gBS->CopyMem (*Buffer, &mAppleImageTable, *BufferSize);
160 }
161
162 *AuthenticationStatus = 0;
163 return Status;
164 }
165
166 if (mReadSection != NULL) {
167 Status = mReadSection (
168 This,
169 NameGuid,
170 SectionType,
171 SectionInstance,
172 Buffer,
173 BufferSize,
174 AuthenticationStatus
175 );
176 } else {
177 //
178 // The firmware volume is configured to disallow reads.
179 // UEFI PI Specification 1.6, page 98
180 //
181 Status = EFI_ACCESS_DENIED;
182 }
183
184 return Status;
185}
186
187STATIC
188EFI_STATUS
189EFIAPI
192 IN UINT32 NumberOfFiles,
193 IN FRAMEWORK_EFI_FV_WRITE_POLICY WritePolicy,
195 )
196{
197 EFI_STATUS Status;
198
199 if (mWriteFile != NULL) {
200 Status = mWriteFile (This, NumberOfFiles, WritePolicy, FileData);
201 } else {
202 //
203 // The firmware volume is configured to disallow writes.
204 // According UEFI PI Specification 1.6, page 101
205 //
206 Status = EFI_WRITE_PROTECTED;
207 }
208
209 return Status;
210}
211
212STATIC
213EFI_STATUS
214EFIAPI
217 IN OUT VOID *Key,
218 IN OUT EFI_FV_FILETYPE *FileType,
219 OUT EFI_GUID *NameGuid,
220 OUT EFI_FV_FILE_ATTRIBUTES *Attributes,
221 OUT UINTN *Size
222 )
223{
224 EFI_STATUS Status;
225
226 if (mGetNextFile != NULL) {
227 Status = mGetNextFile (This, Key, FileType, NameGuid, Attributes, Size);
228 } else {
229 //
230 // The firmware volume is configured to disallow reads.
231 // According UEFI PI Specification 1.6, page 101
232 //
233 Status = EFI_ACCESS_DENIED;
234 }
235
236 return Status;
237}
238
249
260 IN BOOLEAN Reinstall
261 )
262{
263 EFI_STATUS Status;
264 EFI_FIRMWARE_VOLUME_PROTOCOL *FirmwareVolumeInterface = NULL;
265 EFI_FIRMWARE_VOLUME2_PROTOCOL *FirmwareVolume2Interface = NULL;
266 EFI_HANDLE NewHandle = NULL;
267
268 Status = gBS->LocateProtocol (
270 NULL,
271 (VOID **)&FirmwareVolumeInterface
272 );
273
274 if (EFI_ERROR (Status)) {
275 //
276 // This is a rough workaround for MSI 100 and 200 series motherboards.
277 // These boards do not have Firmware Volume protocol, yet their
278 // dispatcher protocol, responsible for loading BIOS UI elements,
279 // prefers Firmware Volume to Firmware Volume 2.
280 // For this reason we make sure that all the other Firmware Volume 2
281 // volumes are backed with Firmware Volume implementations.
282 // We assume that by the time this code is executed, Firmware Volume 2
283 // protocols are available if exists. Otherwise do not bother installing
284 // hunks over nowhere.
285 //
286
287 Status = gBS->LocateProtocol (
288 &gEfiFirmwareVolume2ProtocolGuid,
289 NULL,
290 (VOID **)&FirmwareVolume2Interface
291 );
292
293 if (!EFI_ERROR (Status)) {
295 }
296
297 Status = gBS->InstallMultipleProtocolInterfaces (
298 &NewHandle,
301 NULL
302 );
303
304 if (EFI_ERROR (Status)) {
305 return NULL;
306 }
307 } else {
308 if (Reinstall) {
309 //
310 // If a protocol already exists, we just wrap the first discovered
311 // protocol to handle our special GUIDs. This works, as boot.efi
312 // makes sure to check all the available volumes.
313 //
314
315 //
316 // Remember pointers to original functions
317 //
318 mGetVolumeAttributes = FirmwareVolumeInterface->GetVolumeAttributes;
319 mSetVolumeAttributes = FirmwareVolumeInterface->SetVolumeAttributes;
320 mReadFile = FirmwareVolumeInterface->ReadFile;
321 mReadSection = FirmwareVolumeInterface->ReadSection;
322 mWriteFile = FirmwareVolumeInterface->WriteFile;
323 mGetNextFile = FirmwareVolumeInterface->GetNextFile;
324 //
325 // Override with our wrappers
326 //
327 FirmwareVolumeInterface->GetVolumeAttributes = GetVolumeAttributesEx;
328 FirmwareVolumeInterface->SetVolumeAttributes = SetVolumeAttributesEx;
329 FirmwareVolumeInterface->ReadFile = ReadFileEx;
330 FirmwareVolumeInterface->ReadSection = ReadSectionEx;
331 FirmwareVolumeInterface->WriteFile = WriteFileEx;
332 FirmwareVolumeInterface->GetNextFile = GetNextFileEx;
333 } else {
334 return FirmwareVolumeInterface;
335 }
336 }
337
338 return &mFirmwareVolume;
339}
EFI_GUID gAppleArrowCursorImageGuid
EFI_GUID gAppleArrowCursor2xImageGuid
EFI_GUID gAppleImageListGuid
UINT8 EFI_SECTION_TYPE
UINT32 EFI_FV_FILE_ATTRIBUTES
UINT8 EFI_FV_FILETYPE
UINT64 FRAMEWORK_EFI_FV_ATTRIBUTES
EFI_STATUS(EFIAPI * FRAMEWORK_EFI_FV_GET_NEXT_FILE)(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN OUT VOID *Key, IN OUT EFI_FV_FILETYPE *FileType, OUT EFI_GUID *NameGuid, OUT EFI_FV_FILE_ATTRIBUTES *Attributes, OUT UINTN *Size)
EFI_STATUS(EFIAPI * FRAMEWORK_EFI_FV_READ_SECTION)(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN EFI_GUID *NameGuid, IN EFI_SECTION_TYPE SectionType, IN UINTN SectionInstance, IN OUT VOID **Buffer, IN OUT UINTN *BufferSize, OUT UINT32 *AuthenticationStatus)
EFI_STATUS(EFIAPI * FRAMEWORK_EFI_FV_SET_ATTRIBUTES)(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes)
EFI_STATUS(EFIAPI * FRAMEWORK_EFI_FV_GET_ATTRIBUTES)(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes)
EFI_STATUS(EFIAPI * FRAMEWORK_EFI_FV_WRITE_FILE)(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN UINT32 NumberOfFiles, IN FRAMEWORK_EFI_FV_WRITE_POLICY WritePolicy, IN FRAMEWORK_EFI_FV_WRITE_FILE_DATA *FileData)
EFI_STATUS(EFIAPI * FRAMEWORK_EFI_FV_READ_FILE)(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN EFI_GUID *NameGuid, IN OUT VOID **Buffer, IN OUT UINTN *BufferSize, OUT EFI_FV_FILETYPE *FoundType, OUT EFI_FV_FILE_ATTRIBUTES *FileAttributes, OUT UINT32 *AuthenticationStatus)
UINT32 FRAMEWORK_EFI_FV_WRITE_POLICY
EFI_GUID gEfiFirmwareVolumeProtocolGuid
EFI_STATUS EFIAPI InitializeFirmwareVolume2(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
DMG_SIZE_DEVICE_PATH Size
EFI_SYSTEM_TABLE * gST
EFI_HANDLE gImageHandle
EFI_BOOT_SERVICES * gBS
STATIC FRAMEWORK_EFI_FV_GET_ATTRIBUTES mGetVolumeAttributes
STATIC EFI_STATUS EFIAPI ReadFileEx(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN EFI_GUID *NameGuid, IN OUT VOID **Buffer, IN OUT UINTN *BufferSize, OUT EFI_FV_FILETYPE *FoundType, OUT EFI_FV_FILE_ATTRIBUTES *FileAttributes, OUT UINT32 *AuthenticationStatus)
STATIC FRAMEWORK_EFI_FV_WRITE_FILE mWriteFile
STATIC EFI_FIRMWARE_VOLUME_PROTOCOL mFirmwareVolume
STATIC EFI_STATUS EFIAPI GetNextFileEx(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN OUT VOID *Key, IN OUT EFI_FV_FILETYPE *FileType, OUT EFI_GUID *NameGuid, OUT EFI_FV_FILE_ATTRIBUTES *Attributes, OUT UINTN *Size)
STATIC EFI_STATUS EFIAPI GetVolumeAttributesEx(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes)
STATIC FRAMEWORK_EFI_FV_SET_ATTRIBUTES mSetVolumeAttributes
STATIC EFI_STATUS EFIAPI ReadSectionEx(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN EFI_GUID *NameGuid, IN EFI_SECTION_TYPE SectionType, IN UINTN SectionInstance, IN OUT VOID **Buffer, IN OUT UINTN *BufferSize, OUT UINT32 *AuthenticationStatus)
STATIC FRAMEWORK_EFI_FV_GET_NEXT_FILE mGetNextFile
EFI_FIRMWARE_VOLUME_PROTOCOL * OcFirmwareVolumeInstallProtocol(IN BOOLEAN Reinstall)
STATIC FRAMEWORK_EFI_FV_READ_FILE mReadFile
STATIC FRAMEWORK_EFI_FV_READ_SECTION mReadSection
STATIC EFI_STATUS EFIAPI SetVolumeAttributesEx(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes)
STATIC EFI_STATUS EFIAPI WriteFileEx(IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN UINT32 NumberOfFiles, IN FRAMEWORK_EFI_FV_WRITE_POLICY WritePolicy, IN FRAMEWORK_EFI_FV_WRITE_FILE_DATA *FileData)
STATIC IMAGE_ENTRY mAppleImageTable[]
STATIC UINT8 mAppleArrowCursor2xImage[]
STATIC UINT8 mAppleArrowCursorImage[]
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
FRAMEWORK_EFI_FV_SET_ATTRIBUTES SetVolumeAttributes
FRAMEWORK_EFI_FV_GET_NEXT_FILE GetNextFile
FRAMEWORK_EFI_FV_GET_ATTRIBUTES GetVolumeAttributes
FRAMEWORK_EFI_FV_WRITE_FILE WriteFile
FRAMEWORK_EFI_FV_READ_FILE ReadFile
FRAMEWORK_EFI_FV_READ_SECTION ReadSection