blob: 95f6242197155ee119589081fdb07e7c9e55d411 [file] [log] [blame]
/*
This Software is provided under the Zope Public License (ZPL) Version 2.1.
Copyright (c) 2009, 2010 by the mingw-w64 project
Written by Kai Tietz.
This license has been certified as open source. It has also been designated
as GPL compatible by the Free Software Foundation (FSF).
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions in source code must retain the accompanying copyright
notice, this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the accompanying
copyright notice, this list of conditions, and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
3. Names of the copyright holders must not be used to endorse or promote
products derived from this software without prior written permission
from the copyright holders.
4. The right to distribute this software or to use it for any purpose does
not give you the right to use Servicemarks (sm) or Trademarks (tm) of
the copyright holders. Use of them is covered by separate agreement
with the copyright holders.
5. If any files are modified, you must cause the modified files to carry
prominent notices stating that you changed the files and the date of
any change.
Disclaimer
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#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