annotate src/codeview/coff.d @ 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
1 /* Ddbg - Win32 Debugger for the D programming language
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
2 * Copyright (c) 2007 Jascha Wetzel
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
3 * All rights reserved. See LICENSE.TXT for details.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
4 */
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
5
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
6 module codeview.coff;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
7
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
8 import std.file;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
9 import std.stdio;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
10 import std.c.string;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
11
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
12 import util;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
13 import codeview.parser;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
14 import codeview.codeview;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
15
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
16 import win32.winnt;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
17
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
18 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
19 Type indeces for COFF debug sections.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
20 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
21 enum DebugType
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
22 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
23 UNKNOWN = 0,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
24 COFF,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
25 CODEVIEW
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
26 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
27
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
28 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
29 Represents a COFF section.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
30 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
31 class Section
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
32 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
33 PIMAGE_SECTION_HEADER header;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
34 ubyte[] data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
35
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
36 this(PIMAGE_SECTION_HEADER csh, DataReader dr)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
37 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
38 uint old_cursor = dr.cursor;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
39 header = csh;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
40 assert(dr.data.length>=csh.PointerToRawData+csh.SizeOfRawData);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
41 data = dr.data[csh.PointerToRawData .. csh.PointerToRawData+csh.SizeOfRawData];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
42 dr.seek(old_cursor);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
43 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
44 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
45
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
46 /**************************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
47 Represents a COFF executable image file.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
48 **************************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
49 class COFFImage
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
50 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
51 private PIMAGE_FILE_HEADER header;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
52 private PIMAGE_OPTIONAL_HEADER opt_header;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
53 private IMAGE_DEBUG_DIRECTORY[] debug_dirs;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
54 Section[] sections;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
55 CodeView[] codeview_data;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
56
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
57 size_t codebase,
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
58 code_section_index;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
59
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
60 string name;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
61
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
62 size_t imageSize()
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
63 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
64 assert(opt_header !is null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
65 return opt_header.SizeOfImage;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
66 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
67
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
68 size_t imageBase()
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
69 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
70 assert(opt_header !is null);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
71 return opt_header.ImageBase;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
72 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
73
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
74 CodeView codeView()
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
75 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
76 if ( codeview_data.length == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
77 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
78 return codeview_data[0];
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
79 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
80
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
81 void load(string filename)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
82 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
83 load(cast(ubyte[])read(filename), filename);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
84 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
85
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
86 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
87 Very dirty, preliminary COFF image reader to extract codeview data
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
88 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
89 void load(ubyte[] data, string filename=null)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
90 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
91 DataReader dr = new DataReader(data);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
92
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
93 dr.seek(0x3c);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
94 uint pe_offset;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
95 dr.read(pe_offset);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
96
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
97 uint pe_sig;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
98 dr.seek(pe_offset);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
99 dr.read(pe_sig);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
100 if ( pe_sig != 0x4550 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
101 throw new Exception("File is not an COFF PE executable");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
102
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
103 ubyte[] buf;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
104 assert ( IMAGE_FILE_HEADER.sizeof == 5*4);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
105 dr.readA(buf, IMAGE_FILE_HEADER.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
106 header = cast(PIMAGE_FILE_HEADER)buf.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
107 if ( header.Machine != 0x14c )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
108 throw new Exception("Unsupported machine Id in COFF file");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
109 uint headersize = header.SizeOfOptionalHeader;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
110
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
111 assert(headersize>=IMAGE_OPTIONAL_HEADER.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
112 headersize -= IMAGE_OPTIONAL_HEADER.sizeof;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
113 dr.readA(buf, IMAGE_OPTIONAL_HEADER.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
114 opt_header = cast(PIMAGE_OPTIONAL_HEADER)buf.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
115 if ( opt_header.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
116 throw new Exception("Unknown optional header magic");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
117
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
118 assert ( IMAGE_SIZEOF_SHORT_NAME+8*4 == IMAGE_SECTION_HEADER.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
119 for ( int i = 0; i < header.NumberOfSections; ++i )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
120 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
121 dr.readA(buf, IMAGE_SECTION_HEADER.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
122 sections ~= new Section(cast(PIMAGE_SECTION_HEADER)buf.ptr, dr);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
123 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
124
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
125 dr.seek(fileOffsetFromRVA(opt_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
126 assert ( IMAGE_DEBUG_DIRECTORY.sizeof == 7*4);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
127 dr.readA(debug_dirs, opt_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size/IMAGE_DEBUG_DIRECTORY.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
128
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
129 foreach ( IMAGE_DEBUG_DIRECTORY dd; debug_dirs )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
130 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
131 if ( dd.Type == DebugType.CODEVIEW )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
132 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
133 auto cv = CodeViewParser.parse(this, dr.data[dd.PointerToRawData..dd.PointerToRawData+dd.SizeOfData]);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
134 if ( cv !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
135 codeview_data ~= cv;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
136 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
137 else {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
138 debug DbgIO.println("Unsupported COFF Debug Information format 0x%x", dd.Type);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
139 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
140 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
141
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
142 if ( opt_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
143 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
144 dr.seek(fileOffsetFromRVA(opt_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
145 assert ( IMAGE_EXPORT_DIRECTORY.sizeof == 10*4 );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
146 dr.readA(buf, IMAGE_EXPORT_DIRECTORY.sizeof);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
147 PIMAGE_EXPORT_DIRECTORY export_dir = cast(PIMAGE_EXPORT_DIRECTORY)buf.ptr;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
148 dr.seek(fileOffsetFromRVA(export_dir.Name));
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
149
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
150 char c;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
151 for ( dr.read(c); c != '\0'; dr.read(c) )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
152 name ~= c;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
153 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
154 if ( name is null && filename !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
155 name = filename;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
156 if ( codeview_data.length > 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
157 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
158 if ( name !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
159 DbgIO.println("Loading symbols from %s", name is null?filename:name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
160 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
161 DbgIO.println("Loading symbols");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
162 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
163 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
164 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
165 if ( name !is null )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
166 DbgIO.println("No symbols available from %s", name is null?filename:name);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
167 else
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
168 DbgIO.println("No symbols available");
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
169 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
170 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
171
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
172 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
173 Calculates the file offset from a given virtual address.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
174 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
175 private uint fileOffsetFromRVA(uint rva)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
176 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
177 foreach ( Section s; sections )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
178 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
179 with ( *s.header )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
180 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
181 if( rva >= VirtualAddress && rva <= VirtualAddress+Misc.VirtualSize )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
182 return rva-VirtualAddress+PointerToRawData;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
183 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
184 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
185 return 0;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
186 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
187
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
188 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
189 Calculates the virtual base address where code from this image is loaded to.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
190 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
191 size_t getCodeBase()
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
192 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
193 if ( codebase == 0 )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
194 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
195 assert ( opt_header !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
196 Section s = findSection(0x20000000, code_section_index);
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
197 assert ( s !is null );
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
198 codebase = opt_header.ImageBase + s.header.VirtualAddress;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
199 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
200 return codebase;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
201 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
202
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
203 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
204 Calculates the base address for the given section.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
205 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
206 uint getSectionBase(uint section)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
207 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
208 if ( section > sections.length )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
209 return opt_header.ImageBase;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
210 return opt_header.ImageBase + sections[section-1].header.VirtualAddress;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
211 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
212
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
213 /**********************************************************************************************
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
214 Finds a section with the given characteristics.
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
215 **********************************************************************************************/
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
216 private Section findSection(uint characteristics, out uint index)
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
217 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
218 foreach( int i, s; sections )
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
219 {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
220 if( (s.header.Characteristics & characteristics) == characteristics ) {
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
221 index = i;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
222 return s;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
223 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
224 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
225 return null;
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
226 }
4a9dcbd9e54f -files of 0.13 beta
marton@basel.hu
parents:
diff changeset
227 }