| /* | |
| * typelib_struct.h internal wine data structures | |
| * used to decode typelib's | |
| * | |
| * Copyright 1999 Rein KLazes | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library 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 | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| #ifndef _WIDL_TYPELIB_STRUCT_H | |
| #define _WIDL_TYPELIB_STRUCT_H | |
| #define HELPDLLFLAG (0x0100) | |
| #define DO_NOT_SEEK (-1) | |
| #define MSFT_HREFTYPE_INTHISFILE(href) (!((href) & 3)) | |
| #define MSFT_HREFTYPE_INDEX(href) ((href) /sizeof(MSFT_TypeInfoBase)) | |
| /*-------------------------FILE STRUCTURES-----------------------------------*/ | |
| /* There are two known file formats, those created with ICreateTypeLib | |
| * have the signature "SLTG" as their first four bytes, while those created | |
| * with ICreateTypeLib2 have "MSFT". | |
| */ | |
| /***************************************************** | |
| * MSFT typelibs | |
| * | |
| * These are TypeLibs created with ICreateTypeLib2 | |
| * | |
| */ | |
| /* | |
| * structure of the typelib type2 header | |
| * it is at the beginning of a type lib file | |
| * | |
| */ | |
| typedef struct tagMSFT_Header { | |
| /*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 */ | |
| /* the lower nibble is syskind */ | |
| /* 0x40 always seems to be set */ | |
| /* 0x10 set with a helpfile defined */ | |
| /* 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 */ | |
| 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 (guid hash size?) */ | |
| INT res48; /* unknown always: 0x80 (name hash size?) */ | |
| INT dispatchpos; /* HREFTYPE to IDispatch, or -1 if no IDispatch */ | |
| /*0x50*/INT res50; /* is zero becomes one when an interface is derived */ | |
| } MSFT_Header; | |
| /* segments in the type lib file have a structure like this: */ | |
| typedef struct tagMSFT_pSeg { | |
| 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 */ | |
| } MSFT_pSeg; | |
| /* layout of the main segment directory */ | |
| typedef struct tagMSFT_SegDir { | |
| /*1*/MSFT_pSeg pTypeInfoTab; /* each type info get an entry of 0x64 bytes */ | |
| /* (25 ints) */ | |
| /*2*/MSFT_pSeg pImpInfo; /* table with info for imported types */ | |
| /*3*/MSFT_pSeg pImpFiles; /* import libaries */ | |
| /*4*/MSFT_pSeg pRefTab; /* References table */ | |
| /*5*/MSFT_pSeg pLibtab; /* always exists, alway same size (0x80) */ | |
| /* hash table w offsets to guid????? */ | |
| /*6*/MSFT_pSeg pGuidTab; /* all guids are stored here together with */ | |
| /* offset in some table???? */ | |
| /*7*/MSFT_pSeg res07; /* always created, alway same size (0x200) */ | |
| /* purpose largely unknown */ | |
| /*8*/MSFT_pSeg pNametab; /* name tables */ | |
| /*9*/MSFT_pSeg pStringtab; /* string table */ | |
| /*A*/MSFT_pSeg pTypdescTab; /* table with type descriptors */ | |
| /*B*/MSFT_pSeg pArrayDescriptions; | |
| /*C*/MSFT_pSeg pCustData; /* data table, used for custom data and default */ | |
| /* parameter values */ | |
| /*D*/MSFT_pSeg pCDGuids; /* table with offsets for the guids and into */ | |
| /* the customer data table */ | |
| /*E*/MSFT_pSeg res0e; /* unknown */ | |
| /*F*/MSFT_pSeg res0f; /* unknown */ | |
| } MSFT_SegDir; | |
| /* base type info data */ | |
| typedef struct tagMSFT_TypeInfoBase { | |
| /*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 */ | |
| #ifdef WORDS_BIGENDIAN | |
| INT16 cbSizeVft; /* virtual table size, including inherits */ | |
| INT16 cImplTypes; /* nr of implemented interfaces */ | |
| #else | |
| INT16 cImplTypes; /* nr of implemented interfaces */ | |
| INT16 cbSizeVft; /* virtual table size, including inherits */ | |
| #endif | |
| /*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; /* for interfaces: hiword is num of inherited funcs */ | |
| /* loword is num of inherited interfaces */ | |
| INT res18; /* always? 0 */ | |
| /*060*/ INT res19; /* always? -1 */ | |
| } MSFT_TypeInfoBase; | |
| /* layout of an entry with information on imported types */ | |
| typedef struct tagMSFT_ImpInfo { | |
| INT res0; /* unknown */ | |
| INT oImpFile; /* offset inthe Import File table */ | |
| INT oGuid; /* offset in Guid table */ | |
| } MSFT_ImpInfo; | |
| /* 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) */ | |
| #ifdef WORDS_BIGENDIAN | |
| INT16 funcdescsize; /* size of reconstituted FUNCDESC and related structs */ | |
| INT16 VtableOffset; /* offset in vtable */ | |
| #else | |
| INT16 VtableOffset; /* offset in vtable */ | |
| INT16 funcdescsize; /* size of reconstituted FUNCDESC and related structs */ | |
| #endif | |
| INT FKCCIC; /* bit string with the following */ | |
| /* meaning (bit 0 is the lsb): */ | |
| /* bits 0 - 2: FUNCKIND */ | |
| /* bits 3 - 6: INVOKEKIND */ | |
| /* bit 7: custom data present */ | |
| /* bits 8 - 11: CALLCONV */ | |
| /* bit 12: parameters have default values */ | |
| /* bit 13: oEntry is numeric */ | |
| /* bit 14: has retval param */ | |
| /* bits 16 - 31: index of next function with same id */ | |
| #ifdef WORDS_BIGENDIAN | |
| INT16 nroargs; /* nr of optional arguments */ | |
| INT16 nrargs; /* number of arguments (including optional ????) */ | |
| #else | |
| INT16 nrargs; /* number of arguments (including optional ????) */ | |
| INT16 nroargs; /* nr of optional arguments */ | |
| #endif | |
| /* 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 (see bit 13 of FKCCIC) // | |
| 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 // | |
| */ | |
| } MSFT_FuncRecord; | |
| /* 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; | |
| } MSFT_ParameterInfo; | |
| /* Variable description data */ | |
| typedef struct { | |
| /* INT recsize; // record size including some xtra stuff */ | |
| INT DataType; /* data type of the variable */ | |
| INT Flags; /* VarFlags (LOWORD) */ | |
| #ifdef WORDS_BIGENDIAN | |
| INT16 vardescsize; /* size of reconstituted VARDESC and related structs */ | |
| INT16 VarKind; /* VarKind */ | |
| #else | |
| INT16 VarKind; /* VarKind */ | |
| INT16 vardescsize; /* size of reconstituted VARDESC and related structs */ | |
| #endif | |
| 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; | |
| } MSFT_VarRecord; | |
| /* Structure of the reference data */ | |
| typedef struct { | |
| INT reftype; /* either offset in type info table, then it's */ | |
| /* 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 */ | |
| } MSFT_RefRecord; | |
| /* this is how a guid is stored */ | |
| typedef struct { | |
| GUID guid; | |
| INT hreftype; /* -2 for the typelib guid, typeinfo offset | |
| for typeinfo guid, low two bits are 01 if | |
| this is an imported typeinfo, low two bits | |
| are 10 if this is an imported typelib (used | |
| by imported typeinfos) */ | |
| INT next_hash; /* offset to next guid in the hash bucket */ | |
| } MSFT_GuidEntry; | |
| /* some data preceding entries in the name table */ | |
| typedef struct { | |
| INT hreftype; /* is -1 if name is for neither a typeinfo, | |
| a variable, or a function (that is, name | |
| is for a typelib or a function parameter). | |
| otherwise is the offset of the first | |
| typeinfo that this name refers to (either | |
| to the typeinfo itself or to a member of | |
| the typeinfo */ | |
| INT next_hash; /* offset to next name in the hash bucket */ | |
| INT namelen; /* only lower 8 bits are valid */ | |
| /* 0x1000 if name is only used once as a variable name */ | |
| /* 0x2000 if name is a variable in an enumeration */ | |
| /* 0x3800 if name is typeinfo name */ | |
| /* upper 16 bits are hash code */ | |
| } MSFT_NameIntro; | |
| /* the custom data table directory has enties like this */ | |
| typedef struct { | |
| INT GuidOffset; | |
| INT DataOffset; | |
| INT next; /* next offset in the table, -1 if it's the last */ | |
| } MSFT_CDGuid; | |
| /*********************************************************** | |
| * | |
| * SLTG typelibs. | |
| * | |
| * These are created with ICreateTypeLib | |
| * | |
| */ | |
| #include "pshpack1.h" | |
| typedef struct { | |
| /*00*/ DWORD SLTG_magic; /* 0x47544c53 == "SLTG" */ | |
| /*04*/ WORD nrOfFileBlks; /* no of SLTG_BlkEntry's + 1 */ | |
| /*06*/ WORD res06; /* ?? always 9 */ | |
| /*08*/ WORD res08; /* some kind of len/offset ?? */ | |
| /*0a*/ WORD first_blk; /* 1 based index into blk entries that | |
| corresponds to first block in file */ | |
| /*0c*/ DWORD res0c; /* always 0x000204ff */ | |
| /*10*/ DWORD res10; /* always 0x00000000 */ | |
| /*14*/ DWORD res14; /* always 0x000000c0 */ | |
| /*18*/ DWORD res18; /* always 0x46000000 */ | |
| /*1c*/ DWORD res1c; /* always 0x00000044 */ | |
| /*20*/ DWORD res20; /* always 0xffff0000 */ | |
| } SLTG_Header; | |
| /* This gets followed by a list of block entries */ | |
| typedef struct { | |
| /*00*/ DWORD len; | |
| /*04*/ WORD index_string; /* offs from start of SLTG_Magic to index string */ | |
| /*06*/ WORD next; | |
| } SLTG_BlkEntry; | |
| /* The order of the blocks in the file is given by starting at Block | |
| entry firt_blk and stepping through using the next pointer */ | |
| /* These then get followed by this magic */ | |
| typedef struct { | |
| /*00*/ BYTE res00; /* always 0x01 */ | |
| /*01*/ CHAR CompObj_magic[8]; /* always "CompObj" */ | |
| /*09*/ CHAR dir_magic[4]; /* always "dir" */ | |
| } SLTG_Magic; | |
| #define SLTG_COMPOBJ_MAGIC "CompObj" | |
| #define SLTG_DIR_MAGIC "dir" | |
| /* Next we have SLTG_Header.nrOfFileBlks - 2 of Index strings. These | |
| are presumably unique to within the file and look something like | |
| "AAAAAAAAAA" with the first character incremented from 'A' to ensure | |
| uniqueness. I guess successive chars increment when we need to wrap | |
| the first one. */ | |
| typedef struct { | |
| /*00*/ CHAR string[11]; | |
| } SLTG_Index; | |
| /* This is followed by SLTG_pad9 */ | |
| typedef struct { | |
| /*00*/ CHAR pad[9]; /* 9 '\0's */ | |
| } SLTG_Pad9; | |
| /* Now we have the noOfFileBlks - 1 worth of blocks. The length of | |
| each block is given by its entry in SLTG_BlkEntry. */ | |
| /* type SLTG_NAME in rather like a BSTR except that the length in | |
| bytes is given by the first WORD and the string contains 8bit chars */ | |
| typedef WORD SLTG_Name; | |
| /* The main library block looks like this. This one seems to come last */ | |
| typedef struct { | |
| /*00*/ WORD magic; /* 0x51cc */ | |
| /*02*/ WORD res02; /* 0x0003, 0x0004 */ | |
| /*04*/ WORD name; /* offset to name in name table */ | |
| /*06*/ SLTG_Name res06; /* maybe this is just WORD == 0xffff */ | |
| SLTG_Name helpstring; | |
| SLTG_Name helpfile; | |
| DWORD helpcontext; | |
| WORD syskind; /* == 1 for win32, 0 for win16 */ | |
| WORD lcid; /* == 0x409, 0x809 etc */ | |
| DWORD res12; /* == 0 */ | |
| WORD libflags; /* LIBFLAG_* */ | |
| WORD maj_vers; | |
| WORD min_vers; | |
| GUID uuid; | |
| } SLTG_LibBlk; | |
| #define SLTG_LIBBLK_MAGIC 0x51cc | |
| /* we then get 0x40 bytes worth of 0xffff or small numbers followed by | |
| nrOfFileBlks - 2 of these */ | |
| typedef struct { | |
| WORD small_no; | |
| SLTG_Name index_name; /* This refers to a name in the directory */ | |
| SLTG_Name other_name; /* Another one of these weird names */ | |
| WORD res1a; /* 0xffff */ | |
| WORD name_offs; /* offset to name in name table */ | |
| WORD more_bytes; /* if this is non-zero we get this many | |
| bytes before the next element, which seem | |
| to reference the docstring of the type ? */ | |
| WORD res20; /* 0xffff */ | |
| DWORD helpcontext; | |
| WORD res26; /* 0xffff */ | |
| GUID uuid; | |
| } SLTG_OtherTypeInfo; | |
| /* Next we get WORD 0x0003 followed by a DWORD which if we add to | |
| 0x216 gives the offset to the name table from the start of the LibBlk | |
| struct */ | |
| typedef struct { | |
| /*00*/ WORD magic; /* 0x0501 */ | |
| /*02*/ DWORD href_table; /* if not 0xffffffff, then byte offset from | |
| beginning of struct to href table */ | |
| /*06*/ DWORD res06; /* 0xffffffff */ | |
| /*0a*/ DWORD elem_table; /* offset to members */ | |
| /*0e*/ DWORD res0e; /* 0xffffffff */ | |
| /*12*/ WORD major_version; /* major version number */ | |
| /*14*/ WORD minor_version; /* minor version number */ | |
| /*16*/ DWORD res16; /* 0xfffe0000 */ | |
| /*1a*/ BYTE typeflags1;/* 0x02 | top 5 bits hold l5sbs of TYPEFLAGS */ | |
| /*1b*/ BYTE typeflags2;/* TYPEFLAGS >> 5 */ | |
| /*1c*/ BYTE typeflags3;/* 0x02*/ | |
| /*1d*/ BYTE typekind; /* 0x03 == TKIND_INTERFACE etc. */ | |
| /*1e*/ DWORD res1e; /* 0x00000000 or 0xffffffff */ | |
| } SLTG_TypeInfoHeader; | |
| #define SLTG_TIHEADER_MAGIC 0x0501 | |
| typedef struct { | |
| /*00*/ WORD cFuncs; | |
| /*02*/ WORD cVars; | |
| /*04*/ WORD cImplTypes; | |
| /*06*/ WORD res06; | |
| /*08*/ WORD res08; | |
| /*0a*/ WORD res0a; | |
| /*0c*/ WORD res0c; | |
| /*0e*/ WORD res0e; | |
| /*10*/ WORD res10; | |
| /*12*/ WORD res12; | |
| /*14*/ WORD tdescalias_vt; /* for TKIND_ALIAS */ | |
| /*16*/ WORD res16; | |
| /*18*/ WORD res18; | |
| /*1a*/ WORD res1a; | |
| /*1c*/ WORD res1c; | |
| /*1e*/ WORD res1e; | |
| /*20*/ WORD cbSizeInstance; | |
| /*22*/ WORD cbAlignment; | |
| /*24*/ WORD res24; | |
| /*26*/ WORD res26; | |
| /*28*/ WORD cbSizeVft; | |
| /*2a*/ WORD res2a; | |
| /*2c*/ WORD res2c; | |
| /*2e*/ WORD res2e; | |
| /*30*/ WORD res30; | |
| /*32*/ WORD res32; | |
| /*34*/ WORD res34; | |
| } SLTG_TypeInfoTail; | |
| typedef struct { | |
| /*00*/ WORD res00; /* 0x0001 sometimes 0x0003 ?? */ | |
| /*02*/ WORD res02; /* 0xffff */ | |
| /*04*/ BYTE res04; /* 0x01 */ | |
| /*05*/ DWORD cbExtra; /* No of bytes that follow */ | |
| } SLTG_MemberHeader; | |
| typedef struct { | |
| /*00*/ WORD magic; /* 0x120a */ | |
| /*02*/ WORD next; /* offset in bytes to next block from start of block | |
| group, 0xffff if last item */ | |
| /*04*/ WORD name; /* offset to name within name table */ | |
| /*06*/ WORD value; /* offset to value from start of block group */ | |
| /*08*/ WORD res08; /* 0x56 */ | |
| /*0a*/ DWORD memid; /* memid */ | |
| /*0e*/ WORD helpcontext;/* 0xfffe == no context, 0x0001 == stored in EnumInfo struct, else offset | |
| to value from start of block group */ | |
| /*10*/ WORD helpstring;/* offset from start of block group to string offset */ | |
| } SLTG_EnumItem; | |
| #define SLTG_ENUMITEM_MAGIC 0x120a | |
| typedef struct { | |
| /*00*/ WORD vt; /* vartype, 0xffff marks end. */ | |
| /*02*/ WORD res02; /* ?, 0xffff marks end */ | |
| } SLTG_AliasItem; | |
| #define SLTG_ALIASITEM_MAGIC 0x001d | |
| typedef struct { | |
| BYTE magic; /* 0x4c or 0x6c */ | |
| BYTE inv; /* high nibble is INVOKE_KIND, low nibble = 2 */ | |
| WORD next; /* byte offset from beginning of group to next fn */ | |
| WORD name; /* Offset within name table to name */ | |
| DWORD dispid; /* dispid */ | |
| WORD helpcontext; /* helpcontext (again 1 is special) */ | |
| WORD helpstring;/* helpstring offset to offset */ | |
| WORD arg_off; /* offset to args from start of block */ | |
| BYTE nacc; /* lowest 3bits are CALLCONV, rest are no of args */ | |
| BYTE retnextopt;/* if 0x80 bit set ret type follows else next WORD | |
| is offset to ret type. No of optional args is | |
| middle 6 bits */ | |
| WORD rettype; /* return type VT_?? or offset to ret type */ | |
| WORD vtblpos; /* position in vtbl? */ | |
| WORD funcflags; /* present if magic == 0x6c */ | |
| /* Param list starts, repeat next two as required */ | |
| #if 0 | |
| WORD name; /* offset to 2nd letter of name */ | |
| WORD+ type; /* VT_ of param */ | |
| #endif | |
| } SLTG_Function; | |
| #define SLTG_FUNCTION_MAGIC 0x4c | |
| #define SLTG_FUNCTION_WITH_FLAGS_MAGIC 0x6c | |
| typedef struct { | |
| /*00*/ BYTE magic; /* 0xdf */ | |
| /*01*/ BYTE res01; /* 0x00 */ | |
| /*02*/ DWORD res02; /* 0xffffffff */ | |
| /*06*/ DWORD res06; /* 0xffffffff */ | |
| /*0a*/ DWORD res0a; /* 0xffffffff */ | |
| /*0e*/ DWORD res0e; /* 0xffffffff */ | |
| /*12*/ DWORD res12; /* 0xffffffff */ | |
| /*16*/ DWORD res16; /* 0xffffffff */ | |
| /*1a*/ DWORD res1a; /* 0xffffffff */ | |
| /*1e*/ DWORD res1e; /* 0xffffffff */ | |
| /*22*/ DWORD res22; /* 0xffffffff */ | |
| /*26*/ DWORD res26; /* 0xffffffff */ | |
| /*2a*/ DWORD res2a; /* 0xffffffff */ | |
| /*2e*/ DWORD res2e; /* 0xffffffff */ | |
| /*32*/ DWORD res32; /* 0xffffffff */ | |
| /*36*/ DWORD res36; /* 0xffffffff */ | |
| /*3a*/ DWORD res3a; /* 0xffffffff */ | |
| /*3e*/ DWORD res3e; /* 0xffffffff */ | |
| /*42*/ WORD res42; /* 0xffff */ | |
| /*44*/ DWORD number; /* this is 8 times the number of refs */ | |
| /*48*/ /* Now we have number bytes (8 for each ref) of SLTG_UnknownRefInfo */ | |
| /*50*/ WORD res50; /* 0xffff */ | |
| /*52*/ BYTE res52; /* 0x01 */ | |
| /*53*/ DWORD res53; /* 0x00000000 */ | |
| /*57*/ SLTG_Name names[1]; | |
| /* Now we have number/8 SLTG_Names (first WORD is no of bytes in the ascii | |
| * string). Strings look like "*\Rxxxx*#n". If xxxx == ffff then the | |
| * ref refers to the nth type listed in this library (0 based). Else | |
| * the xxxx (which maybe fewer than 4 digits) is the offset into the name | |
| * table to a string "*\G{<guid>}#1.0#0#C:\WINNT\System32\stdole32.tlb#" | |
| * The guid is the typelib guid; the ref again refers to the nth type of | |
| * the imported typelib. | |
| */ | |
| /*xx*/ BYTE resxx; /* 0xdf */ | |
| } SLTG_RefInfo; | |
| #define SLTG_REF_MAGIC 0xdf | |
| typedef struct { | |
| WORD res00; /* 0x0001 */ | |
| BYTE res02; /* 0x02 */ | |
| BYTE res03; /* 0x40 if internal ref, 0x00 if external ? */ | |
| WORD res04; /* 0xffff */ | |
| WORD res06; /* 0x0000, 0x0013 or 0xffff ?? */ | |
| } SLTG_UnknownRefInfo; | |
| typedef struct { | |
| WORD res00; /* 0x004a */ | |
| WORD next; /* byte offs to next interface */ | |
| WORD res04; /* 0xffff */ | |
| BYTE impltypeflags; /* IMPLTYPEFLAG_* */ | |
| BYTE res07; /* 0x80 */ | |
| WORD res08; /* 0x0012, 0x0028 ?? */ | |
| WORD ref; /* number in ref table ? */ | |
| WORD res0c; /* 0x4000 */ | |
| WORD res0e; /* 0xfffe */ | |
| WORD res10; /* 0xffff */ | |
| WORD res12; /* 0x001d */ | |
| WORD pos_in_table; /* 0x0, 0x4, ? */ | |
| } SLTG_ImplInfo; | |
| #define SLTG_IMPL_MAGIC 0x004a | |
| typedef struct { | |
| BYTE magic; /* 0x0a */ | |
| BYTE typepos; | |
| WORD next; | |
| WORD name; | |
| WORD byte_offs; /* pos in struct */ | |
| WORD type; /* if typepos == 0x02 this is the type, else offset to type */ | |
| DWORD memid; | |
| WORD helpcontext; /* ?? */ | |
| WORD helpstring; /* ?? */ | |
| } SLTG_RecordItem; | |
| #define SLTG_RECORD_MAGIC 0x0a | |
| /* CARRAYs look like this | |
| WORD type == VT_CARRAY | |
| WORD offset from start of block to SAFEARRAY | |
| WORD typeofarray | |
| */ | |
| #include "poppack.h" | |
| /*---------------------------END--------------------------------------------*/ | |
| #endif |