| /* | |
| * typelib.h internal wine data structures | |
| * used to decode typelib's | |
| * | |
| * Copyright 1999 Rein KLazes | |
| * | |
| */ | |
| #ifndef _WINE_TYPELIB_H | |
| #define _WINE_TYPELIB_H | |
| #include "oleauto.h" | |
| #define TLBMAGIC2 "MSFT" | |
| #define TLBMAGIC1 "SLTG" | |
| #define HELPDLLFLAG (0x0100) | |
| #define DO_NOT_SEEK (-1) | |
| #define HREFTYPE_INTHISFILE(href) (!((href) & 3)) | |
| #define HREFTYPE_INDEX(href) ((href) /sizeof(TLBTypeInfoBase)) | |
| typedef struct tagTLBCustData { | |
| GUID guid; | |
| VARIANT data; | |
| struct tagTLBCustData* next; | |
| } TLBCustData; | |
| /* internal Parameter data */ | |
| typedef struct tagTLBParDesc{ | |
| PCHAR Name; | |
| int ctCustData; | |
| TLBCustData * pCustData; /* linked list to cust data; */ | |
| } TLBParDesc; | |
| /* internal Function data */ | |
| typedef struct tagTLBFuncDesc{ | |
| FUNCDESC funcdesc; /* lots of info on the function and its attributes. */ | |
| PCHAR Name; /* the name of this function */ | |
| TLBParDesc *pParamDesc; /* array with name and custom data */ | |
| int helpcontext; | |
| int HelpStringContext; | |
| PCHAR HelpString; | |
| PCHAR Entry; /* if its Hiword==0, it numeric; -1 is not present*/ | |
| int ctCustData; | |
| TLBCustData * pCustData; /* linked list to cust data; */ | |
| struct tagTLBFuncDesc * next; | |
| } TLBFuncDesc; | |
| /* internal Variable data */ | |
| typedef struct tagTLBVarDesc{ | |
| VARDESC vardesc; /* lots of info on the variable and its attributes. */ | |
| PCHAR Name; /* the name of this variable */ | |
| int HelpContext; | |
| int HelpStringContext; /* fixme: where? */ | |
| PCHAR HelpString; | |
| int ctCustData; | |
| TLBCustData * pCustData;/* linked list to cust data; */ | |
| struct tagTLBVarDesc * next; | |
| } TLBVarDesc; | |
| /* data for refernced types in a coclass, or an inherited interface */ | |
| typedef struct tagTLBRefType { | |
| GUID guid; /* guid of the referenced type */ | |
| /* (important if its a imported type) */ | |
| HREFTYPE reference; | |
| int flags; | |
| int ctCustData; | |
| TLBCustData * pCustData;/* linked list to custom data; */ | |
| struct tagTLBImpLib *pImpTLInfo; | |
| struct tagTLBRefType * next; | |
| }TLBRefType; | |
| /* internal TypeInfo data */ | |
| typedef struct tagTYPEINFO { | |
| LPTYPEINFO_VTABLE lpvtbl; | |
| UINT ref; | |
| TYPEATTR TypeAttr ; /* _lots_ of type information. */ | |
| struct tagTYPELIB * pTypeLib; /* back pointer to typelib */ | |
| int index; /* index in this typelib; */ | |
| /* type libs seem to store the doc strings in ascii | |
| * so why should we do it in unicode? | |
| */ | |
| PCHAR Name; | |
| PCHAR DocString; | |
| unsigned long dwHelpContext; | |
| unsigned long dwHelpStringContext; | |
| /* functions */ | |
| TLBFuncDesc * funclist; /* linked list with function descriptions */ | |
| /* variables */ | |
| TLBVarDesc * varlist; /* linked list with variable descriptions */ | |
| /* Implemented Interfaces */ | |
| TLBRefType * impltypelist; | |
| int ctCustData; | |
| TLBCustData * pCustData; /* linked list to cust data; */ | |
| struct tagTYPEINFO * next; | |
| } TLBTypeInfo; | |
| /* data structure for import typelibs */ | |
| typedef struct tagTLBImpLib { | |
| int offset; /* offset in the file */ | |
| GUID guid; /* libid */ | |
| PCHAR name; /* name; */ | |
| struct tagTYPELIB *pImpTypeLib; /* pointer to loaded typelib */ | |
| struct tagTLBImpLib * next; | |
| } TLBImpLib; | |
| /* internal TypeLib data */ | |
| typedef struct tagTYPELIB { | |
| LPTYPELIB_VTABLE lpvtbl; | |
| UINT ref; | |
| TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */ | |
| /* type libs seem to store the doc strings in ascii | |
| * so why should we do it in unicode? | |
| */ | |
| PCHAR Name; | |
| PCHAR DocString; | |
| PCHAR HelpFile; | |
| PCHAR HelpStringDll; | |
| unsigned long dwHelpContext; | |
| int TypeInfoCount; /* nr of typeinfo's in librarry */ | |
| TLBTypeInfo *pTypeInfo; /* linked list of type info data */ | |
| int ctCustData; /* number of items in cust data list */ | |
| TLBCustData * pCustData; /* linked list to cust data; */ | |
| TLBImpLib * pImpLibs; /* linked list to all imported typelibs */ | |
| TYPEDESC * pTypeDesc; /* array of TypeDescriptions found in the libary */ | |
| } TLBLibInfo; | |
| /*-------------------------FILE STRUCTURES-----------------------------------*/ | |
| /* | |
| * structure of the typelib type2 header | |
| * it is at the beginning of a type lib file | |
| * | |
| */ | |
| typedef struct tagTLB2Header { | |
| /*0x00*/INT magic1; /* 0x5446534D "MSFT" */ | |
| INT magic2; /* 0x00010002 version nr? */ | |
| INT posguid; /* position of libid in guid table */ | |
| /* (should be, else -1) */ | |
| INT lcid; /* locale id */ | |
| /*0x10*/INT lcid2; | |
| INT varflags; /* (largely) unknown flags ,seems to be always 41 */ | |
| /* becomes 0x51 with a helpfile defined */ | |
| /* if help dll defined its 0x151 */ | |
| /* update : the lower nibble is syskind */ | |
| INT version; /* set with SetVersion() */ | |
| INT flags; /* set with SetFlags() */ | |
| /*0x20*/INT nrtypeinfos; /* number of typeinfo's (till so far) */ | |
| INT helpstring; /* position of help string in stringtable */ | |
| INT helpstringcontext; | |
| INT helpcontext; | |
| /*0x30*/INT nametablecount; /* number of names in name table */ | |
| INT nametablechars; /* nr of characters in name table */ | |
| INT NameOffset; /* offset of name in name table */ | |
| INT helpfile; /* position of helpfile in stringtable */ | |
| /*0x40*/INT CustomDataOffset; /* if -1 no custom data, else it is offset */ | |
| /* in customer data/guid offset table */ | |
| INT res44; /* unknown always: 0x20 */ | |
| INT res48; /* unknown always: 0x80 */ | |
| INT dispatchpos; /* gets a value (1+n*0x0c) with Idispatch interfaces */ | |
| /*0x50*/INT res50; /* is zero becomes one when an interface is derived */ | |
| } TLB2Header; | |
| /* segments in the type lib file have a structure like this: */ | |
| typedef struct _tptag { | |
| INT offset; /* absolute offset in file */ | |
| INT length; /* length of segment */ | |
| INT res08; /* unknown always -1 */ | |
| INT res0c; /* unknown always 0x0f in the header */ | |
| /* 0x03 in the typeinfo_data */ | |
| } pSeg; | |
| /* layout of the main segment directory */ | |
| typedef struct tagTLBSegDir { | |
| /*1*/pSeg pTypeInfoTab; /* each type info get an entry of 0x64 bytes */ | |
| /* (25 ints) */ | |
| /*2*/pSeg pImpInfo; /* table with info for imported types */ | |
| /*3*/pSeg pImpFiles; /* import libaries */ | |
| /*4*/pSeg pRefTab; /* References table */ | |
| /*5*/pSeg pLibtab; /* always exists, alway same size (0x80) */ | |
| /* hash table w offsets to guid????? */ | |
| /*6*/pSeg pGuidTab; /* all guids are stored here together with */ | |
| /* offset in some table???? */ | |
| /*7*/pSeg res07; /* always created, alway same size (0x200) */ | |
| /* purpose largely unknown */ | |
| /*8*/pSeg pNametab; /* name tables */ | |
| /*9*/pSeg pStringtab; /*string table */ | |
| /*A*/pSeg pTypdescTab; /* table with type descriptors */ | |
| /*B*/pSeg pArrayDescriptions; | |
| /*C*/pSeg pCustData; /* data table, used for custom data and default */ | |
| /* parameter values */ | |
| /*D*/pSeg pCDGuids; /* table with offsets for the guids and into the customer data table */ | |
| /*E*/pSeg res0e; /* unknown */ | |
| /*F*/pSeg res0f; /* unknown */ | |
| } TLBSegDir; | |
| /* base type info data */ | |
| typedef struct tagTLBTypeInfoBase { | |
| /*000*/ INT typekind; /* it is the TKIND_xxx */ | |
| /* some byte alignment stuf */ | |
| INT memoffset; /* points past the file, if no elements */ | |
| INT res2; /* zero if no element, N*0x40 */ | |
| INT res3; /* -1 if no lement, (N-1)*0x38 */ | |
| /*010*/ INT res4; /* always? 3 */ | |
| INT res5; /* always? zero */ | |
| INT cElement; /* counts elements, HI=cVars, LO=cFuncs */ | |
| INT res7; /* always? zero */ | |
| /*020*/ INT res8; /* always? zero */ | |
| INT res9; /* always? zero */ | |
| INT resA; /* always? zero */ | |
| INT posguid; /* position in guid table */ | |
| /*030*/ INT flags; /* Typeflags */ | |
| INT NameOffset; /* offset in name table */ | |
| INT version; /* element version */ | |
| INT docstringoffs; /* offset of docstring in string tab */ | |
| /*040*/ INT helpstringcontext; /* */ | |
| INT helpcontext; /* */ | |
| INT oCustData; /* offset in customer data table */ | |
| INT16 cImplTypes; /* nr of implemented interfaces */ | |
| INT16 cbSizeVft; /* virtual table size, not including inherits */ | |
| /*050*/ INT size; /* size in bytes, at least for structures */ | |
| /* fixme: name of this field */ | |
| INT datatype1; /* position in type description table */ | |
| /* or in base intefaces */ | |
| /* if coclass: offset in reftable */ | |
| /* if interface: reference to inherited if */ | |
| INT datatype2; /* if 0x8000, entry above is valid */ | |
| /* actually dunno */ | |
| /* else it is zero? */ | |
| INT res18; /* always? 0 */ | |
| /*060*/ INT res19; /* always? -1 */ | |
| } TLBTypeInfoBase; | |
| /* layout of an entry with information on imported types */ | |
| typedef struct tagTLBImpInfo { | |
| INT res0; /* unknown */ | |
| INT oImpFile; /* offset inthe Import File table */ | |
| INT oGuid; /* offset in Guid table */ | |
| } TLBImpInfo; | |
| /* function description data */ | |
| typedef struct { | |
| /* INT recsize; record size including some xtra stuff */ | |
| INT DataType; /* data type of the memeber, eg return of function */ | |
| INT Flags; /* something to do with attribute flags (LOWORD) */ | |
| INT16 VtableOffset; /* offset in vtable */ | |
| INT16 res3; /* some offset into dunno what */ | |
| INT FKCCIC; /* bit string with the following */ | |
| /* meaning (bit 0 is the msb): */ | |
| /* bit 2 indicates that oEntry is numeric */ | |
| /* bit 3 that parameter has default values */ | |
| /* calling convention (bits 4-7 ) */ | |
| /* bit 8 indicates that custom data is present */ | |
| /* Invokation kind (bits 9-12 ) */ | |
| /* function kind (eg virtual), bits 13-15 */ | |
| INT16 nrargs; /* number of arguments (including optional ????) */ | |
| INT16 nroargs; /* nr of optional arguments */ | |
| /* optional attribute fields, the number of them is variable */ | |
| INT OptAttr[1]; | |
| /* | |
| 0* INT helpcontext; | |
| 1* INT oHelpString; | |
| 2* INT oEntry; // either offset in string table or numeric as it is // | |
| 3* INT res9; // unknown (-1) // | |
| 4* INT resA; // unknown (-1) // | |
| 5* INT HelpStringContext; | |
| // these are controlled by a bit set in the FKCCIC field // | |
| 6* INT oCustData; // custom data for function // | |
| 7* INT oArgCustData[1]; // custom data per argument // | |
| */ | |
| } TLBFuncRecord; | |
| /* after this may follow an array with default value pointers if the | |
| * appropriate bit in the FKCCIC field has been set: | |
| * INT oDefautlValue[nrargs]; | |
| */ | |
| /* Parameter info one per argument*/ | |
| typedef struct { | |
| INT DataType; | |
| INT oName; | |
| INT Flags; | |
| } TLBParameterInfo; | |
| /* Variable description data */ | |
| typedef struct { | |
| /* INT recsize; // record size including some xtra stuff */ | |
| INT DataType; /* data type of the variable */ | |
| INT Flags; /* VarFlags (LOWORD) */ | |
| INT16 VarKind; /* VarKind */ | |
| INT16 res3; /* some offset into dunno what */ | |
| INT OffsValue; /* value of the variable or the offset */ | |
| /* in the data structure */ | |
| /* optional attribute fields, the number of them is variable */ | |
| /* controlled by record length */ | |
| INT HelpContext; | |
| INT oHelpString; | |
| INT res9; /* unknown (-1) */ | |
| INT oCustData; /* custom data for variable */ | |
| INT HelpStringContext; | |
| } TLBVarRecord; | |
| /* Structure of the reference data */ | |
| typedef struct { | |
| INT reftype; /* either offset in type info table, then its */ | |
| /* a multiple of 64 */ | |
| /* or offset in the external reference table */ | |
| /* with an offset of 1 */ | |
| INT flags; | |
| INT oCustData; /* custom data */ | |
| INT onext; /* next offset, -1 if last */ | |
| } TLBRefRecord; | |
| /* this is how a guid is stored */ | |
| typedef struct { | |
| GUID guid; | |
| INT unk10; /* differntiate with libid, classid etc? */ | |
| /* its -2 for a libary */ | |
| /* it's 0 for an interface */ | |
| INT unk14; /* always? -1 */ | |
| } TLBGuidEntry; | |
| /* some data preceding entries in the name table */ | |
| typedef struct { | |
| INT unk00; /* sometimes -1 (lib, parameter) , | |
| sometimes 0 (interface, func) */ | |
| INT unk10; /* sometimes -1 (lib) , sometimes 0 (interface, func), | |
| sometime 0x10 (par) */ | |
| INT namelen; /* only lower 8 bits are valid */ | |
| } TLBNameIntro; | |
| /* the custom data table directory has enties like this */ | |
| typedef struct { | |
| INT GuidOffset; | |
| INT DataOffset; | |
| INT next; /* next offset in the table, -1 if its the last */ | |
| } TLBCDGuid; | |
| /*---------------------------END--------------------------------------------*/ | |
| #endif |