Forward EnumDependentServicesA/W to services.exe.
[reactos.git] / reactos / tools / rsym.h
1 /* rsym.h */
2
3 #ifndef RSYM_H
4 #define RSYM_H
5
6 #define IMAGE_DOS_MAGIC 0x5a4d
7 #define IMAGE_PE_MAGIC 0x00004550
8
9 #define IMAGE_SIZEOF_SHORT_NAME 8
10
11 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
12
13 typedef unsigned char BYTE;
14 typedef unsigned char UCHAR;
15 typedef unsigned short WORD;
16 typedef unsigned short USHORT;
17 #if defined(__x86_64__) && defined(linux)
18 typedef signed int LONG;
19 typedef unsigned int ULONG;
20 typedef unsigned int DWORD;
21 #else
22 typedef signed long LONG;
23 typedef unsigned long ULONG;
24 typedef unsigned long DWORD;
25 #endif
26 #if defined(_WIN64)
27 typedef unsigned __int64 ULONG_PTR;
28 #else
29 #if defined(__x86_64__) && defined(linux)
30 typedef unsigned int ULONG_PTR;
31 #else
32 typedef unsigned long ULONG_PTR;
33 #endif
34 #endif
35
36 #pragma pack(2)
37 typedef struct _IMAGE_DOS_HEADER {
38 WORD e_magic;
39 WORD e_cblp;
40 WORD e_cp;
41 WORD e_crlc;
42 WORD e_cparhdr;
43 WORD e_minalloc;
44 WORD e_maxalloc;
45 WORD e_ss;
46 WORD e_sp;
47 WORD e_csum;
48 WORD e_ip;
49 WORD e_cs;
50 WORD e_lfarlc;
51 WORD e_ovno;
52 WORD e_res[4];
53 WORD e_oemid;
54 WORD e_oeminfo;
55 WORD e_res2[10];
56 LONG e_lfanew;
57 } IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
58 #pragma pack(4)
59
60 #define IMAGE_FILE_LINE_NUMS_STRIPPED 4
61 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 8
62 #define IMAGE_FILE_DEBUG_STRIPPED 512
63
64 #pragma pack(4)
65 typedef struct _IMAGE_FILE_HEADER {
66 WORD Machine;
67 WORD NumberOfSections;
68 DWORD TimeDateStamp;
69 DWORD PointerToSymbolTable;
70 DWORD NumberOfSymbols;
71 WORD SizeOfOptionalHeader;
72 WORD Characteristics;
73 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
74
75 typedef struct _IMAGE_DATA_DIRECTORY {
76 DWORD VirtualAddress;
77 DWORD Size;
78 } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
79
80 #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
81
82 typedef struct _IMAGE_OPTIONAL_HEADER {
83 WORD Magic;
84 BYTE MajorLinkerVersion;
85 BYTE MinorLinkerVersion;
86 DWORD SizeOfCode;
87 DWORD SizeOfInitializedData;
88 DWORD SizeOfUninitializedData;
89 DWORD AddressOfEntryPoint;
90 DWORD BaseOfCode;
91 DWORD BaseOfData;
92 DWORD ImageBase;
93 DWORD SectionAlignment;
94 DWORD FileAlignment;
95 WORD MajorOperatingSystemVersion;
96 WORD MinorOperatingSystemVersion;
97 WORD MajorImageVersion;
98 WORD MinorImageVersion;
99 WORD MajorSubsystemVersion;
100 WORD MinorSubsystemVersion;
101 DWORD Reserved1;
102 DWORD SizeOfImage;
103 DWORD SizeOfHeaders;
104 DWORD CheckSum;
105 WORD Subsystem;
106 WORD DllCharacteristics;
107 DWORD SizeOfStackReserve;
108 DWORD SizeOfStackCommit;
109 DWORD SizeOfHeapReserve;
110 DWORD SizeOfHeapCommit;
111 DWORD LoaderFlags;
112 DWORD NumberOfRvaAndSizes;
113 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
114 } IMAGE_OPTIONAL_HEADER,*PIMAGE_OPTIONAL_HEADER;
115
116 #define IMAGE_SCN_TYPE_NOLOAD 0x00000002
117 #define IMAGE_SCN_LNK_REMOVE 0x00000800
118 #define IMAGE_SCN_MEM_READ 0x40000000
119 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
120
121 typedef struct _IMAGE_SECTION_HEADER {
122 BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
123 union {
124 DWORD PhysicalAddress;
125 DWORD VirtualSize;
126 } Misc;
127 DWORD VirtualAddress;
128 DWORD SizeOfRawData;
129 DWORD PointerToRawData;
130 DWORD PointerToRelocations;
131 DWORD PointerToLinenumbers;
132 WORD NumberOfRelocations;
133 WORD NumberOfLinenumbers;
134 DWORD Characteristics;
135 } IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
136
137 typedef struct _IMAGE_BASE_RELOCATION {
138 DWORD VirtualAddress;
139 DWORD SizeOfBlock;
140 } IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
141
142
143 typedef struct {
144 USHORT f_magic; /* magic number */
145 USHORT f_nscns; /* number of sections */
146 ULONG f_timdat; /* time & date stamp */
147 ULONG f_symptr; /* file pointer to symtab */
148 ULONG f_nsyms; /* number of symtab entries */
149 USHORT f_opthdr; /* sizeof(optional hdr) */
150 USHORT f_flags; /* flags */
151 } FILHDR;
152
153 typedef struct {
154 char s_name[8]; /* section name */
155 ULONG s_paddr; /* physical address, aliased s_nlib */
156 ULONG s_vaddr; /* virtual address */
157 ULONG s_size; /* section size */
158 ULONG s_scnptr; /* file ptr to raw data for section */
159 ULONG s_relptr; /* file ptr to relocation */
160 ULONG s_lnnoptr; /* file ptr to line numbers */
161 USHORT s_nreloc; /* number of relocation entries */
162 USHORT s_nlnno; /* number of line number entries */
163 ULONG s_flags; /* flags */
164 } SCNHDR;
165 #pragma pack(4)
166
167 typedef struct _SYMBOLFILE_HEADER {
168 ULONG SymbolsOffset;
169 ULONG SymbolsLength;
170 ULONG StringsOffset;
171 ULONG StringsLength;
172 } SYMBOLFILE_HEADER, *PSYMBOLFILE_HEADER;
173
174 typedef struct _STAB_ENTRY {
175 ULONG n_strx; /* index into string table of name */
176 UCHAR n_type; /* type of symbol */
177 UCHAR n_other; /* misc info (usually empty) */
178 USHORT n_desc; /* description field */
179 ULONG n_value; /* value of symbol */
180 } STAB_ENTRY, *PSTAB_ENTRY;
181
182 /* http://www.math.utah.edu/docs/info/stabs_12.html */
183 #define N_GYSM 0x20
184 #define N_FNAME 0x22
185 #define N_FUN 0x24
186 #define N_STSYM 0x26
187 #define N_LCSYM 0x28
188 #define N_MAIN 0x2A
189 #define N_PC 0x30
190 #define N_NSYMS 0x32
191 #define N_NOMAP 0x34
192 #define N_RSYM 0x40
193 #define N_M2C 0x42
194 #define N_SLINE 0x44
195 #define N_DSLINE 0x46
196 #define N_BSLINE 0x48
197 #define N_BROWS 0x48
198 #define N_DEFD 0x4A
199 #define N_EHDECL 0x50
200 #define N_MOD2 0x50
201 #define N_CATCH 0x54
202 #define N_SSYM 0x60
203 #define N_SO 0x64
204 #define N_LSYM 0x80
205 #define N_BINCL 0x82
206 #define N_SOL 0x84
207 #define N_PSYM 0xA0
208 #define N_EINCL 0xA2
209 #define N_ENTRY 0xA4
210 #define N_LBRAC 0xC0
211 #define N_EXCL 0xC2
212 #define N_SCOPE 0xC4
213 #define N_RBRAC 0xE0
214 #define N_BCOMM 0xE2
215 #define N_ECOMM 0xE4
216 #define N_ECOML 0xE8
217 #define N_LENG 0xFE
218
219 /* COFF symbol table */
220
221 #define E_SYMNMLEN 8 /* # characters in a symbol name */
222 #define E_FILNMLEN 14 /* # characters in a file name */
223 #define E_DIMNUM 4 /* # array dimensions in auxiliary entry */
224
225 #define N_BTMASK (0xf)
226 #define N_TMASK (0x30)
227 #define N_BTSHFT (4)
228 #define N_TSHIFT (2)
229
230 /* derived types, in e_type */
231 #define DT_NON (0) /* no derived type */
232 #define DT_PTR (1) /* pointer */
233 #define DT_FCN (2) /* function */
234 #define DT_ARY (3) /* array */
235
236 #define BTYPE(x) ((x) & N_BTMASK)
237
238 #define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))
239 #define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))
240 #define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))
241 #define ISTAG(x) ((x)==C_STRTAG||(x)==C_UNTAG||(x)==C_ENTAG)
242 #define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
243
244 #define C_EFCN 0xff /* physical end of function */
245 #define C_NULL 0
246 #define C_AUTO 1 /* automatic variable */
247 #define C_EXT 2 /* external symbol */
248 #define C_STAT 3 /* static */
249 #define C_REG 4 /* register variable */
250 #define C_EXTDEF 5 /* external definition */
251 #define C_LABEL 6 /* label */
252 #define C_ULABEL 7 /* undefined label */
253 #define C_MOS 8 /* member of structure */
254 #define C_ARG 9 /* function argument */
255 #define C_STRTAG 10 /* structure tag */
256 #define C_MOU 11 /* member of union */
257 #define C_UNTAG 12 /* union tag */
258 #define C_TPDEF 13 /* type definition */
259 #define C_USTATIC 14 /* undefined static */
260 #define C_ENTAG 15 /* enumeration tag */
261 #define C_MOE 16 /* member of enumeration */
262 #define C_REGPARM 17 /* register parameter */
263 #define C_FIELD 18 /* bit field */
264 #define C_AUTOARG 19 /* auto argument */
265 #define C_LASTENT 20 /* dummy entry (end of block) */
266 #define C_BLOCK 100 /* ".bb" or ".eb" */
267 #define C_FCN 101 /* ".bf" or ".ef" */
268 #define C_EOS 102 /* end of structure */
269 #define C_FILE 103 /* file name */
270 #define C_LINE 104 /* line # reformatted as symbol table entry */
271 #define C_ALIAS 105 /* duplicate tag */
272 #define C_HIDDEN 106 /* ext symbol in dmert public lib */
273
274 #pragma pack(1)
275 typedef struct _COFF_SYMENT
276 {
277 union
278 {
279 char e_name[E_SYMNMLEN];
280 struct
281 {
282 ULONG e_zeroes;
283 ULONG e_offset;
284 }
285 e;
286 }
287 e;
288 ULONG e_value;
289 short e_scnum;
290 USHORT e_type;
291 UCHAR e_sclass;
292 UCHAR e_numaux;
293 } COFF_SYMENT, *PCOFF_SYMENT;
294 #pragma pack(4)
295
296 typedef struct _ROSSYM_ENTRY {
297 ULONG_PTR Address;
298 ULONG FunctionOffset;
299 ULONG FileOffset;
300 ULONG SourceLine;
301 } ROSSYM_ENTRY, *PROSSYM_ENTRY;
302
303 #define ROUND_UP(N, S) (((N) + (S) - 1) & ~((S) - 1))
304
305 extern char*
306 convert_path(const char* origpath);
307
308 extern void*
309 load_file ( const char* file_name, size_t* file_size );
310
311 #endif/*RSYM_H*/