Huw Davies : ole32: Fix CopyTo to work correctly with LARGE_INTEGERs.

Alexandre Julliard julliard at winehq.org
Thu Mar 6 11:08:37 CST 2008


Module: wine
Branch: master
Commit: 0aedac346aaabfc1d78cd8c678f1cd3c48e74ace
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0aedac346aaabfc1d78cd8c678f1cd3c48e74ace

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Mar  6 12:05:52 2008 +0000

ole32: Fix CopyTo to work correctly with LARGE_INTEGERs.

---

 dlls/ole32/hglobalstream.c |   41 +++++++++++------------------------------
 1 files changed, 11 insertions(+), 30 deletions(-)

diff --git a/dlls/ole32/hglobalstream.c b/dlls/ole32/hglobalstream.c
index 2175214..68a1527 100644
--- a/dlls/ole32/hglobalstream.c
+++ b/dlls/ole32/hglobalstream.c
@@ -467,24 +467,16 @@ static HRESULT WINAPI HGLOBALStreamImpl_CopyTo(
   TRACE("(%p, %p, %d, %p, %p)\n", iface, pstm,
 	cb.u.LowPart, pcbRead, pcbWritten);
 
-  /*
-   * Sanity check
-   */
   if ( pstm == 0 )
     return STG_E_INVALIDPOINTER;
 
-  totalBytesRead.u.LowPart = totalBytesRead.u.HighPart = 0;
-  totalBytesWritten.u.LowPart = totalBytesWritten.u.HighPart = 0;
+  totalBytesRead.QuadPart = 0;
+  totalBytesWritten.QuadPart = 0;
 
-  /*
-   * use stack to store data temporarly
-   * there is surely more performant way of doing it, for now this basic
-   * implementation will do the job
-   */
-  while ( cb.u.LowPart > 0 )
+  while ( cb.QuadPart > 0 )
   {
-    if ( cb.u.LowPart >= 128 )
-      copySize = 128;
+    if ( cb.QuadPart >= sizeof(tmpBuffer) )
+      copySize = sizeof(tmpBuffer);
     else
       copySize = cb.u.LowPart;
 
@@ -492,7 +484,7 @@ static HRESULT WINAPI HGLOBALStreamImpl_CopyTo(
     if (FAILED(hr))
         break;
 
-    totalBytesRead.u.LowPart += bytesRead;
+    totalBytesRead.QuadPart += bytesRead;
 
     if (bytesRead)
     {
@@ -500,29 +492,18 @@ static HRESULT WINAPI HGLOBALStreamImpl_CopyTo(
         if (FAILED(hr))
             break;
 
-        totalBytesWritten.u.LowPart += bytesWritten;
+        totalBytesWritten.QuadPart += bytesWritten;
     }
 
     if (bytesRead!=copySize)
-      cb.u.LowPart = 0;
+      cb.QuadPart = 0;
     else
-      cb.u.LowPart -= bytesRead;
+      cb.QuadPart -= bytesRead;
   }
 
-  /*
-   * Update number of bytes read and written
-   */
-  if (pcbRead)
-  {
-    pcbRead->u.LowPart = totalBytesRead.u.LowPart;
-    pcbRead->u.HighPart = totalBytesRead.u.HighPart;
-  }
+  if (pcbRead) pcbRead->QuadPart = totalBytesRead.QuadPart;
+  if (pcbWritten) pcbWritten->QuadPart = totalBytesWritten.QuadPart;
 
-  if (pcbWritten)
-  {
-    pcbWritten->u.LowPart = totalBytesWritten.u.LowPart;
-    pcbWritten->u.HighPart = totalBytesWritten.u.HighPart;
-  }
   return hr;
 }
 




More information about the wine-cvs mailing list