1 /* windint.h -- internal header file for windres program. 2 Copyright (C) 1997-2016 Free Software Foundation, Inc. 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 9 the Free Software Foundation; either version 3 of the License, or 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 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 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 { 971 /* String tables. */ 972 struct rc_ver_stringtable *stringtables; 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); 1095 extern void set_windres_bfd_endianness (windres_bfd *, int); 1096 1097 #endif 1098