| /* |
| * 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 |