VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/FirmwareNew/MdePkg/Include/Library/PeCoffLib.h@ 85716

Last change on this file since 85716 was 80721, checked in by vboxsync, 5 years ago

Devices/EFI/FirmwareNew: Start upgrade process to edk2-stable201908 (compiles on Windows and works to some extent), bugref:4643

  • Property svn:eol-style set to native
File size: 17.5 KB
Line 
1/** @file
2 Provides services to load and relocate a PE/COFF image.
3
4 The PE/COFF Loader Library abstracts the implementation of a PE/COFF loader for
5 IA-32, x86, IPF, and EBC processor types. The library functions are memory-based
6 and can be ported easily to any environment.
7
8Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
9SPDX-License-Identifier: BSD-2-Clause-Patent
10
11**/
12
13#ifndef __BASE_PE_COFF_LIB_H__
14#define __BASE_PE_COFF_LIB_H__
15
16#include <IndustryStandard/PeImage.h>
17//
18// Return status codes from the PE/COFF Loader services
19//
20#define IMAGE_ERROR_SUCCESS 0
21#define IMAGE_ERROR_IMAGE_READ 1
22#define IMAGE_ERROR_INVALID_PE_HEADER_SIGNATURE 2
23#define IMAGE_ERROR_INVALID_MACHINE_TYPE 3
24#define IMAGE_ERROR_INVALID_SUBSYSTEM 4
25#define IMAGE_ERROR_INVALID_IMAGE_ADDRESS 5
26#define IMAGE_ERROR_INVALID_IMAGE_SIZE 6
27#define IMAGE_ERROR_INVALID_SECTION_ALIGNMENT 7
28#define IMAGE_ERROR_SECTION_NOT_LOADED 8
29#define IMAGE_ERROR_FAILED_RELOCATION 9
30#define IMAGE_ERROR_FAILED_ICACHE_FLUSH 10
31#define IMAGE_ERROR_UNSUPPORTED 11
32
33/**
34 Reads contents of a PE/COFF image.
35
36 A function of this type reads contents of the PE/COFF image specified by FileHandle. The read
37 operation copies ReadSize bytes from the PE/COFF image starting at byte offset FileOffset into
38 the buffer specified by Buffer. The size of the buffer actually read is returned in ReadSize.
39 If FileOffset specifies an offset past the end of the PE/COFF image, a ReadSize of 0 is returned.
40 A function of this type must be registered in the ImageRead field of a PE_COFF_LOADER_IMAGE_CONTEXT
41 structure for the PE/COFF Loader Library service to function correctly. This function abstracts access
42 to a PE/COFF image so it can be implemented in an environment specific manner. For example, SEC and PEI
43 environments may access memory directly to read the contents of a PE/COFF image, and DXE or UEFI
44 environments may require protocol services to read the contents of PE/COFF image
45 stored on FLASH, disk, or network devices.
46
47 If FileHandle is not a valid handle, then ASSERT().
48 If ReadSize is NULL, then ASSERT().
49 If Buffer is NULL, then ASSERT().
50
51 @param FileHandle Pointer to the file handle to read the PE/COFF image.
52 @param FileOffset Offset into the PE/COFF image to begin the read operation.
53 @param ReadSize On input, the size in bytes of the requested read operation.
54 On output, the number of bytes actually read.
55 @param Buffer Output buffer that contains the data read from the PE/COFF image.
56
57 @retval RETURN_SUCCESS The specified portion of the PE/COFF image was
58 read and the size return in ReadSize.
59 @retval RETURN_DEVICE_ERROR The specified portion of the PE/COFF image
60 could not be read due to a device error.
61
62**/
63typedef
64RETURN_STATUS
65(EFIAPI *PE_COFF_LOADER_READ_FILE)(
66 IN VOID *FileHandle,
67 IN UINTN FileOffset,
68 IN OUT UINTN *ReadSize,
69 OUT VOID *Buffer
70 );
71
72///
73/// The context structure used while PE/COFF image is being loaded and relocated.
74///
75typedef struct {
76 ///
77 /// Set by PeCoffLoaderGetImageInfo() to the ImageBase in the PE/COFF header.
78 ///
79 PHYSICAL_ADDRESS ImageAddress;
80 ///
81 /// Set by PeCoffLoaderGetImageInfo() to the SizeOfImage in the PE/COFF header.
82 /// Image size includes the size of Debug Entry if it is present.
83 ///
84 UINT64 ImageSize;
85 ///
86 /// Is set to zero by PeCoffLoaderGetImageInfo(). If DestinationAddress is non-zero,
87 /// PeCoffLoaderRelocateImage() will relocate the image using this base address.
88 /// If the DestinationAddress is zero, the ImageAddress will be used as the base
89 /// address of relocation.
90 ///
91 PHYSICAL_ADDRESS DestinationAddress;
92 ///
93 /// PeCoffLoaderLoadImage() sets EntryPoint to to the entry point of the PE/COFF image.
94 ///
95 PHYSICAL_ADDRESS EntryPoint;
96 ///
97 /// Passed in by the caller to PeCoffLoaderGetImageInfo() and PeCoffLoaderLoadImage()
98 /// to abstract accessing the image from the library.
99 ///
100 PE_COFF_LOADER_READ_FILE ImageRead;
101 ///
102 /// Used as the FileHandle passed into the ImageRead function when it's called.
103 ///
104 VOID *Handle;
105 ///
106 /// Caller allocated buffer of size FixupDataSize that can be optionally allocated
107 /// prior to calling PeCoffLoaderRelocateImage().
108 /// This buffer is filled with the information used to fix up the image.
109 /// The fixups have been applied to the image and this entry is just for information.
110 ///
111 VOID *FixupData;
112 ///
113 /// Set by PeCoffLoaderGetImageInfo() to the Section Alignment in the PE/COFF header.
114 /// If the image is a TE image, then this field is set to 0.
115 ///
116 UINT32 SectionAlignment;
117 ///
118 /// Set by PeCoffLoaderGetImageInfo() to offset to the PE/COFF header.
119 /// If the PE/COFF image does not start with a DOS header, this value is zero.
120 /// Otherwise, it's the offset to the PE/COFF header.
121 ///
122 UINT32 PeCoffHeaderOffset;
123 ///
124 /// Set by PeCoffLoaderGetImageInfo() to the Relative Virtual Address of the debug directory,
125 /// if it exists in the image
126 ///
127 UINT32 DebugDirectoryEntryRva;
128 ///
129 /// Set by PeCoffLoaderLoadImage() to CodeView area of the PE/COFF Debug directory.
130 ///
131 VOID *CodeView;
132 ///
133 /// Set by PeCoffLoaderLoadImage() to point to the PDB entry contained in the CodeView area.
134 /// The PdbPointer points to the filename of the PDB file used for source-level debug of
135 /// the image by a debugger.
136 ///
137 CHAR8 *PdbPointer;
138 ///
139 /// Is set by PeCoffLoaderGetImageInfo() to the Section Alignment in the PE/COFF header.
140 ///
141 UINTN SizeOfHeaders;
142 ///
143 /// Not used by this library class. Other library classes that layer on top of this library
144 /// class fill in this value as part of their GetImageInfo call.
145 /// This allows the caller of the library to know what type of memory needs to be allocated
146 /// to load and relocate the image.
147 ///
148 UINT32 ImageCodeMemoryType;
149 ///
150 /// Not used by this library class. Other library classes that layer on top of this library
151 /// class fill in this value as part of their GetImageInfo call.
152 /// This allows the caller of the library to know what type of memory needs to be allocated
153 /// to load and relocate the image.
154 ///
155 UINT32 ImageDataMemoryType;
156 ///
157 /// Set by any of the library functions if they encounter an error.
158 ///
159 UINT32 ImageError;
160 ///
161 /// Set by PeCoffLoaderLoadImage() to indicate the size of FixupData that the caller must
162 /// allocate before calling PeCoffLoaderRelocateImage().
163 ///
164 UINTN FixupDataSize;
165 ///
166 /// Set by PeCoffLoaderGetImageInfo() to the machine type stored in the PE/COFF header.
167 ///
168 UINT16 Machine;
169 ///
170 /// Set by PeCoffLoaderGetImageInfo() to the subsystem type stored in the PE/COFF header.
171 ///
172 UINT16 ImageType;
173 ///
174 /// Set by PeCoffLoaderGetImageInfo() to TRUE if the PE/COFF image does not contain
175 /// relocation information.
176 ///
177 BOOLEAN RelocationsStripped;
178 ///
179 /// Set by PeCoffLoaderGetImageInfo() to TRUE if the image is a TE image.
180 /// For a definition of the TE Image format, see the Platform Initialization Pre-EFI
181 /// Initialization Core Interface Specification.
182 ///
183 BOOLEAN IsTeImage;
184 ///
185 /// Set by PeCoffLoaderLoadImage() to the HII resource offset
186 /// if the image contains a custom PE/COFF resource with the type 'HII'.
187 /// Otherwise, the entry remains to be 0.
188 ///
189 PHYSICAL_ADDRESS HiiResourceData;
190#ifdef VBOX /* Mach-O FAT support. */
191 ///
192 /// Indicates that this is a FAT image.
193 ///
194 BOOLEAN IsFat;
195 ///
196 /// The EFI image offset within the FAT file.
197 ///
198 UINT32 FatOffset;
199#endif
200 ///
201 /// Private storage for implementation specific data.
202 ///
203 UINT64 Context;
204} PE_COFF_LOADER_IMAGE_CONTEXT;
205
206/**
207 Retrieves information about a PE/COFF image.
208
209 Computes the PeCoffHeaderOffset, IsTeImage, ImageType, ImageAddress, ImageSize,
210 DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders, and
211 DebugDirectoryEntryRva fields of the ImageContext structure.
212 If ImageContext is NULL, then return RETURN_INVALID_PARAMETER.
213 If the PE/COFF image accessed through the ImageRead service in the ImageContext
214 structure is not a supported PE/COFF image type, then return RETURN_UNSUPPORTED.
215 If any errors occur while computing the fields of ImageContext,
216 then the error status is returned in the ImageError field of ImageContext.
217 If the image is a TE image, then SectionAlignment is set to 0.
218 The ImageRead and Handle fields of ImageContext structure must be valid prior
219 to invoking this service.
220
221 @param ImageContext The pointer to the image context structure that
222 describes the PE/COFF image that needs to be
223 examined by this function.
224
225 @retval RETURN_SUCCESS The information on the PE/COFF image was collected.
226 @retval RETURN_INVALID_PARAMETER ImageContext is NULL.
227 @retval RETURN_UNSUPPORTED The PE/COFF image is not supported.
228
229**/
230RETURN_STATUS
231EFIAPI
232PeCoffLoaderGetImageInfo (
233 IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
234 );
235
236/**
237 Applies relocation fixups to a PE/COFF image that was loaded with PeCoffLoaderLoadImage().
238
239 If the DestinationAddress field of ImageContext is 0, then use the ImageAddress field of
240 ImageContext as the relocation base address. Otherwise, use the DestinationAddress field
241 of ImageContext as the relocation base address. The caller must allocate the relocation
242 fixup log buffer and fill in the FixupData field of ImageContext prior to calling this function.
243
244 The ImageRead, Handle, PeCoffHeaderOffset, IsTeImage, Machine, ImageType, ImageAddress,
245 ImageSize, DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders,
246 DebugDirectoryEntryRva, EntryPoint, FixupDataSize, CodeView, PdbPointer, and FixupData of
247 the ImageContext structure must be valid prior to invoking this service.
248
249 If ImageContext is NULL, then ASSERT().
250
251 Note that if the platform does not maintain coherency between the instruction cache(s) and the data
252 cache(s) in hardware, then the caller is responsible for performing cache maintenance operations
253 prior to transferring control to a PE/COFF image that is loaded using this library.
254
255 @param ImageContext The pointer to the image context structure that describes the PE/COFF
256 image that is being relocated.
257
258 @retval RETURN_SUCCESS The PE/COFF image was relocated.
259 Extended status information is in the ImageError field of ImageContext.
260 @retval RETURN_LOAD_ERROR The image in not a valid PE/COFF image.
261 Extended status information is in the ImageError field of ImageContext.
262 @retval RETURN_UNSUPPORTED A relocation record type is not supported.
263 Extended status information is in the ImageError field of ImageContext.
264
265**/
266RETURN_STATUS
267EFIAPI
268PeCoffLoaderRelocateImage (
269 IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
270 );
271
272/**
273 Loads a PE/COFF image into memory.
274
275 Loads the PE/COFF image accessed through the ImageRead service of ImageContext into the buffer
276 specified by the ImageAddress and ImageSize fields of ImageContext. The caller must allocate
277 the load buffer and fill in the ImageAddress and ImageSize fields prior to calling this function.
278 The EntryPoint, FixupDataSize, CodeView, PdbPointer and HiiResourceData fields of ImageContext are computed.
279 The ImageRead, Handle, PeCoffHeaderOffset, IsTeImage, Machine, ImageType, ImageAddress, ImageSize,
280 DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders, and DebugDirectoryEntryRva
281 fields of the ImageContext structure must be valid prior to invoking this service.
282
283 If ImageContext is NULL, then ASSERT().
284
285 Note that if the platform does not maintain coherency between the instruction cache(s) and the data
286 cache(s) in hardware, then the caller is responsible for performing cache maintenance operations
287 prior to transferring control to a PE/COFF image that is loaded using this library.
288
289 @param ImageContext The pointer to the image context structure that describes the PE/COFF
290 image that is being loaded.
291
292 @retval RETURN_SUCCESS The PE/COFF image was loaded into the buffer specified by
293 the ImageAddress and ImageSize fields of ImageContext.
294 Extended status information is in the ImageError field of ImageContext.
295 @retval RETURN_BUFFER_TOO_SMALL The caller did not provide a large enough buffer.
296 Extended status information is in the ImageError field of ImageContext.
297 @retval RETURN_LOAD_ERROR The PE/COFF image is an EFI Runtime image with no relocations.
298 Extended status information is in the ImageError field of ImageContext.
299 @retval RETURN_INVALID_PARAMETER The image address is invalid.
300 Extended status information is in the ImageError field of ImageContext.
301
302**/
303RETURN_STATUS
304EFIAPI
305PeCoffLoaderLoadImage (
306 IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
307 );
308
309
310/**
311 Reads contents of a PE/COFF image from a buffer in system memory.
312
313 This is the default implementation of a PE_COFF_LOADER_READ_FILE function
314 that assumes FileHandle pointer to the beginning of a PE/COFF image.
315 This function reads contents of the PE/COFF image that starts at the system memory
316 address specified by FileHandle. The read operation copies ReadSize bytes from the
317 PE/COFF image starting at byte offset FileOffset into the buffer specified by Buffer.
318 The size of the buffer actually read is returned in ReadSize.
319
320 If FileHandle is NULL, then ASSERT().
321 If ReadSize is NULL, then ASSERT().
322 If Buffer is NULL, then ASSERT().
323
324 @param FileHandle The pointer to base of the input stream
325 @param FileOffset Offset into the PE/COFF image to begin the read operation.
326 @param ReadSize On input, the size in bytes of the requested read operation.
327 On output, the number of bytes actually read.
328 @param Buffer Output buffer that contains the data read from the PE/COFF image.
329
330 @retval RETURN_SUCCESS The data is read from FileOffset from the Handle into
331 the buffer.
332**/
333RETURN_STATUS
334EFIAPI
335PeCoffLoaderImageReadFromMemory (
336 IN VOID *FileHandle,
337 IN UINTN FileOffset,
338 IN OUT UINTN *ReadSize,
339 OUT VOID *Buffer
340 );
341
342
343/**
344 Reapply fixups on a fixed up PE32/PE32+ image to allow virtual calling at EFI
345 runtime.
346
347 This function reapplies relocation fixups to the PE/COFF image specified by ImageBase
348 and ImageSize so the image will execute correctly when the PE/COFF image is mapped
349 to the address specified by VirtualImageBase. RelocationData must be identical
350 to the FiuxupData buffer from the PE_COFF_LOADER_IMAGE_CONTEXT structure
351 after this PE/COFF image was relocated with PeCoffLoaderRelocateImage().
352
353 Note that if the platform does not maintain coherency between the instruction cache(s) and the data
354 cache(s) in hardware, then the caller is responsible for performing cache maintenance operations
355 prior to transferring control to a PE/COFF image that is loaded using this library.
356
357 @param ImageBase The base address of a PE/COFF image that has been loaded
358 and relocated into system memory.
359 @param VirtImageBase The request virtual address that the PE/COFF image is to
360 be fixed up for.
361 @param ImageSize The size, in bytes, of the PE/COFF image.
362 @param RelocationData A pointer to the relocation data that was collected when the PE/COFF
363 image was relocated using PeCoffLoaderRelocateImage().
364
365**/
366VOID
367EFIAPI
368PeCoffLoaderRelocateImageForRuntime (
369 IN PHYSICAL_ADDRESS ImageBase,
370 IN PHYSICAL_ADDRESS VirtImageBase,
371 IN UINTN ImageSize,
372 IN VOID *RelocationData
373 );
374
375/**
376 Unloads a loaded PE/COFF image from memory and releases its taken resource.
377 Releases any environment specific resources that were allocated when the image
378 specified by ImageContext was loaded using PeCoffLoaderLoadImage().
379
380 For NT32 emulator, the PE/COFF image loaded by system needs to release.
381 For real platform, the PE/COFF image loaded by Core doesn't needs to be unloaded,
382 this function can simply return RETURN_SUCCESS.
383
384 If ImageContext is NULL, then ASSERT().
385
386 @param ImageContext Pointer to the image context structure that describes the PE/COFF
387 image to be unloaded.
388
389 @retval RETURN_SUCCESS The PE/COFF image was unloaded successfully.
390**/
391RETURN_STATUS
392EFIAPI
393PeCoffLoaderUnloadImage (
394 IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
395 );
396#endif
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette