1/* windint.h -- internal header file for windres program. 2 Copyright (C) 1997-2017 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 30typedef bfd_size_type rc_uint_type; 31#endif 32 33/* Resource directory structure. */ 34 35typedef struct res_hdr 36{ 37 rc_uint_type data_size; 38 rc_uint_type header_size; 39} res_hdr; 40 41struct __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 48struct __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 58typedef 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. */ 70typedef 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 84typedef 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 101typedef 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 125typedef 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 146enum 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 177typedef 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 201struct __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 214typedef 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 227typedef 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 296typedef 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 308struct __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 329typedef 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 341struct __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 350typedef 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 368struct __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 379struct __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 390typedef 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 420struct __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 434typedef 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 446struct __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 461struct __attribute__ ((__packed__)) bin_dialogfont 462{ 463 bfd_byte pointsize[2]; 464}; 465#define BIN_DIALOGFONT_SIZE 2 466 467struct __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 629typedef 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 657struct __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 669struct __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 693typedef 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 704struct __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 714typedef 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 734struct __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 742struct __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 757typedef 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 766struct __attribute__ ((__packed__)) bin_menu 767{ 768 bfd_byte sig1[2]; 769 bfd_byte sig2[2]; 770}; 771#define BIN_MENU_SIZE 4 772 773struct __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 783typedef 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 802struct __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 810struct __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 836typedef 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 873typedef 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 887typedef 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 895struct __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 905typedef 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 928struct __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 948typedef 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 960typedef 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 985struct __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 995typedef 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 1007typedef 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 1017typedef 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 1024struct __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 1034struct __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 1042struct __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 1049typedef 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 1057struct __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 1066extern int target_is_bigendian; 1067 1068typedef 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 1084extern void set_windres_bfd_content (windres_bfd *, const void *, rc_uint_type, rc_uint_type); 1085extern void get_windres_bfd_content (windres_bfd *, void *, rc_uint_type, rc_uint_type); 1086 1087extern void windres_put_8 (windres_bfd *, void *, rc_uint_type); 1088extern void windres_put_16 (windres_bfd *, void *, rc_uint_type); 1089extern void windres_put_32 (windres_bfd *, void *, rc_uint_type); 1090extern rc_uint_type windres_get_8 (windres_bfd *, const void *, rc_uint_type); 1091extern rc_uint_type windres_get_16 (windres_bfd *, const void *, rc_uint_type); 1092extern rc_uint_type windres_get_32 (windres_bfd *, const void *, rc_uint_type); 1093 1094extern void set_windres_bfd (windres_bfd *, bfd *, asection *, rc_uint_type); 1095extern void set_windres_bfd_endianness (windres_bfd *, int); 1096 1097#endif 1098