bfb6c1ab1e
Fix a syntax error bug when compiling rc files with the VERSIONINFO resource containing more than one language block inside a single StringFileInfo block. * windint.h (rc_ver_stringtable): New structure definition. (rc_ver_info): Use it. * rcparse.y (verstringtable): New variable. (verstringtables): New type. (verstringtables:): New rule declaration. (verblocks:): Use it. * resrc.c (append_ver_stringtable): New function. (append_ver_stringfileinfo): Update to use stringtables. * windres.h (append_ver_stringfileinfo): Update declaration. (append_ver_stringtable): New declaration. * resrc.c (write_rc_versioninfo): Update to support multiple blocks. * resbin.c (bin_to_res_version): Likewise. (res_to_bin_versioninfo): Likewise. * binutils-all\windres\version.rsd: Regenerate. * binutils-all\windres\version_cat.rsd: Regenerate. * binutils-all\windres\version_mlang.rc: Add new test. * binutils-all\windres\version_mlang.rsd: Likewise.
1099 lines
26 KiB
C
1099 lines
26 KiB
C
/* windint.h -- internal header file for windres program.
|
|
Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2011
|
|
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 int 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
|