Author: akhaldi
Date: Mon Jul 20 22:44:15 2015
New Revision: 68486

URL: http://svn.reactos.org/svn/reactos?rev=68486&view=rev
Log:
[OLEAUT32] Sync with Wine Staging 1.7.47. CORE-9924

Modified:
    trunk/reactos/dll/win32/oleaut32/connpt.c
    trunk/reactos/dll/win32/oleaut32/olepropframe.c
    trunk/reactos/dll/win32/oleaut32/recinfo.c
    trunk/reactos/dll/win32/oleaut32/tmarshal.c
    trunk/reactos/dll/win32/oleaut32/typelib.c
    trunk/reactos/dll/win32/oleaut32/usrmarshal.c
    trunk/reactos/dll/win32/oleaut32/varformat.c
    trunk/reactos/dll/win32/oleaut32/variant.c
    trunk/reactos/dll/win32/oleaut32/variant.h
    trunk/reactos/dll/win32/oleaut32/vartype.c
    trunk/reactos/media/doc/README.WINE

Modified: trunk/reactos/dll/win32/oleaut32/connpt.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/connpt.c?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/connpt.c   [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/connpt.c   [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -53,9 +53,6 @@
   DWORD nSinks;
 } ConnectionPointImpl;
 
-static const IConnectionPointVtbl ConnectionPointImpl_VTable;
-
-
 /************************************************************************
  * Implementation of IEnumConnections
  */
@@ -89,26 +86,6 @@
 static inline EnumConnectionsImpl *impl_from_IEnumConnections(IEnumConnections 
*iface)
 {
   return CONTAINING_RECORD(iface, EnumConnectionsImpl, IEnumConnections_iface);
-}
-
-/************************************************************************
- * ConnectionPointImpl_Construct
- */
-static ConnectionPointImpl *ConnectionPointImpl_Construct(IUnknown *pUnk,
-                                                         REFIID riid)
-{
-  ConnectionPointImpl *Obj;
-
-  Obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*Obj));
-  Obj->IConnectionPoint_iface.lpVtbl = &ConnectionPointImpl_VTable;
-  Obj->Obj = pUnk;
-  Obj->ref = 1;
-  Obj->iid =  *riid;
-  Obj->maxSinks = MAXSINKS;
-  Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-                        sizeof(IUnknown*) * MAXSINKS);
-  Obj->nSinks = 0;
-  return Obj;
 }
 
 /************************************************************************
@@ -128,7 +105,6 @@
   return;
 }
 
-static ULONG WINAPI ConnectionPointImpl_AddRef(IConnectionPoint* iface);
 /************************************************************************
  * ConnectionPointImpl_QueryInterface (IUnknown)
  *
@@ -145,7 +121,7 @@
   /*
    * Perform a sanity check on the parameters.
    */
-  if ( (This==0) || (ppvObject==0) )
+  if (!ppvObject)
     return E_INVALIDARG;
 
   /*
@@ -153,28 +129,20 @@
    */
   *ppvObject = 0;
 
-  /*
-   * Compare the riid with the interface IDs implemented by this object.
-   */
-  if (IsEqualIID(&IID_IUnknown, riid))
-    *ppvObject = This;
-  else if (IsEqualIID(&IID_IConnectionPoint, riid))
-    *ppvObject = This;
+
+  if (IsEqualIID(&IID_IConnectionPoint, riid) || IsEqualIID(&IID_IUnknown, 
riid))
+    *ppvObject = iface;
 
   /*
    * Check that we obtained an interface.
    */
   if ((*ppvObject)==0)
   {
-    FIXME("() : asking for un supported interface %s\n",debugstr_guid(riid));
+    FIXME("() : asking for unsupported interface %s\n", debugstr_guid(riid));
     return E_NOINTERFACE;
   }
 
-  /*
-   * Query Interface always increases the reference count by one when it is
-   * successful
-   */
-  ConnectionPointImpl_AddRef(&This->IConnectionPoint_iface);
+  IUnknown_AddRef((IUnknown*)*ppvObject);
 
   return S_OK;
 }
@@ -330,9 +298,9 @@
 
   /* Bump the ref count of this object up by one.  It gets Released in
      IEnumConnections_Release */
-  IUnknown_AddRef((IUnknown*)This);
-
-  EnumObj = EnumConnectionsImpl_Construct((IUnknown*)This, This->nSinks, pCD);
+  IConnectionPoint_AddRef(iface);
+
+  EnumObj = EnumConnectionsImpl_Construct((IUnknown*)iface, This->nSinks, pCD);
   hr = IEnumConnections_QueryInterface(&EnumObj->IEnumConnections_iface,
                                        &IID_IEnumConnections, (void**)ppEnum);
   IEnumConnections_Release(&EnumObj->IEnumConnections_iface);
