blob: 7729b837e832f3b9452afb6e706b6d98a30b36e1 [file] [log] [blame]
/* 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