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