[PATCH 2/2 v2] ole2: Implement ReadClassStm()
Nikolay Sivov
nsivov at codeweavers.com
Wed Jan 6 03:34:34 CST 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
v2: Use Read() on stream instead of Stat()
dlls/ole2.dll16/ole2.c | 59 ++++++++++++++++++++++++++++++++++++++---
dlls/ole2.dll16/ole2.dll16.spec | 2 +-
2 files changed, 57 insertions(+), 4 deletions(-)
diff --git a/dlls/ole2.dll16/ole2.c b/dlls/ole2.dll16/ole2.c
index bcbf025..4557afd 100644
--- a/dlls/ole2.dll16/ole2.c
+++ b/dlls/ole2.dll16/ole2.c
@@ -273,6 +273,9 @@ HRESULT WINAPI OleFlushClipboard16(void)
return OleFlushClipboard();
}
+#define GET_SEGPTR_METHOD_ADDR(ifacename,segptr,methodname) \
+ (DWORD)((const ifacename##Vtbl*)MapSL((SEGPTR)((ifacename*)MapSL(segptr))->lpVtbl))->methodname
+
/***********************************************************************
* ReadClassStg (OLE2.18)
*
@@ -312,9 +315,7 @@ HRESULT WINAPI ReadClassStg16(SEGPTR pstg, CLSID *pclsid)
args[2] = STATFLAG_DEFAULT;
if (!WOWCallback16Ex(
- (DWORD)((const IStorage16Vtbl*)MapSL(
- (SEGPTR)((LPSTORAGE16)MapSL(pstg))->lpVtbl)
- )->Stat,
+ GET_SEGPTR_METHOD_ADDR(IStorage16, pstg, Stat),
WCB16_PASCAL,
3*sizeof(DWORD),
(LPVOID)args,
@@ -335,6 +336,58 @@ HRESULT WINAPI ReadClassStg16(SEGPTR pstg, CLSID *pclsid)
}
/***********************************************************************
+ * ReadClassStm (OLE2.20)
+ */
+HRESULT WINAPI ReadClassStm16(SEGPTR stream, CLSID *clsid)
+{
+ HANDLE16 hclsid, hread;
+ HRESULT hres;
+ DWORD args[4];
+
+ TRACE("(0x%x, %p)\n", stream, clsid);
+
+ if (!clsid)
+ return E_INVALIDARG16;
+
+ memset(clsid, 0, sizeof(*clsid));
+
+ if (!stream)
+ return E_INVALIDARG16;
+
+ args[0] = (DWORD)stream; /* iface */
+ args[1] = WOWGlobalAllocLock16( 0, sizeof(CLSID), &hclsid );
+ args[2] = sizeof(CLSID);
+ args[3] = WOWGlobalAllocLock16( 0, sizeof(ULONG), &hread );
+
+ if (WOWCallback16Ex(
+ GET_SEGPTR_METHOD_ADDR(IStream16, stream, Read),
+ WCB16_PASCAL,
+ 4*sizeof(DWORD),
+ (void*)args,
+ (DWORD*)&hres))
+ {
+ ULONG readlen;
+
+ memcpy(&readlen, MapSL(args[3]), sizeof(readlen));
+ if (readlen == sizeof(CLSID))
+ memcpy(clsid, MapSL(args[1]), sizeof(CLSID));
+ else
+ hres = STG_E_READFAULT;
+
+ TRACE("clsid is %s\n", debugstr_guid(clsid));
+ }
+ else
+ {
+ ERR("CallTo16 IStream16::Read() failed, hres %x\n", hres);
+ hres = E_FAIL;
+ }
+ WOWGlobalUnlockFree16(args[1]);
+ WOWGlobalUnlockFree16(args[3]);
+
+ return hres;
+}
+
+/***********************************************************************
* GetConvertStg (OLE2.82)
*/
HRESULT WINAPI GetConvertStg16(LPSTORAGE stg)
diff --git a/dlls/ole2.dll16/ole2.dll16.spec b/dlls/ole2.dll16/ole2.dll16.spec
index cb6b1ec..ed5e917 100644
--- a/dlls/ole2.dll16/ole2.dll16.spec
+++ b/dlls/ole2.dll16/ole2.dll16.spec
@@ -17,7 +17,7 @@
17 stub OLELOCKRUNNING
18 pascal ReadClassStg(segptr ptr) ReadClassStg16
19 pascal WriteClassStg(segptr ptr) WriteClassStg16
-20 stub READCLASSSTM
+20 pascal ReadClassStm(segptr ptr) ReadClassStm16
21 stub WRITECLASSSTM
22 stub BINDMONIKER
23 stub MKPARSEDISPLAYNAME
--
2.6.4
More information about the wine-patches
mailing list