You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-04-13 14:42:51 -07:00
Rebase against a46043015322bf8e6c78a74bd33300f3478767e3.
This commit is contained in:
@@ -1,63 +0,0 @@
|
||||
From ed5f6c45666a220fd9f2532d0ab55bc9e4e7054c Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
Date: Wed, 20 Jan 2016 14:04:08 +0800
|
||||
Subject: oleaut32: Fix logic for deciding whether type description follows the
|
||||
name (v2).
|
||||
|
||||
This makes it possible to load an SLTG typelib generated by widl.
|
||||
|
||||
It looks like the lowest bit actually indicates whether type description
|
||||
follows the name, and since the name offsets are always aligned that makes
|
||||
sense.
|
||||
---
|
||||
dlls/oleaut32/typelib.c | 17 ++++++-----------
|
||||
1 file changed, 6 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
|
||||
index 0a83b79..d8d8ec8 100644
|
||||
--- a/dlls/oleaut32/typelib.c
|
||||
+++ b/dlls/oleaut32/typelib.c
|
||||
@@ -4214,7 +4214,7 @@ static void SLTG_DoFuncs(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI,
|
||||
pArg = (WORD*)(pBlk + pFunc->arg_off);
|
||||
|
||||
for(param = 0; param < pFuncDesc->funcdesc.cParams; param++) {
|
||||
- char *paramName = pNameTable + *pArg;
|
||||
+ char *paramName = pNameTable + (*pArg & ~1);
|
||||
BOOL HaveOffs;
|
||||
/* If arg type follows then paramName points to the 2nd
|
||||
letter of the name, else the next WORD is an offset to
|
||||
@@ -4225,26 +4225,21 @@ static void SLTG_DoFuncs(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI,
|
||||
meaning that the next WORD is the type, the latter
|
||||
meaning that the next WORD is an offset to the type. */
|
||||
|
||||
- HaveOffs = FALSE;
|
||||
- if(*pArg == 0xffff)
|
||||
+ if(*pArg == 0xffff || *pArg == 0xfffe)
|
||||
paramName = NULL;
|
||||
- else if(*pArg == 0xfffe) {
|
||||
- paramName = NULL;
|
||||
- HaveOffs = TRUE;
|
||||
- }
|
||||
- else if(paramName[-1] && !isalnum(paramName[-1]))
|
||||
- HaveOffs = TRUE;
|
||||
|
||||
+ HaveOffs = !(*pArg & 1);
|
||||
pArg++;
|
||||
|
||||
+ TRACE_(typelib)("param %d: paramName %s, *pArg %#x\n",
|
||||
+ param, debugstr_a(paramName), *pArg);
|
||||
+
|
||||
if(HaveOffs) { /* the next word is an offset to type */
|
||||
pType = (WORD*)(pBlk + *pArg);
|
||||
SLTG_DoElem(pType, pBlk,
|
||||
&pFuncDesc->funcdesc.lprgelemdescParam[param], ref_lookup);
|
||||
pArg++;
|
||||
} else {
|
||||
- if(paramName)
|
||||
- paramName--;
|
||||
pArg = SLTG_DoElem(pArg, pBlk,
|
||||
&pFuncDesc->funcdesc.lprgelemdescParam[param], ref_lookup);
|
||||
}
|
||||
--
|
||||
2.6.4
|
||||
|
@@ -1,247 +0,0 @@
|
||||
From cca2b1bf5ffed383620c26fdb7a37c21dbd38171 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
Date: Tue, 26 Jan 2016 15:05:54 +0800
|
||||
Subject: [PATCH] oleaut32: Implement decoding of SLTG help strings.
|
||||
|
||||
Based on the patch by Sebastian Lackner <sebastian@fds-team.de>.
|
||||
---
|
||||
dlls/oleaut32/typelib.c | 134 ++++++++++++++++++++++++++++++++--------
|
||||
dlls/oleaut32/typelib.h | 4 +-
|
||||
2 files changed, 111 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
|
||||
index 1740472c9e8..d5c8191abba 100644
|
||||
--- a/dlls/oleaut32/typelib.c
|
||||
+++ b/dlls/oleaut32/typelib.c
|
||||
@@ -3680,6 +3680,87 @@ static BOOL TLB_GUIDFromString(const char *str, GUID *guid)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
+struct bitstream
|
||||
+{
|
||||
+ const BYTE *buffer;
|
||||
+ DWORD length;
|
||||
+ WORD current;
|
||||
+};
|
||||
+
|
||||
+static const char *lookup_code(const BYTE *table, DWORD table_size, struct bitstream *bits)
|
||||
+{
|
||||
+ const BYTE *p = table;
|
||||
+
|
||||
+ while (p < table + table_size && *p == 0x80)
|
||||
+ {
|
||||
+ if (p + 2 >= table + table_size) return NULL;
|
||||
+
|
||||
+ if (!(bits->current & 0xff))
|
||||
+ {
|
||||
+ if (!bits->length) return NULL;
|
||||
+ bits->current = (*bits->buffer << 8) | 1;
|
||||
+ bits->buffer++;
|
||||
+ bits->length--;
|
||||
+ }
|
||||
+
|
||||
+ if (bits->current & 0x8000)
|
||||
+ {
|
||||
+ p += 3;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ p = table + (*(p + 2) | (*(p + 1) << 8));
|
||||
+ }
|
||||
+
|
||||
+ bits->current <<= 1;
|
||||
+ }
|
||||
+
|
||||
+ if (p + 1 < table + table_size && *(p + 1))
|
||||
+ {
|
||||
+ /* FIXME: Whats the meaning of *p? */
|
||||
+ const BYTE *q = p + 1;
|
||||
+ while (q < table + table_size && *q) q++;
|
||||
+ return (q < table + table_size) ? (const char *)(p + 1) : NULL;
|
||||
+ }
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static const TLBString *decode_string(const BYTE *table, const char *stream, DWORD stream_length, ITypeLibImpl *lib)
|
||||
+{
|
||||
+ DWORD buf_size, table_size;
|
||||
+ const char *p;
|
||||
+ struct bitstream bits;
|
||||
+ BSTR buf;
|
||||
+ TLBString *tlbstr;
|
||||
+
|
||||
+ if (!stream_length) return NULL;
|
||||
+
|
||||
+ bits.buffer = (const BYTE *)stream;
|
||||
+ bits.length = stream_length;
|
||||
+ bits.current = 0;
|
||||
+
|
||||
+ buf_size = *(const WORD *)table;
|
||||
+ table += sizeof(WORD);
|
||||
+ table_size = *(const DWORD *)table;
|
||||
+ table += sizeof(DWORD);
|
||||
+
|
||||
+ buf = SysAllocStringLen(NULL, buf_size);
|
||||
+ buf[0] = 0;
|
||||
+
|
||||
+ while ((p = lookup_code(table, table_size, &bits)))
|
||||
+ {
|
||||
+ static const WCHAR spaceW[] = { ' ',0 };
|
||||
+ if (buf[0]) lstrcatW(buf, spaceW);
|
||||
+ MultiByteToWideChar(CP_ACP, 0, p, -1, buf + lstrlenW(buf), buf_size - lstrlenW(buf));
|
||||
+ }
|
||||
+
|
||||
+ tlbstr = TLB_append_str(&lib->string_list, buf);
|
||||
+ SysFreeString(buf);
|
||||
+
|
||||
+ return tlbstr;
|
||||
+}
|
||||
+
|
||||
static WORD SLTG_ReadString(const char *ptr, const TLBString **pStr, ITypeLibImpl *lib)
|
||||
{
|
||||
WORD bytelen;
|
||||
@@ -4366,17 +4447,17 @@ static void SLTG_ProcessModule(char *pBlk, ITypeInfoImpl *pTI,
|
||||
/* Because SLTG_OtherTypeInfo is such a painful struct, we make a more
|
||||
manageable copy of it into this */
|
||||
typedef struct {
|
||||
- WORD small_no;
|
||||
char *index_name;
|
||||
char *other_name;
|
||||
WORD res1a;
|
||||
WORD name_offs;
|
||||
- WORD more_bytes;
|
||||
+ WORD hlpstr_len;
|
||||
char *extra;
|
||||
WORD res20;
|
||||
DWORD helpcontext;
|
||||
WORD res26;
|
||||
GUID uuid;
|
||||
+ WORD typekind;
|
||||
} SLTG_InternalOtherTypeInfo;
|
||||
|
||||
/****************************************************************************
|
||||
@@ -4395,8 +4476,8 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
|
||||
LPVOID pBlk, pFirstBlk;
|
||||
SLTG_LibBlk *pLibBlk;
|
||||
SLTG_InternalOtherTypeInfo *pOtherTypeInfoBlks;
|
||||
- char *pAfterOTIBlks = NULL;
|
||||
char *pNameTable, *ptr;
|
||||
+ const BYTE *hlp_strings;
|
||||
int i;
|
||||
DWORD len, order;
|
||||
ITypeInfoImpl **ppTypeInfoImpl;
|
||||
@@ -4462,53 +4543,55 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
|
||||
len += 0x40;
|
||||
|
||||
/* And now TypeInfoCount of SLTG_OtherTypeInfo */
|
||||
+ pTypeLibImpl->TypeInfoCount = *(WORD *)((char *)pLibBlk + len);
|
||||
+ len += sizeof(WORD);
|
||||
|
||||
pOtherTypeInfoBlks = calloc(pTypeLibImpl->TypeInfoCount, sizeof(*pOtherTypeInfoBlks));
|
||||
|
||||
-
|
||||
ptr = (char*)pLibBlk + len;
|
||||
|
||||
for(i = 0; i < pTypeLibImpl->TypeInfoCount; i++) {
|
||||
WORD w, extra;
|
||||
len = 0;
|
||||
|
||||
- pOtherTypeInfoBlks[i].small_no = *(WORD*)ptr;
|
||||
-
|
||||
- w = *(WORD*)(ptr + 2);
|
||||
+ w = *(WORD*)ptr;
|
||||
if(w != 0xffff) {
|
||||
len += w;
|
||||
- pOtherTypeInfoBlks[i].index_name = malloc(w + 1);
|
||||
- memcpy(pOtherTypeInfoBlks[i].index_name, ptr + 4, w);
|
||||
+ pOtherTypeInfoBlks[i].index_name = malloc(w+1);
|
||||
+ memcpy(pOtherTypeInfoBlks[i].index_name, ptr + 2, w);
|
||||
pOtherTypeInfoBlks[i].index_name[w] = '\0';
|
||||
}
|
||||
- w = *(WORD*)(ptr + 4 + len);
|
||||
+ w = *(WORD*)(ptr + 2 + len);
|
||||
if(w != 0xffff) {
|
||||
- TRACE_(typelib)("\twith %s\n", debugstr_an(ptr + 6 + len, w));
|
||||
- len += w;
|
||||
- pOtherTypeInfoBlks[i].other_name = malloc(w + 1);
|
||||
- memcpy(pOtherTypeInfoBlks[i].other_name, ptr + 6 + len, w);
|
||||
+ TRACE_(typelib)("\twith %s\n", debugstr_an(ptr + 4 + len, w));
|
||||
+ pOtherTypeInfoBlks[i].other_name = malloc(w+1);
|
||||
+ memcpy(pOtherTypeInfoBlks[i].other_name, ptr + 4 + len, w);
|
||||
pOtherTypeInfoBlks[i].other_name[w] = '\0';
|
||||
+ len += w;
|
||||
}
|
||||
- pOtherTypeInfoBlks[i].res1a = *(WORD*)(ptr + len + 6);
|
||||
- pOtherTypeInfoBlks[i].name_offs = *(WORD*)(ptr + len + 8);
|
||||
- extra = pOtherTypeInfoBlks[i].more_bytes = *(WORD*)(ptr + 10 + len);
|
||||
+ pOtherTypeInfoBlks[i].res1a = *(WORD*)(ptr + 4 + len);
|
||||
+ pOtherTypeInfoBlks[i].name_offs = *(WORD*)(ptr + 6 + len);
|
||||
+ extra = pOtherTypeInfoBlks[i].hlpstr_len = *(WORD*)(ptr + 8 + len);
|
||||
if(extra) {
|
||||
pOtherTypeInfoBlks[i].extra = malloc(extra);
|
||||
- memcpy(pOtherTypeInfoBlks[i].extra, ptr + 12, extra);
|
||||
+ memcpy(pOtherTypeInfoBlks[i].extra, ptr + 10 + len, extra);
|
||||
len += extra;
|
||||
}
|
||||
- pOtherTypeInfoBlks[i].res20 = *(WORD*)(ptr + 12 + len);
|
||||
- pOtherTypeInfoBlks[i].helpcontext = *(DWORD*)(ptr + 14 + len);
|
||||
- pOtherTypeInfoBlks[i].res26 = *(WORD*)(ptr + 18 + len);
|
||||
- memcpy(&pOtherTypeInfoBlks[i].uuid, ptr + 20 + len, sizeof(GUID));
|
||||
+ pOtherTypeInfoBlks[i].res20 = *(WORD*)(ptr + 10 + len);
|
||||
+ pOtherTypeInfoBlks[i].helpcontext = *(DWORD*)(ptr + 12 + len);
|
||||
+ pOtherTypeInfoBlks[i].res26 = *(WORD*)(ptr + 16 + len);
|
||||
+ memcpy(&pOtherTypeInfoBlks[i].uuid, ptr + 18 + len, sizeof(GUID));
|
||||
+ pOtherTypeInfoBlks[i].typekind = *(WORD*)(ptr + 18 + sizeof(GUID) + len);
|
||||
len += sizeof(SLTG_OtherTypeInfo);
|
||||
ptr += len;
|
||||
}
|
||||
|
||||
- pAfterOTIBlks = ptr;
|
||||
+ /* Get the next DWORD */
|
||||
+ len = *(DWORD*)ptr;
|
||||
|
||||
- /* Skip this WORD and get the next DWORD */
|
||||
- len = *(DWORD*)(pAfterOTIBlks + 2);
|
||||
+ hlp_strings = (const BYTE *)ptr + sizeof(DWORD);
|
||||
+ TRACE("max help string length %#x, help strings length %#lx\n",
|
||||
+ *(WORD *)hlp_strings, *(DWORD *)(hlp_strings + 2));
|
||||
|
||||
/* Now add this to pLibBLk look at what we're pointing at and
|
||||
possibly add 0x20, then add 0x216, sprinkle a bit a magic
|
||||
@@ -4574,6 +4657,7 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
|
||||
(*ppTypeInfoImpl)->index = i;
|
||||
(*ppTypeInfoImpl)->Name = SLTG_ReadName(pNameTable, pOtherTypeInfoBlks[i].name_offs, pTypeLibImpl);
|
||||
(*ppTypeInfoImpl)->dwHelpContext = pOtherTypeInfoBlks[i].helpcontext;
|
||||
+ (*ppTypeInfoImpl)->DocString = decode_string(hlp_strings, pOtherTypeInfoBlks[i].extra, pOtherTypeInfoBlks[i].hlpstr_len, pTypeLibImpl);
|
||||
(*ppTypeInfoImpl)->guid = TLB_append_guid(&pTypeLibImpl->guid_list, &pOtherTypeInfoBlks[i].uuid, 2);
|
||||
(*ppTypeInfoImpl)->typeattr.typekind = pTIHeader->typekind;
|
||||
(*ppTypeInfoImpl)->typeattr.wMajorVerNum = pTIHeader->major_version;
|
||||
diff --git a/dlls/oleaut32/typelib.h b/dlls/oleaut32/typelib.h
|
||||
index 515d4b557e6..bfe908c035f 100644
|
||||
--- a/dlls/oleaut32/typelib.h
|
||||
+++ b/dlls/oleaut32/typelib.h
|
||||
@@ -382,18 +382,18 @@ typedef struct {
|
||||
/* 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
|
||||
+ WORD hlpstr_len; /* 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;
|
||||
+ WORD typekind;
|
||||
} SLTG_OtherTypeInfo;
|
||||
|
||||
/* Next we get WORD 0x0003 followed by a DWORD which if we add to
|
||||
--
|
||||
2.40.1
|
||||
|
@@ -1,115 +0,0 @@
|
||||
From 94e6e18f72a5586fc8077dadc4ea50bd994e02a3 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
Date: Tue, 26 Jan 2016 15:41:06 +0800
|
||||
Subject: [PATCH] oleaut32: Add support for decoding SLTG function help
|
||||
strings.
|
||||
|
||||
---
|
||||
dlls/oleaut32/typelib.c | 24 ++++++++++++++----------
|
||||
1 file changed, 14 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
|
||||
index 988e6c1b457..9c15254727d 100644
|
||||
--- a/dlls/oleaut32/typelib.c
|
||||
+++ b/dlls/oleaut32/typelib.c
|
||||
@@ -4199,7 +4199,8 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign
|
||||
}
|
||||
|
||||
static void SLTG_DoFuncs(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI,
|
||||
- unsigned short cFuncs, char *pNameTable, const sltg_ref_lookup_t *ref_lookup)
|
||||
+ unsigned short cFuncs, char *pNameTable, const sltg_ref_lookup_t *ref_lookup,
|
||||
+ const BYTE *hlp_strings)
|
||||
{
|
||||
SLTG_Function *pFunc;
|
||||
unsigned short i;
|
||||
@@ -4240,6 +4241,9 @@ static void SLTG_DoFuncs(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI,
|
||||
else
|
||||
pFuncDesc->funcdesc.oVft = (unsigned short)(pFunc->vtblpos & ~1) * sizeof(void *) / pTI->pTypeLib->ptr_size;
|
||||
|
||||
+ if (pFunc->helpstring != 0xffff)
|
||||
+ pFuncDesc->HelpString = decode_string(hlp_strings, pBlk + pFunc->helpstring, pNameTable - pBlk, pTI->pTypeLib);
|
||||
+
|
||||
if(pFunc->magic & SLTG_FUNCTION_FLAGS_PRESENT)
|
||||
pFuncDesc->funcdesc.wFuncFlags = pFunc->funcflags;
|
||||
|
||||
@@ -4326,7 +4330,7 @@ static void SLTG_ProcessCoClass(char *pBlk, ITypeInfoImpl *pTI,
|
||||
|
||||
static void SLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI,
|
||||
char *pNameTable, SLTG_TypeInfoHeader *pTIHeader,
|
||||
- const SLTG_TypeInfoTail *pTITail)
|
||||
+ const SLTG_TypeInfoTail *pTITail, const BYTE *hlp_strings)
|
||||
{
|
||||
char *pFirstItem;
|
||||
sltg_ref_lookup_t *ref_lookup = NULL;
|
||||
@@ -4343,7 +4347,7 @@ static void SLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI,
|
||||
}
|
||||
|
||||
if (pTITail->funcs_off != 0xffff)
|
||||
- SLTG_DoFuncs(pBlk, pBlk + pTITail->funcs_off, pTI, pTITail->cFuncs, pNameTable, ref_lookup);
|
||||
+ SLTG_DoFuncs(pBlk, pBlk + pTITail->funcs_off, pTI, pTITail->cFuncs, pNameTable, ref_lookup, hlp_strings);
|
||||
|
||||
free(ref_lookup);
|
||||
|
||||
@@ -4388,7 +4392,7 @@ static void SLTG_ProcessAlias(char *pBlk, ITypeInfoImpl *pTI,
|
||||
|
||||
static void SLTG_ProcessDispatch(char *pBlk, ITypeInfoImpl *pTI,
|
||||
char *pNameTable, SLTG_TypeInfoHeader *pTIHeader,
|
||||
- const SLTG_TypeInfoTail *pTITail)
|
||||
+ const SLTG_TypeInfoTail *pTITail, const BYTE *hlp_strings)
|
||||
{
|
||||
sltg_ref_lookup_t *ref_lookup = NULL;
|
||||
if (pTIHeader->href_table != 0xffffffff)
|
||||
@@ -4399,7 +4403,7 @@ static void SLTG_ProcessDispatch(char *pBlk, ITypeInfoImpl *pTI,
|
||||
SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, ref_lookup);
|
||||
|
||||
if (pTITail->funcs_off != 0xffff)
|
||||
- SLTG_DoFuncs(pBlk, pBlk + pTITail->funcs_off, pTI, pTITail->cFuncs, pNameTable, ref_lookup);
|
||||
+ SLTG_DoFuncs(pBlk, pBlk + pTITail->funcs_off, pTI, pTITail->cFuncs, pNameTable, ref_lookup, hlp_strings);
|
||||
|
||||
if (pTITail->impls_off != 0xffff)
|
||||
SLTG_DoImpls(pBlk + pTITail->impls_off, pTI, FALSE, ref_lookup);
|
||||
@@ -4423,7 +4427,7 @@ static void SLTG_ProcessEnum(char *pBlk, ITypeInfoImpl *pTI,
|
||||
|
||||
static void SLTG_ProcessModule(char *pBlk, ITypeInfoImpl *pTI,
|
||||
char *pNameTable, SLTG_TypeInfoHeader *pTIHeader,
|
||||
- const SLTG_TypeInfoTail *pTITail)
|
||||
+ const SLTG_TypeInfoTail *pTITail, const BYTE *hlp_strings)
|
||||
{
|
||||
sltg_ref_lookup_t *ref_lookup = NULL;
|
||||
if (pTIHeader->href_table != 0xffffffff)
|
||||
@@ -4434,7 +4438,7 @@ static void SLTG_ProcessModule(char *pBlk, ITypeInfoImpl *pTI,
|
||||
SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, ref_lookup);
|
||||
|
||||
if (pTITail->funcs_off != 0xffff)
|
||||
- SLTG_DoFuncs(pBlk, pBlk + pTITail->funcs_off, pTI, pTITail->cFuncs, pNameTable, ref_lookup);
|
||||
+ SLTG_DoFuncs(pBlk, pBlk + pTITail->funcs_off, pTI, pTITail->cFuncs, pNameTable, ref_lookup, hlp_strings);
|
||||
free(ref_lookup);
|
||||
if (TRACE_ON(typelib))
|
||||
dump_TypeInfo(pTI);
|
||||
@@ -4696,7 +4700,7 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
|
||||
|
||||
case TKIND_INTERFACE:
|
||||
SLTG_ProcessInterface((char *)(pMemHeader + 1), *ppTypeInfoImpl, pNameTable,
|
||||
- pTIHeader, pTITail);
|
||||
+ pTIHeader, pTITail, hlp_strings);
|
||||
break;
|
||||
|
||||
case TKIND_COCLASS:
|
||||
@@ -4711,12 +4715,12 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
|
||||
|
||||
case TKIND_DISPATCH:
|
||||
SLTG_ProcessDispatch((char *)(pMemHeader + 1), *ppTypeInfoImpl, pNameTable,
|
||||
- pTIHeader, pTITail);
|
||||
+ pTIHeader, pTITail, hlp_strings);
|
||||
break;
|
||||
|
||||
case TKIND_MODULE:
|
||||
SLTG_ProcessModule((char *)(pMemHeader + 1), *ppTypeInfoImpl, pNameTable,
|
||||
- pTIHeader, pTITail);
|
||||
+ pTIHeader, pTITail, hlp_strings);
|
||||
break;
|
||||
|
||||
default:
|
||||
--
|
||||
2.43.0
|
||||
|
@@ -1,96 +0,0 @@
|
||||
From 259d6774b0b769956c33382a4260ae5278e54b85 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
Date: Tue, 26 Jan 2016 16:17:21 +0800
|
||||
Subject: [PATCH] oleaut32: Add support for decoding SLTG variable help
|
||||
strings.
|
||||
|
||||
---
|
||||
dlls/oleaut32/typelib.c | 24 +++++++++++++++---------
|
||||
1 file changed, 15 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
|
||||
index ff1506856e2..ee15996dea5 100644
|
||||
--- a/dlls/oleaut32/typelib.c
|
||||
+++ b/dlls/oleaut32/typelib.c
|
||||
@@ -4086,7 +4086,7 @@ static char *SLTG_DoImpls(char *pBlk, ITypeInfoImpl *pTI,
|
||||
}
|
||||
|
||||
static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsigned short cVars,
|
||||
- const char *pNameTable, const sltg_ref_lookup_t *ref_lookup)
|
||||
+ const char *pNameTable, const sltg_ref_lookup_t *ref_lookup, const BYTE *hlp_strings)
|
||||
{
|
||||
TLBVarDesc *pVarDesc;
|
||||
const TLBString *prevName = NULL;
|
||||
@@ -4116,6 +4116,12 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign
|
||||
TRACE_(typelib)("byte_offs = 0x%x\n", pItem->byte_offs);
|
||||
TRACE_(typelib)("memid = %#lx\n", pItem->memid);
|
||||
|
||||
+ if (pItem->helpstring != 0xffff)
|
||||
+ {
|
||||
+ pVarDesc->HelpString = decode_string(hlp_strings, pBlk + pItem->helpstring, pNameTable - pBlk, pTI->pTypeLib);
|
||||
+ TRACE_(typelib)("helpstring = %s\n", debugstr_w(pVarDesc->HelpString->str));
|
||||
+ }
|
||||
+
|
||||
if(pItem->flags & 0x02)
|
||||
pType = &pItem->type;
|
||||
else
|
||||
@@ -4355,9 +4361,9 @@ static void SLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI,
|
||||
|
||||
static void SLTG_ProcessRecord(char *pBlk, ITypeInfoImpl *pTI,
|
||||
const char *pNameTable, SLTG_TypeInfoHeader *pTIHeader,
|
||||
- const SLTG_TypeInfoTail *pTITail)
|
||||
+ const SLTG_TypeInfoTail *pTITail, const BYTE *hlp_strings)
|
||||
{
|
||||
- SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, NULL);
|
||||
+ SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, NULL, hlp_strings);
|
||||
}
|
||||
|
||||
static void SLTG_ProcessAlias(char *pBlk, ITypeInfoImpl *pTI,
|
||||
@@ -4398,7 +4404,7 @@ static void SLTG_ProcessDispatch(char *pBlk, ITypeInfoImpl *pTI,
|
||||
pNameTable);
|
||||
|
||||
if (pTITail->vars_off != 0xffff)
|
||||
- SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, ref_lookup);
|
||||
+ SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, ref_lookup, hlp_strings);
|
||||
|
||||
if (pTITail->funcs_off != 0xffff)
|
||||
SLTG_DoFuncs(pBlk, pBlk + pTITail->funcs_off, pTI, pTITail->cFuncs, pNameTable, ref_lookup, hlp_strings);
|
||||
@@ -4418,9 +4424,9 @@ static void SLTG_ProcessDispatch(char *pBlk, ITypeInfoImpl *pTI,
|
||||
|
||||
static void SLTG_ProcessEnum(char *pBlk, ITypeInfoImpl *pTI,
|
||||
const char *pNameTable, SLTG_TypeInfoHeader *pTIHeader,
|
||||
- const SLTG_TypeInfoTail *pTITail)
|
||||
+ const SLTG_TypeInfoTail *pTITail, const BYTE *hlp_strings)
|
||||
{
|
||||
- SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, NULL);
|
||||
+ SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, NULL, hlp_strings);
|
||||
}
|
||||
|
||||
static void SLTG_ProcessModule(char *pBlk, ITypeInfoImpl *pTI,
|
||||
@@ -4433,7 +4439,7 @@ static void SLTG_ProcessModule(char *pBlk, ITypeInfoImpl *pTI,
|
||||
pNameTable);
|
||||
|
||||
if (pTITail->vars_off != 0xffff)
|
||||
- SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, ref_lookup);
|
||||
+ SLTG_DoVars(pBlk, pBlk + pTITail->vars_off, pTI, pTITail->cVars, pNameTable, ref_lookup, hlp_strings);
|
||||
|
||||
if (pTITail->funcs_off != 0xffff)
|
||||
SLTG_DoFuncs(pBlk, pBlk + pTITail->funcs_off, pTI, pTITail->cFuncs, pNameTable, ref_lookup, hlp_strings);
|
||||
@@ -4688,12 +4694,12 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
|
||||
switch(pTIHeader->typekind) {
|
||||
case TKIND_ENUM:
|
||||
SLTG_ProcessEnum((char *)(pMemHeader + 1), *ppTypeInfoImpl, pNameTable,
|
||||
- pTIHeader, pTITail);
|
||||
+ pTIHeader, pTITail, hlp_strings);
|
||||
break;
|
||||
|
||||
case TKIND_RECORD:
|
||||
SLTG_ProcessRecord((char *)(pMemHeader + 1), *ppTypeInfoImpl, pNameTable,
|
||||
- pTIHeader, pTITail);
|
||||
+ pTIHeader, pTITail, hlp_strings);
|
||||
break;
|
||||
|
||||
case TKIND_INTERFACE:
|
||||
--
|
||||
2.34.1
|
||||
|
@@ -1 +0,0 @@
|
||||
Fixes: Implement support for SLTG typelibs in widl
|
@@ -1 +1 @@
|
||||
59720e7d1b88ed519569135542aa55145a2a6ff7
|
||||
a46043015322bf8e6c78a74bd33300f3478767e3
|
||||
|
Reference in New Issue
Block a user