Home | History | Annotate | Download | only in binutils
      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