@@ -355,7 +323,6 @@
 
 
 static const IEnumConnectionsVtbl EnumConnectionsImpl_VTable;
-static ULONG WINAPI EnumConnectionsImpl_AddRef(IEnumConnections* iface);
 
 /************************************************************************
  * EnumConnectionsImpl_Construct
@@ -412,7 +379,7 @@
   /*
    * Perform a sanity check on the parameters.
    */
-  if ( (This==0) || (ppvObject==0) )
+  if (!ppvObject)
     return E_INVALIDARG;
 
   /*
@@ -420,28 +387,19 @@
    */
   *ppvObject = 0;
 
-  /*
-   * Compare the riid with the interface IDs implemented by this object.
-   */
-  if (IsEqualIID(&IID_IUnknown, riid))
-    *ppvObject = This;
-  else if (IsEqualIID(&IID_IEnumConnections, riid))
-    *ppvObject = This;
+  if (IsEqualIID(&IID_IEnumConnections, riid) || IsEqualIID(&IID_IUnknown, 
riid))
+    *ppvObject = iface;
 
   /*
    * Check that we obtained an interface.
    */
   if ((*ppvObject)==0)
   {
-    FIXME("() : asking for un supported interface %s\n",debugstr_guid(riid));
+    FIXME("() : asking for unsupported interface %s\n", debugstr_guid(riid));
     return E_NOINTERFACE;
   }
 
-  /*
-   * Query Interface always increases the reference count by one when it is
-   * successful
-   */
-  EnumConnectionsImpl_AddRef((IEnumConnections*)This);
+  IUnknown_AddRef((IUnknown*)*ppvObject);
 
   return S_OK;
 }
@@ -568,7 +526,7 @@
 
   newObj = EnumConnectionsImpl_Construct(This->pUnk, This->nConns, This->pCD);
   newObj->nCur = This->nCur;
-  *ppEnum = (LPENUMCONNECTIONS)newObj;
+  *ppEnum = &newObj->IEnumConnections_iface;
   IUnknown_AddRef(This->pUnk);
   return S_OK;
 }
@@ -602,13 +560,22 @@
                              IConnectionPoint **pCP)
 {
   ConnectionPointImpl *Obj;
-  HRESULT hr;
-
-  Obj = ConnectionPointImpl_Construct(pUnk, riid);
-  if(!Obj) return E_OUTOFMEMORY;
-
-  hr = IConnectionPoint_QueryInterface(&Obj->IConnectionPoint_iface,
-                                       &IID_IConnectionPoint, (void**)pCP);
-  IConnectionPoint_Release(&Obj->IConnectionPoint_iface);
-  return hr;
-}
+
+  TRACE("(%p %s %p)\n", pUnk, debugstr_guid(riid), pCP);
+
+  *pCP = NULL;
+  Obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*Obj));
+  if (!Obj)
+    return E_OUTOFMEMORY;
+
+  Obj->IConnectionPoint_iface.lpVtbl = &ConnectionPointImpl_VTable;
+  Obj->Obj = pUnk;
+  Obj->ref = 1;
+  Obj->iid = *riid;
+  Obj->maxSinks = MAXSINKS;
+  Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IUnknown*) 
* MAXSINKS);
+  Obj->nSinks = 0;
+
+  *pCP = &Obj->IConnectionPoint_iface;
+  return S_OK;
+}

