1ed0d50c3Schristos /* windint.h -- internal header file for windres program.
2*b88e3e88Schristos    Copyright (C) 1997-2020 Free Software Foundation, Inc.
3ed0d50c3Schristos    Written by Kai Tietz, Onevision.
4ed0d50c3Schristos 
5ed0d50c3Schristos    This file is part of GNU Binutils.
6ed0d50c3Schristos 
7ed0d50c3Schristos    This program is free software; you can redistribute it and/or modify
8ed0d50c3Schristos    it under the terms of the GNU General Public License as published by
9ed0d50c3Schristos    the Free Software Foundation; either version 3 of the License, or
10ed0d50c3Schristos    (at your option) any later version.
11ed0d50c3Schristos 
12ed0d50c3Schristos    This program is distributed in the hope that it will be useful,
13ed0d50c3Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
14ed0d50c3Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15ed0d50c3Schristos    GNU General Public License for more details.
16ed0d50c3Schristos 
17ed0d50c3Schristos    You should have received a copy of the GNU General Public License
18ed0d50c3Schristos    along with this program; if not, write to the Free Software
19ed0d50c3Schristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20ed0d50c3Schristos    02110-1301, USA.  */
21ed0d50c3Schristos 
22ed0d50c3Schristos #include "winduni.h"
23ed0d50c3Schristos 
24ed0d50c3Schristos #ifndef WINDINT_H
25ed0d50c3Schristos #define WINDINT_H
26ed0d50c3Schristos 
27ed0d50c3Schristos /* Use bfd_size_type to ensure a sufficient number of bits.  */
28ed0d50c3Schristos #ifndef DEFINED_RC_UINT_TYPE
29ed0d50c3Schristos #define DEFINED_RC_UINT_TYPE
30ed0d50c3Schristos typedef bfd_size_type rc_uint_type;
31ed0d50c3Schristos #endif
32ed0d50c3Schristos 
33ed0d50c3Schristos /* Resource directory structure.  */
34ed0d50c3Schristos 
35ed0d50c3Schristos typedef struct res_hdr
36ed0d50c3Schristos {
37ed0d50c3Schristos   rc_uint_type data_size;
38ed0d50c3Schristos   rc_uint_type header_size;
39ed0d50c3Schristos } res_hdr;
40ed0d50c3Schristos 
41ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_res_hdr
42ed0d50c3Schristos {
43ed0d50c3Schristos   bfd_byte data_size[4];
44ed0d50c3Schristos   bfd_byte header_size[4];
45ed0d50c3Schristos };
46ed0d50c3Schristos #define BIN_RES_HDR_SIZE 8
47ed0d50c3Schristos 
48ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_res_id
49ed0d50c3Schristos {
50ed0d50c3Schristos   bfd_byte sig[2]; /* Has to be 0xffff for unnamed ids.  */
51ed0d50c3Schristos   bfd_byte id[2];
52ed0d50c3Schristos };
53ed0d50c3Schristos #define BIN_RES_ID  4
54ed0d50c3Schristos 
55ed0d50c3Schristos /* This structure is used when converting resource information to
56ed0d50c3Schristos    binary.  */
57ed0d50c3Schristos 
58ed0d50c3Schristos typedef struct bindata
59ed0d50c3Schristos {
60ed0d50c3Schristos   /* Next data.  */
61ed0d50c3Schristos   struct bindata *next;
62ed0d50c3Schristos   /* Length of data.  */
63ed0d50c3Schristos   rc_uint_type length;
64ed0d50c3Schristos   /* Data.  */
65ed0d50c3Schristos   bfd_byte *data;
66ed0d50c3Schristos } bindata;
67ed0d50c3Schristos 
68ed0d50c3Schristos /* This structure is used when converting resource information to
69ed0d50c3Schristos    coff.  */
70ed0d50c3Schristos typedef struct coff_res_data
71ed0d50c3Schristos {
72ed0d50c3Schristos   /* Next data.  */
73ed0d50c3Schristos   struct coff_res_data *next;
74ed0d50c3Schristos   /* Length of data.  */
75ed0d50c3Schristos   rc_uint_type length;
76ed0d50c3Schristos   /* Data.  */
77ed0d50c3Schristos   const struct rc_res_resource *res;
78ed0d50c3Schristos } coff_res_data;
79ed0d50c3Schristos 
80ed0d50c3Schristos /* We represent resources internally as a tree, similar to the tree
81ed0d50c3Schristos    used in the .rsrc section of a COFF file.  The root is a
82ed0d50c3Schristos    rc_res_directory structure.  */
83ed0d50c3Schristos 
84ed0d50c3Schristos typedef struct rc_res_directory
85ed0d50c3Schristos {
86ed0d50c3Schristos   /* Resource flags.  According to the MS docs, this is currently
87ed0d50c3Schristos      always zero.  */
88ed0d50c3Schristos   rc_uint_type characteristics;
89ed0d50c3Schristos   /* Time/date stamp.  */
90ed0d50c3Schristos   rc_uint_type time;
91ed0d50c3Schristos   /* Major version number.  */
92ed0d50c3Schristos   rc_uint_type major;
93ed0d50c3Schristos   /* Minor version number.  */
94ed0d50c3Schristos   rc_uint_type minor;
95ed0d50c3Schristos   /* Directory entries.  */
96ed0d50c3Schristos   struct rc_res_entry *entries;
97ed0d50c3Schristos } rc_res_directory;
98ed0d50c3Schristos 
99ed0d50c3Schristos /* A resource ID is stored in a rc_res_id structure.  */
100ed0d50c3Schristos 
101ed0d50c3Schristos typedef struct rc_res_id
102ed0d50c3Schristos {
103ed0d50c3Schristos   /* Non-zero if this entry has a name rather than an ID.  */
104ed0d50c3Schristos   rc_uint_type named : 1;
105ed0d50c3Schristos   union
106ed0d50c3Schristos   {
107ed0d50c3Schristos     /* If the named field is non-zero, this is the name.  */
108ed0d50c3Schristos     struct
109ed0d50c3Schristos     {
110ed0d50c3Schristos       /* Length of the name.  */
111ed0d50c3Schristos       rc_uint_type length;
112ed0d50c3Schristos       /* Pointer to the name, which is a Unicode string.  */
113ed0d50c3Schristos       unichar *name;
114ed0d50c3Schristos     } n;
115ed0d50c3Schristos     /* If the named field is zero, this is the ID.  */
116ed0d50c3Schristos     rc_uint_type id;
117ed0d50c3Schristos   } u;
118ed0d50c3Schristos } rc_res_id;
119ed0d50c3Schristos 
120ed0d50c3Schristos /* Each entry in the tree is a rc_res_entry structure.  We mix
121ed0d50c3Schristos    directories and resources because in a COFF file all entries in a
122ed0d50c3Schristos    directory are sorted together, whether the entries are
123ed0d50c3Schristos    subdirectories or resources.  */
124ed0d50c3Schristos 
125ed0d50c3Schristos typedef struct rc_res_entry
126ed0d50c3Schristos {
127ed0d50c3Schristos   /* Next entry.  */
128ed0d50c3Schristos   struct rc_res_entry *next;
129ed0d50c3Schristos   /* Resource ID.  */
130ed0d50c3Schristos   rc_res_id id;
131ed0d50c3Schristos   /* Non-zero if this entry is a subdirectory rather than a leaf.  */
132ed0d50c3Schristos   rc_uint_type subdir : 1;
133ed0d50c3Schristos   union
134ed0d50c3Schristos   {
135ed0d50c3Schristos     /* If the subdir field is non-zero, this is a pointer to the
136ed0d50c3Schristos        subdirectory.  */
137ed0d50c3Schristos     rc_res_directory *dir;
138ed0d50c3Schristos     /* If the subdir field is zero, this is a pointer to the resource
139ed0d50c3Schristos        data.  */
140ed0d50c3Schristos     struct rc_res_resource *res;
141ed0d50c3Schristos   } u;
142ed0d50c3Schristos } rc_res_entry;
143ed0d50c3Schristos 
144ed0d50c3Schristos /* Types of resources.  */
145ed0d50c3Schristos 
146ed0d50c3Schristos enum rc_res_type
147ed0d50c3Schristos {
148ed0d50c3Schristos   RES_TYPE_UNINITIALIZED,
149ed0d50c3Schristos   RES_TYPE_ACCELERATOR,
150ed0d50c3Schristos   RES_TYPE_BITMAP,
151ed0d50c3Schristos   RES_TYPE_CURSOR,
152ed0d50c3Schristos   RES_TYPE_GROUP_CURSOR,
153ed0d50c3Schristos   RES_TYPE_DIALOG,
154ed0d50c3Schristos   RES_TYPE_FONT,
155ed0d50c3Schristos   RES_TYPE_FONTDIR,
156ed0d50c3Schristos   RES_TYPE_ICON,
157ed0d50c3Schristos   RES_TYPE_GROUP_ICON,
158ed0d50c3Schristos   RES_TYPE_MENU,
159ed0d50c3Schristos   RES_TYPE_MESSAGETABLE,
160ed0d50c3Schristos   RES_TYPE_RCDATA,
161ed0d50c3Schristos   RES_TYPE_STRINGTABLE,
162ed0d50c3Schristos   RES_TYPE_USERDATA,
163ed0d50c3Schristos   RES_TYPE_VERSIONINFO,
164ed0d50c3Schristos   RES_TYPE_DLGINCLUDE,
165ed0d50c3Schristos   RES_TYPE_PLUGPLAY,
166ed0d50c3Schristos   RES_TYPE_VXD,
167ed0d50c3Schristos   RES_TYPE_ANICURSOR,
168ed0d50c3Schristos   RES_TYPE_ANIICON,
169ed0d50c3Schristos   RES_TYPE_DLGINIT,
170ed0d50c3Schristos   RES_TYPE_TOOLBAR
171ed0d50c3Schristos };
172ed0d50c3Schristos 
173ed0d50c3Schristos /* A res file and a COFF file store information differently.  The
174ed0d50c3Schristos    res_info structures holds data which in a res file is stored with
175ed0d50c3Schristos    each resource, but in a COFF file is stored elsewhere.  */
176ed0d50c3Schristos 
177ed0d50c3Schristos typedef struct rc_res_res_info
178ed0d50c3Schristos {
179ed0d50c3Schristos   /* Language.  In a COFF file, the third level of the directory is
180ed0d50c3Schristos      keyed by the language, so the language of a resource is defined
181ed0d50c3Schristos      by its location in the resource tree.  */
182ed0d50c3Schristos   rc_uint_type language;
183ed0d50c3Schristos   /* Characteristics of the resource.  Entirely user defined.  In a
184ed0d50c3Schristos      COFF file, the rc_res_directory structure has a characteristics
185ed0d50c3Schristos      field, but I don't know if it's related to the one in the res
186ed0d50c3Schristos      file.  */
187ed0d50c3Schristos   rc_uint_type characteristics;
188ed0d50c3Schristos   /* Version of the resource.  Entirely user defined.  In a COFF file,
189ed0d50c3Schristos      the rc_res_directory structure has a characteristics field, but I
190ed0d50c3Schristos      don't know if it's related to the one in the res file.  */
191ed0d50c3Schristos   rc_uint_type version;
192ed0d50c3Schristos   /* Memory flags.  This is a combination of the MEMFLAG values
193ed0d50c3Schristos      defined below.  Most of these values are historical, and are not
194ed0d50c3Schristos      meaningful for win32.  I don't think there is any way to store
195ed0d50c3Schristos      this information in a COFF file.  */
196ed0d50c3Schristos   rc_uint_type memflags;
197ed0d50c3Schristos } rc_res_res_info;
198ed0d50c3Schristos 
199ed0d50c3Schristos /* Binary layout of rc_res_info.  */
200ed0d50c3Schristos 
201ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_res_info
202ed0d50c3Schristos {
203ed0d50c3Schristos   bfd_byte version[4];
204ed0d50c3Schristos   bfd_byte memflags[2];
205ed0d50c3Schristos   bfd_byte language[2];
206ed0d50c3Schristos   bfd_byte version2[4];
207ed0d50c3Schristos   bfd_byte characteristics[4];
208ed0d50c3Schristos };
209ed0d50c3Schristos #define BIN_RES_INFO_SIZE 16
210ed0d50c3Schristos 
211ed0d50c3Schristos /* Each resource in a COFF file has some information which can does
212ed0d50c3Schristos    not appear in a res file.  */
213ed0d50c3Schristos 
214ed0d50c3Schristos typedef struct rc_res_coff_info
215ed0d50c3Schristos {
216ed0d50c3Schristos   /* The code page used for the data.  I don't really know what this
217ed0d50c3Schristos      should be.  It has something todo with ASCII to Unicode encoding.  */
218ed0d50c3Schristos   rc_uint_type codepage;
219ed0d50c3Schristos   /* A resource entry in a COFF file has a reserved field, which we
220ed0d50c3Schristos      record here when reading a COFF file.  When writing a COFF file,
221ed0d50c3Schristos      we set this field to zero.  */
222ed0d50c3Schristos   rc_uint_type reserved;
223ed0d50c3Schristos } rc_res_coff_info;
224ed0d50c3Schristos 
225ed0d50c3Schristos /* Resource data is stored in a rc_res_resource structure.  */
226ed0d50c3Schristos 
227ed0d50c3Schristos typedef struct rc_res_resource
228ed0d50c3Schristos {
229ed0d50c3Schristos   /* The type of resource.  */
230ed0d50c3Schristos   enum rc_res_type type;
231ed0d50c3Schristos   /* The data for the resource.  */
232ed0d50c3Schristos   union
233ed0d50c3Schristos   {
234ed0d50c3Schristos     struct
235ed0d50c3Schristos     {
236ed0d50c3Schristos       rc_uint_type length;
237ed0d50c3Schristos       const bfd_byte *data;
238ed0d50c3Schristos     } data;
239ed0d50c3Schristos     struct rc_accelerator *acc;
240ed0d50c3Schristos     struct rc_cursor *cursor;
241ed0d50c3Schristos     struct rc_group_cursor *group_cursor;
242ed0d50c3Schristos     struct rc_dialog *dialog;
243ed0d50c3Schristos     struct rc_fontdir *fontdir;
244ed0d50c3Schristos     struct rc_group_icon *group_icon;
245ed0d50c3Schristos     struct rc_menu *menu;
246ed0d50c3Schristos     struct rc_rcdata_item *rcdata;
247ed0d50c3Schristos     struct rc_stringtable *stringtable;
248ed0d50c3Schristos     struct rc_rcdata_item *userdata;
249ed0d50c3Schristos     struct rc_versioninfo *versioninfo;
250ed0d50c3Schristos     struct rc_toolbar *toolbar;
251ed0d50c3Schristos   } u;
252ed0d50c3Schristos   /* Information from a res file.  */
253ed0d50c3Schristos   struct rc_res_res_info res_info;
254ed0d50c3Schristos   /* Information from a COFF file.  */
255ed0d50c3Schristos   rc_res_coff_info coff_info;
256ed0d50c3Schristos } rc_res_resource;
257ed0d50c3Schristos 
258ed0d50c3Schristos #define SUBLANG_SHIFT 10
259ed0d50c3Schristos 
260ed0d50c3Schristos /* Memory flags in the memflags field of a rc_res_resource.  */
261ed0d50c3Schristos 
262ed0d50c3Schristos #define MEMFLAG_MOVEABLE	0x10
263ed0d50c3Schristos #define MEMFLAG_PURE		0x20
264ed0d50c3Schristos #define MEMFLAG_PRELOAD		0x40
265ed0d50c3Schristos #define MEMFLAG_DISCARDABLE	0x1000
266ed0d50c3Schristos 
267ed0d50c3Schristos /* Standard resource type codes.  These are used in the ID field of a
268ed0d50c3Schristos    rc_res_entry structure.  */
269ed0d50c3Schristos 
270ed0d50c3Schristos #define RT_CURSOR		 1
271ed0d50c3Schristos #define RT_BITMAP		 2
272ed0d50c3Schristos #define RT_ICON			 3
273ed0d50c3Schristos #define RT_MENU			 4
274ed0d50c3Schristos #define RT_DIALOG		 5
275ed0d50c3Schristos #define RT_STRING		 6
276ed0d50c3Schristos #define RT_FONTDIR		 7
277ed0d50c3Schristos #define RT_FONT			 8
278ed0d50c3Schristos #define RT_ACCELERATOR		 9
279ed0d50c3Schristos #define RT_RCDATA		10
280ed0d50c3Schristos #define RT_MESSAGETABLE		11
281ed0d50c3Schristos #define RT_GROUP_CURSOR		12
282ed0d50c3Schristos #define RT_GROUP_ICON		14
283ed0d50c3Schristos #define RT_VERSION		16
284ed0d50c3Schristos #define RT_DLGINCLUDE		17
285ed0d50c3Schristos #define RT_PLUGPLAY		19
286ed0d50c3Schristos #define RT_VXD			20
287ed0d50c3Schristos #define RT_ANICURSOR		21
288ed0d50c3Schristos #define RT_ANIICON		22
289ed0d50c3Schristos #define RT_HTML			23
290ed0d50c3Schristos #define RT_MANIFEST		24
291ed0d50c3Schristos #define RT_DLGINIT		240
292ed0d50c3Schristos #define RT_TOOLBAR		241
293ed0d50c3Schristos 
294ed0d50c3Schristos /* An accelerator resource is a linked list of these structures.  */
295ed0d50c3Schristos 
296ed0d50c3Schristos typedef struct rc_accelerator
297ed0d50c3Schristos {
298ed0d50c3Schristos   /* Next accelerator.  */
299ed0d50c3Schristos   struct rc_accelerator *next;
300ed0d50c3Schristos   /* Flags.  A combination of the ACC values defined below.  */
301ed0d50c3Schristos   rc_uint_type flags;
302ed0d50c3Schristos   /* Key value.  */
303ed0d50c3Schristos   rc_uint_type key;
304ed0d50c3Schristos   /* Resource ID.  */
305ed0d50c3Schristos   rc_uint_type id;
306ed0d50c3Schristos } rc_accelerator;
307ed0d50c3Schristos 
308ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_accelerator
309ed0d50c3Schristos {
310ed0d50c3Schristos   bfd_byte flags[2];
311ed0d50c3Schristos   bfd_byte key[2];
312ed0d50c3Schristos   bfd_byte id[2];
313ed0d50c3Schristos   bfd_byte pad[2];
314ed0d50c3Schristos };
315ed0d50c3Schristos #define BIN_ACCELERATOR_SIZE  8
316ed0d50c3Schristos 
317ed0d50c3Schristos /* Accelerator flags in the flags field of a rc_accelerator.
318ed0d50c3Schristos    These are the same values that appear in a res file.  I hope.  */
319ed0d50c3Schristos 
320ed0d50c3Schristos #define ACC_VIRTKEY	0x01
321ed0d50c3Schristos #define ACC_NOINVERT	0x02
322ed0d50c3Schristos #define ACC_SHIFT	0x04
323ed0d50c3Schristos #define ACC_CONTROL	0x08
324ed0d50c3Schristos #define ACC_ALT		0x10
325ed0d50c3Schristos #define ACC_LAST	0x80
326ed0d50c3Schristos 
327ed0d50c3Schristos /* A cursor resource.  */
328ed0d50c3Schristos 
329ed0d50c3Schristos typedef struct rc_cursor
330ed0d50c3Schristos {
331ed0d50c3Schristos   /* X coordinate of hotspot.  */
332ed0d50c3Schristos   bfd_signed_vma xhotspot;
333ed0d50c3Schristos   /* Y coordinate of hotspot.  */
334ed0d50c3Schristos   bfd_signed_vma yhotspot;
335ed0d50c3Schristos   /* Length of bitmap data.  */
336ed0d50c3Schristos   rc_uint_type length;
337ed0d50c3Schristos   /* Data.  */
338ed0d50c3Schristos   const bfd_byte *data;
339ed0d50c3Schristos } rc_cursor;
340ed0d50c3Schristos 
341ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_cursor
342ed0d50c3Schristos {
343ed0d50c3Schristos   bfd_byte xhotspot[2];
344ed0d50c3Schristos   bfd_byte yhotspot[2];
345ed0d50c3Schristos };
346ed0d50c3Schristos #define BIN_CURSOR_SIZE 4
347ed0d50c3Schristos 
348ed0d50c3Schristos /* A group_cursor resource is a list of rc_i_group_cursor structures.  */
349ed0d50c3Schristos 
350ed0d50c3Schristos typedef struct rc_group_cursor
351ed0d50c3Schristos {
352ed0d50c3Schristos   /* Next cursor in group.  */
353ed0d50c3Schristos   struct rc_group_cursor *next;
354ed0d50c3Schristos   /* Width.  */
355ed0d50c3Schristos   rc_uint_type width;
356ed0d50c3Schristos   /* Height.  */
357ed0d50c3Schristos   rc_uint_type height;
358ed0d50c3Schristos   /* Planes.  */
359ed0d50c3Schristos   rc_uint_type planes;
360ed0d50c3Schristos   /* Bits per pixel.  */
361ed0d50c3Schristos   rc_uint_type bits;
362ed0d50c3Schristos   /* Number of bytes in cursor resource.  */
363ed0d50c3Schristos   rc_uint_type bytes;
364ed0d50c3Schristos   /* Index of cursor resource.  */
365ed0d50c3Schristos   rc_uint_type index;
366ed0d50c3Schristos } rc_group_cursor;
367ed0d50c3Schristos 
368ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_group_cursor_item
369ed0d50c3Schristos {
370ed0d50c3Schristos   bfd_byte width[2];
371ed0d50c3Schristos   bfd_byte height[2];
372ed0d50c3Schristos   bfd_byte planes[2];
373ed0d50c3Schristos   bfd_byte bits[2];
374ed0d50c3Schristos   bfd_byte bytes[4];
375ed0d50c3Schristos   bfd_byte index[2];
376ed0d50c3Schristos };
377ed0d50c3Schristos #define BIN_GROUP_CURSOR_ITEM_SIZE 14
378ed0d50c3Schristos 
379ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_group_cursor
380ed0d50c3Schristos {
381ed0d50c3Schristos   bfd_byte sig1[2];
382ed0d50c3Schristos   bfd_byte sig2[2];
383ed0d50c3Schristos   bfd_byte nitems[2];
384ed0d50c3Schristos   /* struct bin_group_cursor_item item[nitems]; */
385ed0d50c3Schristos };
386ed0d50c3Schristos #define BIN_GROUP_CURSOR_SIZE 6
387ed0d50c3Schristos 
388ed0d50c3Schristos /* A dialog resource.  */
389ed0d50c3Schristos 
390ed0d50c3Schristos typedef struct rc_dialog
391ed0d50c3Schristos {
392ed0d50c3Schristos   /* Basic window style.  */
393ed0d50c3Schristos   unsigned int style;
394ed0d50c3Schristos   /* Extended window style.  */
395ed0d50c3Schristos   rc_uint_type exstyle;
396ed0d50c3Schristos   /* X coordinate.  */
397ed0d50c3Schristos   rc_uint_type x;
398ed0d50c3Schristos   /* Y coordinate.  */
399ed0d50c3Schristos   rc_uint_type y;
400ed0d50c3Schristos   /* Width.  */
401ed0d50c3Schristos   rc_uint_type width;
402ed0d50c3Schristos   /* Height.  */
403ed0d50c3Schristos   rc_uint_type height;
404ed0d50c3Schristos   /* Menu name.  */
405ed0d50c3Schristos   rc_res_id menu;
406ed0d50c3Schristos   /* Class name.  */
407ed0d50c3Schristos   rc_res_id class;
408ed0d50c3Schristos   /* Caption.  */
409ed0d50c3Schristos   unichar *caption;
410ed0d50c3Schristos   /* Font point size.  */
411ed0d50c3Schristos   rc_uint_type pointsize;
412ed0d50c3Schristos   /* Font name.  */
413ed0d50c3Schristos   unichar *font;
414ed0d50c3Schristos   /* Extended information for a dialogex.  */
415ed0d50c3Schristos   struct rc_dialog_ex *ex;
416ed0d50c3Schristos   /* Controls.  */
417ed0d50c3Schristos   struct rc_dialog_control *controls;
418ed0d50c3Schristos } rc_dialog;
419ed0d50c3Schristos 
420ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_dialog
421ed0d50c3Schristos {
422ed0d50c3Schristos   bfd_byte style[4];
423ed0d50c3Schristos   bfd_byte exstyle[4];
424ed0d50c3Schristos   bfd_byte off[2];
425ed0d50c3Schristos   bfd_byte x[2];
426ed0d50c3Schristos   bfd_byte y[2];
427ed0d50c3Schristos   bfd_byte width[2];
428ed0d50c3Schristos   bfd_byte height[2];
429ed0d50c3Schristos };
430ed0d50c3Schristos #define BIN_DIALOG_SIZE 18
431ed0d50c3Schristos 
432ed0d50c3Schristos /* An extended dialog has additional information.  */
433ed0d50c3Schristos 
434ed0d50c3Schristos typedef struct rc_dialog_ex
435ed0d50c3Schristos {
436ed0d50c3Schristos   /* Help ID.  */
437ed0d50c3Schristos   rc_uint_type help;
438ed0d50c3Schristos   /* Font weight.  */
439ed0d50c3Schristos   rc_uint_type weight;
440ed0d50c3Schristos   /* Whether the font is italic.  */
441ed0d50c3Schristos   bfd_byte italic;
442ed0d50c3Schristos   /* Character set.  */
443ed0d50c3Schristos   bfd_byte charset;
444ed0d50c3Schristos } rc_dialog_ex;
445ed0d50c3Schristos 
446ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_dialogex
447ed0d50c3Schristos {
448ed0d50c3Schristos   bfd_byte sig1[2];
449ed0d50c3Schristos   bfd_byte sig2[2];
450ed0d50c3Schristos   bfd_byte help[4];
451ed0d50c3Schristos   bfd_byte exstyle[4];
452ed0d50c3Schristos   bfd_byte style[4];
453ed0d50c3Schristos   bfd_byte off[2];
454ed0d50c3Schristos   bfd_byte x[2];
455ed0d50c3Schristos   bfd_byte y[2];
456ed0d50c3Schristos   bfd_byte width[2];
457ed0d50c3Schristos   bfd_byte height[2];
458ed0d50c3Schristos };
459ed0d50c3Schristos #define BIN_DIALOGEX_SIZE 26
460ed0d50c3Schristos 
461ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_dialogfont
462ed0d50c3Schristos {
463ed0d50c3Schristos   bfd_byte pointsize[2];
464ed0d50c3Schristos };
465ed0d50c3Schristos #define BIN_DIALOGFONT_SIZE 2
466ed0d50c3Schristos 
467ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_dialogexfont
468ed0d50c3Schristos {
469ed0d50c3Schristos   bfd_byte pointsize[2];
470ed0d50c3Schristos   bfd_byte weight[2];
471ed0d50c3Schristos   bfd_byte italic[1];
472ed0d50c3Schristos   bfd_byte charset[1];
473ed0d50c3Schristos };
474ed0d50c3Schristos #define BIN_DIALOGEXFONT_SIZE 6
475ed0d50c3Schristos 
476ed0d50c3Schristos /* Window style flags, from the winsup Defines.h header file.  These
477ed0d50c3Schristos    can appear in the style field of a rc_dialog or a rc_dialog_control.  */
478ed0d50c3Schristos 
479ed0d50c3Schristos #define CW_USEDEFAULT	0x80000000
480ed0d50c3Schristos #define WS_BORDER	0x800000L
481ed0d50c3Schristos #define WS_CAPTION	0xc00000L
482ed0d50c3Schristos #define WS_CHILD	0x40000000L
483ed0d50c3Schristos #define WS_CHILDWINDOW	0x40000000L
484ed0d50c3Schristos #define WS_CLIPCHILDREN	0x2000000L
485ed0d50c3Schristos #define WS_CLIPSIBLINGS	0x4000000L
486ed0d50c3Schristos #define WS_DISABLED	0x8000000L
487ed0d50c3Schristos #define WS_DLGFRAME	0x400000L
488ed0d50c3Schristos #define WS_GROUP	0x20000L
489ed0d50c3Schristos #define WS_HSCROLL	0x100000L
490ed0d50c3Schristos #define WS_ICONIC	0x20000000L
491ed0d50c3Schristos #define WS_MAXIMIZE	0x1000000L
492ed0d50c3Schristos #define WS_MAXIMIZEBOX	0x10000L
493ed0d50c3Schristos #define WS_MINIMIZE	0x20000000L
494ed0d50c3Schristos #define WS_MINIMIZEBOX	0x20000L
495ed0d50c3Schristos #define WS_OVERLAPPED	0L
496ed0d50c3Schristos #define WS_OVERLAPPEDWINDOW	0xcf0000L
497ed0d50c3Schristos #define WS_POPUP	0x80000000L
498ed0d50c3Schristos #define WS_POPUPWINDOW	0x80880000L
499ed0d50c3Schristos #define WS_SIZEBOX	0x40000L
500ed0d50c3Schristos #define WS_SYSMENU	0x80000L
501ed0d50c3Schristos #define WS_TABSTOP	0x10000L
502ed0d50c3Schristos #define WS_THICKFRAME	0x40000L
503ed0d50c3Schristos #define WS_TILED	0L
504ed0d50c3Schristos #define WS_TILEDWINDOW	0xcf0000L
505ed0d50c3Schristos #define WS_VISIBLE	0x10000000L
506ed0d50c3Schristos #define WS_VSCROLL	0x200000L
507ed0d50c3Schristos #define MDIS_ALLCHILDSTYLES	0x1
508ed0d50c3Schristos #define BS_3STATE	0x5L
509ed0d50c3Schristos #define BS_AUTO3STATE	0x6L
510ed0d50c3Schristos #define BS_AUTOCHECKBOX	0x3L
511ed0d50c3Schristos #define BS_AUTORADIOBUTTON	0x9L
512ed0d50c3Schristos #define BS_BITMAP	0x80L
513ed0d50c3Schristos #define BS_BOTTOM	0x800L
514ed0d50c3Schristos #define BS_CENTER	0x300L
515ed0d50c3Schristos #define BS_CHECKBOX	0x2L
516ed0d50c3Schristos #define BS_DEFPUSHBUTTON	0x1L
517ed0d50c3Schristos #define BS_GROUPBOX	0x7L
518ed0d50c3Schristos #define BS_ICON		0x40L
519ed0d50c3Schristos #define BS_LEFT		0x100L
520ed0d50c3Schristos #define BS_LEFTTEXT	0x20L
521ed0d50c3Schristos #define BS_MULTILINE	0x2000L
522ed0d50c3Schristos #define BS_NOTIFY	0x4000L
523ed0d50c3Schristos #define BS_OWNERDRAW	0xbL
524ed0d50c3Schristos #define BS_PUSHBOX	0xcL		/* FIXME!  What should this be?  */
525ed0d50c3Schristos #define BS_PUSHBUTTON	0L
526ed0d50c3Schristos #define BS_PUSHLIKE	0x1000L
527ed0d50c3Schristos #define BS_RADIOBUTTON	0x4L
528ed0d50c3Schristos #define BS_RIGHT	0x200L
529ed0d50c3Schristos #define BS_RIGHTBUTTON	0x20L
530ed0d50c3Schristos #define BS_TEXT		0L
531ed0d50c3Schristos #define BS_TOP		0x400L
532ed0d50c3Schristos #define BS_USERBUTTON	0x8L
533ed0d50c3Schristos #define BS_VCENTER	0xc00L
534ed0d50c3Schristos #define CBS_AUTOHSCROLL	0x40L
535ed0d50c3Schristos #define CBS_DISABLENOSCROLL	0x800L
536ed0d50c3Schristos #define CBS_DROPDOWN	0x2L
537ed0d50c3Schristos #define CBS_DROPDOWNLIST	0x3L
538ed0d50c3Schristos #define CBS_HASSTRINGS	0x200L
539ed0d50c3Schristos #define CBS_LOWERCASE	0x4000L
540ed0d50c3Schristos #define CBS_NOINTEGRALHEIGHT	0x400L
541ed0d50c3Schristos #define CBS_OEMCONVERT	0x80L
542ed0d50c3Schristos #define CBS_OWNERDRAWFIXED	0x10L
543ed0d50c3Schristos #define CBS_OWNERDRAWVARIABLE	0x20L
544ed0d50c3Schristos #define CBS_SIMPLE	0x1L
545ed0d50c3Schristos #define CBS_SORT	0x100L
546ed0d50c3Schristos #define CBS_UPPERCASE	0x2000L
547ed0d50c3Schristos #define ES_AUTOHSCROLL	0x80L
548ed0d50c3Schristos #define ES_AUTOVSCROLL	0x40L
549ed0d50c3Schristos #define ES_CENTER	0x1L
550ed0d50c3Schristos #define ES_LEFT		0L
551ed0d50c3Schristos #define ES_LOWERCASE	0x10L
552ed0d50c3Schristos #define ES_MULTILINE	0x4L
553ed0d50c3Schristos #define ES_NOHIDESEL	0x100L
554ed0d50c3Schristos #define ES_NUMBER	0x2000L
555ed0d50c3Schristos #define ES_OEMCONVERT	0x400L
556ed0d50c3Schristos #define ES_PASSWORD	0x20L
557ed0d50c3Schristos #define ES_READONLY	0x800L
558ed0d50c3Schristos #define ES_RIGHT	0x2L
559ed0d50c3Schristos #define ES_UPPERCASE	0x8L
560ed0d50c3Schristos #define ES_WANTRETURN	0x1000L
561ed0d50c3Schristos #define LBS_DISABLENOSCROLL	0x1000L
562ed0d50c3Schristos #define LBS_EXTENDEDSEL	0x800L
563ed0d50c3Schristos #define LBS_HASSTRINGS	0x40L
564ed0d50c3Schristos #define LBS_MULTICOLUMN	0x200L
565ed0d50c3Schristos #define LBS_MULTIPLESEL	0x8L
566ed0d50c3Schristos #define LBS_NODATA	0x2000L
567ed0d50c3Schristos #define LBS_NOINTEGRALHEIGHT	0x100L
568ed0d50c3Schristos #define LBS_NOREDRAW	0x4L
569ed0d50c3Schristos #define LBS_NOSEL	0x4000L
570ed0d50c3Schristos #define LBS_NOTIFY	0x1L
571ed0d50c3Schristos #define LBS_OWNERDRAWFIXED	0x10L
572ed0d50c3Schristos #define LBS_OWNERDRAWVARIABLE	0x20L
573ed0d50c3Schristos #define LBS_SORT	0x2L
574ed0d50c3Schristos #define LBS_STANDARD	0xa00003L
575ed0d50c3Schristos #define LBS_USETABSTOPS	0x80L
576ed0d50c3Schristos #define LBS_WANTKEYBOARDINPUT	0x400L
577ed0d50c3Schristos #define SBS_BOTTOMALIGN	0x4L
578ed0d50c3Schristos #define SBS_HORZ	0L
579ed0d50c3Schristos #define SBS_LEFTALIGN	0x2L
580ed0d50c3Schristos #define SBS_RIGHTALIGN	0x4L
581ed0d50c3Schristos #define SBS_SIZEBOX	0x8L
582ed0d50c3Schristos #define SBS_SIZEBOXBOTTOMRIGHTALIGN	0x4L
583ed0d50c3Schristos #define SBS_SIZEBOXTOPLEFTALIGN	0x2L
584ed0d50c3Schristos #define SBS_SIZEGRIP	0x10L
585ed0d50c3Schristos #define SBS_TOPALIGN	0x2L
586ed0d50c3Schristos #define SBS_VERT	0x1L
587ed0d50c3Schristos #define SS_BITMAP	0xeL
588ed0d50c3Schristos #define SS_BLACKFRAME	0x7L
589ed0d50c3Schristos #define SS_BLACKRECT	0x4L
590ed0d50c3Schristos #define SS_CENTER	0x1L
591ed0d50c3Schristos #define SS_CENTERIMAGE	0x200L
592ed0d50c3Schristos #define SS_ENHMETAFILE	0xfL
593ed0d50c3Schristos #define SS_ETCHEDFRAME	0x12L
594ed0d50c3Schristos #define SS_ETCHEDHORZ	0x10L
595ed0d50c3Schristos #define SS_ETCHEDVERT	0x11L
596ed0d50c3Schristos #define SS_GRAYFRAME	0x8L
597ed0d50c3Schristos #define SS_GRAYRECT	0x5L
598ed0d50c3Schristos #define SS_ICON		0x3L
599ed0d50c3Schristos #define SS_LEFT		0L
600ed0d50c3Schristos #define SS_LEFTNOWORDWRAP	0xcL
601ed0d50c3Schristos #define SS_NOPREFIX	0x80L
602ed0d50c3Schristos #define SS_NOTIFY	0x100L
603ed0d50c3Schristos #define SS_OWNERDRAW	0xdL
604ed0d50c3Schristos #define SS_REALSIZEIMAGE	0x800L
605ed0d50c3Schristos #define SS_RIGHT	0x2L
606ed0d50c3Schristos #define SS_RIGHTJUST	0x400L
607ed0d50c3Schristos #define SS_SIMPLE	0xbL
608ed0d50c3Schristos #define SS_SUNKEN	0x1000L
609ed0d50c3Schristos #define SS_USERITEM     0xaL
610ed0d50c3Schristos #define SS_WHITEFRAME	0x9L
611ed0d50c3Schristos #define SS_WHITERECT	0x6L
612ed0d50c3Schristos #define DS_3DLOOK	0x4L
613ed0d50c3Schristos #define DS_ABSALIGN	0x1L
614ed0d50c3Schristos #define DS_CENTER	0x800L
615ed0d50c3Schristos #define DS_CENTERMOUSE	0x1000L
616ed0d50c3Schristos #define DS_CONTEXTHELP	0x2000L
617ed0d50c3Schristos #define DS_CONTROL	0x400L
618ed0d50c3Schristos #define DS_FIXEDSYS	0x8L
619ed0d50c3Schristos #define DS_LOCALEDIT	0x20L
620ed0d50c3Schristos #define DS_MODALFRAME	0x80L
621ed0d50c3Schristos #define DS_NOFAILCREATE	0x10L
622ed0d50c3Schristos #define DS_NOIDLEMSG	0x100L
623ed0d50c3Schristos #define DS_SETFONT	0x40L
624ed0d50c3Schristos #define DS_SETFOREGROUND	0x200L
625ed0d50c3Schristos #define DS_SYSMODAL	0x2L
626ed0d50c3Schristos 
627ed0d50c3Schristos /* A dialog control.  */
628ed0d50c3Schristos 
629ed0d50c3Schristos typedef struct rc_dialog_control
630ed0d50c3Schristos {
631ed0d50c3Schristos   /* Next control.  */
632ed0d50c3Schristos   struct rc_dialog_control *next;
633ed0d50c3Schristos   /* ID.  */
634ed0d50c3Schristos   rc_uint_type id;
635ed0d50c3Schristos   /* Style.  */
636ed0d50c3Schristos   rc_uint_type style;
637ed0d50c3Schristos   /* Extended style.  */
638ed0d50c3Schristos   rc_uint_type exstyle;
639ed0d50c3Schristos   /* X coordinate.  */
640ed0d50c3Schristos   rc_uint_type x;
641ed0d50c3Schristos   /* Y coordinate.  */
642ed0d50c3Schristos   rc_uint_type y;
643ed0d50c3Schristos   /* Width.  */
644ed0d50c3Schristos   rc_uint_type width;
645ed0d50c3Schristos   /* Height.  */
646ed0d50c3Schristos   rc_uint_type height;
647ed0d50c3Schristos   /* Class name.  */
648ed0d50c3Schristos   rc_res_id class;
649ed0d50c3Schristos   /* Associated text.  */
650ed0d50c3Schristos   rc_res_id text;
651ed0d50c3Schristos   /* Extra data for the window procedure.  */
652ed0d50c3Schristos   struct rc_rcdata_item *data;
653ed0d50c3Schristos   /* Help ID.  Only used in an extended dialog.  */
654ed0d50c3Schristos   rc_uint_type help;
655ed0d50c3Schristos } rc_dialog_control;
656ed0d50c3Schristos 
657ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_dialog_control
658ed0d50c3Schristos {
659ed0d50c3Schristos   bfd_byte style[4];
660ed0d50c3Schristos   bfd_byte exstyle[4];
661ed0d50c3Schristos   bfd_byte x[2];
662ed0d50c3Schristos   bfd_byte y[2];
663ed0d50c3Schristos   bfd_byte width[2];
664ed0d50c3Schristos   bfd_byte height[2];
665ed0d50c3Schristos   bfd_byte id[2];
666ed0d50c3Schristos };
667ed0d50c3Schristos #define BIN_DIALOG_CONTROL_SIZE 18
668ed0d50c3Schristos 
669ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_dialogex_control
670ed0d50c3Schristos {
671ed0d50c3Schristos   bfd_byte help[4];
672ed0d50c3Schristos   bfd_byte exstyle[4];
673ed0d50c3Schristos   bfd_byte style[4];
674ed0d50c3Schristos   bfd_byte x[2];
675ed0d50c3Schristos   bfd_byte y[2];
676ed0d50c3Schristos   bfd_byte width[2];
677ed0d50c3Schristos   bfd_byte height[2];
678ed0d50c3Schristos   bfd_byte id[4];
679ed0d50c3Schristos };
680ed0d50c3Schristos #define BIN_DIALOGEX_CONTROL_SIZE 24
681ed0d50c3Schristos 
682ed0d50c3Schristos /* Control classes.  These can be used as the ID field in a rc_dialog_control.  */
683ed0d50c3Schristos 
684ed0d50c3Schristos #define CTL_BUTTON	0x80
685ed0d50c3Schristos #define CTL_EDIT	0x81
686ed0d50c3Schristos #define CTL_STATIC	0x82
687ed0d50c3Schristos #define CTL_LISTBOX	0x83
688ed0d50c3Schristos #define CTL_SCROLLBAR	0x84
689ed0d50c3Schristos #define CTL_COMBOBOX	0x85
690ed0d50c3Schristos 
691ed0d50c3Schristos /* A fontdir resource is a list of rc_fontdir.  */
692ed0d50c3Schristos 
693ed0d50c3Schristos typedef struct rc_fontdir
694ed0d50c3Schristos {
695ed0d50c3Schristos   struct rc_fontdir *next;
696ed0d50c3Schristos   /* Index of font entry.  */
697ed0d50c3Schristos   rc_uint_type index;
698ed0d50c3Schristos   /* Length of font information.  */
699ed0d50c3Schristos   rc_uint_type length;
700ed0d50c3Schristos   /* Font information.  */
701ed0d50c3Schristos   const bfd_byte *data;
702ed0d50c3Schristos } rc_fontdir;
703ed0d50c3Schristos 
704ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_fontdir_item
705ed0d50c3Schristos {
706ed0d50c3Schristos   bfd_byte index[2];
707ed0d50c3Schristos   bfd_byte header[54];
708ed0d50c3Schristos   bfd_byte device_name[1];
709ed0d50c3Schristos   /* bfd_byte face_name[]; */
710ed0d50c3Schristos };
711ed0d50c3Schristos 
712ed0d50c3Schristos /* A group_icon resource is a list of rc_group_icon.  */
713ed0d50c3Schristos 
714ed0d50c3Schristos typedef struct rc_group_icon
715ed0d50c3Schristos {
716ed0d50c3Schristos   /* Next icon in group.  */
717ed0d50c3Schristos   struct rc_group_icon *next;
718ed0d50c3Schristos   /* Width.  */
719ed0d50c3Schristos   bfd_byte width;
720ed0d50c3Schristos   /* Height.  */
721ed0d50c3Schristos   bfd_byte height;
722ed0d50c3Schristos   /* Color count.  */
723ed0d50c3Schristos   bfd_byte colors;
724ed0d50c3Schristos   /* Planes.  */
725ed0d50c3Schristos   rc_uint_type planes;
726ed0d50c3Schristos   /* Bits per pixel.  */
727ed0d50c3Schristos   rc_uint_type bits;
728ed0d50c3Schristos   /* Number of bytes in cursor resource.  */
729ed0d50c3Schristos   rc_uint_type bytes;
730ed0d50c3Schristos   /* Index of cursor resource.  */
731ed0d50c3Schristos   rc_uint_type index;
732ed0d50c3Schristos } rc_group_icon;
733ed0d50c3Schristos 
734ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_group_icon
735ed0d50c3Schristos {
736ed0d50c3Schristos   bfd_byte sig1[2];
737ed0d50c3Schristos   bfd_byte sig2[2];
738ed0d50c3Schristos   bfd_byte count[2];
739ed0d50c3Schristos };
740ed0d50c3Schristos #define BIN_GROUP_ICON_SIZE 6
741ed0d50c3Schristos 
742ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_group_icon_item
743ed0d50c3Schristos {
744ed0d50c3Schristos   bfd_byte width[1];
745ed0d50c3Schristos   bfd_byte height[1];
746ed0d50c3Schristos   bfd_byte colors[1];
747ed0d50c3Schristos   bfd_byte pad[1];
748ed0d50c3Schristos   bfd_byte planes[2];
749ed0d50c3Schristos   bfd_byte bits[2];
750ed0d50c3Schristos   bfd_byte bytes[4];
751ed0d50c3Schristos   bfd_byte index[2];
752ed0d50c3Schristos };
753ed0d50c3Schristos #define BIN_GROUP_ICON_ITEM_SIZE 14
754ed0d50c3Schristos 
755ed0d50c3Schristos /* A menu resource.  */
756ed0d50c3Schristos 
757ed0d50c3Schristos typedef struct rc_menu
758ed0d50c3Schristos {
759ed0d50c3Schristos   /* List of menuitems.  */
760ed0d50c3Schristos   struct rc_menuitem *items;
761ed0d50c3Schristos   /* Help ID.  I don't think there is any way to set this in an rc
762ed0d50c3Schristos      file, but it can appear in the binary format.  */
763ed0d50c3Schristos   rc_uint_type help;
764ed0d50c3Schristos } rc_menu;
765ed0d50c3Schristos 
766ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_menu
767ed0d50c3Schristos {
768ed0d50c3Schristos   bfd_byte sig1[2];
769ed0d50c3Schristos   bfd_byte sig2[2];
770ed0d50c3Schristos };
771ed0d50c3Schristos #define BIN_MENU_SIZE 4
772ed0d50c3Schristos 
773ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_menuex
774ed0d50c3Schristos {
775ed0d50c3Schristos   bfd_byte sig1[2];
776ed0d50c3Schristos   bfd_byte sig2[2];
777ed0d50c3Schristos   bfd_byte help[4];
778ed0d50c3Schristos };
779ed0d50c3Schristos #define BIN_MENUEX_SIZE 8
780ed0d50c3Schristos 
781ed0d50c3Schristos /* A menu resource is a list of rc_menuitem.  */
782ed0d50c3Schristos 
783ed0d50c3Schristos typedef struct rc_menuitem
784ed0d50c3Schristos {
785ed0d50c3Schristos   /* Next menu item.  */
786ed0d50c3Schristos   struct rc_menuitem *next;
787ed0d50c3Schristos   /* Type.  In a normal menu, rather than a menuex, this is the flags
788ed0d50c3Schristos      field.  */
789ed0d50c3Schristos   rc_uint_type type;
790ed0d50c3Schristos   /* State.  This is only used in a menuex.  */
791ed0d50c3Schristos   rc_uint_type state;
792ed0d50c3Schristos   /* Id.  */
793ed0d50c3Schristos   rc_uint_type id;
794ed0d50c3Schristos   /* Unicode text.  */
795ed0d50c3Schristos   unichar *text;
796ed0d50c3Schristos   /* Popup menu items for a popup.  */
797ed0d50c3Schristos   struct rc_menuitem *popup;
798ed0d50c3Schristos   /* Help ID.  This is only used in a menuex.  */
799ed0d50c3Schristos   rc_uint_type help;
800ed0d50c3Schristos } rc_menuitem;
801ed0d50c3Schristos 
802ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_menuitem
803ed0d50c3Schristos {
804ed0d50c3Schristos   bfd_byte flags[2];
805ed0d50c3Schristos   bfd_byte id[2];
806ed0d50c3Schristos };
807ed0d50c3Schristos #define BIN_MENUITEM_SIZE  4
808ed0d50c3Schristos #define BIN_MENUITEM_POPUP_SIZE  2
809ed0d50c3Schristos 
810ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_menuitemex
811ed0d50c3Schristos {
812ed0d50c3Schristos   bfd_byte type[4];
813ed0d50c3Schristos   bfd_byte state[4];
814ed0d50c3Schristos   bfd_byte id[4];
815ed0d50c3Schristos   bfd_byte flags[2];
816ed0d50c3Schristos   /* unicode text */
817ed0d50c3Schristos   /* if popup: align, bfd_byte help[4], align, bin_menuitemex[]; */
818ed0d50c3Schristos };
819ed0d50c3Schristos #define BIN_MENUITEMEX_SIZE 14
820ed0d50c3Schristos 
821ed0d50c3Schristos /* Menu item flags.  These can appear in the flags field of a rc_menuitem.  */
822ed0d50c3Schristos 
823ed0d50c3Schristos #define MENUITEM_GRAYED		0x001
824ed0d50c3Schristos #define MENUITEM_INACTIVE	0x002
825ed0d50c3Schristos #define MENUITEM_BITMAP		0x004
826ed0d50c3Schristos #define MENUITEM_OWNERDRAW	0x100
827ed0d50c3Schristos #define MENUITEM_CHECKED	0x008
828ed0d50c3Schristos #define MENUITEM_POPUP		0x010
829ed0d50c3Schristos #define MENUITEM_MENUBARBREAK	0x020
830ed0d50c3Schristos #define MENUITEM_MENUBREAK	0x040
831ed0d50c3Schristos #define MENUITEM_ENDMENU	0x080
832ed0d50c3Schristos #define MENUITEM_HELP	       0x4000
833ed0d50c3Schristos 
834ed0d50c3Schristos /* An rcdata resource is a pointer to a list of rc_rcdata_item.  */
835ed0d50c3Schristos 
836ed0d50c3Schristos typedef struct rc_rcdata_item
837ed0d50c3Schristos {
838ed0d50c3Schristos   /* Next data item.  */
839ed0d50c3Schristos   struct rc_rcdata_item *next;
840ed0d50c3Schristos   /* Type of data.  */
841ed0d50c3Schristos   enum
842ed0d50c3Schristos   {
843ed0d50c3Schristos     RCDATA_WORD,
844ed0d50c3Schristos     RCDATA_DWORD,
845ed0d50c3Schristos     RCDATA_STRING,
846ed0d50c3Schristos     RCDATA_WSTRING,
847ed0d50c3Schristos     RCDATA_BUFFER
848ed0d50c3Schristos   } type;
849ed0d50c3Schristos   union
850ed0d50c3Schristos   {
851ed0d50c3Schristos     rc_uint_type word;
852ed0d50c3Schristos     rc_uint_type dword;
853ed0d50c3Schristos     struct
854ed0d50c3Schristos     {
855ed0d50c3Schristos       rc_uint_type length;
856ed0d50c3Schristos       const char *s;
857ed0d50c3Schristos     } string;
858ed0d50c3Schristos     struct
859ed0d50c3Schristos     {
860ed0d50c3Schristos       rc_uint_type length;
861ed0d50c3Schristos       const unichar *w;
862ed0d50c3Schristos     } wstring;
863ed0d50c3Schristos     struct
864ed0d50c3Schristos     {
865ed0d50c3Schristos       rc_uint_type length;
866ed0d50c3Schristos       const bfd_byte *data;
867ed0d50c3Schristos     } buffer;
868ed0d50c3Schristos   } u;
869ed0d50c3Schristos } rc_rcdata_item;
870ed0d50c3Schristos 
871ed0d50c3Schristos /* A stringtable resource is a pointer to a rc_stringtable.  */
872ed0d50c3Schristos 
873ed0d50c3Schristos typedef struct rc_stringtable
874ed0d50c3Schristos {
875ed0d50c3Schristos   /* Each stringtable resource is a list of 16 unicode strings.  */
876ed0d50c3Schristos   struct
877ed0d50c3Schristos   {
878ed0d50c3Schristos     /* Length of string.  */
879ed0d50c3Schristos     rc_uint_type length;
880ed0d50c3Schristos     /* String data if length > 0.  */
881ed0d50c3Schristos     unichar *string;
882ed0d50c3Schristos   } strings[16];
883ed0d50c3Schristos } rc_stringtable;
884ed0d50c3Schristos 
885ed0d50c3Schristos /* A versioninfo resource points to a rc_versioninfo.  */
886ed0d50c3Schristos 
887ed0d50c3Schristos typedef struct rc_versioninfo
888ed0d50c3Schristos {
889ed0d50c3Schristos   /* Fixed version information.  */
890ed0d50c3Schristos   struct rc_fixed_versioninfo *fixed;
891ed0d50c3Schristos   /* Variable version information.  */
892ed0d50c3Schristos   struct rc_ver_info *var;
893ed0d50c3Schristos } rc_versioninfo;
894ed0d50c3Schristos 
895ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_versioninfo
896ed0d50c3Schristos {
897ed0d50c3Schristos   bfd_byte size[2];
898ed0d50c3Schristos   bfd_byte fixed_size[2];
899ed0d50c3Schristos   bfd_byte sig2[2];
900ed0d50c3Schristos };
901ed0d50c3Schristos #define BIN_VERSIONINFO_SIZE 6
902ed0d50c3Schristos 
903ed0d50c3Schristos /* The fixed portion of a versioninfo resource.  */
904ed0d50c3Schristos 
905ed0d50c3Schristos typedef struct rc_fixed_versioninfo
906ed0d50c3Schristos {
907ed0d50c3Schristos   /* The file version, which is two 32 bit integers.  */
908ed0d50c3Schristos   rc_uint_type file_version_ms;
909ed0d50c3Schristos   rc_uint_type file_version_ls;
910ed0d50c3Schristos   /* The product version, which is two 32 bit integers.  */
911ed0d50c3Schristos   rc_uint_type product_version_ms;
912ed0d50c3Schristos   rc_uint_type product_version_ls;
913ed0d50c3Schristos   /* The file flags mask.  */
914ed0d50c3Schristos   rc_uint_type file_flags_mask;
915ed0d50c3Schristos   /* The file flags.  */
916ed0d50c3Schristos   rc_uint_type file_flags;
917ed0d50c3Schristos   /* The OS type.  */
918ed0d50c3Schristos   rc_uint_type file_os;
919ed0d50c3Schristos   /* The file type.  */
920ed0d50c3Schristos   rc_uint_type file_type;
921ed0d50c3Schristos   /* The file subtype.  */
922ed0d50c3Schristos   rc_uint_type file_subtype;
923ed0d50c3Schristos   /* The date, which in Windows is two 32 bit integers.  */
924ed0d50c3Schristos   rc_uint_type file_date_ms;
925ed0d50c3Schristos   rc_uint_type file_date_ls;
926ed0d50c3Schristos } rc_fixed_versioninfo;
927ed0d50c3Schristos 
928ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_fixed_versioninfo
929ed0d50c3Schristos {
930ed0d50c3Schristos   bfd_byte sig1[4];
931ed0d50c3Schristos   bfd_byte sig2[4];
932ed0d50c3Schristos   bfd_byte file_version[4];
933ed0d50c3Schristos   bfd_byte file_version_ls[4];
934ed0d50c3Schristos   bfd_byte product_version_ms[4];
935ed0d50c3Schristos   bfd_byte product_version_ls[4];
936ed0d50c3Schristos   bfd_byte file_flags_mask[4];
937ed0d50c3Schristos   bfd_byte file_flags[4];
938ed0d50c3Schristos   bfd_byte file_os[4];
939ed0d50c3Schristos   bfd_byte file_type[4];
940ed0d50c3Schristos   bfd_byte file_subtype[4];
941ed0d50c3Schristos   bfd_byte file_date_ms[4];
942ed0d50c3Schristos   bfd_byte file_date_ls[4];
943ed0d50c3Schristos };
944ed0d50c3Schristos #define BIN_FIXED_VERSIONINFO_SIZE 52
945ed0d50c3Schristos 
946ed0d50c3Schristos /* A list of string version information.  */
947ed0d50c3Schristos 
948ed0d50c3Schristos typedef struct rc_ver_stringtable
949ed0d50c3Schristos {
950ed0d50c3Schristos   /* Next item.  */
951ed0d50c3Schristos   struct rc_ver_stringtable *next;
952ed0d50c3Schristos   /* Language.  */
953ed0d50c3Schristos   unichar *language;
954ed0d50c3Schristos   /* Strings.  */
955ed0d50c3Schristos   struct rc_ver_stringinfo *strings;
956ed0d50c3Schristos } rc_ver_stringtable;
957ed0d50c3Schristos 
958ed0d50c3Schristos /* A list of variable version information.  */
959ed0d50c3Schristos 
960ed0d50c3Schristos typedef struct rc_ver_info
961ed0d50c3Schristos {
962ed0d50c3Schristos   /* Next item.  */
963ed0d50c3Schristos   struct rc_ver_info *next;
964ed0d50c3Schristos   /* Type of data.  */
965ed0d50c3Schristos   enum { VERINFO_STRING, VERINFO_VAR } type;
966ed0d50c3Schristos   union
967ed0d50c3Schristos   {
968ed0d50c3Schristos     /* StringFileInfo data.  */
969ed0d50c3Schristos     struct
970ed0d50c3Schristos     {
971ed0d50c3Schristos       /* String tables.  */
972ed0d50c3Schristos       struct rc_ver_stringtable *stringtables;
973ed0d50c3Schristos     } string;
974ed0d50c3Schristos     /* VarFileInfo data.  */
975ed0d50c3Schristos     struct
976ed0d50c3Schristos     {
977ed0d50c3Schristos       /* Key.  */
978ed0d50c3Schristos       unichar *key;
979ed0d50c3Schristos       /* Values.  */
980ed0d50c3Schristos       struct rc_ver_varinfo *var;
981ed0d50c3Schristos     } var;
982ed0d50c3Schristos   } u;
983ed0d50c3Schristos } rc_ver_info;
984ed0d50c3Schristos 
985ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_ver_info
986ed0d50c3Schristos {
987ed0d50c3Schristos   bfd_byte size[2];
988ed0d50c3Schristos   bfd_byte sig1[2];
989ed0d50c3Schristos   bfd_byte sig2[2];
990ed0d50c3Schristos };
991ed0d50c3Schristos #define BIN_VER_INFO_SIZE 6
992ed0d50c3Schristos 
993ed0d50c3Schristos /* A list of string version information.  */
994ed0d50c3Schristos 
995ed0d50c3Schristos typedef struct rc_ver_stringinfo
996ed0d50c3Schristos {
997ed0d50c3Schristos   /* Next string.  */
998ed0d50c3Schristos   struct rc_ver_stringinfo *next;
999ed0d50c3Schristos   /* Key.  */
1000ed0d50c3Schristos   unichar *key;
1001ed0d50c3Schristos   /* Value.  */
1002ed0d50c3Schristos   unichar *value;
1003ed0d50c3Schristos } rc_ver_stringinfo;
1004ed0d50c3Schristos 
1005ed0d50c3Schristos /* A list of variable version information.  */
1006ed0d50c3Schristos 
1007ed0d50c3Schristos typedef struct rc_ver_varinfo
1008ed0d50c3Schristos {
1009ed0d50c3Schristos   /* Next item.  */
1010ed0d50c3Schristos   struct rc_ver_varinfo *next;
1011ed0d50c3Schristos   /* Language ID.  */
1012ed0d50c3Schristos   rc_uint_type language;
1013ed0d50c3Schristos   /* Character set ID.  */
1014ed0d50c3Schristos   rc_uint_type charset;
1015ed0d50c3Schristos } rc_ver_varinfo;
1016ed0d50c3Schristos 
1017ed0d50c3Schristos typedef struct rc_toolbar_item
1018ed0d50c3Schristos {
1019ed0d50c3Schristos   struct rc_toolbar_item *next;
1020ed0d50c3Schristos   struct rc_toolbar_item *prev;
1021ed0d50c3Schristos   rc_res_id id;
1022ed0d50c3Schristos } rc_toolbar_item;
1023ed0d50c3Schristos 
1024ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_messagetable_item
1025ed0d50c3Schristos {
1026ed0d50c3Schristos   bfd_byte length[2];
1027ed0d50c3Schristos   bfd_byte flags[2];
1028ed0d50c3Schristos   bfd_byte data[1];
1029ed0d50c3Schristos };
1030ed0d50c3Schristos #define BIN_MESSAGETABLE_ITEM_SIZE  4
1031ed0d50c3Schristos 
1032ed0d50c3Schristos #define MESSAGE_RESOURCE_UNICODE  0x0001
1033ed0d50c3Schristos 
1034ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_messagetable_block
1035ed0d50c3Schristos {
1036ed0d50c3Schristos   bfd_byte lowid[4];
1037ed0d50c3Schristos   bfd_byte highid[4];
1038ed0d50c3Schristos   bfd_byte offset[4];
1039ed0d50c3Schristos };
1040ed0d50c3Schristos #define BIN_MESSAGETABLE_BLOCK_SIZE 12
1041ed0d50c3Schristos 
1042ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_messagetable
1043ed0d50c3Schristos {
1044ed0d50c3Schristos   bfd_byte cblocks[4];
1045ed0d50c3Schristos   struct bin_messagetable_block items[1];
1046ed0d50c3Schristos };
1047ed0d50c3Schristos #define BIN_MESSAGETABLE_SIZE 8
1048ed0d50c3Schristos 
1049ed0d50c3Schristos typedef struct rc_toolbar
1050ed0d50c3Schristos {
1051ed0d50c3Schristos   rc_uint_type button_width;
1052ed0d50c3Schristos   rc_uint_type button_height;
1053ed0d50c3Schristos   rc_uint_type nitems;
1054ed0d50c3Schristos   rc_toolbar_item *items;
1055ed0d50c3Schristos } rc_toolbar;
1056ed0d50c3Schristos 
1057ed0d50c3Schristos struct __attribute__ ((__packed__)) bin_toolbar
1058ed0d50c3Schristos {
1059ed0d50c3Schristos   bfd_byte button_width[4];
1060ed0d50c3Schristos   bfd_byte button_height[4];
1061ed0d50c3Schristos   bfd_byte nitems[4];
1062ed0d50c3Schristos   /* { bfd_byte id[4]; } * nitems; */
1063ed0d50c3Schristos };
1064ed0d50c3Schristos #define BIN_TOOLBAR_SIZE 12
1065ed0d50c3Schristos 
1066ed0d50c3Schristos extern int target_is_bigendian;
1067ed0d50c3Schristos 
1068ed0d50c3Schristos typedef struct windres_bfd
1069ed0d50c3Schristos {
1070ed0d50c3Schristos   bfd *abfd;
1071ed0d50c3Schristos   asection *sec;
1072ed0d50c3Schristos   rc_uint_type kind : 4;
1073ed0d50c3Schristos } windres_bfd;
1074ed0d50c3Schristos 
1075ed0d50c3Schristos #define WR_KIND_TARGET	  0
1076ed0d50c3Schristos #define WR_KIND_BFD	  1
1077ed0d50c3Schristos #define WR_KIND_BFD_BIN_L 2
1078ed0d50c3Schristos #define WR_KIND_BFD_BIN_B 3
1079ed0d50c3Schristos 
1080ed0d50c3Schristos #define WR_KIND(PTR)  (PTR)->kind
1081ed0d50c3Schristos #define WR_SECTION(PTR)	(PTR)->sec
1082ed0d50c3Schristos #define WR_BFD(PTR) (PTR)->abfd
1083ed0d50c3Schristos 
1084ed0d50c3Schristos extern void set_windres_bfd_content (windres_bfd *, const void *, rc_uint_type, rc_uint_type);
1085ed0d50c3Schristos extern void get_windres_bfd_content (windres_bfd *, void *, rc_uint_type, rc_uint_type);
1086ed0d50c3Schristos 
1087ed0d50c3Schristos extern void windres_put_8 (windres_bfd *, void *, rc_uint_type);
1088ed0d50c3Schristos extern void windres_put_16 (windres_bfd *, void *, rc_uint_type);
1089ed0d50c3Schristos extern void windres_put_32 (windres_bfd *, void *, rc_uint_type);
1090ed0d50c3Schristos extern rc_uint_type windres_get_8 (windres_bfd *, const void *, rc_uint_type);
1091ed0d50c3Schristos extern rc_uint_type windres_get_16 (windres_bfd *, const void *, rc_uint_type);
1092ed0d50c3Schristos extern rc_uint_type windres_get_32 (windres_bfd *, const void *, rc_uint_type);
1093ed0d50c3Schristos 
1094ed0d50c3Schristos extern void set_windres_bfd (windres_bfd *, bfd *, asection *, rc_uint_type);
1095ed0d50c3Schristos extern void set_windres_bfd_endianness (windres_bfd *, int);
1096ed0d50c3Schristos 
1097ed0d50c3Schristos #endif
1098