| /* windint.h -- internal header file for windres program. |
| Copyright (C) 1997-2024 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 |