UINT32 FileOffset; ///< The file pointer to the debug data.\r
} EFI_IMAGE_DEBUG_DIRECTORY_ENTRY;\r
\r
-#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2 ///< The Visual C++ debug information.\r
+#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2 ///< The Visual C++ debug information.\r
+#define EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20\r
\r
///\r
/// Debug Data Structure defined in Microsoft C++.\r
//\r
} EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY;\r
\r
+///\r
+/// Extended DLL Characteristics\r
+///\r
+#define EFI_IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001\r
+#define EFI_IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040\r
+\r
+typedef struct {\r
+ UINT32 DllCharacteristicsEx;\r
+} EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY;\r
+\r
///\r
/// Resource format.\r
///\r
//\r
// Use PE32 offset\r
//\r
- ImageContext->ImageType = Hdr.Pe32->OptionalHeader.Subsystem;\r
- ImageContext->ImageSize = (UINT64)Hdr.Pe32->OptionalHeader.SizeOfImage;\r
- ImageContext->SectionAlignment = Hdr.Pe32->OptionalHeader.SectionAlignment;\r
- ImageContext->SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;\r
+ ImageContext->ImageType = Hdr.Pe32->OptionalHeader.Subsystem;\r
+ ImageContext->ImageSize = (UINT64)Hdr.Pe32->OptionalHeader.SizeOfImage;\r
+ ImageContext->SectionAlignment = Hdr.Pe32->OptionalHeader.SectionAlignment;\r
+ ImageContext->SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;\r
+ ImageContext->DllCharacteristics = Hdr.Pe32->OptionalHeader.DllCharacteristics;\r
} else if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
//\r
// 1. Check FileHeader.NumberOfRvaAndSizes filed.\r
//\r
// Use PE32+ offset\r
//\r
- ImageContext->ImageType = Hdr.Pe32Plus->OptionalHeader.Subsystem;\r
- ImageContext->ImageSize = (UINT64)Hdr.Pe32Plus->OptionalHeader.SizeOfImage;\r
- ImageContext->SectionAlignment = Hdr.Pe32Plus->OptionalHeader.SectionAlignment;\r
- ImageContext->SizeOfHeaders = Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders;\r
+ ImageContext->ImageType = Hdr.Pe32Plus->OptionalHeader.Subsystem;\r
+ ImageContext->ImageSize = (UINT64)Hdr.Pe32Plus->OptionalHeader.SizeOfImage;\r
+ ImageContext->SectionAlignment = Hdr.Pe32Plus->OptionalHeader.SectionAlignment;\r
+ ImageContext->SizeOfHeaders = Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders;\r
+ ImageContext->DllCharacteristics = Hdr.Pe32Plus->OptionalHeader.DllCharacteristics;\r
} else {\r
ImageContext->ImageError = IMAGE_ERROR_INVALID_MACHINE_TYPE;\r
return RETURN_UNSUPPORTED;\r
Retrieves information about a PE/COFF image.\r
\r
Computes the PeCoffHeaderOffset, IsTeImage, ImageType, ImageAddress, ImageSize,\r
- DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders, and\r
- DebugDirectoryEntryRva fields of the ImageContext structure.\r
+ DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders,\r
+ DllCharacteristics, DllCharacteristicsEx and DebugDirectoryEntryRva fields of\r
+ the ImageContext structure.\r
If ImageContext is NULL, then return RETURN_INVALID_PARAMETER.\r
If the PE/COFF image accessed through the ImageRead service in the ImageContext\r
structure is not a supported PE/COFF image type, then return RETURN_UNSUPPORTED.\r
ImageContext->ImageSize += DebugEntry.SizeOfData;\r
}\r
\r
- return RETURN_SUCCESS;\r
+ continue;\r
+ }\r
+\r
+ if (DebugEntry.Type == EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS) {\r
+ Size = sizeof (EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY);\r
+ ReadSize = sizeof (EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY);\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ DebugEntry.FileOffset,\r
+ &Size,\r
+ &ImageContext->DllCharacteristicsEx\r
+ );\r
+ if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
+ ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
+ if (Size != ReadSize) {\r
+ Status = RETURN_UNSUPPORTED;\r
+ }\r
+\r
+ return Status;\r
+ }\r
+\r
+ continue;\r
}\r
}\r
}\r