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