| /* | 
 |  * 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" | 
 | #include "wine/windef16.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)) | 
 |  | 
 | /*-------------------------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 |