|  | /* 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 |