OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
FirmwareFile.c
Go to the documentation of this file.
1
15#include <PiDxe.h>
16#include <Library/BaseMemoryLib.h>
17#include <Library/DebugLib.h>
18#include <Library/DevicePathLib.h>
19#include <Library/MemoryAllocationLib.h>
20#include <Library/OcFileLib.h>
21#include <Library/UefiBootServicesTableLib.h>
22#include <Library/UefiLib.h>
23#include <Protocol/DevicePath.h>
24#include <Protocol/GraphicsOutput.h>
26#include <Protocol/FirmwareVolume2.h>
27#include <Protocol/DevicePath.h>
28
29STATIC
30EFI_HANDLE
32 IN EFI_GUID *FvNameGuid,
33 IN EFI_SECTION_TYPE SectionType,
34 OUT VOID **FileData OPTIONAL,
35 OUT UINT32 *FileSize OPTIONAL
36 )
37{
38 UINTN Index;
39 EFI_STATUS Status;
40 UINT32 AuthenticationStatus;
42 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv2;
43 UINTN NumOfHandles;
44 EFI_HANDLE *HandleBuffer;
45 EFI_FV_FILETYPE Type;
46 UINTN Size;
47 EFI_FV_FILE_ATTRIBUTES Attributes;
48 EFI_HANDLE CurrentVolume;
49 BOOLEAN UseFv2;
50
51 UseFv2 = FALSE;
52 Status = gBS->LocateHandleBuffer (
53 ByProtocol,
55 NULL,
56 &NumOfHandles,
57 &HandleBuffer
58 );
59
60 if (EFI_ERROR (Status)) {
61 Status = gBS->LocateHandleBuffer (
62 ByProtocol,
63 &gEfiFirmwareVolume2ProtocolGuid,
64 NULL,
65 &NumOfHandles,
66 &HandleBuffer
67 );
68 UseFv2 = TRUE;
69 }
70
71 if (EFI_ERROR (Status)) {
72 return NULL;
73 }
74
75 for (Index = 0; Index < NumOfHandles; ++Index) {
76 CurrentVolume = HandleBuffer[Index];
77
78 if (UseFv2) {
79 Status = gBS->HandleProtocol (
80 CurrentVolume,
81 &gEfiFirmwareVolume2ProtocolGuid,
82 (VOID **)&Fv2
83 );
84 } else {
85 Status = gBS->HandleProtocol (
86 CurrentVolume,
88 (VOID **)&Fv
89 );
90 }
91
92 if (EFI_ERROR (Status)) {
93 continue;
94 }
95
96 if (UseFv2) {
97 Status = Fv2->ReadFile (
98 Fv2,
99 FvNameGuid,
100 NULL,
101 &Size,
102 &Type,
103 &Attributes,
104 &AuthenticationStatus
105 );
106 } else {
107 Status = Fv->ReadFile (
108 Fv,
109 FvNameGuid,
110 NULL,
111 &Size,
112 &Type,
113 &Attributes,
114 &AuthenticationStatus
115 );
116 }
117
118 if (!EFI_ERROR (Status)) {
119 FreePool (HandleBuffer);
120
121 if (FileData != NULL) {
122 ASSERT (FileSize != NULL);
123
124 *FileData = NULL;
125 if (UseFv2) {
126 Status = Fv2->ReadSection (
127 Fv2,
128 FvNameGuid,
129 SectionType,
130 0,
131 FileData,
132 &Size,
133 &AuthenticationStatus
134 );
135 } else {
136 Status = Fv->ReadSection (
137 Fv,
138 FvNameGuid,
139 SectionType,
140 0,
141 FileData,
142 &Size,
143 &AuthenticationStatus
144 );
145 }
146
147 if (!EFI_ERROR (Status)) {
148 *FileSize = (UINT32)Size;
149 } else {
150 CurrentVolume = NULL;
151 }
152 }
153
154 return CurrentVolume;
155 }
156 }
157
158 FreePool (HandleBuffer);
159 return NULL;
160}
161
162EFI_DEVICE_PATH_PROTOCOL *
164 IN EFI_GUID *FileGuid
165 )
166{
167 EFI_HANDLE VolumeHandle;
168 EFI_DEVICE_PATH_PROTOCOL *VolumeDevicePath;
169 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FvFileNode;
170
171 VolumeHandle = GetFvFileData (FileGuid, EFI_SECTION_ALL, NULL, NULL);
172 if (VolumeHandle == NULL) {
173 return NULL;
174 }
175
176 VolumeDevicePath = DevicePathFromHandle (VolumeHandle);
177 if (VolumeDevicePath == NULL) {
178 return NULL;
179 }
180
181 EfiInitializeFwVolDevicepathNode (&FvFileNode, FileGuid);
182 return AppendDevicePathNode (VolumeDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&FvFileNode);
183}
184
185VOID *
187 IN EFI_GUID *FileGuid,
188 IN UINT8 SectionType,
189 OUT UINT32 *FileSize
190 )
191{
192 EFI_HANDLE VolumeHandle;
193 VOID *FileData;
194
195 //
196 // TODO: This is quite an ugly interface, redesign.
197 //
198 VolumeHandle = GetFvFileData (FileGuid, SectionType, &FileData, FileSize);
199 if (VolumeHandle == NULL) {
200 return NULL;
201 }
202
203 return FileData;
204}
UINT8 EFI_SECTION_TYPE
UINT32 EFI_FV_FILE_ATTRIBUTES
#define EFI_SECTION_ALL
UINT8 EFI_FV_FILETYPE
STATIC EFI_HANDLE GetFvFileData(IN EFI_GUID *FvNameGuid, IN EFI_SECTION_TYPE SectionType, OUT VOID **FileData OPTIONAL, OUT UINT32 *FileSize OPTIONAL)
EFI_DEVICE_PATH_PROTOCOL * OcCreateFvFileDevicePath(IN EFI_GUID *FileGuid)
VOID * OcReadFvFileSection(IN EFI_GUID *FileGuid, IN UINT8 SectionType, OUT UINT32 *FileSize)
EFI_GUID gEfiFirmwareVolumeProtocolGuid
DMG_SIZE_DEVICE_PATH Size
EFI_BOOT_SERVICES * gBS
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)
Definition UserMisc.c:680
#define ASSERT(x)
Definition coder.h:55
FRAMEWORK_EFI_FV_READ_FILE ReadFile
FRAMEWORK_EFI_FV_READ_SECTION ReadSection