| /* |
| genidl - Generate interface defintion language listing from a |
| Portable Executable. |
| Copyright (C) 2009-2016 mingw-w64 project |
| |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program 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 General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #ifndef GETIDL_TYPINFO_HXX |
| #define GETIDL_TYPINFO_HXX |
| |
| #define TITYP_NONE -1 |
| #define TITYP_NAME 0 |
| #define TITYP_STR 1 |
| #define TITYP_GUIDS 2 |
| #define TITYP_TYPINFO_NAMES 3 |
| #define TITYP_DEREF 4 |
| #define TITYP_ARRAY 5 |
| #define TITYP_REF 6 |
| #define TITYP_IMP 7 |
| #define TITYP_UNKNOWN 8 |
| #define TITYP_CUSTOMDATA 9 |
| #define TITYP_CUSTOMGUID 10 |
| #define TITYP_IMPREF 11 |
| |
| #define TITYP_MAX 12 |
| |
| typedef struct sTITyp { |
| uint32_t memid; /**< TYPINFO offset ID */ |
| int32_t kind; /**< TYPINFO kind */ |
| int32_t refkind; |
| uint32_t refmem; /**< Offset reference */ |
| char *refstr; /**< Helper member to form TYPINFO string */ |
| char *poststr; /**< Helper member to form TYPINFO string */ |
| char name[1]; /**< TYPINFO name */ |
| } sTITyp; |
| |
| typedef struct sTITypsHash |
| { |
| size_t count; |
| size_t max; |
| sTITyp **arr; /**< Directory of TYPEINFO data found */ |
| } sTITypsHash; |
| |
| typedef struct sTITyps { |
| sTITypsHash buc[TITYP_MAX]; |
| } sTITyps; |
| |
| /** |
| * Initializes sTITyps struct |
| * @param[in] ptyp Address of struct to zero |
| * @return always 0 |
| */ |
| int32_t TI_init_typs (sTITyps *ptyp); |
| |
| /** |
| * Walks over and frees sTITypsHash entries found in sTITyps structure |
| * @param[in] ptyp sTITyps structure containing sTITypsHash entries to destroy |
| * @return always 0 |
| */ |
| int32_t TI_dest_typs (sTITyps *ptyp); |
| |
| /** |
| * Inserts a sTITypsHash entry into a sTITyps |
| * @param[in] ptyp Structure to insert entry into |
| * @param[in] memid |
| * @param[in] kind |
| * @param[in] refkind |
| * @param[in] refmem |
| * @param[in[ refstr |
| * @param[in] name typinfo associated name |
| * @param[in] poststr |
| * @return always 0 |
| */ |
| int32_t TI_add_typ (sTITyps *ptyp, uint32_t memid, int32_t kind, int32_t refkind, uint32_t refmem, |
| const char *refstr, const char *name, const char *poststr); |
| |
| /** |
| * Searches ptyp for element matching memid and kind. |
| * @param[in] ptyp typelib data to search |
| * @param[in] memid TTYPINFO offset to match |
| * @param[in] kind TYPINFO kind to match |
| * @return pointer to matching matching typinfo section |
| */ |
| sTITyp *TI_get_typ (sTITyps *ptyp, uint32_t memid, int32_t kind); |
| |
| /** |
| * Returns a string to name the TYPINFO sections |
| * @param[in] memid TTYPINFO offset to match |
| * @param[in] kind TYPINFO kind to match |
| * @param[in] varname |
| * @return string to name of TYPINFO section |
| */ |
| char *TI_get_typ_name (sTITyps *ptyp, uint32_t memid, int32_t kind, const char *varName); |
| |
| /** |
| * Decodes name from raw data to insert into new entry in sTITyps |
| * @return always 0 |
| */ |
| int32_t TI2_import_name (sTITyps *nptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_guid (sTITyps *gptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_typinfo_names (sTITyps *tptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_string (sTITyps *sptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_typedesc (sTITyps *dptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_customdata (sTITyps *dptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_customdataguid (sTITyps *gptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_importlibs (sTITyps *iptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_ref (sTITyps *gptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_array (sTITyps *gptr, unsigned char *dta, uint32_t len); |
| int32_t TI2_import_importref (sTITyps *gptr, unsigned char *dta, uint32_t len); |
| |
| const char *decode_VT_name_tmp (unsigned short vt); |
| size_t getVT_data (sTITyps *dptr, uint32_t vt, unsigned char *dta, char **ret); |
| char *TI_getVTorDref (sTITyps *ptyp,uint32_t vt, const char *varName, int beBase); |
| size_t getVT_size (uint32_t vt, unsigned char *dta, size_t *basesz); |
| |
| typedef struct sTI2TypeBaseMemItem { |
| int beFunc; |
| #ifdef __GNUC__ |
| __extension__ |
| #endif |
| union { |
| unsigned char *mem; |
| sMSFT_func *func; |
| sMSFT_var *var; |
| }; |
| uint32_t *customData; |
| sMSFT_FuncParam *funcParam; |
| uint32_t *extData; |
| size_t max; |
| } sTI2TypeBaseMemItem; |
| |
| typedef struct sTI2TypeBaseMem |
| { |
| size_t count; |
| sTI2TypeBaseMemItem *items; |
| } sTI2TypeBaseMem; |
| |
| typedef struct sTI2TypeBase { |
| uint32_t kind; |
| uint32_t kflags; |
| int32_t cVars; |
| int32_t cFuncs; |
| int32_t flags; |
| char *name; |
| char *guid; |
| char *docstr; |
| char *custData; |
| uint32_t version; |
| char *dataType; |
| sMSFT_TypeInfoBase *tib; |
| sTI2TypeBaseMem mem; |
| } sTI2TypeBase; |
| |
| typedef struct sTI2TypLib { |
| int16_t ver_major; |
| int16_t ver_minor; |
| int32_t version; |
| char *guid; |
| uint32_t lcid1; |
| uint32_t lcid2; |
| uint32_t flags; |
| uint32_t setFlags; |
| char *helpstring; |
| char *helpfile; |
| int32_t helpstringctx; |
| int32_t helpctx; |
| char *name; |
| int32_t dispatch; |
| size_t nr_typinfos; |
| size_t nr_impinfos; |
| uint32_t *typinfos_hash; |
| sTITyps ti2_typs; |
| sTI2TypeBase *typb; |
| } sTI2TypLib; |
| |
| sTI2TypLib *TI2_typlib_init (unsigned char *dta, size_t len); |
| void TI2_typlib_dest (sTI2TypLib *tl); |
| void TI2_typlib_hdr (FILE *fp, sTI2TypLib *tl, const char *orgfname); |
| void TI2_typlib_idl (FILE *fp, sTI2TypLib *tl, const char *orgname); |
| |
| /** |
| * Returns text string of calling convention type |
| * @param[in] cc calling convention type |
| * @return pointer to convention type string |
| */ |
| const char *getCallConvName (int32_t cc); |
| |
| /** |
| * Returns text string of calling convention type |
| * @param[in] fp file to print to |
| * @param[in] typs |
| */ |
| void printValue(FILE *fp, sTITyps *typs, uint32_t val); |
| char *getTypeBOrImpRef (sTITyps *dptr, uint32_t off, const char *var); |
| |
| #endif |