| /* windint.h -- internal header file for windres program. | 
 |    Copyright (C) 1997-2023 Free Software Foundation, Inc. | 
 |    Written by Kai Tietz, Onevision. | 
 |  | 
 |    This file is part of GNU Binutils. | 
 |  | 
 |    This program is free software; you can redistribute it and/or modify | 
 |    it under the terms of the GNU General Public License as published by | 
 |    the Free Software Foundation; either version 3 of the License, or | 
 |    (at your option) any later version. | 
 |  | 
 |    This program is distributed in the hope that it will be useful, | 
 |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |    GNU General Public License for more details. | 
 |  | 
 |    You should have received a copy of the GNU General Public License | 
 |    along with this program; if not, write to the Free Software | 
 |    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA | 
 |    02110-1301, USA.  */ | 
 |  | 
 | #include "winduni.h" | 
 |  | 
 | #ifndef WINDINT_H | 
 | #define WINDINT_H | 
 |  | 
 | /* Use bfd_size_type to ensure a sufficient number of bits.  */ | 
 | #ifndef DEFINED_RC_UINT_TYPE | 
 | #define DEFINED_RC_UINT_TYPE | 
 | typedef bfd_size_type rc_uint_type; | 
 | #endif | 
 |  | 
 | /* Resource directory structure.  */ | 
 |  | 
 | typedef struct res_hdr | 
 | { | 
 |   rc_uint_type data_size; | 
 |   rc_uint_type header_size; | 
 | } res_hdr; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_res_hdr | 
 | { | 
 |   bfd_byte data_size[4]; | 
 |   bfd_byte header_size[4]; | 
 | }; | 
 | #define BIN_RES_HDR_SIZE 8 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_res_id | 
 | { | 
 |   bfd_byte sig[2]; /* Has to be 0xffff for unnamed ids.  */ | 
 |   bfd_byte id[2]; | 
 | }; | 
 | #define BIN_RES_ID  4 | 
 |  | 
 | /* This structure is used when converting resource information to | 
 |    binary.  */ | 
 |  | 
 | typedef struct bindata | 
 | { | 
 |   /* Next data.  */ | 
 |   struct bindata *next; | 
 |   /* Length of data.  */ | 
 |   rc_uint_type length; | 
 |   /* Data.  */ | 
 |   bfd_byte *data; | 
 | } bindata; | 
 |  | 
 | /* This structure is used when converting resource information to | 
 |    coff.  */ | 
 | typedef struct coff_res_data | 
 | { | 
 |   /* Next data.  */ | 
 |   struct coff_res_data *next; | 
 |   /* Length of data.  */ | 
 |   rc_uint_type length; | 
 |   /* Data.  */ | 
 |   const struct rc_res_resource *res; | 
 | } coff_res_data; | 
 |  | 
 | /* We represent resources internally as a tree, similar to the tree | 
 |    used in the .rsrc section of a COFF file.  The root is a | 
 |    rc_res_directory structure.  */ | 
 |  | 
 | typedef struct rc_res_directory | 
 | { | 
 |   /* Resource flags.  According to the MS docs, this is currently | 
 |      always zero.  */ | 
 |   rc_uint_type characteristics; | 
 |   /* Time/date stamp.  */ | 
 |   rc_uint_type time; | 
 |   /* Major version number.  */ | 
 |   rc_uint_type major; | 
 |   /* Minor version number.  */ | 
 |   rc_uint_type minor; | 
 |   /* Directory entries.  */ | 
 |   struct rc_res_entry *entries; | 
 | } rc_res_directory; | 
 |  | 
 | /* A resource ID is stored in a rc_res_id structure.  */ | 
 |  | 
 | typedef struct rc_res_id | 
 | { | 
 |   /* Non-zero if this entry has a name rather than an ID.  */ | 
 |   rc_uint_type named : 1; | 
 |   union | 
 |   { | 
 |     /* If the named field is non-zero, this is the name.  */ | 
 |     struct | 
 |     { | 
 |       /* Length of the name.  */ | 
 |       rc_uint_type length; | 
 |       /* Pointer to the name, which is a Unicode string.  */ | 
 |       unichar *name; | 
 |     } n; | 
 |     /* If the named field is zero, this is the ID.  */ | 
 |     rc_uint_type id; | 
 |   } u; | 
 | } rc_res_id; | 
 |  | 
 | /* Each entry in the tree is a rc_res_entry structure.  We mix | 
 |    directories and resources because in a COFF file all entries in a | 
 |    directory are sorted together, whether the entries are | 
 |    subdirectories or resources.  */ | 
 |  | 
 | typedef struct rc_res_entry | 
 | { | 
 |   /* Next entry.  */ | 
 |   struct rc_res_entry *next; | 
 |   /* Resource ID.  */ | 
 |   rc_res_id id; | 
 |   /* Non-zero if this entry is a subdirectory rather than a leaf.  */ | 
 |   rc_uint_type subdir : 1; | 
 |   union | 
 |   { | 
 |     /* If the subdir field is non-zero, this is a pointer to the | 
 |        subdirectory.  */ | 
 |     rc_res_directory *dir; | 
 |     /* If the subdir field is zero, this is a pointer to the resource | 
 |        data.  */ | 
 |     struct rc_res_resource *res; | 
 |   } u; | 
 | } rc_res_entry; | 
 |  | 
 | /* Types of resources.  */ | 
 |  | 
 | enum rc_res_type | 
 | { | 
 |   RES_TYPE_UNINITIALIZED, | 
 |   RES_TYPE_ACCELERATOR, | 
 |   RES_TYPE_BITMAP, | 
 |   RES_TYPE_CURSOR, | 
 |   RES_TYPE_GROUP_CURSOR, | 
 |   RES_TYPE_DIALOG, | 
 |   RES_TYPE_FONT, | 
 |   RES_TYPE_FONTDIR, | 
 |   RES_TYPE_ICON, | 
 |   RES_TYPE_GROUP_ICON, | 
 |   RES_TYPE_MENU, | 
 |   RES_TYPE_MESSAGETABLE, | 
 |   RES_TYPE_RCDATA, | 
 |   RES_TYPE_STRINGTABLE, | 
 |   RES_TYPE_USERDATA, | 
 |   RES_TYPE_VERSIONINFO, | 
 |   RES_TYPE_DLGINCLUDE, | 
 |   RES_TYPE_PLUGPLAY, | 
 |   RES_TYPE_VXD, | 
 |   RES_TYPE_ANICURSOR, | 
 |   RES_TYPE_ANIICON, | 
 |   RES_TYPE_DLGINIT, | 
 |   RES_TYPE_TOOLBAR | 
 | }; | 
 |  | 
 | /* A res file and a COFF file store information differently.  The | 
 |    res_info structures holds data which in a res file is stored with | 
 |    each resource, but in a COFF file is stored elsewhere.  */ | 
 |  | 
 | typedef struct rc_res_res_info | 
 | { | 
 |   /* Language.  In a COFF file, the third level of the directory is | 
 |      keyed by the language, so the language of a resource is defined | 
 |      by its location in the resource tree.  */ | 
 |   rc_uint_type language; | 
 |   /* Characteristics of the resource.  Entirely user defined.  In a | 
 |      COFF file, the rc_res_directory structure has a characteristics | 
 |      field, but I don't know if it's related to the one in the res | 
 |      file.  */ | 
 |   rc_uint_type characteristics; | 
 |   /* Version of the resource.  Entirely user defined.  In a COFF file, | 
 |      the rc_res_directory structure has a characteristics field, but I | 
 |      don't know if it's related to the one in the res file.  */ | 
 |   rc_uint_type version; | 
 |   /* Memory flags.  This is a combination of the MEMFLAG values | 
 |      defined below.  Most of these values are historical, and are not | 
 |      meaningful for win32.  I don't think there is any way to store | 
 |      this information in a COFF file.  */ | 
 |   rc_uint_type memflags; | 
 | } rc_res_res_info; | 
 |  | 
 | /* Binary layout of rc_res_info.  */ | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_res_info | 
 | { | 
 |   bfd_byte version[4]; | 
 |   bfd_byte memflags[2]; | 
 |   bfd_byte language[2]; | 
 |   bfd_byte version2[4]; | 
 |   bfd_byte characteristics[4]; | 
 | }; | 
 | #define BIN_RES_INFO_SIZE 16 | 
 |  | 
 | /* Each resource in a COFF file has some information which can does | 
 |    not appear in a res file.  */ | 
 |  | 
 | typedef struct rc_res_coff_info | 
 | { | 
 |   /* The code page used for the data.  I don't really know what this | 
 |      should be.  It has something todo with ASCII to Unicode encoding.  */ | 
 |   rc_uint_type codepage; | 
 |   /* A resource entry in a COFF file has a reserved field, which we | 
 |      record here when reading a COFF file.  When writing a COFF file, | 
 |      we set this field to zero.  */ | 
 |   rc_uint_type reserved; | 
 | } rc_res_coff_info; | 
 |  | 
 | /* Resource data is stored in a rc_res_resource structure.  */ | 
 |  | 
 | typedef struct rc_res_resource | 
 | { | 
 |   /* The type of resource.  */ | 
 |   enum rc_res_type type; | 
 |   /* The data for the resource.  */ | 
 |   union | 
 |   { | 
 |     struct | 
 |     { | 
 |       rc_uint_type length; | 
 |       const bfd_byte *data; | 
 |     } data; | 
 |     struct rc_accelerator *acc; | 
 |     struct rc_cursor *cursor; | 
 |     struct rc_group_cursor *group_cursor; | 
 |     struct rc_dialog *dialog; | 
 |     struct rc_fontdir *fontdir; | 
 |     struct rc_group_icon *group_icon; | 
 |     struct rc_menu *menu; | 
 |     struct rc_rcdata_item *rcdata; | 
 |     struct rc_stringtable *stringtable; | 
 |     struct rc_rcdata_item *userdata; | 
 |     struct rc_versioninfo *versioninfo; | 
 |     struct rc_toolbar *toolbar; | 
 |   } u; | 
 |   /* Information from a res file.  */ | 
 |   struct rc_res_res_info res_info; | 
 |   /* Information from a COFF file.  */ | 
 |   rc_res_coff_info coff_info; | 
 | } rc_res_resource; | 
 |  | 
 | #define SUBLANG_SHIFT 10 | 
 |  | 
 | /* Memory flags in the memflags field of a rc_res_resource.  */ | 
 |  | 
 | #define MEMFLAG_MOVEABLE	0x10 | 
 | #define MEMFLAG_PURE		0x20 | 
 | #define MEMFLAG_PRELOAD		0x40 | 
 | #define MEMFLAG_DISCARDABLE	0x1000 | 
 |  | 
 | /* Standard resource type codes.  These are used in the ID field of a | 
 |    rc_res_entry structure.  */ | 
 |  | 
 | #define RT_CURSOR		 1 | 
 | #define RT_BITMAP		 2 | 
 | #define RT_ICON			 3 | 
 | #define RT_MENU			 4 | 
 | #define RT_DIALOG		 5 | 
 | #define RT_STRING		 6 | 
 | #define RT_FONTDIR		 7 | 
 | #define RT_FONT			 8 | 
 | #define RT_ACCELERATOR		 9 | 
 | #define RT_RCDATA		10 | 
 | #define RT_MESSAGETABLE		11 | 
 | #define RT_GROUP_CURSOR		12 | 
 | #define RT_GROUP_ICON		14 | 
 | #define RT_VERSION		16 | 
 | #define RT_DLGINCLUDE		17 | 
 | #define RT_PLUGPLAY		19 | 
 | #define RT_VXD			20 | 
 | #define RT_ANICURSOR		21 | 
 | #define RT_ANIICON		22 | 
 | #define RT_HTML			23 | 
 | #define RT_MANIFEST		24 | 
 | #define RT_DLGINIT		240 | 
 | #define RT_TOOLBAR		241 | 
 |  | 
 | /* An accelerator resource is a linked list of these structures.  */ | 
 |  | 
 | typedef struct rc_accelerator | 
 | { | 
 |   /* Next accelerator.  */ | 
 |   struct rc_accelerator *next; | 
 |   /* Flags.  A combination of the ACC values defined below.  */ | 
 |   rc_uint_type flags; | 
 |   /* Key value.  */ | 
 |   rc_uint_type key; | 
 |   /* Resource ID.  */ | 
 |   rc_uint_type id; | 
 | } rc_accelerator; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_accelerator | 
 | { | 
 |   bfd_byte flags[2]; | 
 |   bfd_byte key[2]; | 
 |   bfd_byte id[2]; | 
 |   bfd_byte pad[2]; | 
 | }; | 
 | #define BIN_ACCELERATOR_SIZE  8 | 
 |  | 
 | /* Accelerator flags in the flags field of a rc_accelerator. | 
 |    These are the same values that appear in a res file.  I hope.  */ | 
 |  | 
 | #define ACC_VIRTKEY	0x01 | 
 | #define ACC_NOINVERT	0x02 | 
 | #define ACC_SHIFT	0x04 | 
 | #define ACC_CONTROL	0x08 | 
 | #define ACC_ALT		0x10 | 
 | #define ACC_LAST	0x80 | 
 |  | 
 | /* A cursor resource.  */ | 
 |  | 
 | typedef struct rc_cursor | 
 | { | 
 |   /* X coordinate of hotspot.  */ | 
 |   bfd_signed_vma xhotspot; | 
 |   /* Y coordinate of hotspot.  */ | 
 |   bfd_signed_vma yhotspot; | 
 |   /* Length of bitmap data.  */ | 
 |   rc_uint_type length; | 
 |   /* Data.  */ | 
 |   const bfd_byte *data; | 
 | } rc_cursor; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_cursor | 
 | { | 
 |   bfd_byte xhotspot[2]; | 
 |   bfd_byte yhotspot[2]; | 
 | }; | 
 | #define BIN_CURSOR_SIZE 4 | 
 |  | 
 | /* A group_cursor resource is a list of rc_i_group_cursor structures.  */ | 
 |  | 
 | typedef struct rc_group_cursor | 
 | { | 
 |   /* Next cursor in group.  */ | 
 |   struct rc_group_cursor *next; | 
 |   /* Width.  */ | 
 |   rc_uint_type width; | 
 |   /* Height.  */ | 
 |   rc_uint_type height; | 
 |   /* Planes.  */ | 
 |   rc_uint_type planes; | 
 |   /* Bits per pixel.  */ | 
 |   rc_uint_type bits; | 
 |   /* Number of bytes in cursor resource.  */ | 
 |   rc_uint_type bytes; | 
 |   /* Index of cursor resource.  */ | 
 |   rc_uint_type index; | 
 | } rc_group_cursor; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_group_cursor_item | 
 | { | 
 |   bfd_byte width[2]; | 
 |   bfd_byte height[2]; | 
 |   bfd_byte planes[2]; | 
 |   bfd_byte bits[2]; | 
 |   bfd_byte bytes[4]; | 
 |   bfd_byte index[2]; | 
 | }; | 
 | #define BIN_GROUP_CURSOR_ITEM_SIZE 14 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_group_cursor | 
 | { | 
 |   bfd_byte sig1[2]; | 
 |   bfd_byte sig2[2]; | 
 |   bfd_byte nitems[2]; | 
 |   /* struct bin_group_cursor_item item[nitems]; */ | 
 | }; | 
 | #define BIN_GROUP_CURSOR_SIZE 6 | 
 |  | 
 | /* A dialog resource.  */ | 
 |  | 
 | typedef struct rc_dialog | 
 | { | 
 |   /* Basic window style.  */ | 
 |   unsigned int style; | 
 |   /* Extended window style.  */ | 
 |   rc_uint_type exstyle; | 
 |   /* X coordinate.  */ | 
 |   rc_uint_type x; | 
 |   /* Y coordinate.  */ | 
 |   rc_uint_type y; | 
 |   /* Width.  */ | 
 |   rc_uint_type width; | 
 |   /* Height.  */ | 
 |   rc_uint_type height; | 
 |   /* Menu name.  */ | 
 |   rc_res_id menu; | 
 |   /* Class name.  */ | 
 |   rc_res_id class; | 
 |   /* Caption.  */ | 
 |   unichar *caption; | 
 |   /* Font point size.  */ | 
 |   rc_uint_type pointsize; | 
 |   /* Font name.  */ | 
 |   unichar *font; | 
 |   /* Extended information for a dialogex.  */ | 
 |   struct rc_dialog_ex *ex; | 
 |   /* Controls.  */ | 
 |   struct rc_dialog_control *controls; | 
 | } rc_dialog; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_dialog | 
 | { | 
 |   bfd_byte style[4]; | 
 |   bfd_byte exstyle[4]; | 
 |   bfd_byte off[2]; | 
 |   bfd_byte x[2]; | 
 |   bfd_byte y[2]; | 
 |   bfd_byte width[2]; | 
 |   bfd_byte height[2]; | 
 | }; | 
 | #define BIN_DIALOG_SIZE 18 | 
 |  | 
 | /* An extended dialog has additional information.  */ | 
 |  | 
 | typedef struct rc_dialog_ex | 
 | { | 
 |   /* Help ID.  */ | 
 |   rc_uint_type help; | 
 |   /* Font weight.  */ | 
 |   rc_uint_type weight; | 
 |   /* Whether the font is italic.  */ | 
 |   bfd_byte italic; | 
 |   /* Character set.  */ | 
 |   bfd_byte charset; | 
 | } rc_dialog_ex; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_dialogex | 
 | { | 
 |   bfd_byte sig1[2]; | 
 |   bfd_byte sig2[2]; | 
 |   bfd_byte help[4]; | 
 |   bfd_byte exstyle[4]; | 
 |   bfd_byte style[4]; | 
 |   bfd_byte off[2]; | 
 |   bfd_byte x[2]; | 
 |   bfd_byte y[2]; | 
 |   bfd_byte width[2]; | 
 |   bfd_byte height[2]; | 
 | }; | 
 | #define BIN_DIALOGEX_SIZE 26 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_dialogfont | 
 | { | 
 |   bfd_byte pointsize[2]; | 
 | }; | 
 | #define BIN_DIALOGFONT_SIZE 2 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_dialogexfont | 
 | { | 
 |   bfd_byte pointsize[2]; | 
 |   bfd_byte weight[2]; | 
 |   bfd_byte italic[1]; | 
 |   bfd_byte charset[1]; | 
 | }; | 
 | #define BIN_DIALOGEXFONT_SIZE 6 | 
 |  | 
 | /* Window style flags, from the winsup Defines.h header file.  These | 
 |    can appear in the style field of a rc_dialog or a rc_dialog_control.  */ | 
 |  | 
 | #define CW_USEDEFAULT	0x80000000 | 
 | #define WS_BORDER	0x800000L | 
 | #define WS_CAPTION	0xc00000L | 
 | #define WS_CHILD	0x40000000L | 
 | #define WS_CHILDWINDOW	0x40000000L | 
 | #define WS_CLIPCHILDREN	0x2000000L | 
 | #define WS_CLIPSIBLINGS	0x4000000L | 
 | #define WS_DISABLED	0x8000000L | 
 | #define WS_DLGFRAME	0x400000L | 
 | #define WS_GROUP	0x20000L | 
 | #define WS_HSCROLL	0x100000L | 
 | #define WS_ICONIC	0x20000000L | 
 | #define WS_MAXIMIZE	0x1000000L | 
 | #define WS_MAXIMIZEBOX	0x10000L | 
 | #define WS_MINIMIZE	0x20000000L | 
 | #define WS_MINIMIZEBOX	0x20000L | 
 | #define WS_OVERLAPPED	0L | 
 | #define WS_OVERLAPPEDWINDOW	0xcf0000L | 
 | #define WS_POPUP	0x80000000L | 
 | #define WS_POPUPWINDOW	0x80880000L | 
 | #define WS_SIZEBOX	0x40000L | 
 | #define WS_SYSMENU	0x80000L | 
 | #define WS_TABSTOP	0x10000L | 
 | #define WS_THICKFRAME	0x40000L | 
 | #define WS_TILED	0L | 
 | #define WS_TILEDWINDOW	0xcf0000L | 
 | #define WS_VISIBLE	0x10000000L | 
 | #define WS_VSCROLL	0x200000L | 
 | #define MDIS_ALLCHILDSTYLES	0x1 | 
 | #define BS_3STATE	0x5L | 
 | #define BS_AUTO3STATE	0x6L | 
 | #define BS_AUTOCHECKBOX	0x3L | 
 | #define BS_AUTORADIOBUTTON	0x9L | 
 | #define BS_BITMAP	0x80L | 
 | #define BS_BOTTOM	0x800L | 
 | #define BS_CENTER	0x300L | 
 | #define BS_CHECKBOX	0x2L | 
 | #define BS_DEFPUSHBUTTON	0x1L | 
 | #define BS_GROUPBOX	0x7L | 
 | #define BS_ICON		0x40L | 
 | #define BS_LEFT		0x100L | 
 | #define BS_LEFTTEXT	0x20L | 
 | #define BS_MULTILINE	0x2000L | 
 | #define BS_NOTIFY	0x4000L | 
 | #define BS_OWNERDRAW	0xbL | 
 | #define BS_PUSHBOX	0xcL		/* FIXME!  What should this be?  */ | 
 | #define BS_PUSHBUTTON	0L | 
 | #define BS_PUSHLIKE	0x1000L | 
 | #define BS_RADIOBUTTON	0x4L | 
 | #define BS_RIGHT	0x200L | 
 | #define BS_RIGHTBUTTON	0x20L | 
 | #define BS_TEXT		0L | 
 | #define BS_TOP		0x400L | 
 | #define BS_USERBUTTON	0x8L | 
 | #define BS_VCENTER	0xc00L | 
 | #define CBS_AUTOHSCROLL	0x40L | 
 | #define CBS_DISABLENOSCROLL	0x800L | 
 | #define CBS_DROPDOWN	0x2L | 
 | #define CBS_DROPDOWNLIST	0x3L | 
 | #define CBS_HASSTRINGS	0x200L | 
 | #define CBS_LOWERCASE	0x4000L | 
 | #define CBS_NOINTEGRALHEIGHT	0x400L | 
 | #define CBS_OEMCONVERT	0x80L | 
 | #define CBS_OWNERDRAWFIXED	0x10L | 
 | #define CBS_OWNERDRAWVARIABLE	0x20L | 
 | #define CBS_SIMPLE	0x1L | 
 | #define CBS_SORT	0x100L | 
 | #define CBS_UPPERCASE	0x2000L | 
 | #define ES_AUTOHSCROLL	0x80L | 
 | #define ES_AUTOVSCROLL	0x40L | 
 | #define ES_CENTER	0x1L | 
 | #define ES_LEFT		0L | 
 | #define ES_LOWERCASE	0x10L | 
 | #define ES_MULTILINE	0x4L | 
 | #define ES_NOHIDESEL	0x100L | 
 | #define ES_NUMBER	0x2000L | 
 | #define ES_OEMCONVERT	0x400L | 
 | #define ES_PASSWORD	0x20L | 
 | #define ES_READONLY	0x800L | 
 | #define ES_RIGHT	0x2L | 
 | #define ES_UPPERCASE	0x8L | 
 | #define ES_WANTRETURN	0x1000L | 
 | #define LBS_DISABLENOSCROLL	0x1000L | 
 | #define LBS_EXTENDEDSEL	0x800L | 
 | #define LBS_HASSTRINGS	0x40L | 
 | #define LBS_MULTICOLUMN	0x200L | 
 | #define LBS_MULTIPLESEL	0x8L | 
 | #define LBS_NODATA	0x2000L | 
 | #define LBS_NOINTEGRALHEIGHT	0x100L | 
 | #define LBS_NOREDRAW	0x4L | 
 | #define LBS_NOSEL	0x4000L | 
 | #define LBS_NOTIFY	0x1L | 
 | #define LBS_OWNERDRAWFIXED	0x10L | 
 | #define LBS_OWNERDRAWVARIABLE	0x20L | 
 | #define LBS_SORT	0x2L | 
 | #define LBS_STANDARD	0xa00003L | 
 | #define LBS_USETABSTOPS	0x80L | 
 | #define LBS_WANTKEYBOARDINPUT	0x400L | 
 | #define SBS_BOTTOMALIGN	0x4L | 
 | #define SBS_HORZ	0L | 
 | #define SBS_LEFTALIGN	0x2L | 
 | #define SBS_RIGHTALIGN	0x4L | 
 | #define SBS_SIZEBOX	0x8L | 
 | #define SBS_SIZEBOXBOTTOMRIGHTALIGN	0x4L | 
 | #define SBS_SIZEBOXTOPLEFTALIGN	0x2L | 
 | #define SBS_SIZEGRIP	0x10L | 
 | #define SBS_TOPALIGN	0x2L | 
 | #define SBS_VERT	0x1L | 
 | #define SS_BITMAP	0xeL | 
 | #define SS_BLACKFRAME	0x7L | 
 | #define SS_BLACKRECT	0x4L | 
 | #define SS_CENTER	0x1L | 
 | #define SS_CENTERIMAGE	0x200L | 
 | #define SS_ENHMETAFILE	0xfL | 
 | #define SS_ETCHEDFRAME	0x12L | 
 | #define SS_ETCHEDHORZ	0x10L | 
 | #define SS_ETCHEDVERT	0x11L | 
 | #define SS_GRAYFRAME	0x8L | 
 | #define SS_GRAYRECT	0x5L | 
 | #define SS_ICON		0x3L | 
 | #define SS_LEFT		0L | 
 | #define SS_LEFTNOWORDWRAP	0xcL | 
 | #define SS_NOPREFIX	0x80L | 
 | #define SS_NOTIFY	0x100L | 
 | #define SS_OWNERDRAW	0xdL | 
 | #define SS_REALSIZEIMAGE	0x800L | 
 | #define SS_RIGHT	0x2L | 
 | #define SS_RIGHTJUST	0x400L | 
 | #define SS_SIMPLE	0xbL | 
 | #define SS_SUNKEN	0x1000L | 
 | #define SS_USERITEM     0xaL | 
 | #define SS_WHITEFRAME	0x9L | 
 | #define SS_WHITERECT	0x6L | 
 | #define DS_3DLOOK	0x4L | 
 | #define DS_ABSALIGN	0x1L | 
 | #define DS_CENTER	0x800L | 
 | #define DS_CENTERMOUSE	0x1000L | 
 | #define DS_CONTEXTHELP	0x2000L | 
 | #define DS_CONTROL	0x400L | 
 | #define DS_FIXEDSYS	0x8L | 
 | #define DS_LOCALEDIT	0x20L | 
 | #define DS_MODALFRAME	0x80L | 
 | #define DS_NOFAILCREATE	0x10L | 
 | #define DS_NOIDLEMSG	0x100L | 
 | #define DS_SETFONT	0x40L | 
 | #define DS_SETFOREGROUND	0x200L | 
 | #define DS_SYSMODAL	0x2L | 
 |  | 
 | /* A dialog control.  */ | 
 |  | 
 | typedef struct rc_dialog_control | 
 | { | 
 |   /* Next control.  */ | 
 |   struct rc_dialog_control *next; | 
 |   /* ID.  */ | 
 |   rc_uint_type id; | 
 |   /* Style.  */ | 
 |   rc_uint_type style; | 
 |   /* Extended style.  */ | 
 |   rc_uint_type exstyle; | 
 |   /* X coordinate.  */ | 
 |   rc_uint_type x; | 
 |   /* Y coordinate.  */ | 
 |   rc_uint_type y; | 
 |   /* Width.  */ | 
 |   rc_uint_type width; | 
 |   /* Height.  */ | 
 |   rc_uint_type height; | 
 |   /* Class name.  */ | 
 |   rc_res_id class; | 
 |   /* Associated text.  */ | 
 |   rc_res_id text; | 
 |   /* Extra data for the window procedure.  */ | 
 |   struct rc_rcdata_item *data; | 
 |   /* Help ID.  Only used in an extended dialog.  */ | 
 |   rc_uint_type help; | 
 | } rc_dialog_control; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_dialog_control | 
 | { | 
 |   bfd_byte style[4]; | 
 |   bfd_byte exstyle[4]; | 
 |   bfd_byte x[2]; | 
 |   bfd_byte y[2]; | 
 |   bfd_byte width[2]; | 
 |   bfd_byte height[2]; | 
 |   bfd_byte id[2]; | 
 | }; | 
 | #define BIN_DIALOG_CONTROL_SIZE 18 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_dialogex_control | 
 | { | 
 |   bfd_byte help[4]; | 
 |   bfd_byte exstyle[4]; | 
 |   bfd_byte style[4]; | 
 |   bfd_byte x[2]; | 
 |   bfd_byte y[2]; | 
 |   bfd_byte width[2]; | 
 |   bfd_byte height[2]; | 
 |   bfd_byte id[4]; | 
 | }; | 
 | #define BIN_DIALOGEX_CONTROL_SIZE 24 | 
 |  | 
 | /* Control classes.  These can be used as the ID field in a rc_dialog_control.  */ | 
 |  | 
 | #define CTL_BUTTON	0x80 | 
 | #define CTL_EDIT	0x81 | 
 | #define CTL_STATIC	0x82 | 
 | #define CTL_LISTBOX	0x83 | 
 | #define CTL_SCROLLBAR	0x84 | 
 | #define CTL_COMBOBOX	0x85 | 
 |  | 
 | /* A fontdir resource is a list of rc_fontdir.  */ | 
 |  | 
 | typedef struct rc_fontdir | 
 | { | 
 |   struct rc_fontdir *next; | 
 |   /* Index of font entry.  */ | 
 |   rc_uint_type index; | 
 |   /* Length of font information.  */ | 
 |   rc_uint_type length; | 
 |   /* Font information.  */ | 
 |   const bfd_byte *data; | 
 | } rc_fontdir; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_fontdir_item | 
 | { | 
 |   bfd_byte index[2]; | 
 |   bfd_byte header[54]; | 
 |   bfd_byte device_name[1]; | 
 |   /* bfd_byte face_name[]; */ | 
 | }; | 
 |  | 
 | /* A group_icon resource is a list of rc_group_icon.  */ | 
 |  | 
 | typedef struct rc_group_icon | 
 | { | 
 |   /* Next icon in group.  */ | 
 |   struct rc_group_icon *next; | 
 |   /* Width.  */ | 
 |   bfd_byte width; | 
 |   /* Height.  */ | 
 |   bfd_byte height; | 
 |   /* Color count.  */ | 
 |   bfd_byte colors; | 
 |   /* Planes.  */ | 
 |   rc_uint_type planes; | 
 |   /* Bits per pixel.  */ | 
 |   rc_uint_type bits; | 
 |   /* Number of bytes in cursor resource.  */ | 
 |   rc_uint_type bytes; | 
 |   /* Index of cursor resource.  */ | 
 |   rc_uint_type index; | 
 | } rc_group_icon; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_group_icon | 
 | { | 
 |   bfd_byte sig1[2]; | 
 |   bfd_byte sig2[2]; | 
 |   bfd_byte count[2]; | 
 | }; | 
 | #define BIN_GROUP_ICON_SIZE 6 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_group_icon_item | 
 | { | 
 |   bfd_byte width[1]; | 
 |   bfd_byte height[1]; | 
 |   bfd_byte colors[1]; | 
 |   bfd_byte pad[1]; | 
 |   bfd_byte planes[2]; | 
 |   bfd_byte bits[2]; | 
 |   bfd_byte bytes[4]; | 
 |   bfd_byte index[2]; | 
 | }; | 
 | #define BIN_GROUP_ICON_ITEM_SIZE 14 | 
 |  | 
 | /* A menu resource.  */ | 
 |  | 
 | typedef struct rc_menu | 
 | { | 
 |   /* List of menuitems.  */ | 
 |   struct rc_menuitem *items; | 
 |   /* Help ID.  I don't think there is any way to set this in an rc | 
 |      file, but it can appear in the binary format.  */ | 
 |   rc_uint_type help; | 
 | } rc_menu; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_menu | 
 | { | 
 |   bfd_byte sig1[2]; | 
 |   bfd_byte sig2[2]; | 
 | }; | 
 | #define BIN_MENU_SIZE 4 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_menuex | 
 | { | 
 |   bfd_byte sig1[2]; | 
 |   bfd_byte sig2[2]; | 
 |   bfd_byte help[4]; | 
 | }; | 
 | #define BIN_MENUEX_SIZE 8 | 
 |  | 
 | /* A menu resource is a list of rc_menuitem.  */ | 
 |  | 
 | typedef struct rc_menuitem | 
 | { | 
 |   /* Next menu item.  */ | 
 |   struct rc_menuitem *next; | 
 |   /* Type.  In a normal menu, rather than a menuex, this is the flags | 
 |      field.  */ | 
 |   rc_uint_type type; | 
 |   /* State.  This is only used in a menuex.  */ | 
 |   rc_uint_type state; | 
 |   /* Id.  */ | 
 |   rc_uint_type id; | 
 |   /* Unicode text.  */ | 
 |   unichar *text; | 
 |   /* Popup menu items for a popup.  */ | 
 |   struct rc_menuitem *popup; | 
 |   /* Help ID.  This is only used in a menuex.  */ | 
 |   rc_uint_type help; | 
 | } rc_menuitem; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_menuitem | 
 | { | 
 |   bfd_byte flags[2]; | 
 |   bfd_byte id[2]; | 
 | }; | 
 | #define BIN_MENUITEM_SIZE  4 | 
 | #define BIN_MENUITEM_POPUP_SIZE  2 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_menuitemex | 
 | { | 
 |   bfd_byte type[4]; | 
 |   bfd_byte state[4]; | 
 |   bfd_byte id[4]; | 
 |   bfd_byte flags[2]; | 
 |   /* unicode text */ | 
 |   /* if popup: align, bfd_byte help[4], align, bin_menuitemex[]; */ | 
 | }; | 
 | #define BIN_MENUITEMEX_SIZE 14 | 
 |  | 
 | /* Menu item flags.  These can appear in the flags field of a rc_menuitem.  */ | 
 |  | 
 | #define MENUITEM_GRAYED		0x001 | 
 | #define MENUITEM_INACTIVE	0x002 | 
 | #define MENUITEM_BITMAP		0x004 | 
 | #define MENUITEM_OWNERDRAW	0x100 | 
 | #define MENUITEM_CHECKED	0x008 | 
 | #define MENUITEM_POPUP		0x010 | 
 | #define MENUITEM_MENUBARBREAK	0x020 | 
 | #define MENUITEM_MENUBREAK	0x040 | 
 | #define MENUITEM_ENDMENU	0x080 | 
 | #define MENUITEM_HELP	       0x4000 | 
 |  | 
 | /* An rcdata resource is a pointer to a list of rc_rcdata_item.  */ | 
 |  | 
 | typedef struct rc_rcdata_item | 
 | { | 
 |   /* Next data item.  */ | 
 |   struct rc_rcdata_item *next; | 
 |   /* Type of data.  */ | 
 |   enum | 
 |   { | 
 |     RCDATA_WORD, | 
 |     RCDATA_DWORD, | 
 |     RCDATA_STRING, | 
 |     RCDATA_WSTRING, | 
 |     RCDATA_BUFFER | 
 |   } type; | 
 |   union | 
 |   { | 
 |     rc_uint_type word; | 
 |     rc_uint_type dword; | 
 |     struct | 
 |     { | 
 |       rc_uint_type length; | 
 |       const char *s; | 
 |     } string; | 
 |     struct | 
 |     { | 
 |       rc_uint_type length; | 
 |       const unichar *w; | 
 |     } wstring; | 
 |     struct | 
 |     { | 
 |       rc_uint_type length; | 
 |       const bfd_byte *data; | 
 |     } buffer; | 
 |   } u; | 
 | } rc_rcdata_item; | 
 |  | 
 | /* A stringtable resource is a pointer to a rc_stringtable.  */ | 
 |  | 
 | typedef struct rc_stringtable | 
 | { | 
 |   /* Each stringtable resource is a list of 16 unicode strings.  */ | 
 |   struct | 
 |   { | 
 |     /* Length of string.  */ | 
 |     rc_uint_type length; | 
 |     /* String data if length > 0.  */ | 
 |     unichar *string; | 
 |   } strings[16]; | 
 | } rc_stringtable; | 
 |  | 
 | /* A versioninfo resource points to a rc_versioninfo.  */ | 
 |  | 
 | typedef struct rc_versioninfo | 
 | { | 
 |   /* Fixed version information.  */ | 
 |   struct rc_fixed_versioninfo *fixed; | 
 |   /* Variable version information.  */ | 
 |   struct rc_ver_info *var; | 
 | } rc_versioninfo; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_versioninfo | 
 | { | 
 |   bfd_byte size[2]; | 
 |   bfd_byte fixed_size[2]; | 
 |   bfd_byte sig2[2]; | 
 | }; | 
 | #define BIN_VERSIONINFO_SIZE 6 | 
 |  | 
 | /* The fixed portion of a versioninfo resource.  */ | 
 |  | 
 | typedef struct rc_fixed_versioninfo | 
 | { | 
 |   /* The file version, which is two 32 bit integers.  */ | 
 |   rc_uint_type file_version_ms; | 
 |   rc_uint_type file_version_ls; | 
 |   /* The product version, which is two 32 bit integers.  */ | 
 |   rc_uint_type product_version_ms; | 
 |   rc_uint_type product_version_ls; | 
 |   /* The file flags mask.  */ | 
 |   rc_uint_type file_flags_mask; | 
 |   /* The file flags.  */ | 
 |   rc_uint_type file_flags; | 
 |   /* The OS type.  */ | 
 |   rc_uint_type file_os; | 
 |   /* The file type.  */ | 
 |   rc_uint_type file_type; | 
 |   /* The file subtype.  */ | 
 |   rc_uint_type file_subtype; | 
 |   /* The date, which in Windows is two 32 bit integers.  */ | 
 |   rc_uint_type file_date_ms; | 
 |   rc_uint_type file_date_ls; | 
 | } rc_fixed_versioninfo; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_fixed_versioninfo | 
 | { | 
 |   bfd_byte sig1[4]; | 
 |   bfd_byte sig2[4]; | 
 |   bfd_byte file_version[4]; | 
 |   bfd_byte file_version_ls[4]; | 
 |   bfd_byte product_version_ms[4]; | 
 |   bfd_byte product_version_ls[4]; | 
 |   bfd_byte file_flags_mask[4]; | 
 |   bfd_byte file_flags[4]; | 
 |   bfd_byte file_os[4]; | 
 |   bfd_byte file_type[4]; | 
 |   bfd_byte file_subtype[4]; | 
 |   bfd_byte file_date_ms[4]; | 
 |   bfd_byte file_date_ls[4]; | 
 | }; | 
 | #define BIN_FIXED_VERSIONINFO_SIZE 52 | 
 |  | 
 | /* A list of string version information.  */ | 
 |  | 
 | typedef struct rc_ver_stringtable | 
 | { | 
 |   /* Next item.  */ | 
 |   struct rc_ver_stringtable *next; | 
 |   /* Language.  */ | 
 |   unichar *language; | 
 |   /* Strings.  */ | 
 |   struct rc_ver_stringinfo *strings; | 
 | } rc_ver_stringtable; | 
 |  | 
 | /* A list of variable version information.  */ | 
 |  | 
 | typedef struct rc_ver_info | 
 | { | 
 |   /* Next item.  */ | 
 |   struct rc_ver_info *next; | 
 |   /* Type of data.  */ | 
 |   enum { VERINFO_STRING, VERINFO_VAR } type; | 
 |   union | 
 |   { | 
 |     /* StringFileInfo data.  */ | 
 |     struct | 
 |     { | 
 |       /* String tables.  */ | 
 |       struct rc_ver_stringtable *stringtables; | 
 |     } string; | 
 |     /* VarFileInfo data.  */ | 
 |     struct | 
 |     { | 
 |       /* Key.  */ | 
 |       unichar *key; | 
 |       /* Values.  */ | 
 |       struct rc_ver_varinfo *var; | 
 |     } var; | 
 |   } u; | 
 | } rc_ver_info; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_ver_info | 
 | { | 
 |   bfd_byte size[2]; | 
 |   bfd_byte sig1[2]; | 
 |   bfd_byte sig2[2]; | 
 | }; | 
 | #define BIN_VER_INFO_SIZE 6 | 
 |  | 
 | /* A list of string version information.  */ | 
 |  | 
 | typedef struct rc_ver_stringinfo | 
 | { | 
 |   /* Next string.  */ | 
 |   struct rc_ver_stringinfo *next; | 
 |   /* Key.  */ | 
 |   unichar *key; | 
 |   /* Value.  */ | 
 |   unichar *value; | 
 | } rc_ver_stringinfo; | 
 |  | 
 | /* A list of variable version information.  */ | 
 |  | 
 | typedef struct rc_ver_varinfo | 
 | { | 
 |   /* Next item.  */ | 
 |   struct rc_ver_varinfo *next; | 
 |   /* Language ID.  */ | 
 |   rc_uint_type language; | 
 |   /* Character set ID.  */ | 
 |   rc_uint_type charset; | 
 | } rc_ver_varinfo; | 
 |  | 
 | typedef struct rc_toolbar_item | 
 | { | 
 |   struct rc_toolbar_item *next; | 
 |   struct rc_toolbar_item *prev; | 
 |   rc_res_id id; | 
 | } rc_toolbar_item; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_messagetable_item | 
 | { | 
 |   bfd_byte length[2]; | 
 |   bfd_byte flags[2]; | 
 |   bfd_byte data[1]; | 
 | }; | 
 | #define BIN_MESSAGETABLE_ITEM_SIZE  4 | 
 |  | 
 | #define MESSAGE_RESOURCE_UNICODE  0x0001 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_messagetable_block | 
 | { | 
 |   bfd_byte lowid[4]; | 
 |   bfd_byte highid[4]; | 
 |   bfd_byte offset[4]; | 
 | }; | 
 | #define BIN_MESSAGETABLE_BLOCK_SIZE 12 | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_messagetable | 
 | { | 
 |   bfd_byte cblocks[4]; | 
 |   struct bin_messagetable_block items[1]; | 
 | }; | 
 | #define BIN_MESSAGETABLE_SIZE 8 | 
 |  | 
 | typedef struct rc_toolbar | 
 | { | 
 |   rc_uint_type button_width; | 
 |   rc_uint_type button_height; | 
 |   rc_uint_type nitems; | 
 |   rc_toolbar_item *items; | 
 | } rc_toolbar; | 
 |  | 
 | struct __attribute__ ((__packed__)) bin_toolbar | 
 | { | 
 |   bfd_byte button_width[4]; | 
 |   bfd_byte button_height[4]; | 
 |   bfd_byte nitems[4]; | 
 |   /* { bfd_byte id[4]; } * nitems; */ | 
 | }; | 
 | #define BIN_TOOLBAR_SIZE 12 | 
 |  | 
 | extern bool target_is_bigendian; | 
 |  | 
 | typedef struct windres_bfd | 
 | { | 
 |   bfd *abfd; | 
 |   asection *sec; | 
 |   rc_uint_type kind : 4; | 
 | } windres_bfd; | 
 |  | 
 | #define WR_KIND_TARGET	  0 | 
 | #define WR_KIND_BFD	  1 | 
 | #define WR_KIND_BFD_BIN_L 2 | 
 | #define WR_KIND_BFD_BIN_B 3 | 
 |  | 
 | #define WR_KIND(PTR)  (PTR)->kind | 
 | #define WR_SECTION(PTR)	(PTR)->sec | 
 | #define WR_BFD(PTR) (PTR)->abfd | 
 |  | 
 | extern void set_windres_bfd_content (windres_bfd *, const void *, rc_uint_type, rc_uint_type); | 
 | extern void get_windres_bfd_content (windres_bfd *, void *, rc_uint_type, rc_uint_type); | 
 |  | 
 | extern void windres_put_8 (windres_bfd *, void *, rc_uint_type); | 
 | extern void windres_put_16 (windres_bfd *, void *, rc_uint_type); | 
 | extern void windres_put_32 (windres_bfd *, void *, rc_uint_type); | 
 | extern rc_uint_type windres_get_8 (windres_bfd *, const void *, rc_uint_type); | 
 | extern rc_uint_type windres_get_16 (windres_bfd *, const void *, rc_uint_type); | 
 | extern rc_uint_type windres_get_32 (windres_bfd *, const void *, rc_uint_type); | 
 |  | 
 | extern void set_windres_bfd (windres_bfd *, bfd *, asection *, rc_uint_type); | 
 | extern void set_windres_bfd_endianness (windres_bfd *, int); | 
 |  | 
 | #endif |