1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
7 /*============================================================
11 ** IMAGEHLP routines so we can avoid early binding to that DLL.
13 ===========================================================*/
21 #define RTL_MEG (1024UL * 1024UL)
22 #define RTLP_IMAGE_MAX_DOS_HEADER ( 256UL * RTL_MEG)
24 // IMAGE_FIRST_SECTION doesn't need 32/64 versions since the file header is
25 // the same either way.
27 #define PTR_IMAGE_FIRST_SECTION( ntheader ) \
28 PTR_IMAGE_SECTION_HEADER \
29 (dac_cast<TADDR>(ntheader) + \
30 FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
31 VAL16((ntheader)->FileHeader.SizeOfOptionalHeader) \
34 #ifndef DACCESS_COMPILE
36 IMAGE_NT_HEADERS *Cor_RtlImageNtHeader(VOID *pvBase, ULONG FileLength)
38 LIMITED_METHOD_CONTRACT;
39 IMAGE_NT_HEADERS *pNtHeaders = NULL;
40 if (pvBase && (pvBase != (VOID*)-1)) {
43 IMAGE_DOS_HEADER *pDos;
45 IMAGE_NT_HEADERS *pNtHeaders;
47 param.pDos = (IMAGE_DOS_HEADER*)pvBase;
48 param.FileLength = FileLength;
49 param.pNtHeaders = pNtHeaders;
51 PAL_TRY(Param *, pParam, ¶m) {
52 if ( (pParam->pDos->e_magic == VAL16(IMAGE_DOS_SIGNATURE))
53 && ((DWORD)VAL32(pParam->pDos->e_lfanew) < RTLP_IMAGE_MAX_DOS_HEADER)
54 && ovadd_lt((DWORD)VAL32(pParam->pDos->e_lfanew), sizeof(IMAGE_FILE_HEADER) + sizeof(DWORD), pParam->FileLength)) {
55 pParam->pNtHeaders = (IMAGE_NT_HEADERS*)((BYTE*)pParam->pDos + VAL32(pParam->pDos->e_lfanew));
56 if (pParam->pNtHeaders->Signature != VAL32(IMAGE_NT_SIGNATURE))
57 pParam->pNtHeaders = NULL;
60 PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
61 param.pNtHeaders = NULL;
65 pNtHeaders = param.pNtHeaders;
70 #endif // #ifndef DACCESS_COMPILE
72 EXTERN_C PIMAGE_SECTION_HEADER
73 Cor_RtlImageRvaToSection32(PTR_IMAGE_NT_HEADERS32 NtHeaders,
77 LIMITED_METHOD_CONTRACT;
79 PTR_IMAGE_SECTION_HEADER NtSection;
81 NtSection = PTR_IMAGE_FIRST_SECTION( NtHeaders );
82 for (i=0; i<NtHeaders->FileHeader.NumberOfSections; i++) {
84 (((VAL32(NtSection->PointerToRawData) > FileLength)) ||
85 (VAL32(NtSection->SizeOfRawData) > FileLength - VAL32(NtSection->PointerToRawData))))
87 if (Rva >= VAL32(NtSection->VirtualAddress) &&
88 Rva < VAL32(NtSection->VirtualAddress) + VAL32(NtSection->SizeOfRawData))
97 EXTERN_C PIMAGE_SECTION_HEADER
98 Cor_RtlImageRvaToSection64(PTR_IMAGE_NT_HEADERS64 NtHeaders,
102 LIMITED_METHOD_CONTRACT;
104 PTR_IMAGE_SECTION_HEADER NtSection;
106 NtSection = PTR_IMAGE_FIRST_SECTION( NtHeaders );
107 for (i=0; i<VAL16(NtHeaders->FileHeader.NumberOfSections); i++) {
109 (((VAL32(NtSection->PointerToRawData) > FileLength)) ||
110 (VAL32(NtSection->SizeOfRawData) > FileLength - VAL32(NtSection->PointerToRawData))))
112 if (Rva >= VAL32(NtSection->VirtualAddress) &&
113 Rva < VAL32(NtSection->VirtualAddress) + VAL32(NtSection->SizeOfRawData))
122 EXTERN_C PIMAGE_SECTION_HEADER
123 Cor_RtlImageRvaToSection(PTR_IMAGE_NT_HEADERS NtHeaders,
127 LIMITED_METHOD_CONTRACT;
128 if (NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR32_MAGIC))
129 return Cor_RtlImageRvaToSection32((PTR_IMAGE_NT_HEADERS32)NtHeaders,
131 else if(NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR64_MAGIC))
132 return Cor_RtlImageRvaToSection64((PTR_IMAGE_NT_HEADERS64)NtHeaders,
135 _ASSERTE(!"Invalid File Type");
140 EXTERN_C PBYTE Cor_RtlImageRvaToVa32(PTR_IMAGE_NT_HEADERS32 NtHeaders,
145 LIMITED_METHOD_CONTRACT;
146 PIMAGE_SECTION_HEADER NtSection =
147 Cor_RtlImageRvaToSection32(NtHeaders,
151 if (NtSection != NULL)
153 (Rva - VAL32(NtSection->VirtualAddress)) +
154 VAL32(NtSection->PointerToRawData));
159 EXTERN_C PBYTE Cor_RtlImageRvaToVa64(PTR_IMAGE_NT_HEADERS64 NtHeaders,
164 LIMITED_METHOD_CONTRACT;
165 PIMAGE_SECTION_HEADER NtSection =
166 Cor_RtlImageRvaToSection64(NtHeaders,
170 if (NtSection != NULL)
172 (Rva - VAL32(NtSection->VirtualAddress)) +
173 VAL32(NtSection->PointerToRawData));
178 EXTERN_C PBYTE Cor_RtlImageRvaToVa(PTR_IMAGE_NT_HEADERS NtHeaders,
183 LIMITED_METHOD_CONTRACT;
184 if (NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR32_MAGIC))
185 return Cor_RtlImageRvaToVa32((PTR_IMAGE_NT_HEADERS32)NtHeaders,
186 Base, Rva, FileLength);
187 else if(NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR64_MAGIC))
188 return Cor_RtlImageRvaToVa64((PTR_IMAGE_NT_HEADERS64)NtHeaders,
189 Base, Rva, FileLength);
191 _ASSERTE(!"Invalid File Type");
196 EXTERN_C PBYTE Cor_RtlImageDirToVa(PTR_IMAGE_NT_HEADERS NtHeaders,
201 LIMITED_METHOD_CONTRACT;
202 if (NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR32_MAGIC))
203 return Cor_RtlImageRvaToVa32((PTR_IMAGE_NT_HEADERS32)NtHeaders, Base,
204 VAL32(((PTR_IMAGE_NT_HEADERS32)NtHeaders)->OptionalHeader.DataDirectory[DirIndex].VirtualAddress),
206 else if(NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR64_MAGIC))
207 return Cor_RtlImageRvaToVa64((PTR_IMAGE_NT_HEADERS64)NtHeaders, Base,
208 VAL32(((PTR_IMAGE_NT_HEADERS64)NtHeaders)->OptionalHeader.DataDirectory[DirIndex].VirtualAddress),
211 _ASSERTE(!"Invalid File Type");
216 EXTERN_C PIMAGE_SECTION_HEADER
217 Cor_RtlImageRvaRangeToSection(PTR_IMAGE_NT_HEADERS NtHeaders,
222 LIMITED_METHOD_CONTRACT;
224 PTR_IMAGE_SECTION_HEADER NtSection;
227 return Cor_RtlImageRvaToSection(NtHeaders, Rva, FileLength);
229 NtSection = PTR_IMAGE_FIRST_SECTION( NtHeaders );
230 for (i=0; i<VAL16(NtHeaders->FileHeader.NumberOfSections); i++) {
232 ((VAL32(NtSection->PointerToRawData) > FileLength) ||
233 (VAL32(NtSection->SizeOfRawData) > FileLength - VAL32(NtSection->PointerToRawData))))
235 if (Rva >= VAL32(NtSection->VirtualAddress) &&
236 Rva + Range <= VAL32(NtSection->VirtualAddress) + VAL32(NtSection->SizeOfRawData))
245 EXTERN_C DWORD Cor_RtlImageRvaToOffset(PTR_IMAGE_NT_HEADERS NtHeaders,
249 LIMITED_METHOD_CONTRACT;
250 PIMAGE_SECTION_HEADER NtSection =
251 Cor_RtlImageRvaToSection(NtHeaders,
256 return ((Rva - VAL32(NtSection->VirtualAddress)) +
257 VAL32(NtSection->PointerToRawData));