Modified: trunk/reactos/dll/win32/oleaut32/olepropframe.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/olepropframe.c?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/olepropframe.c     [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/olepropframe.c     [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -201,6 +201,7 @@
     if(property_sheet_dialog_data) {
         if(property_sheet_dialog_data[1] == 0xffff) {
             ERR("Expected DLGTEMPLATE structure\n");
+            FreeLibrary(hcomctl);
             return E_OUTOFMEMORY;
         }
 

Modified: trunk/reactos/dll/win32/oleaut32/recinfo.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/recinfo.c?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/recinfo.c  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/recinfo.c  [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -503,12 +503,7 @@
     TRACE( "(%p)->(%p)\n", This, info2 );
 
     IRecordInfo_GetGuid( info2, &guid2 );
-    if (IsEqualGUID( &This->guid, &guid2 )) return TRUE;
-
-    FIXME( "records have different guids (%s %s) but could still match\n",
-           debugstr_guid( &This->guid ), debugstr_guid( &guid2 ) );
-
-    return FALSE;
+    return IsEqualGUID( &This->guid, &guid2 );
 }
 
 static PVOID WINAPI IRecordInfoImpl_RecordCreate(IRecordInfo *iface)
@@ -642,7 +637,12 @@
             WARN("GetRefTypeInfo failed: %08x\n", hres);
             return hres;
         }
-        ITypeInfo_GetTypeAttr(pTypeInfo, &typeattr);
+        hres = ITypeInfo_GetTypeAttr(pTypeInfo, &typeattr);
+        if(FAILED(hres)) {
+            ITypeInfo_Release(pTypeInfo);
+            WARN("GetTypeAttr failed for referenced type: %08x\n", hres);
+            return hres;
+        }
     }else  {
         pTypeInfo = pTI;
         ITypeInfo_AddRef(pTypeInfo);

Modified: trunk/reactos/dll/win32/oleaut32/tmarshal.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/tmarshal.c?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/tmarshal.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/tmarshal.c [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -242,18 +242,71 @@
 static ULONG WINAPI PSFacBuf_AddRef(LPPSFACTORYBUFFER iface) { return 2; }
 static ULONG WINAPI PSFacBuf_Release(LPPSFACTORYBUFFER iface) { return 1; }
 
-static HRESULT
-_get_typeinfo_for_iid(REFIID riid, ITypeInfo**ti) {
-    HRESULT    hres;
+struct ifacepsredirect_data
+{
+    ULONG size;
+    DWORD mask;
+    GUID  iid;
+    ULONG nummethods;
+    GUID  tlbid;
+    GUID  base;
+    ULONG name_len;
+    ULONG name_offset;
+};
+
+struct tlibredirect_data
+{
+    ULONG  size;
+    DWORD  res;
+    ULONG  name_len;
+    ULONG  name_offset;
+    LANGID langid;
+    WORD   flags;
+    ULONG  help_len;
+    ULONG  help_offset;
+    WORD   major_version;
+    WORD   minor_version;
+};
+
+static BOOL actctx_get_typelib_module(REFIID riid, WCHAR *module, DWORD len)
+{
+    struct ifacepsredirect_data *iface;
+    struct tlibredirect_data *tlib;
+    ACTCTX_SECTION_KEYED_DATA data;
+    WCHAR *ptrW;
+
+    data.cbSize = sizeof(data);
+    if (!FindActCtxSectionGuid(0, NULL, 
ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION,
+            riid, &data))
+        return FALSE;
+
+    iface = (struct ifacepsredirect_data*)data.lpData;
+    if (!FindActCtxSectionGuid(0, NULL, 
ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION,
+            &iface->tlbid, &data))
+        return FALSE;
+
+    tlib = (struct tlibredirect_data*)data.lpData;
+    ptrW = (WCHAR*)((BYTE*)data.lpSectionBase + tlib->name_offset);
+
+    if (tlib->name_len/sizeof(WCHAR) >= len) {
+        ERR("need larger module buffer, %u\n", tlib->name_len);
+        return FALSE;
+    }
+
+    memcpy(module, ptrW, tlib->name_len);
+    module[tlib->name_len/sizeof(WCHAR)] = 0;
+    return TRUE;
+}
+
+static HRESULT reg_get_typelib_module(REFIID riid, WCHAR *module, DWORD len)
+{
     HKEY       ikey;
     REGSAM     opposite = (sizeof(void*) == 8) ? KEY_WOW64_32KEY : 
KEY_WOW64_64KEY;
     BOOL       is_wow64;
     char       tlguid[200],typelibkey[300],interfacekey[300],ver[100];
     char       tlfn[260];
-    OLECHAR    tlfnW[260];
     DWORD      tlguidlen, verlen, type;
     LONG       tlfnlen, err;
-    ITypeLib   *tl;
 
     sprintf( interfacekey, 
"Interface\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\Typelib",
        riid->Data1, riid->Data2, riid->Data3,
@@ -297,19 +350,37 @@
         }
 #endif
     }
-    MultiByteToWideChar(CP_ACP, 0, tlfn, -1, tlfnW, sizeof(tlfnW) / 
sizeof(tlfnW[0]));
-    hres = LoadTypeLib(tlfnW,&tl);
-    if (hres) {
+    MultiByteToWideChar(CP_ACP, 0, tlfn, -1, module, len);
+    return S_OK;
+}
+
+static HRESULT
+_get_typeinfo_for_iid(REFIID riid, ITypeInfo **typeinfo)
+{
+    OLECHAR   moduleW[260];
+    ITypeLib *typelib;
+    HRESULT   hres;
+
+    *typeinfo = NULL;
+
+    moduleW[0] = 0;
+    if (!actctx_get_typelib_module(riid, moduleW, 
sizeof(moduleW)/sizeof(moduleW[0]))) {
+        hres = reg_get_typelib_module(riid, moduleW, 
sizeof(moduleW)/sizeof(moduleW[0]));
+        if (FAILED(hres))
+            return hres;
+    }
+
+    hres = LoadTypeLib(moduleW, &typelib);
+    if (hres != S_OK) {
        ERR("Failed to load typelib for %s, but it should be 
there.\n",debugstr_guid(riid));
        return hres;
     }
-    hres = ITypeLib_GetTypeInfoOfGuid(tl,riid,ti);
-    if (hres) {
-       ERR("typelib does not contain info for %s?\n",debugstr_guid(riid));
-       ITypeLib_Release(tl);
-       return hres;
-    }
-    ITypeLib_Release(tl);
+
+    hres = ITypeLib_GetTypeInfoOfGuid(typelib, riid, typeinfo);
+    ITypeLib_Release(typelib);
+    if (hres != S_OK)
+       ERR("typelib does not contain info for %s\n", debugstr_guid(riid));
+
     return hres;
 }
 
@@ -1714,9 +1785,7 @@
     /* nrofargs including This */
     int nrofargs = 1;
     ITypeInfo *tinfo2;
-#ifdef __i386__
     TMAsmProxy *xasm = proxy->asmstubs + num;
-#endif
     HRESULT hres;
     const FUNCDESC *fdesc;
 

Modified: trunk/reactos/dll/win32/oleaut32/typelib.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/typelib.c?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/typelib.c  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/typelib.c  [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -3393,18 +3393,27 @@
 
     h = CreateFileW(pszPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 
FILE_ATTRIBUTE_NORMAL, NULL);
     if(h != INVALID_HANDLE_VALUE){
-        FILE_NAME_INFORMATION *info;
-        char data[MAX_PATH * sizeof(WCHAR) + sizeof(info->FileNameLength)];
+        FILE_NAME_INFORMATION size_info;
         BOOL br;
 
-        info = (FILE_NAME_INFORMATION*)data;
         /* GetFileInformationByHandleEx returns the path of the file without
          * WOW64 redirection */
-        br = GetFileInformationByHandleEx(h, FileNameInfo, data, sizeof(data));
-        if(br){
-            info->FileName[info->FileNameLength / sizeof(WCHAR)] = 0;
-            lstrcpynW(pszPath + 2, info->FileName, cchPath - 2);
-        }
+        br = GetFileInformationByHandleEx(h, FileNameInfo, &size_info, 
sizeof(size_info));
+        if(br || GetLastError() == ERROR_MORE_DATA){
+            FILE_NAME_INFORMATION *info;
+            DWORD size = sizeof(*info) + size_info.FileNameLength + 
sizeof(WCHAR);
+
+            info = HeapAlloc(GetProcessHeap(), 0, size);
+
+            br = GetFileInformationByHandleEx(h, FileNameInfo, info, size);
+            if(br){
+                info->FileName[info->FileNameLength / sizeof(WCHAR)] = 0;
+                lstrcpynW(pszPath + 2, info->FileName, cchPath - 2);
+            }
+
+            HeapFree(GetProcessHeap(), 0, info);
+        }
+
         CloseHandle(h);
     }
 
@@ -6487,10 +6496,10 @@
                    "movq 8(%rsp),%rdx\n\t"
                    "movq 16(%rsp),%r8\n\t"
                    "movq 24(%rsp),%r9\n\t"
-                   "movq %rcx,%xmm0\n\t"
-                   "movq %rdx,%xmm1\n\t"
-                   "movq %r8,%xmm2\n\t"
-                   "movq %r9,%xmm3\n\t"
+                   "movq 0(%rsp),%xmm0\n\t"
+                   "movq 8(%rsp),%xmm1\n\t"
+                   "movq 16(%rsp),%xmm2\n\t"
+                   "movq 24(%rsp),%xmm3\n\t"
                    "callq *%rax\n\t"
                    "leaq -16(%rbp),%rsp\n\t"
                    "popq %rdi\n\t"

Modified: trunk/reactos/dll/win32/oleaut32/usrmarshal.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/usrmarshal.c?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/usrmarshal.c       [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/usrmarshal.c       [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -27,6 +27,11 @@
 #define ALIGNED_POINTER(_Ptr, _Align) 
((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align))
 #define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align)
 #define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align)
+
+/* ole32 exports those, not defined in public headers */
+ULONG __RPC_USER WdtpInterfacePointer_UserSize(ULONG*, ULONG, ULONG, 
IUnknown*, REFIID);
+unsigned char * __RPC_USER WdtpInterfacePointer_UserMarshal(ULONG*, ULONG, 
unsigned char*, IUnknown*, REFIID);
+unsigned char * __RPC_USER WdtpInterfacePointer_UserUnmarshal(ULONG*, unsigned 
char*, IUnknown**, REFIID);
 
 static void dump_user_flags(const ULONG *pFlags)
 {
@@ -239,21 +244,21 @@
     return 7;
 }
 
-static unsigned interface_variant_size(const ULONG *pFlags, REFIID riid, 
IUnknown *punk)
+/* WdtpInterfacePointer_UserSize takes care of 2 additional DWORDs to store 
marshalling buffer size */
+static unsigned interface_variant_size(ULONG *pFlags, REFIID riid, IUnknown 
*punk)
 {
     ULONG size = 0;
-    HRESULT hr;
 
     if (punk)
     {
-        hr = CoGetMarshalSizeMax(&size, riid, punk, LOWORD(*pFlags), NULL, 
MSHLFLAGS_NORMAL);
-        if (FAILED(hr))
+        size = WdtpInterfacePointer_UserSize(pFlags, LOWORD(*pFlags), 0, punk, 
riid);
+        if (!size)
         {
-            ERR("interface variant buffer size calculation failed, 
HRESULT=0x%x\n", hr);
+            ERR("interface variant buffer size calculation failed\n");
             return 0;
         }
     }
-    size += sizeof(ULONG); /* we have to store the buffersize in the stream */
+    size += sizeof(ULONG);
     TRACE("wire-size extra of interface variant is %d\n", size);
     return size;
 }
@@ -295,115 +300,47 @@
   }
 }
 
-/* helper: called for VT_DISPATCH variants to marshal the IDispatch* into the 
buffer. returns Buffer on failure, new position otherwise */
-static unsigned char* interface_variant_marshal(const ULONG *pFlags, unsigned 
char *Buffer,
+/* helper: called for VT_DISPATCH variants to marshal the IDispatch* into the 
buffer */
+static unsigned char* interface_variant_marshal(ULONG *pFlags, unsigned char 
*Buffer,
                                                 REFIID riid, IUnknown *punk)
 {
-  IStream *working; 
-  HGLOBAL working_mem;
-  void *working_memlocked;
-  unsigned char *oldpos;
-  ULONG size;
-  HRESULT hr;
-  
   TRACE("pFlags=%d, Buffer=%p, pUnk=%p\n", *pFlags, Buffer, punk);
 
+  /* first DWORD is used to store pointer itself, truncated on win64 */
   if(!punk)
   {
       memset(Buffer, 0, sizeof(ULONG));
       return Buffer + sizeof(ULONG);
   }
-
-  oldpos = Buffer;
-  
-  /* CoMarshalInterface needs a stream, whereas at this level we are operating 
in terms of buffers.
-   * We create a stream on an HGLOBAL, so we can simply do a memcpy to move it 
to the buffer.
-   * in rpcrt4/ndr_ole.c, a simple IStream implementation is wrapped around 
the buffer object,
-   * but that would be overkill here, hence this implementation. We save the 
size because the unmarshal
-   * code has no way to know how long the marshalled buffer is. */
-
-  size = interface_variant_size(pFlags, riid, punk);
-  
-  working_mem = GlobalAlloc(0, size);
-  if (!working_mem) return oldpos;
-
-  hr = CreateStreamOnHGlobal(working_mem, TRUE, &working);
-  if (hr != S_OK) {
-    GlobalFree(working_mem);
-    return oldpos;
+  else
+  {
+      *(DWORD*)Buffer = (DWORD_PTR)punk;
+      Buffer += sizeof(DWORD);
   }
-  
-  hr = CoMarshalInterface(working, riid, punk, LOWORD(*pFlags), NULL, 
MSHLFLAGS_NORMAL);
-  if (hr != S_OK) {
-    IStream_Release(working); /* this also releases the hglobal */
-    return oldpos;
-  }
-
-  working_memlocked = GlobalLock(working_mem);
-  memcpy(Buffer, &size, sizeof(ULONG)); /* copy the buffersize */
-  memcpy(Buffer + sizeof(ULONG), working_memlocked, size - sizeof(ULONG));
-  GlobalUnlock(working_mem);
-
-  IStream_Release(working);
-
-  /* size includes the ULONG for the size written above */
-  TRACE("done, size=%d\n", size);
-  return Buffer + size;
-}
-
-/* helper: called for VT_DISPATCH / VT_UNKNOWN variants to unmarshal the 
buffer. returns Buffer on failure, new position otherwise */
-static unsigned char *interface_variant_unmarshal(const ULONG *pFlags, 
unsigned char *Buffer,
+
+  return WdtpInterfacePointer_UserMarshal(pFlags, LOWORD(*pFlags), Buffer, 
punk, riid);
+}
+
+/* helper: called for VT_DISPATCH / VT_UNKNOWN variants to unmarshal the 
buffer */
+static unsigned char *interface_variant_unmarshal(ULONG *pFlags, unsigned char 
*Buffer,
                                                   REFIID riid, IUnknown 
**ppunk)
 {
-  IStream *working;
-  HGLOBAL working_mem;
-  void *working_memlocked;
-  unsigned char *oldpos;
-  ULONG size;
-  HRESULT hr;
+  DWORD ptr;
   
   TRACE("pFlags=%d, Buffer=%p, ppUnk=%p\n", *pFlags, Buffer, ppunk);
 
-  oldpos = Buffer;
-
-  /* get the buffersize */
-  memcpy(&size, Buffer, sizeof(ULONG));
-  TRACE("buffersize=%d\n", size);
-
-  if(!size)
+  /* skip pointer part itself */
+  ptr = *(DWORD*)Buffer;
+  Buffer += sizeof(DWORD);
+
+  if(!ptr)
   {
       *ppunk = NULL;
-      return Buffer + sizeof(ULONG);
+      return Buffer;
   }
 
-  working_mem = GlobalAlloc(0, size);
-  if (!working_mem) return oldpos;
-
-  hr = CreateStreamOnHGlobal(working_mem, TRUE, &working);
-  if (hr != S_OK) {
-    GlobalFree(working_mem);
-    return oldpos;
-  }
-
-  working_memlocked = GlobalLock(working_mem);
-  
-  /* now we copy the contents of the marshalling buffer to working_memlocked, 
unlock it, and demarshal the stream */
-  memcpy(working_memlocked, Buffer + sizeof(ULONG), size);
-  GlobalUnlock(working_mem);
-
-  hr = CoUnmarshalInterface(working, riid, (void**)ppunk);
-  if (hr != S_OK) {
-    IStream_Release(working);
-    return oldpos;
-  }
-
-  IStream_Release(working); /* this also frees the underlying hglobal */
-
-  /* size includes the ULONG for the size written above */
-  TRACE("done, processed=%d bytes\n", size);
-  return Buffer + size;
-}
-
+  return WdtpInterfacePointer_UserUnmarshal(pFlags, Buffer, ppunk, riid);
+}
 
 ULONG WINAPI VARIANT_UserSize(ULONG *pFlags, ULONG Start, VARIANT *pvar)
 {
@@ -502,19 +439,15 @@
             Pos = VARIANT_UserMarshal(pFlags, Pos, V_VARIANTREF(pvar));
             break;
         case VT_UNKNOWN:
-            /* this should probably call WdtpInterfacePointer_UserMarshal in 
ole32.dll */
             Pos = interface_variant_marshal(pFlags, Pos, &IID_IUnknown, 
V_UNKNOWN(pvar));
             break;
         case VT_UNKNOWN | VT_BYREF:
-            /* this should probably call WdtpInterfacePointer_UserMarshal in 
ole32.dll */
             Pos = interface_variant_marshal(pFlags, Pos, &IID_IUnknown, 
*V_UNKNOWNREF(pvar));
             break;
         case VT_DISPATCH:
-            /* this should probably call WdtpInterfacePointer_UserMarshal in 
ole32.dll */
             Pos = interface_variant_marshal(pFlags, Pos, &IID_IDispatch, 
(IUnknown*)V_DISPATCH(pvar));
             break;
         case VT_DISPATCH | VT_BYREF:
-            /* this should probably call WdtpInterfacePointer_UserMarshal in 
ole32.dll */
             Pos = interface_variant_marshal(pFlags, Pos, &IID_IDispatch, 
(IUnknown*)*V_DISPATCHREF(pvar));
             break;
         case VT_RECORD:
@@ -617,19 +550,15 @@
             Pos = VARIANT_UserUnmarshal(pFlags, Pos, V_VARIANTREF(pvar));
             break;
         case VT_UNKNOWN:
-            /* this should probably call WdtpInterfacePointer_UserUnmarshal in 
ole32.dll */
             Pos = interface_variant_unmarshal(pFlags, Pos, &IID_IUnknown, 
&V_UNKNOWN(pvar));
             break;
         case VT_UNKNOWN | VT_BYREF:
-            /* this should probably call WdtpInterfacePointer_UserUnmarshal in 
ole32.dll */
             Pos = interface_variant_unmarshal(pFlags, Pos, &IID_IUnknown, 
V_UNKNOWNREF(pvar));
             break;
         case VT_DISPATCH:
-            /* this should probably call WdtpInterfacePointer_UserUnmarshal in 
ole32.dll */
             Pos = interface_variant_unmarshal(pFlags, Pos, &IID_IDispatch, 
(IUnknown**)&V_DISPATCH(pvar));
             break;
         case VT_DISPATCH | VT_BYREF:
-            /* this should probably call WdtpInterfacePointer_UserUnmarshal in 
ole32.dll */
             Pos = interface_variant_unmarshal(pFlags, Pos, &IID_IDispatch, 
(IUnknown**)V_DISPATCHREF(pvar));
             break;
         case VT_RECORD:
@@ -2256,8 +2185,14 @@
     LPCONNECTDATA rgcd,
     ULONG *pcFetched)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    ULONG fetched;
+
+    TRACE("(%u, %p %p)\n", cConnections, rgcd, pcFetched);
+
+    if (!pcFetched)
+        pcFetched = &fetched;
+
+    return IEnumConnections_RemoteNext_Proxy(This, cConnections, rgcd, 
pcFetched);
 }
 
 HRESULT __RPC_STUB IEnumConnections_Next_Stub(
@@ -2266,28 +2201,50 @@
     LPCONNECTDATA rgcd,
     ULONG *pcFetched)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    HRESULT hr;
+
+    TRACE("(%u, %p, %p)\n", cConnections, rgcd, pcFetched);
+
+    *pcFetched = 0;
+    hr = IEnumConnections_Next(This, cConnections, rgcd, pcFetched);
+    if (hr == S_OK)
+        *pcFetched = cConnections;
+
+    return hr;
 }
 
 HRESULT CALLBACK IEnumConnectionPoints_Next_Proxy(
     IEnumConnectionPoints* This,
     ULONG cConnections,
-    LPCONNECTIONPOINT *ppCP,
+    IConnectionPoint **ppCP,
     ULONG *pcFetched)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    ULONG fetched;
+
+    TRACE("(%u, %p %p)\n", cConnections, ppCP, pcFetched);
+
+    if (!pcFetched)
+        pcFetched = &fetched;
+
+    return IEnumConnectionPoints_RemoteNext_Proxy(This, cConnections, ppCP, 
pcFetched);
 }
 
 HRESULT __RPC_STUB IEnumConnectionPoints_Next_Stub(
     IEnumConnectionPoints* This,
     ULONG cConnections,
-    LPCONNECTIONPOINT *ppCP,
+    IConnectionPoint **ppCP,
     ULONG *pcFetched)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    HRESULT hr;
+
+    TRACE("(%u, %p, %p)\n", cConnections, ppCP, pcFetched);
+
+    *pcFetched = 0;
+    hr = IEnumConnectionPoints_Next(This, cConnections, ppCP, pcFetched);
+    if (hr == S_OK)
+        *pcFetched = cConnections;
+
+    return hr;
 }
 
 HRESULT CALLBACK IPersistMemory_Load_Proxy(
@@ -2295,8 +2252,12 @@
     LPVOID pMem,
     ULONG cbSize)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    TRACE("(%p, %u)\n", pMem, cbSize);
+
+    if (!pMem)
+        return E_POINTER;
+
+    return IPersistMemory_RemoteLoad_Proxy(This, pMem, cbSize);
 }
 
 HRESULT __RPC_STUB IPersistMemory_Load_Stub(
@@ -2304,8 +2265,8 @@
     BYTE *pMem,
     ULONG cbSize)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    TRACE("(%p, %u)\n", pMem, cbSize);
+    return IPersistMemory_Load(This, pMem, cbSize);
 }
 
 HRESULT CALLBACK IPersistMemory_Save_Proxy(
@@ -2314,8 +2275,12 @@
     BOOL fClearDirty,
     ULONG cbSize)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    TRACE("(%p, %d, %u)\n", pMem, fClearDirty, cbSize);
+
+    if (!pMem)
+        return E_POINTER;
+
+    return IPersistMemory_RemoteSave_Proxy(This, pMem, fClearDirty, cbSize);
 }
 
 HRESULT __RPC_STUB IPersistMemory_Save_Stub(
@@ -2324,23 +2289,25 @@
     BOOL fClearDirty,
     ULONG cbSize)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    TRACE("(%p, %d, %u)\n", pMem, fClearDirty, cbSize);
+    return IPersistMemory_Save(This, pMem, fClearDirty, cbSize);
 }
 
 void CALLBACK IAdviseSinkEx_OnViewStatusChange_Proxy(
     IAdviseSinkEx* This,
     DWORD dwViewStatus)
 {
-    FIXME("not implemented\n");
+    TRACE("(%p, 0x%08x)\n", This, dwViewStatus);
+    IAdviseSinkEx_RemoteOnViewStatusChange_Proxy(This, dwViewStatus);
 }
 
 HRESULT __RPC_STUB IAdviseSinkEx_OnViewStatusChange_Stub(
     IAdviseSinkEx* This,
     DWORD dwViewStatus)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    TRACE("(%p, 0x%08x)\n", This, dwViewStatus);
