blob: 4965e73febbc5dfb61858a5cea706d3bbedd2ee1 [file] [log] [blame]
/*
genidl - Generate interface defintion language listing from a
Portable Executable.
Copyright (C) 2009-2016 mingw-w64 project
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _GENIDL_TYPEINFO_H
#define _GENIDL_TYPEINFO_H
#define TYPELIB_MSFT_MAGIC 0x5446534d /**< MSFT */
#define TYPELIB_NO_INDEX (-1)
#pragma pack(push,1)
typedef struct sTypeLibMSFT {
uint32_t magic1;
uint16_t ver_major;
uint16_t ver_minor;
int32_t pos_guid; /* references into guid table. */
int32_t lcid; /* locale id */
int32_t lcid2;
uint32_t var_flags; /* syskind, 0x10:if helpfile defined, 0x100:if helpstringdll defined. */
int32_t version; /* set with SetVersion() */
int32_t flags; /* set with SetFlags() */
int32_t nr_typeinfos;
int32_t helpstring; /* position of help string in stringtable. */
int32_t helpstringcontext;
int32_t helpcontext;
int32_t nametable_count; /* number of names in name table. */
uint32_t nametable_size; /* nr of characters in name table */
int32_t name_offset; /* offset of name in name table. */
int32_t helpfile; /* position of helpfile in stringtable */
int32_t custom_data_offset; /* if -1 no custom data, else it is offset in customer data/guid offset table */
uint32_t res44; /* unknown always: 0x20 (guid hash size?) */
uint32_t res48; /* unknown always: 0x80 (name hash size?) */
int32_t dispatchpos; /* HREFTYPE to IDispatch, or -1 if no IDispatch */
int32_t nr_impinfos; /* number of impinfos */
int32_t dta[1];
} sTypeLibMSFT;
/* 0x100 set with a helpstringdll defined - in this
case the offset to the name in the stringtable
appears right after this struct, before the
typeinfo offsets */
typedef struct sSegMSFT {
uint32_t offset; /* absolute offset in file */
uint32_t length; /* length of segment */
int32_t res08; /* unknown always -1 */
int32_t res0c; /* unknown always 0x0f in the header 0x03 in the typeinfo_data */
} sSegMSFT;
typedef enum eSegMSFT {
eSegMSFT_TYPEINFO = 0, /* type information */
eSegMSFT_IMPORTINFO, /* import information */
eSegMSFT_IMPORTFILES, /* import filenames */
eSegMSFT_REFERENCES, /* references (?) */
eSegMSFT_GUIDHASH, /* hash table for guids? */
eSegMSFT_GUID, /* guid storage */
eSegMSFT_NAMEHASH, /* hash table for names */
eSegMSFT_NAME, /* name storage */
eSegMSFT_STRING, /* string storage */
eSegMSFT_TYPEDESC, /* type descriptions */
eSegMSFT_ARRAYDESC, /* array descriptions */
eSegMSFT_CUSTDATA, /* custom data */
eSegMSFT_CUSTDATAGUID, /* custom data guids */
eSegMSFT_UNKNOWN, /* ??? */
eSegMSFT_UNKNOWN2, /* ??? */
eSegMSFT_MAX
} eSegMSFT;
typedef struct sMSFT_TypeInfoBase {
int32_t typekind; /* it is the TKIND_xxx */
/* some byte alignment stuff */
uint32_t memoffset; /* points past the file, if no elements */
int32_t res2; /* zero if no element, N*0x40 */
int32_t res3; /* -1 if no element, (N-1)*0x38 */
int32_t res4; /* always? 3 */
int32_t res5; /* always? zero */
int32_t cElement; /* counts elements, HI=cVars, LO=cFuncs */
int32_t res7; /* always? zero */
int32_t res8; /* always? zero */
int32_t res9; /* always? zero */
int32_t resA; /* always? zero */
int32_t posguid; /* position in guid table */
int32_t flags; /* Typeflags */
int32_t NameOffset; /* offset in name table */
int32_t version; /* element version */
int32_t docstringoffs; /* offset of docstring in string tab */
int32_t helpstringcontext; /* */
int32_t helpcontext; /* */
int32_t oCustData; /* offset in customer data table */
int16_t cImplTypes; /* nr of implemented interfaces */
int16_t cbSizeVft; /* virtual table size, including inherits */
int32_t size; /* size in bytes, at least for structures */
/* FIXME: name of this field */
int32_t datatype1; /* position in type description table */
/* or in base interfaces */
/* if coclass: offset in reftable */
/* if interface: reference to inherited if */
int32_t datatype2; /* for interfaces: hiword is num of inherited funcs */
/* loword is num of inherited interfaces */
int32_t res18; /* always? 0 */
int32_t res19; /* always? -1 */
} sMSFT_TypeInfoBase;
typedef struct sMSFT_TypeDesc {
uint16_t kind;
uint16_t flag;
#ifdef __GNUC__
__extension__
#endif
union {
int32_t oTypeB;
int32_t oTypeD;
int32_t oArrayD;
uint32_t vt;
};
} sMSFT_TypeDesc;
typedef struct sMSFT_RefTab {
int32_t oData1;
int32_t no;
int32_t data2;
int32_t oNextRef;
} sMSFT_RefTab;
typedef struct sMSFT_CustomData {
uint16_t vt;
unsigned char dta[1];
} sMSFT_CustomData;
typedef struct sMSFT_CDGuid {
int32_t oGuid;
int32_t oData;
int32_t next; /* next offset in the table, -1 if it's the last */
} sMSFT_CDGuid;
typedef struct sMSFT_FuncParam {
uint32_t dataType;
int32_t oName;
int32_t flags;
} sMSFT_FuncParam;
typedef struct sMSFT_var {
uint16_t rlen;
uint16_t id;
uint32_t datatype;
uint32_t flags;
uint16_t varKind;
uint16_t vardescSize;
int32_t oValue;
} sMSFT_var;
typedef struct sMSFT_func {
uint16_t rlen;
uint16_t id;
uint32_t datatype;
uint32_t flags;
uint16_t vtableOffset;
uint16_t funcdescSize;
#ifdef __GNUC__
__extension__
#endif
union {
int32_t fkccic;
#ifdef __GNUC__
__extension__
#endif
struct {
uint32_t funcKind : 3;
uint32_t invokeKind : 4;
uint32_t hasCustomData : 1;
uint32_t callconv : 4;
uint32_t hasParamDefValue : 1;
uint32_t isOEntryNumeric : 1;
uint32_t hasRetvalParam : 1;
uint32_t reserved1 : 1;
uint32_t nextIndexWithSameID : 16;
} f;
};
uint16_t nrArgs;
uint16_t nrOptArgs;
uint32_t data[1];
/* sMSFT_FuncParam params[1]; */
} sMSFT_func;
typedef struct sMSFT_ImpFiles {
int32_t res1;
int32_t res2;
int32_t res3;
uint16_t flag;
unsigned char dta[1];
} sMSFT_ImpFiles;
typedef struct sMSFT_memblob {
uint32_t size;
#ifdef __GNUC__
__extension__
#endif
union {
unsigned char dta[1];
};
} sMSFT_memblob;
typedef struct sMSFT_ArrayDesc {
uint32_t vt;
uint16_t count;
uint16_t size;
uint32_t vt_offset[1];
} sMSFT_ArrayDesc;
typedef struct tagMSFT_ImpInfo {
uint16_t count;
unsigned char flags;
unsigned char tkind;
int32_t oImpFile; /* offset in the Import File table */
int32_t oGuid; /* offset in Guid table or typeinfo index (see bit 16 of flags) */
} MSFT_ImpInfo;
#pragma pack(pop)
#ifndef IMPLTYPEFLAG_FDEFAULT
#define IMPLTYPEFLAG_FDEFAULT 1
#define IMPLTYPEFLAG_FSOURCE 2
#define IMPLTYPEFLAG_FRESTRICTED 4
#define IMPLTYPEFLAG_FDEFAULTVTABLE 8
#endif
#ifndef LIBFLAG_FRESTRICTED
#define LIBFLAG_FRESTRICTED 1
#define LIBFLAG_FCONTROL 2
#define LIBFLAG_FHIDDEN 4
#define LIBFLAG_FHASDISKIMAGE 0x8
#endif
#define VARKIND_PERINSTANCE 0
#define VARKIND_STATIC 1
#define VARKIND_CONST 2
#define VARKIND_DISPATCH 3
#define SYSKIND_WIN16 0
#define SYSKIND_WIN32 1
#define SYSKIND_MAC 2
#define SYSKIND_WIN64 3
/* Function Kind */
#define FUNCTKIND_VIRTUAL 0
#define FUNCTKIND_PUREVIRTUAL 1
#define FUNCTKIND_NONVIRTUAL 2
#define FUNCTKIND_STATIC 3
#define FUNCTKIND_DISPATCH 4
/* Invoke Kind */
#define INVOKIND_FUNC 1
#define INVOKIND_PROPERTYGET 2
#define INVOKIND_PROPERTYPUT 4
#define INVOKIND_PROPERTYPUTREF 8
/* Calling convention */
#define CALLCONV_FASTCALL 0 /**< fastcall call convention */
#define CALLCONV_CDECL 1 /**< cdecl call convention */
#define CALLCONV_PASCAL 2 /**< pascal call convention */
#define CALLCONV_MACPASCAL 3
#define CALLCONV_STDCALL 4 /**< stdcall call convention */
#define CALLCONV_FPFASTCALL 5
#define CALLCONV_SYSCALL 6
#define CALLCONV_MPWCDECL 7
#define CALLCONV_MPWPASCAL 8
#define CALLCONV_MAX 9
#define DESCKIND_NONE 0
#define DESCKIND_FUNCDESC 1
#define DESCKIND_VARDESC 2
#define DESCKIND_TYPECOMP 3
#define DESCKIND_IMPLICITAPPOBJECT 4
#define DESCKIND_MAX 5
#define TKIND_ENUM 0
#define TKIND_RECORD 1
#define TKIND_MODULE 2
#define TKIND_INTERFACE 3
#define TKIND_DISPATCH 4
#define TKIND_COCLASS 5
#define TKIND_ALIAS 6
#define TKIND_UNION 7
#define TKIND_MAX 8
#define TYPEFLAG_FAPPOBJECT 1
#define TYPEFLAG_FCANCREATE 2
#define TYPEFLAG_FLICENSED 4
#define TYPEFLAG_FPREDECLID 8
#define TYPEFLAG_FHIDDEN 0x10
#define TYPEFLAG_FCONTROL 0x20
#define TYPEFLAG_FDUAL 0x40
#define TYPEFLAG_FNONEXTENSIBLE 0x80
#define TYPEFLAG_FOLEAUTOMATION 0x100
#define TYPEFLAG_FRESTRICTED 0x200
#define TYPEFLAG_FAGGREGATABLE 0x400
#define TYPEFLAG_FREPLACEABLE 0x800
#define TYPEFLAG_FDISPATCHABLE 0x1000
#define TYPEFLAG_FREVERSEBIND 0x2000
#define TYPEFLAG_FPROXY 0x4000
#define TYPE_KIND_STRUCT_EXTERN 0x10a1
#define TYPE_KIND_ENUM 0x2120
#define TYPE_KIND_STRUCT 0x2121
#define TYPE_KIND_TYPEDEF 0x2126
#define TYPE_KIND_FORWARD_STRUCT 0x2225
#define TYPE_KIND_INTERFACE 0x2234
#define TYPE_KIND_UNION 0x4221
#define TYPE_KIND_UNION_INSTRUCT 0x4227
#ifndef PARAMFLAG_FIN
#define PARAMFLAG_FIN 1
#define PARAMFLAG_FOUT 2
#define PARAMFLAG_FLCID 4
#define PARAMFLAG_FRETVAL 8
#define PARAMFLAG_FOPT 0x10
#define PARAMFLAG_FHASDEFAULT 0x20
#define PARAMFLAG_FHASCUSTDATA 0x40
#endif
#define FUNCFLAG_FRESTRICTED 0x1
#define FUNCFLAG_FSOURCE 0x2
#define FUNCFLAG_FBINDABLE 0x4
#define FUNCFLAG_FREQUESTEDIT 0x8
#define FUNCFLAG_FDISPLAYBIND 0x10
#define FUNCFLAG_FDEFAULTBIND 0x20
#define FUNCFLAG_FHIDDEN 0x40
#define FUNCFLAG_FUSESGETLASTERROR 0x80
#define FUNCFLAG_FDEFAULTCOLLELEM 0x100
#define FUNCFLAG_FUIDEFAULT 0x200
#define FUNCFLAG_FNONBROWSABLE 0x400
#define FUNCFLAG_FREPLACEABLE 0x800
#define FUNCFLAG_FIMMEDIATEBIND 0x1000
#define VARFLAG_FREADONLY 0x1
#define VARFLAG_FSOURCE 0x2
#define VARFLAG_FBINDABLE 0x4
#define VARFLAG_FREQUESTEDIT 0x8
#define VARFLAG_FDISPLAYBIND 0x10
#define VARFLAG_FDEFAULTBIND 0x20
#define VARFLAG_FHIDDEN 0x40
#define VARFLAG_FRESTRICTED 0x80
#define VARFLAG_FDEFAULTCOLLELEM 0x100
#define VARFLAG_FUIDEFAULT 0x200
#define VARFLAG_FNONBROWSABLE 0x400
#define VARFLAG_FREPLACEABLE 0x800
#define VARFLAG_FIMMEDIATEBIND 0x1000
/**
* Dumps typelib info to file
* @param[in] fp File to print to
* @param[in] dta raw typelib info
* @param[in] size size of raw typelib information
*/
void dumpInfo (FILE *fp, unsigned char *dta, size_t size);
#endif