Commit | Line | Data |
---|---|---|
4a594fce | 1 | /* windint.h -- internal header file for windres program. |
82704155 | 2 | Copyright (C) 1997-2019 Free Software Foundation, Inc. |
4a594fce NC |
3 | Written by Kai Tietz, Onevision. |
4 | ||
5 | This file is part of GNU Binutils. | |
6 | ||
7 | This program is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
32866df7 | 9 | the Free Software Foundation; either version 3 of the License, or |
4a594fce NC |
10 | (at your option) any later version. |
11 | ||
12 | This program is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with this program; if not, write to the Free Software | |
19 | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA | |
20 | 02110-1301, USA. */ | |
21 | ||
22 | #include "winduni.h" | |
23 | ||
24 | #ifndef WINDINT_H | |
25 | #define WINDINT_H | |
26 | ||
27 | /* Use bfd_size_type to ensure a sufficient number of bits. */ | |
28 | #ifndef DEFINED_RC_UINT_TYPE | |
29 | #define DEFINED_RC_UINT_TYPE | |
30 | typedef bfd_size_type rc_uint_type; | |
31 | #endif | |
32 | ||
33 | /* Resource directory structure. */ | |
34 | ||
35 | typedef struct res_hdr | |
36 | { | |
37 | rc_uint_type data_size; | |
38 | rc_uint_type header_size; | |
39 | } res_hdr; | |
40 | ||
41 | struct __attribute__ ((__packed__)) bin_res_hdr | |
42 | { | |
43 | bfd_byte data_size[4]; | |
44 | bfd_byte header_size[4]; | |
45 | }; | |
46 | #define BIN_RES_HDR_SIZE 8 | |
47 | ||
48 | struct __attribute__ ((__packed__)) bin_res_id | |
49 | { | |
50 | bfd_byte sig[2]; /* Has to be 0xffff for unnamed ids. */ | |
51 | bfd_byte id[2]; | |
52 | }; | |
53 | #define BIN_RES_ID 4 | |
54 | ||
55 | /* This structure is used when converting resource information to | |
56 | binary. */ | |
57 | ||
58 | typedef struct bindata | |
59 | { | |
60 | /* Next data. */ | |
61 | struct bindata *next; | |
62 | /* Length of data. */ | |
63 | rc_uint_type length; | |
64 | /* Data. */ | |
65 | bfd_byte *data; | |
66 | } bindata; | |
67 | ||
68 | /* This structure is used when converting resource information to | |
69 | coff. */ | |
70 | typedef struct coff_res_data | |
71 | { | |
72 | /* Next data. */ | |
73 | struct coff_res_data *next; | |
74 | /* Length of data. */ | |
75 | rc_uint_type length; | |
76 | /* Data. */ | |
77 | const struct rc_res_resource *res; | |
78 | } coff_res_data; | |
79 | ||
80 | /* We represent resources internally as a tree, similar to the tree | |
81 | used in the .rsrc section of a COFF file. The root is a | |
82 | rc_res_directory structure. */ | |
83 | ||
84 | typedef struct rc_res_directory | |
85 | { | |
86 | /* Resource flags. According to the MS docs, this is currently | |
87 | always zero. */ | |
88 | rc_uint_type characteristics; | |
89 | /* Time/date stamp. */ | |
90 | rc_uint_type time; | |
91 | /* Major version number. */ | |
92 | rc_uint_type major; | |
93 | /* Minor version number. */ | |
94 | rc_uint_type minor; | |
95 | /* Directory entries. */ | |
96 | struct rc_res_entry *entries; | |
97 | } rc_res_directory; | |
98 | ||
99 | /* A resource ID is stored in a rc_res_id structure. */ | |
100 | ||
101 | typedef struct rc_res_id | |
102 | { | |
103 | /* Non-zero if this entry has a name rather than an ID. */ | |
104 | rc_uint_type named : 1; | |
105 | union | |
106 | { | |
107 | /* If the named field is non-zero, this is the name. */ | |
108 | struct | |
109 | { | |
110 | /* Length of the name. */ | |
111 | rc_uint_type length; | |
112 | /* Pointer to the name, which is a Unicode string. */ | |
113 | unichar *name; | |
114 | } n; | |
115 | /* If the named field is zero, this is the ID. */ | |
116 | rc_uint_type id; | |
117 | } u; | |
118 | } rc_res_id; | |
119 | ||
120 | /* Each entry in the tree is a rc_res_entry structure. We mix | |
121 | directories and resources because in a COFF file all entries in a | |
122 | directory are sorted together, whether the entries are | |
123 | subdirectories or resources. */ | |
124 | ||
125 | typedef struct rc_res_entry | |
126 | { | |
127 | /* Next entry. */ | |
128 | struct rc_res_entry *next; | |
129 | /* Resource ID. */ | |
130 | rc_res_id id; | |
131 | /* Non-zero if this entry is a subdirectory rather than a leaf. */ | |
132 | rc_uint_type subdir : 1; | |
133 | union | |
134 | { | |
135 | /* If the subdir field is non-zero, this is a pointer to the | |
136 | subdirectory. */ | |
137 | rc_res_directory *dir; | |
138 | /* If the subdir field is zero, this is a pointer to the resource | |
139 | data. */ | |
140 | struct rc_res_resource *res; | |
141 | } u; | |
142 | } rc_res_entry; | |
143 | ||
144 | /* Types of resources. */ | |
145 | ||
146 | enum rc_res_type | |
147 | { | |
148 | RES_TYPE_UNINITIALIZED, | |
149 | RES_TYPE_ACCELERATOR, | |
150 | RES_TYPE_BITMAP, | |
151 | RES_TYPE_CURSOR, | |
152 | RES_TYPE_GROUP_CURSOR, | |
153 | RES_TYPE_DIALOG, | |
154 | RES_TYPE_FONT, | |
155 | RES_TYPE_FONTDIR, | |
156 | RES_TYPE_ICON, | |
157 | RES_TYPE_GROUP_ICON, | |
158 | RES_TYPE_MENU, | |
159 | RES_TYPE_MESSAGETABLE, | |
160 | RES_TYPE_RCDATA, | |
161 | RES_TYPE_STRINGTABLE, | |
162 | RES_TYPE_USERDATA, | |
163 | RES_TYPE_VERSIONINFO, | |
164 | RES_TYPE_DLGINCLUDE, | |
165 | RES_TYPE_PLUGPLAY, | |
166 | RES_TYPE_VXD, | |
167 | RES_TYPE_ANICURSOR, | |
168 | RES_TYPE_ANIICON, | |
169 | RES_TYPE_DLGINIT, | |
170 | RES_TYPE_TOOLBAR | |
171 | }; | |
172 | ||
173 | /* A res file and a COFF file store information differently. The | |
174 | res_info structures holds data which in a res file is stored with | |
175 | each resource, but in a COFF file is stored elsewhere. */ | |
176 | ||
177 | typedef struct rc_res_res_info | |
178 | { | |
179 | /* Language. In a COFF file, the third level of the directory is | |
180 | keyed by the language, so the language of a resource is defined | |
181 | by its location in the resource tree. */ | |
182 | rc_uint_type language; | |
183 | /* Characteristics of the resource. Entirely user defined. In a | |
184 | COFF file, the rc_res_directory structure has a characteristics | |
185 | field, but I don't know if it's related to the one in the res | |
186 | file. */ | |
187 | rc_uint_type characteristics; | |
188 | /* Version of the resource. Entirely user defined. In a COFF file, | |
189 | the rc_res_directory structure has a characteristics field, but I | |
190 | don't know if it's related to the one in the res file. */ | |
191 | rc_uint_type version; | |
192 | /* Memory flags. This is a combination of the MEMFLAG values | |
193 | defined below. Most of these values are historical, and are not | |
194 | meaningful for win32. I don't think there is any way to store | |
195 | this information in a COFF file. */ | |
196 | rc_uint_type memflags; | |
197 | } rc_res_res_info; | |
198 | ||
199 | /* Binary layout of rc_res_info. */ | |
200 | ||
201 | struct __attribute__ ((__packed__)) bin_res_info | |
202 | { | |
203 | bfd_byte version[4]; | |
204 | bfd_byte memflags[2]; | |
205 | bfd_byte language[2]; | |
206 | bfd_byte version2[4]; | |
207 | bfd_byte characteristics[4]; | |
208 | }; | |
209 | #define BIN_RES_INFO_SIZE 16 | |
210 | ||
211 | /* Each resource in a COFF file has some information which can does | |
212 | not appear in a res file. */ | |
213 | ||
214 | typedef struct rc_res_coff_info | |
215 | { | |
216 | /* The code page used for the data. I don't really know what this | |
217 | should be. It has something todo with ASCII to Unicode encoding. */ | |
218 | rc_uint_type codepage; | |
219 | /* A resource entry in a COFF file has a reserved field, which we | |
220 | record here when reading a COFF file. When writing a COFF file, | |
221 | we set this field to zero. */ | |
222 | rc_uint_type reserved; | |
223 | } rc_res_coff_info; | |
224 | ||
225 | /* Resource data is stored in a rc_res_resource structure. */ | |
226 | ||
227 | typedef struct rc_res_resource | |
228 | { | |
229 | /* The type of resource. */ | |
230 | enum rc_res_type type; | |
231 | /* The data for the resource. */ | |
232 | union | |
233 | { | |
234 | struct | |
235 | { | |
236 | rc_uint_type length; | |
237 | const bfd_byte *data; | |
238 | } data; | |
239 | struct rc_accelerator *acc; | |
240 | struct rc_cursor *cursor; | |
241 | struct rc_group_cursor *group_cursor; | |
242 | struct rc_dialog *dialog; | |
243 | struct rc_fontdir *fontdir; | |
244 | struct rc_group_icon *group_icon; | |
245 | struct rc_menu *menu; | |
246 | struct rc_rcdata_item *rcdata; | |
247 | struct rc_stringtable *stringtable; | |
248 | struct rc_rcdata_item *userdata; | |
249 | struct rc_versioninfo *versioninfo; | |
250 | struct rc_toolbar *toolbar; | |
251 | } u; | |
252 | /* Information from a res file. */ | |
253 | struct rc_res_res_info res_info; | |
254 | /* Information from a COFF file. */ | |
255 | rc_res_coff_info coff_info; | |
256 | } rc_res_resource; | |
257 | ||
258 | #define SUBLANG_SHIFT 10 | |
259 | ||
260 | /* Memory flags in the memflags field of a rc_res_resource. */ | |
261 | ||
262 | #define MEMFLAG_MOVEABLE 0x10 | |
263 | #define MEMFLAG_PURE 0x20 | |
264 | #define MEMFLAG_PRELOAD 0x40 | |
265 | #define MEMFLAG_DISCARDABLE 0x1000 | |
266 | ||
267 | /* Standard resource type codes. These are used in the ID field of a | |
268 | rc_res_entry structure. */ | |
269 | ||
270 | #define RT_CURSOR 1 | |
271 | #define RT_BITMAP 2 | |
272 | #define RT_ICON 3 | |
273 | #define RT_MENU 4 | |
274 | #define RT_DIALOG 5 | |
275 | #define RT_STRING 6 | |
276 | #define RT_FONTDIR 7 | |
277 | #define RT_FONT 8 | |
278 | #define RT_ACCELERATOR 9 | |
279 | #define RT_RCDATA 10 | |
280 | #define RT_MESSAGETABLE 11 | |
281 | #define RT_GROUP_CURSOR 12 | |
282 | #define RT_GROUP_ICON 14 | |
283 | #define RT_VERSION 16 | |
284 | #define RT_DLGINCLUDE 17 | |
285 | #define RT_PLUGPLAY 19 | |
286 | #define RT_VXD 20 | |
287 | #define RT_ANICURSOR 21 | |
288 | #define RT_ANIICON 22 | |
289 | #define RT_HTML 23 | |
290 | #define RT_MANIFEST 24 | |
291 | #define RT_DLGINIT 240 | |
292 | #define RT_TOOLBAR 241 | |
293 | ||
294 | /* An accelerator resource is a linked list of these structures. */ | |
295 | ||
296 | typedef struct rc_accelerator | |
297 | { | |
298 | /* Next accelerator. */ | |
299 | struct rc_accelerator *next; | |
300 | /* Flags. A combination of the ACC values defined below. */ | |
301 | rc_uint_type flags; | |
302 | /* Key value. */ | |
303 | rc_uint_type key; | |
304 | /* Resource ID. */ | |
305 | rc_uint_type id; | |
306 | } rc_accelerator; | |
307 | ||
308 | struct __attribute__ ((__packed__)) bin_accelerator | |
309 | { | |
310 | bfd_byte flags[2]; | |
311 | bfd_byte key[2]; | |
312 | bfd_byte id[2]; | |
313 | bfd_byte pad[2]; | |
314 | }; | |
315 | #define BIN_ACCELERATOR_SIZE 8 | |
316 | ||
317 | /* Accelerator flags in the flags field of a rc_accelerator. | |
318 | These are the same values that appear in a res file. I hope. */ | |
319 | ||
320 | #define ACC_VIRTKEY 0x01 | |
321 | #define ACC_NOINVERT 0x02 | |
322 | #define ACC_SHIFT 0x04 | |
323 | #define ACC_CONTROL 0x08 | |
324 | #define ACC_ALT 0x10 | |
325 | #define ACC_LAST 0x80 | |
326 | ||
327 | /* A cursor resource. */ | |
328 | ||
329 | typedef struct rc_cursor | |
330 | { | |
331 | /* X coordinate of hotspot. */ | |
332 | bfd_signed_vma xhotspot; | |
333 | /* Y coordinate of hotspot. */ | |
334 | bfd_signed_vma yhotspot; | |
335 | /* Length of bitmap data. */ | |
336 | rc_uint_type length; | |
337 | /* Data. */ | |
338 | const bfd_byte *data; | |
339 | } rc_cursor; | |
340 | ||
341 | struct __attribute__ ((__packed__)) bin_cursor | |
342 | { | |
343 | bfd_byte xhotspot[2]; | |
344 | bfd_byte yhotspot[2]; | |
345 | }; | |
346 | #define BIN_CURSOR_SIZE 4 | |
347 | ||
348 | /* A group_cursor resource is a list of rc_i_group_cursor structures. */ | |
349 | ||
350 | typedef struct rc_group_cursor | |
351 | { | |
352 | /* Next cursor in group. */ | |
353 | struct rc_group_cursor *next; | |
354 | /* Width. */ | |
355 | rc_uint_type width; | |
356 | /* Height. */ | |
357 | rc_uint_type height; | |
358 | /* Planes. */ | |
359 | rc_uint_type planes; | |
360 | /* Bits per pixel. */ | |
361 | rc_uint_type bits; | |
362 | /* Number of bytes in cursor resource. */ | |
363 | rc_uint_type bytes; | |
364 | /* Index of cursor resource. */ | |
365 | rc_uint_type index; | |
366 | } rc_group_cursor; | |
367 | ||
368 | struct __attribute__ ((__packed__)) bin_group_cursor_item | |
369 | { | |
370 | bfd_byte width[2]; | |
371 | bfd_byte height[2]; | |
372 | bfd_byte planes[2]; | |
373 | bfd_byte bits[2]; | |
374 | bfd_byte bytes[4]; | |
375 | bfd_byte index[2]; | |
376 | }; | |
377 | #define BIN_GROUP_CURSOR_ITEM_SIZE 14 | |
378 | ||
379 | struct __attribute__ ((__packed__)) bin_group_cursor | |
380 | { | |
381 | bfd_byte sig1[2]; | |
382 | bfd_byte sig2[2]; | |
383 | bfd_byte nitems[2]; | |
384 | /* struct bin_group_cursor_item item[nitems]; */ | |
385 | }; | |
386 | #define BIN_GROUP_CURSOR_SIZE 6 | |
387 | ||
388 | /* A dialog resource. */ | |
389 | ||
390 | typedef struct rc_dialog | |
391 | { | |
392 | /* Basic window style. */ | |
393 | unsigned int style; | |
394 | /* Extended window style. */ | |
395 | rc_uint_type exstyle; | |
396 | /* X coordinate. */ | |
397 | rc_uint_type x; | |
398 | /* Y coordinate. */ | |
399 | rc_uint_type y; | |
400 | /* Width. */ | |
401 | rc_uint_type width; | |
402 | /* Height. */ | |
403 | rc_uint_type height; | |
404 | /* Menu name. */ | |
405 | rc_res_id menu; | |
406 | /* Class name. */ | |
407 | rc_res_id class; | |
408 | /* Caption. */ | |
409 | unichar *caption; | |
410 | /* Font point size. */ | |
411 | rc_uint_type pointsize; | |
412 | /* Font name. */ | |
413 | unichar *font; | |
414 | /* Extended information for a dialogex. */ | |
415 | struct rc_dialog_ex *ex; | |
416 | /* Controls. */ | |
417 | struct rc_dialog_control *controls; | |
418 | } rc_dialog; | |
419 | ||
420 | struct __attribute__ ((__packed__)) bin_dialog | |
421 | { | |
422 | bfd_byte style[4]; | |
423 | bfd_byte exstyle[4]; | |
424 | bfd_byte off[2]; | |
425 | bfd_byte x[2]; | |
426 | bfd_byte y[2]; | |
427 | bfd_byte width[2]; | |
428 | bfd_byte height[2]; | |
429 | }; | |
430 | #define BIN_DIALOG_SIZE 18 | |
431 | ||
432 | /* An extended dialog has additional information. */ | |
433 | ||
434 | typedef struct rc_dialog_ex | |
435 | { | |
436 | /* Help ID. */ | |
437 | rc_uint_type help; | |
438 | /* Font weight. */ | |
439 | rc_uint_type weight; | |
440 | /* Whether the font is italic. */ | |
441 | bfd_byte italic; | |
442 | /* Character set. */ | |
443 | bfd_byte charset; | |
444 | } rc_dialog_ex; | |
445 | ||
446 | struct __attribute__ ((__packed__)) bin_dialogex | |
447 | { | |
448 | bfd_byte sig1[2]; | |
449 | bfd_byte sig2[2]; | |
450 | bfd_byte help[4]; | |
451 | bfd_byte exstyle[4]; | |
452 | bfd_byte style[4]; | |
453 | bfd_byte off[2]; | |
454 | bfd_byte x[2]; | |
455 | bfd_byte y[2]; | |
456 | bfd_byte width[2]; | |
457 | bfd_byte height[2]; | |
458 | }; | |
459 | #define BIN_DIALOGEX_SIZE 26 | |
460 | ||
461 | struct __attribute__ ((__packed__)) bin_dialogfont | |
462 | { | |
463 | bfd_byte pointsize[2]; | |
464 | }; | |
465 | #define BIN_DIALOGFONT_SIZE 2 | |
466 | ||
467 | struct __attribute__ ((__packed__)) bin_dialogexfont | |
468 | { | |
469 | bfd_byte pointsize[2]; | |
470 | bfd_byte weight[2]; | |
471 | bfd_byte italic[1]; | |
472 | bfd_byte charset[1]; | |
473 | }; | |
474 | #define BIN_DIALOGEXFONT_SIZE 6 | |
475 | ||
476 | /* Window style flags, from the winsup Defines.h header file. These | |
477 | can appear in the style field of a rc_dialog or a rc_dialog_control. */ | |
478 | ||
479 | #define CW_USEDEFAULT 0x80000000 | |
480 | #define WS_BORDER 0x800000L | |
481 | #define WS_CAPTION 0xc00000L | |
482 | #define WS_CHILD 0x40000000L | |
483 | #define WS_CHILDWINDOW 0x40000000L | |
484 | #define WS_CLIPCHILDREN 0x2000000L | |
485 | #define WS_CLIPSIBLINGS 0x4000000L | |
486 | #define WS_DISABLED 0x8000000L | |
487 | #define WS_DLGFRAME 0x400000L | |
488 | #define WS_GROUP 0x20000L | |
489 | #define WS_HSCROLL 0x100000L | |
490 | #define WS_ICONIC 0x20000000L | |
491 | #define WS_MAXIMIZE 0x1000000L | |
492 | #define WS_MAXIMIZEBOX 0x10000L | |
493 | #define WS_MINIMIZE 0x20000000L | |
494 | #define WS_MINIMIZEBOX 0x20000L | |
495 | #define WS_OVERLAPPED 0L | |
496 | #define WS_OVERLAPPEDWINDOW 0xcf0000L | |
497 | #define WS_POPUP 0x80000000L | |
498 | #define WS_POPUPWINDOW 0x80880000L | |
499 | #define WS_SIZEBOX 0x40000L | |
500 | #define WS_SYSMENU 0x80000L | |
501 | #define WS_TABSTOP 0x10000L | |
502 | #define WS_THICKFRAME 0x40000L | |
503 | #define WS_TILED 0L | |
504 | #define WS_TILEDWINDOW 0xcf0000L | |
505 | #define WS_VISIBLE 0x10000000L | |
506 | #define WS_VSCROLL 0x200000L | |
507 | #define MDIS_ALLCHILDSTYLES 0x1 | |
508 | #define BS_3STATE 0x5L | |
509 | #define BS_AUTO3STATE 0x6L | |
510 | #define BS_AUTOCHECKBOX 0x3L | |
511 | #define BS_AUTORADIOBUTTON 0x9L | |
512 | #define BS_BITMAP 0x80L | |
513 | #define BS_BOTTOM 0x800L | |
514 | #define BS_CENTER 0x300L | |
515 | #define BS_CHECKBOX 0x2L | |
516 | #define BS_DEFPUSHBUTTON 0x1L | |
517 | #define BS_GROUPBOX 0x7L | |
518 | #define BS_ICON 0x40L | |
519 | #define BS_LEFT 0x100L | |
520 | #define BS_LEFTTEXT 0x20L | |
521 | #define BS_MULTILINE 0x2000L | |
522 | #define BS_NOTIFY 0x4000L | |
523 | #define BS_OWNERDRAW 0xbL | |
524 | #define BS_PUSHBOX 0xcL /* FIXME! What should this be? */ | |
525 | #define BS_PUSHBUTTON 0L | |
526 | #define BS_PUSHLIKE 0x1000L | |
527 | #define BS_RADIOBUTTON 0x4L | |
528 | #define BS_RIGHT 0x200L | |
529 | #define BS_RIGHTBUTTON 0x20L | |
530 | #define BS_TEXT 0L | |
531 | #define BS_TOP 0x400L | |
532 | #define BS_USERBUTTON 0x8L | |
533 | #define BS_VCENTER 0xc00L | |
534 | #define CBS_AUTOHSCROLL 0x40L | |
535 | #define CBS_DISABLENOSCROLL 0x800L | |
536 | #define CBS_DROPDOWN 0x2L | |
537 | #define CBS_DROPDOWNLIST 0x3L | |
538 | #define CBS_HASSTRINGS 0x200L | |
539 | #define CBS_LOWERCASE 0x4000L | |
540 | #define CBS_NOINTEGRALHEIGHT 0x400L | |
541 | #define CBS_OEMCONVERT 0x80L | |
542 | #define CBS_OWNERDRAWFIXED 0x10L | |
543 | #define CBS_OWNERDRAWVARIABLE 0x20L | |
544 | #define CBS_SIMPLE 0x1L | |
545 | #define CBS_SORT 0x100L | |
546 | #define CBS_UPPERCASE 0x2000L | |
547 | #define ES_AUTOHSCROLL 0x80L | |
548 | #define ES_AUTOVSCROLL 0x40L | |
549 | #define ES_CENTER 0x1L | |
550 | #define ES_LEFT 0L | |
551 | #define ES_LOWERCASE 0x10L | |
552 | #define ES_MULTILINE 0x4L | |
553 | #define ES_NOHIDESEL 0x100L | |
554 | #define ES_NUMBER 0x2000L | |
555 | #define ES_OEMCONVERT 0x400L | |
556 | #define ES_PASSWORD 0x20L | |
557 | #define ES_READONLY 0x800L | |
558 | #define ES_RIGHT 0x2L | |
559 | #define ES_UPPERCASE 0x8L | |
560 | #define ES_WANTRETURN 0x1000L | |
561 | #define LBS_DISABLENOSCROLL 0x1000L | |
562 | #define LBS_EXTENDEDSEL 0x800L | |
563 | #define LBS_HASSTRINGS 0x40L | |
564 | #define LBS_MULTICOLUMN 0x200L | |
565 | #define LBS_MULTIPLESEL 0x8L | |
566 | #define LBS_NODATA 0x2000L | |
567 | #define LBS_NOINTEGRALHEIGHT 0x100L | |
568 | #define LBS_NOREDRAW 0x4L | |
569 | #define LBS_NOSEL 0x4000L | |
570 | #define LBS_NOTIFY 0x1L | |
571 | #define LBS_OWNERDRAWFIXED 0x10L | |
572 | #define LBS_OWNERDRAWVARIABLE 0x20L | |
573 | #define LBS_SORT 0x2L | |
574 | #define LBS_STANDARD 0xa00003L | |
575 | #define LBS_USETABSTOPS 0x80L | |
576 | #define LBS_WANTKEYBOARDINPUT 0x400L | |
577 | #define SBS_BOTTOMALIGN 0x4L | |
578 | #define SBS_HORZ 0L | |
579 | #define SBS_LEFTALIGN 0x2L | |
580 | #define SBS_RIGHTALIGN 0x4L | |
581 | #define SBS_SIZEBOX 0x8L | |
582 | #define SBS_SIZEBOXBOTTOMRIGHTALIGN 0x4L | |
583 | #define SBS_SIZEBOXTOPLEFTALIGN 0x2L | |
584 | #define SBS_SIZEGRIP 0x10L | |
585 | #define SBS_TOPALIGN 0x2L | |
586 | #define SBS_VERT 0x1L | |
587 | #define SS_BITMAP 0xeL | |
588 | #define SS_BLACKFRAME 0x7L | |
589 | #define SS_BLACKRECT 0x4L | |
590 | #define SS_CENTER 0x1L | |
591 | #define SS_CENTERIMAGE 0x200L | |
592 | #define SS_ENHMETAFILE 0xfL | |
593 | #define SS_ETCHEDFRAME 0x12L | |
594 | #define SS_ETCHEDHORZ 0x10L | |
595 | #define SS_ETCHEDVERT 0x11L | |
596 | #define SS_GRAYFRAME 0x8L | |
597 | #define SS_GRAYRECT 0x5L | |
598 | #define SS_ICON 0x3L | |
599 | #define SS_LEFT 0L | |
600 | #define SS_LEFTNOWORDWRAP 0xcL | |
601 | #define SS_NOPREFIX 0x80L | |
602 | #define SS_NOTIFY 0x100L | |
603 | #define SS_OWNERDRAW 0xdL | |
604 | #define SS_REALSIZEIMAGE 0x800L | |
605 | #define SS_RIGHT 0x2L | |
606 | #define SS_RIGHTJUST 0x400L | |
607 | #define SS_SIMPLE 0xbL | |
608 | #define SS_SUNKEN 0x1000L | |
609 | #define SS_USERITEM 0xaL | |
610 | #define SS_WHITEFRAME 0x9L | |
611 | #define SS_WHITERECT 0x6L | |
612 | #define DS_3DLOOK 0x4L | |
613 | #define DS_ABSALIGN 0x1L | |
614 | #define DS_CENTER 0x800L | |
615 | #define DS_CENTERMOUSE 0x1000L | |
616 | #define DS_CONTEXTHELP 0x2000L | |
617 | #define DS_CONTROL 0x400L | |
618 | #define DS_FIXEDSYS 0x8L | |
619 | #define DS_LOCALEDIT 0x20L | |
620 | #define DS_MODALFRAME 0x80L | |
621 | #define DS_NOFAILCREATE 0x10L | |
622 | #define DS_NOIDLEMSG 0x100L | |
623 | #define DS_SETFONT 0x40L | |
624 | #define DS_SETFOREGROUND 0x200L | |
625 | #define DS_SYSMODAL 0x2L | |
626 | ||
627 | /* A dialog control. */ | |
628 | ||
629 | typedef struct rc_dialog_control | |
630 | { | |
631 | /* Next control. */ | |
632 | struct rc_dialog_control *next; | |
633 | /* ID. */ | |
634 | rc_uint_type id; | |
635 | /* Style. */ | |
636 | rc_uint_type style; | |
637 | /* Extended style. */ | |
638 | rc_uint_type exstyle; | |
639 | /* X coordinate. */ | |
640 | rc_uint_type x; | |
641 | /* Y coordinate. */ | |
642 | rc_uint_type y; | |
643 | /* Width. */ | |
644 | rc_uint_type width; | |
645 | /* Height. */ | |
646 | rc_uint_type height; | |
647 | /* Class name. */ | |
648 | rc_res_id class; | |
649 | /* Associated text. */ | |
650 | rc_res_id text; | |
651 | /* Extra data for the window procedure. */ | |
652 | struct rc_rcdata_item *data; | |
653 | /* Help ID. Only used in an extended dialog. */ | |
654 | rc_uint_type help; | |
655 | } rc_dialog_control; | |
656 | ||
657 | struct __attribute__ ((__packed__)) bin_dialog_control | |
658 | { | |
659 | bfd_byte style[4]; | |
660 | bfd_byte exstyle[4]; | |
661 | bfd_byte x[2]; | |
662 | bfd_byte y[2]; | |
663 | bfd_byte width[2]; | |
664 | bfd_byte height[2]; | |
665 | bfd_byte id[2]; | |
666 | }; | |
667 | #define BIN_DIALOG_CONTROL_SIZE 18 | |
668 | ||
669 | struct __attribute__ ((__packed__)) bin_dialogex_control | |
670 | { | |
671 | bfd_byte help[4]; | |
672 | bfd_byte exstyle[4]; | |
673 | bfd_byte style[4]; | |
674 | bfd_byte x[2]; | |
675 | bfd_byte y[2]; | |
676 | bfd_byte width[2]; | |
677 | bfd_byte height[2]; | |
678 | bfd_byte id[4]; | |
679 | }; | |
680 | #define BIN_DIALOGEX_CONTROL_SIZE 24 | |
681 | ||
682 | /* Control classes. These can be used as the ID field in a rc_dialog_control. */ | |
683 | ||
684 | #define CTL_BUTTON 0x80 | |
685 | #define CTL_EDIT 0x81 | |
686 | #define CTL_STATIC 0x82 | |
687 | #define CTL_LISTBOX 0x83 | |
688 | #define CTL_SCROLLBAR 0x84 | |
689 | #define CTL_COMBOBOX 0x85 | |
690 | ||
691 | /* A fontdir resource is a list of rc_fontdir. */ | |
692 | ||
693 | typedef struct rc_fontdir | |
694 | { | |
695 | struct rc_fontdir *next; | |
696 | /* Index of font entry. */ | |
697 | rc_uint_type index; | |
698 | /* Length of font information. */ | |
699 | rc_uint_type length; | |
700 | /* Font information. */ | |
701 | const bfd_byte *data; | |
702 | } rc_fontdir; | |
703 | ||
704 | struct __attribute__ ((__packed__)) bin_fontdir_item | |
705 | { | |
706 | bfd_byte index[2]; | |
707 | bfd_byte header[54]; | |
708 | bfd_byte device_name[1]; | |
709 | /* bfd_byte face_name[]; */ | |
710 | }; | |
711 | ||
712 | /* A group_icon resource is a list of rc_group_icon. */ | |
713 | ||
714 | typedef struct rc_group_icon | |
715 | { | |
716 | /* Next icon in group. */ | |
717 | struct rc_group_icon *next; | |
718 | /* Width. */ | |
719 | bfd_byte width; | |
720 | /* Height. */ | |
721 | bfd_byte height; | |
722 | /* Color count. */ | |
723 | bfd_byte colors; | |
724 | /* Planes. */ | |
725 | rc_uint_type planes; | |
726 | /* Bits per pixel. */ | |
727 | rc_uint_type bits; | |
728 | /* Number of bytes in cursor resource. */ | |
729 | rc_uint_type bytes; | |
730 | /* Index of cursor resource. */ | |
731 | rc_uint_type index; | |
732 | } rc_group_icon; | |
733 | ||
734 | struct __attribute__ ((__packed__)) bin_group_icon | |
735 | { | |
736 | bfd_byte sig1[2]; | |
737 | bfd_byte sig2[2]; | |
738 | bfd_byte count[2]; | |
739 | }; | |
740 | #define BIN_GROUP_ICON_SIZE 6 | |
741 | ||
742 | struct __attribute__ ((__packed__)) bin_group_icon_item | |
743 | { | |
744 | bfd_byte width[1]; | |
745 | bfd_byte height[1]; | |
746 | bfd_byte colors[1]; | |
747 | bfd_byte pad[1]; | |
748 | bfd_byte planes[2]; | |
749 | bfd_byte bits[2]; | |
750 | bfd_byte bytes[4]; | |
751 | bfd_byte index[2]; | |
752 | }; | |
753 | #define BIN_GROUP_ICON_ITEM_SIZE 14 | |
754 | ||
755 | /* A menu resource. */ | |
756 | ||
757 | typedef struct rc_menu | |
758 | { | |
759 | /* List of menuitems. */ | |
760 | struct rc_menuitem *items; | |
761 | /* Help ID. I don't think there is any way to set this in an rc | |
762 | file, but it can appear in the binary format. */ | |
763 | rc_uint_type help; | |
764 | } rc_menu; | |
765 | ||
766 | struct __attribute__ ((__packed__)) bin_menu | |
767 | { | |
768 | bfd_byte sig1[2]; | |
769 | bfd_byte sig2[2]; | |
770 | }; | |
771 | #define BIN_MENU_SIZE 4 | |
772 | ||
773 | struct __attribute__ ((__packed__)) bin_menuex | |
774 | { | |
775 | bfd_byte sig1[2]; | |
776 | bfd_byte sig2[2]; | |
777 | bfd_byte help[4]; | |
778 | }; | |
779 | #define BIN_MENUEX_SIZE 8 | |
780 | ||
781 | /* A menu resource is a list of rc_menuitem. */ | |
782 | ||
783 | typedef struct rc_menuitem | |
784 | { | |
785 | /* Next menu item. */ | |
786 | struct rc_menuitem *next; | |
787 | /* Type. In a normal menu, rather than a menuex, this is the flags | |
788 | field. */ | |
789 | rc_uint_type type; | |
790 | /* State. This is only used in a menuex. */ | |
791 | rc_uint_type state; | |
792 | /* Id. */ | |
793 | rc_uint_type id; | |
794 | /* Unicode text. */ | |
795 | unichar *text; | |
796 | /* Popup menu items for a popup. */ | |
797 | struct rc_menuitem *popup; | |
798 | /* Help ID. This is only used in a menuex. */ | |
799 | rc_uint_type help; | |
800 | } rc_menuitem; | |
801 | ||
802 | struct __attribute__ ((__packed__)) bin_menuitem | |
803 | { | |
804 | bfd_byte flags[2]; | |
805 | bfd_byte id[2]; | |
806 | }; | |
807 | #define BIN_MENUITEM_SIZE 4 | |
808 | #define BIN_MENUITEM_POPUP_SIZE 2 | |
809 | ||
810 | struct __attribute__ ((__packed__)) bin_menuitemex | |
811 | { | |
812 | bfd_byte type[4]; | |
813 | bfd_byte state[4]; | |
814 | bfd_byte id[4]; | |
815 | bfd_byte flags[2]; | |
816 | /* unicode text */ | |
817 | /* if popup: align, bfd_byte help[4], align, bin_menuitemex[]; */ | |
818 | }; | |
819 | #define BIN_MENUITEMEX_SIZE 14 | |
820 | ||
821 | /* Menu item flags. These can appear in the flags field of a rc_menuitem. */ | |
822 | ||
823 | #define MENUITEM_GRAYED 0x001 | |
824 | #define MENUITEM_INACTIVE 0x002 | |
825 | #define MENUITEM_BITMAP 0x004 | |
826 | #define MENUITEM_OWNERDRAW 0x100 | |
827 | #define MENUITEM_CHECKED 0x008 | |
828 | #define MENUITEM_POPUP 0x010 | |
829 | #define MENUITEM_MENUBARBREAK 0x020 | |
830 | #define MENUITEM_MENUBREAK 0x040 | |
831 | #define MENUITEM_ENDMENU 0x080 | |
832 | #define MENUITEM_HELP 0x4000 | |
833 | ||
834 | /* An rcdata resource is a pointer to a list of rc_rcdata_item. */ | |
835 | ||
836 | typedef struct rc_rcdata_item | |
837 | { | |
838 | /* Next data item. */ | |
839 | struct rc_rcdata_item *next; | |
840 | /* Type of data. */ | |
841 | enum | |
842 | { | |
843 | RCDATA_WORD, | |
844 | RCDATA_DWORD, | |
845 | RCDATA_STRING, | |
846 | RCDATA_WSTRING, | |
847 | RCDATA_BUFFER | |
848 | } type; | |
849 | union | |
850 | { | |
851 | rc_uint_type word; | |
852 | rc_uint_type dword; | |
853 | struct | |
854 | { | |
855 | rc_uint_type length; | |
856 | const char *s; | |
857 | } string; | |
858 | struct | |
859 | { | |
860 | rc_uint_type length; | |
861 | const unichar *w; | |
862 | } wstring; | |
863 | struct | |
864 | { | |
865 | rc_uint_type length; | |
866 | const bfd_byte *data; | |
867 | } buffer; | |
868 | } u; | |
869 | } rc_rcdata_item; | |
870 | ||
871 | /* A stringtable resource is a pointer to a rc_stringtable. */ | |
872 | ||
873 | typedef struct rc_stringtable | |
874 | { | |
875 | /* Each stringtable resource is a list of 16 unicode strings. */ | |
876 | struct | |
877 | { | |
878 | /* Length of string. */ | |
879 | rc_uint_type length; | |
880 | /* String data if length > 0. */ | |
881 | unichar *string; | |
882 | } strings[16]; | |
883 | } rc_stringtable; | |
884 | ||
885 | /* A versioninfo resource points to a rc_versioninfo. */ | |
886 | ||
887 | typedef struct rc_versioninfo | |
888 | { | |
889 | /* Fixed version information. */ | |
890 | struct rc_fixed_versioninfo *fixed; | |
891 | /* Variable version information. */ | |
892 | struct rc_ver_info *var; | |
893 | } rc_versioninfo; | |
894 | ||
895 | struct __attribute__ ((__packed__)) bin_versioninfo | |
896 | { | |
897 | bfd_byte size[2]; | |
898 | bfd_byte fixed_size[2]; | |
899 | bfd_byte sig2[2]; | |
900 | }; | |
901 | #define BIN_VERSIONINFO_SIZE 6 | |
902 | ||
903 | /* The fixed portion of a versioninfo resource. */ | |
904 | ||
905 | typedef struct rc_fixed_versioninfo | |
906 | { | |
907 | /* The file version, which is two 32 bit integers. */ | |
908 | rc_uint_type file_version_ms; | |
909 | rc_uint_type file_version_ls; | |
910 | /* The product version, which is two 32 bit integers. */ | |
911 | rc_uint_type product_version_ms; | |
912 | rc_uint_type product_version_ls; | |
913 | /* The file flags mask. */ | |
914 | rc_uint_type file_flags_mask; | |
915 | /* The file flags. */ | |
916 | rc_uint_type file_flags; | |
917 | /* The OS type. */ | |
918 | rc_uint_type file_os; | |
919 | /* The file type. */ | |
920 | rc_uint_type file_type; | |
921 | /* The file subtype. */ | |
922 | rc_uint_type file_subtype; | |
923 | /* The date, which in Windows is two 32 bit integers. */ | |
924 | rc_uint_type file_date_ms; | |
925 | rc_uint_type file_date_ls; | |
926 | } rc_fixed_versioninfo; | |
927 | ||
928 | struct __attribute__ ((__packed__)) bin_fixed_versioninfo | |
929 | { | |
930 | bfd_byte sig1[4]; | |
931 | bfd_byte sig2[4]; | |
932 | bfd_byte file_version[4]; | |
933 | bfd_byte file_version_ls[4]; | |
934 | bfd_byte product_version_ms[4]; | |
935 | bfd_byte product_version_ls[4]; | |
936 | bfd_byte file_flags_mask[4]; | |
937 | bfd_byte file_flags[4]; | |
938 | bfd_byte file_os[4]; | |
939 | bfd_byte file_type[4]; | |
940 | bfd_byte file_subtype[4]; | |
941 | bfd_byte file_date_ms[4]; | |
942 | bfd_byte file_date_ls[4]; | |
943 | }; | |
944 | #define BIN_FIXED_VERSIONINFO_SIZE 52 | |
945 | ||
bfb6c1ab NC |
946 | /* A list of string version information. */ |
947 | ||
948 | typedef struct rc_ver_stringtable | |
949 | { | |
950 | /* Next item. */ | |
951 | struct rc_ver_stringtable *next; | |
952 | /* Language. */ | |
953 | unichar *language; | |
954 | /* Strings. */ | |
955 | struct rc_ver_stringinfo *strings; | |
956 | } rc_ver_stringtable; | |
957 | ||
4a594fce NC |
958 | /* A list of variable version information. */ |
959 | ||
960 | typedef struct rc_ver_info | |
961 | { | |
962 | /* Next item. */ | |
963 | struct rc_ver_info *next; | |
964 | /* Type of data. */ | |
965 | enum { VERINFO_STRING, VERINFO_VAR } type; | |
966 | union | |
967 | { | |
968 | /* StringFileInfo data. */ | |
969 | struct | |
970 | { | |
bfb6c1ab NC |
971 | /* String tables. */ |
972 | struct rc_ver_stringtable *stringtables; | |
4a594fce NC |
973 | } string; |
974 | /* VarFileInfo data. */ | |
975 | struct | |
976 | { | |
977 | /* Key. */ | |
978 | unichar *key; | |
979 | /* Values. */ | |
980 | struct rc_ver_varinfo *var; | |
981 | } var; | |
982 | } u; | |
983 | } rc_ver_info; | |
984 | ||
985 | struct __attribute__ ((__packed__)) bin_ver_info | |
986 | { | |
987 | bfd_byte size[2]; | |
988 | bfd_byte sig1[2]; | |
989 | bfd_byte sig2[2]; | |
990 | }; | |
991 | #define BIN_VER_INFO_SIZE 6 | |
992 | ||
993 | /* A list of string version information. */ | |
994 | ||
995 | typedef struct rc_ver_stringinfo | |
996 | { | |
997 | /* Next string. */ | |
998 | struct rc_ver_stringinfo *next; | |
999 | /* Key. */ | |
1000 | unichar *key; | |
1001 | /* Value. */ | |
1002 | unichar *value; | |
1003 | } rc_ver_stringinfo; | |
1004 | ||
1005 | /* A list of variable version information. */ | |
1006 | ||
1007 | typedef struct rc_ver_varinfo | |
1008 | { | |
1009 | /* Next item. */ | |
1010 | struct rc_ver_varinfo *next; | |
1011 | /* Language ID. */ | |
1012 | rc_uint_type language; | |
1013 | /* Character set ID. */ | |
1014 | rc_uint_type charset; | |
1015 | } rc_ver_varinfo; | |
1016 | ||
1017 | typedef struct rc_toolbar_item | |
1018 | { | |
1019 | struct rc_toolbar_item *next; | |
1020 | struct rc_toolbar_item *prev; | |
1021 | rc_res_id id; | |
1022 | } rc_toolbar_item; | |
1023 | ||
1024 | struct __attribute__ ((__packed__)) bin_messagetable_item | |
1025 | { | |
1026 | bfd_byte length[2]; | |
1027 | bfd_byte flags[2]; | |
1028 | bfd_byte data[1]; | |
1029 | }; | |
1030 | #define BIN_MESSAGETABLE_ITEM_SIZE 4 | |
1031 | ||
1032 | #define MESSAGE_RESOURCE_UNICODE 0x0001 | |
1033 | ||
1034 | struct __attribute__ ((__packed__)) bin_messagetable_block | |
1035 | { | |
1036 | bfd_byte lowid[4]; | |
1037 | bfd_byte highid[4]; | |
1038 | bfd_byte offset[4]; | |
1039 | }; | |
1040 | #define BIN_MESSAGETABLE_BLOCK_SIZE 12 | |
1041 | ||
1042 | struct __attribute__ ((__packed__)) bin_messagetable | |
1043 | { | |
1044 | bfd_byte cblocks[4]; | |
1045 | struct bin_messagetable_block items[1]; | |
1046 | }; | |
1047 | #define BIN_MESSAGETABLE_SIZE 8 | |
1048 | ||
1049 | typedef struct rc_toolbar | |
1050 | { | |
1051 | rc_uint_type button_width; | |
1052 | rc_uint_type button_height; | |
1053 | rc_uint_type nitems; | |
1054 | rc_toolbar_item *items; | |
1055 | } rc_toolbar; | |
1056 | ||
1057 | struct __attribute__ ((__packed__)) bin_toolbar | |
1058 | { | |
1059 | bfd_byte button_width[4]; | |
1060 | bfd_byte button_height[4]; | |
1061 | bfd_byte nitems[4]; | |
1062 | /* { bfd_byte id[4]; } * nitems; */ | |
1063 | }; | |
1064 | #define BIN_TOOLBAR_SIZE 12 | |
1065 | ||
1066 | extern int target_is_bigendian; | |
1067 | ||
1068 | typedef struct windres_bfd | |
1069 | { | |
1070 | bfd *abfd; | |
1071 | asection *sec; | |
1072 | rc_uint_type kind : 4; | |
1073 | } windres_bfd; | |
1074 | ||
1075 | #define WR_KIND_TARGET 0 | |
1076 | #define WR_KIND_BFD 1 | |
1077 | #define WR_KIND_BFD_BIN_L 2 | |
1078 | #define WR_KIND_BFD_BIN_B 3 | |
1079 | ||
1080 | #define WR_KIND(PTR) (PTR)->kind | |
1081 | #define WR_SECTION(PTR) (PTR)->sec | |
1082 | #define WR_BFD(PTR) (PTR)->abfd | |
1083 | ||
1084 | extern void set_windres_bfd_content (windres_bfd *, const void *, rc_uint_type, rc_uint_type); | |
1085 | extern void get_windres_bfd_content (windres_bfd *, void *, rc_uint_type, rc_uint_type); | |
1086 | ||
1087 | extern void windres_put_8 (windres_bfd *, void *, rc_uint_type); | |
1088 | extern void windres_put_16 (windres_bfd *, void *, rc_uint_type); | |
1089 | extern void windres_put_32 (windres_bfd *, void *, rc_uint_type); | |
1090 | extern rc_uint_type windres_get_8 (windres_bfd *, const void *, rc_uint_type); | |
1091 | extern rc_uint_type windres_get_16 (windres_bfd *, const void *, rc_uint_type); | |
1092 | extern rc_uint_type windres_get_32 (windres_bfd *, const void *, rc_uint_type); | |
1093 | ||
1094 | extern void set_windres_bfd (windres_bfd *, bfd *, asection *, rc_uint_type); | |
cc643b88 | 1095 | extern void set_windres_bfd_endianness (windres_bfd *, int); |
4a594fce NC |
1096 | |
1097 | #endif |