+    IAdviseSinkEx_OnViewStatusChange(This, dwViewStatus);
+    return S_OK;
 }
 
 HRESULT CALLBACK IEnumOleUndoUnits_Next_Proxy(
@@ -2349,8 +2316,14 @@
     IOleUndoUnit **rgElt,
     ULONG *pcEltFetched)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    ULONG fetched;
+
+    TRACE("(%u, %p %p)\n", cElt, rgElt, pcEltFetched);
+
+    if (!pcEltFetched)
+        pcEltFetched = &fetched;
+
+    return IEnumOleUndoUnits_RemoteNext_Proxy(This, cElt, rgElt, pcEltFetched);
 }
 
 HRESULT __RPC_STUB IEnumOleUndoUnits_Next_Stub(
@@ -2359,8 +2332,16 @@
     IOleUndoUnit **rgElt,
     ULONG *pcEltFetched)
 {
-    FIXME("not implemented\n");
-    return E_NOTIMPL;
+    HRESULT hr;
+
+    TRACE("(%u, %p, %p)\n", cElt, rgElt, pcEltFetched);
+
+    *pcEltFetched = 0;
+    hr = IEnumOleUndoUnits_Next(This, cElt, rgElt, pcEltFetched);
+    if (hr == S_OK)
+        *pcEltFetched = cElt;
+
+    return hr;
 }
 
 HRESULT CALLBACK IQuickActivate_QuickActivate_Proxy(

Modified: trunk/reactos/dll/win32/oleaut32/varformat.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/varformat.c?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/varformat.c        [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/varformat.c        [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -270,8 +270,6 @@
 #define FMT_NUM_ON_OFF      0x3F /* Convert to "On" or "Off"  */
 #define FMT_STR_COPY_SPACE  0x40 /* Copy len chars with space if no char */
 #define FMT_STR_COPY_SKIP   0x41 /* Copy len chars or skip if no char */
-/* Wine additions */
-#define FMT_WINE_HOURS_12   0x81 /* Hours using 12 hour clock */
 
 /* Named Formats and their tokenised values */
 static const WCHAR szGeneralDate[] = { 'G','e','n','e','r','a','l',' 
','D','a','t','e','\0' };

Modified: trunk/reactos/dll/win32/oleaut32/variant.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/variant.c?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/variant.c  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/variant.c  [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -3930,9 +3930,6 @@
     break;
     case VT_I2:
     V_I2(result) = V_I2(&lv) - V_I2(&rv);
-    break;
-    case VT_I1:
-    V_I1(result) = V_I1(&lv) - V_I1(&rv);
     break;
     case VT_UI1:
     V_UI1(result) = V_UI2(&lv) - V_UI1(&rv);

Modified: trunk/reactos/dll/win32/oleaut32/variant.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/variant.h?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/variant.h  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/variant.h  [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -112,7 +112,7 @@
   WCHAR cCurrencyDigitSeparator;
 } VARIANT_NUMBER_CHARS;
 
-unsigned int get_type_size(ULONG*, VARTYPE);
+unsigned int get_type_size(ULONG*, VARTYPE) DECLSPEC_HIDDEN;
 BOOL VARIANT_GetLocalisedText(LANGID, DWORD, WCHAR *) DECLSPEC_HIDDEN;
 HRESULT VARIANT_ClearInd(VARIANTARG *) DECLSPEC_HIDDEN;
 BOOL get_date_format(LCID, DWORD, const SYSTEMTIME *,

Modified: trunk/reactos/dll/win32/oleaut32/vartype.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/oleaut32/vartype.c?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/dll/win32/oleaut32/vartype.c  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/oleaut32/vartype.c  [iso-8859-1] Mon Jul 20 
22:44:15 2015
@@ -4137,8 +4137,6 @@
   }
   return S_OK;
 }
-
-#define LOCALE_EN_US           
(MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT))
 
 /* internal representation of the value stored in a DECIMAL. The bytes are
    stored from LSB at index 0 to MSB at index 11

Modified: trunk/reactos/media/doc/README.WINE
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=68486&r1=68485&r2=68486&view=diff
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Mon Jul 20 22:44:15 2015
@@ -147,7 +147,7 @@
 reactos/dll/win32/odbccp32            # Synced to WineStaging-1.7.47
 reactos/dll/win32/ole32               # Synced to WineStaging-1.7.47
 reactos/dll/win32/oleacc              # Synced to WineStaging-1.7.47
-reactos/dll/win32/oleaut32            # Synced to WineStaging-1.7.37
+reactos/dll/win32/oleaut32            # Synced to WineStaging-1.7.47
 reactos/dll/win32/olecli32            # Synced to WineStaging-1.7.37
 reactos/dll/win32/oledlg              # Synced to WineStaging-1.7.37
 reactos/dll/win32/olepro32            # Synced to WineStaging-1.7.37


Reply via email to