Sync to Wine-0_9_4:
Michael Jung <mjung@iss.tu-darmstadt.de>
- ole32: Periodically call IDropTarger::DragOver during Drag&Drop.
Robert Shearman <rob@codeweavers.com>
- CreateErrorInfo trace fix.
  CreateErrorInfo isn't a stub so don't print this in the trace
  message.
Alexandre Julliard <julliard@winehq.org>
- Take advantage of the __EXCEPT_PAGE_FAULT macro.
- We no longer need to handle EXCEPTION_PRIV_INSTRUCTION on page faults.
- ole32: Revert exception handler change.
  The handler does the opposite of normal page fault handlers.
Ulrich Czekalla <ulrich@codeweavers.com>
- ole32: Return error instead of asserting if storage file is corrupt.
Eric Pouech <eric.pouech@wanadoo.fr>
- Functions with no paramters must be (void).
- Const correctness fixes.
Modified: trunk/reactos/lib/ole32/errorinfo.c
Modified: trunk/reactos/lib/ole32/ole16.c
Modified: trunk/reactos/lib/ole32/ole2.c
Modified: trunk/reactos/lib/ole32/rpc.c
Modified: trunk/reactos/lib/ole32/stg_stream.c
Modified: trunk/reactos/lib/ole32/storage32.c
Modified: trunk/reactos/lib/ole32/storage32.h
Modified: trunk/reactos/w32api/include/winerror.h

Modified: trunk/reactos/lib/ole32/errorinfo.c
--- trunk/reactos/lib/ole32/errorinfo.c	2005-12-26 23:10:21 UTC (rev 20349)
+++ trunk/reactos/lib/ole32/errorinfo.c	2005-12-26 23:16:41 UTC (rev 20350)
@@ -476,7 +476,7 @@
 {
 	IErrorInfo * pei;
 	HRESULT res;
-	TRACE("(%p): stub:\n", pperrinfo);
+	TRACE("(%p)\n", pperrinfo);
 	if(! pperrinfo ) return E_INVALIDARG;
 	if(!(pei=IErrorInfoImpl_Constructor()))return E_OUTOFMEMORY;
 

Modified: trunk/reactos/lib/ole32/ole16.c
--- trunk/reactos/lib/ole32/ole16.c	2005-12-26 23:10:21 UTC (rev 20349)
+++ trunk/reactos/lib/ole32/ole16.c	2005-12-26 23:16:41 UTC (rev 20350)
@@ -144,7 +144,7 @@
 /******************************************************************************
  * IMalloc16_GetSize [COMPOBJ.506]
  */
-DWORD IMalloc16_fnGetSize(const IMalloc16* iface,SEGPTR pv)
+DWORD IMalloc16_fnGetSize(IMalloc16* iface,SEGPTR pv)
 {
 	IMalloc16Impl *This = (IMalloc16Impl *)iface;
         TRACE("(%p)->GetSize(%08lx)\n",This,pv);
@@ -154,7 +154,7 @@
 /******************************************************************************
  * IMalloc16_DidAlloc [COMPOBJ.507]
  */
-INT16 IMalloc16_fnDidAlloc(const IMalloc16* iface,LPVOID pv) {
+INT16 IMalloc16_fnDidAlloc(IMalloc16* iface,LPVOID pv) {
         IMalloc16 *This = (IMalloc16 *)iface;
 	TRACE("(%p)->DidAlloc(%p)\n",This,pv);
 	return (INT16)-1;
@@ -173,7 +173,7 @@
  * IMalloc16_Constructor [VTABLE]
  */
 LPMALLOC16
-IMalloc16_Constructor()
+IMalloc16_Constructor(void)
 {
     static IMalloc16Vtbl vt16;
     static SEGPTR msegvt16;

Modified: trunk/reactos/lib/ole32/ole2.c
--- trunk/reactos/lib/ole32/ole2.c	2005-12-26 23:10:21 UTC (rev 20349)
+++ trunk/reactos/lib/ole32/ole2.c	2005-12-26 23:16:41 UTC (rev 20350)
@@ -79,6 +79,8 @@
   HWND       curTargetHWND;	/* window the mouse is hovering over */
   HWND       curDragTargetHWND; /* might be a ancestor of curTargetHWND */
   IDropTarget* curDragTarget;
+  POINTL     curMousePos;       /* current position of the mouse in screen coordinates */
+  DWORD      dwKeyState;        /* current state of the shift and ctrl keys and the mouse buttons */
 } TrackerWindowInfo;
 
 typedef struct tagOleMenuDescriptor  /* OleMenuDescriptor */
@@ -158,13 +160,9 @@
 			 WPARAM wParam,
 			 LPARAM   lParam);
 static void OLEDD_TrackMouseMove(
-                         TrackerWindowInfo* trackerInfo,
-			 POINT            mousePos,
-			 DWORD              keyState);
+                         TrackerWindowInfo* trackerInfo);
 static void OLEDD_TrackStateChange(
-                         TrackerWindowInfo* trackerInfo,
-			 POINT            mousePos,
-			 DWORD              keyState);
+                         TrackerWindowInfo* trackerInfo);
 static DWORD OLEDD_GetButtonState(void);
 
 
@@ -533,6 +531,10 @@
      */
     while (!trackerInfo.trackingDone && GetMessageA(&msg, 0, 0, 0) )
     {
+      trackerInfo.curMousePos.x = msg.pt.x;
+      trackerInfo.curMousePos.y = msg.pt.y;
+      trackerInfo.dwKeyState = OLEDD_GetButtonState();
+	    
       if ( (msg.message >= WM_KEYFIRST) &&
 	   (msg.message <= WM_KEYLAST) )
       {
@@ -551,9 +553,7 @@
 	/*
 	 * Notify the drop source.
 	 */
-	OLEDD_TrackStateChange(&trackerInfo,
-			       msg.pt,
-			       OLEDD_GetButtonState());
+        OLEDD_TrackStateChange(&trackerInfo);
       }
       else
       {
@@ -2033,6 +2033,9 @@
  * to receive the user input and act upon it. This procedure is in charge
  * of this behavior.
  */
+
+#define DRAG_TIMER_ID 1
+
 static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
 			 HWND   hwnd,
 			 UINT   uMsg,
@@ -2046,27 +2049,14 @@
       LPCREATESTRUCTA createStruct = (LPCREATESTRUCTA)lParam;
 
       SetWindowLongA(hwnd, 0, (LONG)createStruct->lpCreateParams);
+      SetTimer(hwnd, DRAG_TIMER_ID, 50, NULL);
 
-
       break;
     }
+    case WM_TIMER:
     case WM_MOUSEMOVE:
     {
-      TrackerWindowInfo* trackerInfo = (TrackerWindowInfo*)GetWindowLongA(hwnd, 0);
-      POINT            mousePos;
-
-      /*
-       * Get the current mouse position in screen coordinates.
-       */
-      mousePos.x = LOWORD(lParam);
-      mousePos.y = HIWORD(lParam);
-      ClientToScreen(hwnd, &mousePos);
-
-      /*
-       * Track the movement of the mouse.
-       */
-      OLEDD_TrackMouseMove(trackerInfo, mousePos, wParam);
-
+      OLEDD_TrackMouseMove((TrackerWindowInfo*)GetWindowLongA(hwnd, 0));
       break;
     }
     case WM_LBUTTONUP:
@@ -2076,24 +2066,14 @@
     case WM_MBUTTONDOWN:
     case WM_RBUTTONDOWN:
     {
-      TrackerWindowInfo* trackerInfo = (TrackerWindowInfo*)GetWindowLongA(hwnd, 0);
-      POINT            mousePos;
-
-      /*
-       * Get the current mouse position in screen coordinates.
-       */
-      mousePos.x = LOWORD(lParam);
-      mousePos.y = HIWORD(lParam);
-      ClientToScreen(hwnd, &mousePos);
-
-      /*
-       * Notify everyone that the button state changed
-       * TODO: Check if the "escape" key was pressed.
-       */
-      OLEDD_TrackStateChange(trackerInfo, mousePos, wParam);
-
+      OLEDD_TrackStateChange((TrackerWindowInfo*)GetWindowLongA(hwnd, 0));
       break;
     }
+    case WM_DESTROY:
+    {
+      KillTimer(hwnd, DRAG_TIMER_ID);
+      break;
+    }
   }
 
   /*
@@ -2114,23 +2094,19 @@
  *    trackerInfo - Pointer to the structure identifying the
  *                  drag & drop operation that is currently
  *                  active.
- *    mousePos    - Current position of the mouse in screen
- *                  coordinates.
- *    keyState    - Contains the state of the shift keys and the
- *                  mouse buttons (MK_LBUTTON and the like)
  */
-static void OLEDD_TrackMouseMove(
-  TrackerWindowInfo* trackerInfo,
-  POINT            mousePos,
-  DWORD              keyState)
+static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo)
 {
   HWND   hwndNewTarget = 0;
   HRESULT  hr = S_OK;
+  POINT pt;
 
   /*
    * Get the handle of the window under the mouse
    */
-  hwndNewTarget = WindowFromPoint(mousePos);
+  pt.x = trackerInfo->curMousePos.x;
+  pt.y = trackerInfo->curMousePos.y;
+  hwndNewTarget = WindowFromPoint(pt);
 
   /*
    * Every time, we re-initialize the effects passed to the
@@ -2145,19 +2121,9 @@
   if ( (trackerInfo->curDragTarget != 0) &&
        (trackerInfo->curTargetHWND == hwndNewTarget) )
   {
-    POINTL  mousePosParam;
-
-    /*
-     * The documentation tells me that the coordinate should be in the target
-     * window's coordinate space. However, the tests I made tell me the
-     * coordinates should be in screen coordinates.
-     */
-    mousePosParam.x = mousePos.x;
-    mousePosParam.y = mousePos.y;
-
     IDropTarget_DragOver(trackerInfo->curDragTarget,
-			 keyState,
-			 mousePosParam,
+                         trackerInfo->dwKeyState,
+                         trackerInfo->curMousePos,
 			 trackerInfo->pdwEffect);
   }
   else
@@ -2197,20 +2163,10 @@
        */
       if (trackerInfo->curDragTarget!=0)
       {
-	POINTL  mousePosParam;
-
-	/*
-	 * The documentation tells me that the coordinate should be in the target
-	 * window's coordinate space. However, the tests I made tell me the
-	 * coordinates should be in screen coordinates.
-	 */
-	mousePosParam.x = mousePos.x;
-	mousePosParam.y = mousePos.y;
-
 	IDropTarget_DragEnter(trackerInfo->curDragTarget,
 			      trackerInfo->dataObject,
-			      keyState,
-			      mousePosParam,
+                              trackerInfo->dwKeyState,
+                              trackerInfo->curMousePos,
 			      trackerInfo->pdwEffect);
       }
     }
@@ -2276,15 +2232,8 @@
  *    trackerInfo - Pointer to the structure identifying the
  *                  drag & drop operation that is currently
  *                  active.
- *    mousePos    - Current position of the mouse in screen
- *                  coordinates.
- *    keyState    - Contains the state of the shift keys and the
- *                  mouse buttons (MK_LBUTTON and the like)
  */
-static void OLEDD_TrackStateChange(
-  TrackerWindowInfo* trackerInfo,
-  POINT            mousePos,
-  DWORD              keyState)
+static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
 {
   /*
    * Ask the drop source what to do with the operation.
@@ -2292,7 +2241,7 @@
   trackerInfo->returnValue = IDropSource_QueryContinueDrag(
 			       trackerInfo->dropSource,
 			       trackerInfo->escPressed,
-			       keyState);
+                               trackerInfo->dwKeyState);
 
   /*
    * All the return valued will stop the operation except the S_OK
@@ -2325,20 +2274,10 @@
 	 */
         case DRAGDROP_S_DROP:
 	{
-	  POINTL  mousePosParam;
-
-	  /*
-	   * The documentation tells me that the coordinate should be
-	   * in the target window's coordinate space. However, the tests
-	   * I made tell me the coordinates should be in screen coordinates.
-	   */
-	  mousePosParam.x = mousePos.x;
-	  mousePosParam.y = mousePos.y;
-
 	  IDropTarget_Drop(trackerInfo->curDragTarget,
 			   trackerInfo->dataObject,
-			   keyState,
-			   mousePosParam,
+                           trackerInfo->dwKeyState,
+                           trackerInfo->curMousePos,
 			   trackerInfo->pdwEffect);
 	  break;
 	}

Modified: trunk/reactos/lib/ole32/rpc.c
--- trunk/reactos/lib/ole32/rpc.c	2005-12-26 23:10:21 UTC (rev 20349)
+++ trunk/reactos/lib/ole32/rpc.c	2005-12-26 23:16:41 UTC (rev 20350)
@@ -112,8 +112,7 @@
 
 static WINE_EXCEPTION_FILTER(ole_filter)
 {
-    if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ||
-        GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION)
+    if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
         return EXCEPTION_CONTINUE_SEARCH;
     return EXCEPTION_EXECUTE_HANDLER;
 }

Modified: trunk/reactos/lib/ole32/stg_stream.c
--- trunk/reactos/lib/ole32/stg_stream.c	2005-12-26 23:10:21 UTC (rev 20349)
+++ trunk/reactos/lib/ole32/stg_stream.c	2005-12-26 23:16:41 UTC (rev 20350)
@@ -273,7 +273,7 @@
    */
   if (This->smallBlockChain!=0)
   {
-    SmallBlockChainStream_ReadAt(This->smallBlockChain,
+    res = SmallBlockChainStream_ReadAt(This->smallBlockChain,
 				 This->currentPosition,
 				 bytesToReadFromBuffer,
 				 pv,
@@ -282,7 +282,7 @@
   }
   else if (This->bigBlockChain!=0)
   {
-    BlockChainStream_ReadAt(This->bigBlockChain,
+    res = BlockChainStream_ReadAt(This->bigBlockChain,
 			    This->currentPosition,
 			    bytesToReadFromBuffer,
 			    pv,
@@ -300,30 +300,19 @@
     goto end;
   }
 
-  /*
-   * We should always be able to read the proper amount of data from the
-   * chain.
-   */
-  assert(bytesToReadFromBuffer == *pcbRead);
-
-  /*
-   * Advance the pointer for the number of positions read.
-   */
-  This->currentPosition.u.LowPart += *pcbRead;
-
-  if(*pcbRead != cb)
+  if (SUCCEEDED(res))
   {
-    WARN("read %ld instead of the required %ld bytes !\n", *pcbRead, cb);
-    /*
-     * this used to return S_FALSE, however MSDN docu says that an app should
-     * be prepared to handle error in case of stream end reached, as *some*
-     * implementations *might* return an error (IOW: most do *not*).
-     * As some program fails on returning S_FALSE, I better use S_OK here.
-     */
-    res = S_OK;
+      /*
+       * We should always be able to read the proper amount of data from the
+       * chain.
+       */
+      assert(bytesToReadFromBuffer == *pcbRead);
+
+      /*
+       * Advance the pointer for the number of positions read.
+       */
+      This->currentPosition.u.LowPart += *pcbRead;
   }
-  else
-    res = S_OK;
 
 end:
   TRACE("<-- %08lx\n", res);

Modified: trunk/reactos/lib/ole32/storage32.c
--- trunk/reactos/lib/ole32/storage32.c	2005-12-26 23:10:21 UTC (rev 20349)
+++ trunk/reactos/lib/ole32/storage32.c	2005-12-26 23:16:41 UTC (rev 20350)
@@ -3414,7 +3414,8 @@
   ULARGE_INTEGER size, offset;
   ULONG cbRead, cbWritten, cbTotalRead, cbTotalWritten;
   ULONG propertyIndex;
-  BOOL successRead, successWrite;
+  BOOL successWrite;
+  HRESULT successRead;
   StgProperty chainProperty;
   BYTE *buffer;
   BlockChainStream *bbTempChain = NULL;
@@ -3463,7 +3464,7 @@
 
     offset.u.LowPart += This->smallBlockSize;
 
-  } while (successRead && successWrite);
+  } while (SUCCEEDED(successRead) && successWrite);
   HeapFree(GetProcessHeap(),0,buffer);
 
   assert(cbTotalRead == cbTotalWritten);
@@ -4397,6 +4398,9 @@
     blockNoInSequence--;
   }
 
+  if ((blockNoInSequence > 0) && (blockIndex == BLOCK_END_OF_CHAIN))
+      return FALSE; /* We failed to find the starting block */
+
   This->lastBlockNoInSequenceIndex = blockIndex;
 
   /*
@@ -5098,13 +5102,14 @@
  * bytesRead may be NULL.
  * Failure will be returned if the specified number of bytes has not been read.
  */
-BOOL SmallBlockChainStream_ReadAt(
+HRESULT SmallBlockChainStream_ReadAt(
   SmallBlockChainStream* This,
   ULARGE_INTEGER         offset,
   ULONG                  size,
   void*                  buffer,
   ULONG*                 bytesRead)
 {
+  HRESULT rc = S_OK;
   ULARGE_INTEGER offsetInBigBlockFile;
   ULONG blockNoInSequence =
     offset.u.LowPart / This->parentStorage->smallBlockSize;
@@ -5127,9 +5132,9 @@
 
   while ( (blockNoInSequence > 0) &&  (blockIndex != BLOCK_END_OF_CHAIN))
   {
-    if(FAILED(SmallBlockChainStream_GetNextBlockInChain(This, blockIndex,
-							&blockIndex)))
-      return FALSE;
+    rc = SmallBlockChainStream_GetNextBlockInChain(This, blockIndex, &blockIndex);
+    if(FAILED(rc))
+      return rc;
     blockNoInSequence--;
   }
 
@@ -5158,27 +5163,32 @@
 
     /*
      * Read those bytes in the buffer from the small block file.
+     * The small block has already been identified so it shouldn't fail
+     * unless the file is corrupt.
      */
-    BlockChainStream_ReadAt(This->parentStorage->smallBlockRootChain,
+    if (!BlockChainStream_ReadAt(This->parentStorage->smallBlockRootChain,
       offsetInBigBlockFile,
       bytesToReadInBuffer,
       bufferWalker,
-      &bytesReadFromBigBlockFile);
+      &bytesReadFromBigBlockFile))
+      return STG_E_DOCFILECORRUPT;
 
     assert(bytesReadFromBigBlockFile == bytesToReadInBuffer);
 
     /*
      * Step to the next big block.
      */
-    if(FAILED(SmallBlockChainStream_GetNextBlockInChain(This, blockIndex, &blockIndex)))
-      return FALSE;
+    rc = SmallBlockChainStream_GetNextBlockInChain(This, blockIndex, &blockIndex);
+    if(FAILED(rc))
+      return rc;
+
     bufferWalker += bytesToReadInBuffer;
     size         -= bytesToReadInBuffer;
     *bytesRead   += bytesToReadInBuffer;
     offsetInBlock = 0;  /* There is no offset on the next block */
   }
 
-  return (size == 0);
+  return rc;
 }
 
 /******************************************************************************

Modified: trunk/reactos/lib/ole32/storage32.h
--- trunk/reactos/lib/ole32/storage32.h	2005-12-26 23:10:21 UTC (rev 20349)
+++ trunk/reactos/lib/ole32/storage32.h	2005-12-26 23:16:41 UTC (rev 20350)
@@ -667,7 +667,7 @@
 ULONG SmallBlockChainStream_GetNextFreeBlock(
          SmallBlockChainStream* This);
 
-BOOL SmallBlockChainStream_ReadAt(
+HRESULT SmallBlockChainStream_ReadAt(
 	       SmallBlockChainStream* This,
 	       ULARGE_INTEGER offset,
 	       ULONG          size,

Modified: trunk/reactos/w32api/include/winerror.h
--- trunk/reactos/w32api/include/winerror.h	2005-12-26 23:10:21 UTC (rev 20349)
+++ trunk/reactos/w32api/include/winerror.h	2005-12-26 23:16:41 UTC (rev 20350)
@@ -2183,6 +2183,7 @@
 #define STG_E_SHAREREQUIRED                                _HRESULT_TYPEDEF_(0x80030106L)
 #define STG_E_NOTFILEBASEDSTORAGE                          _HRESULT_TYPEDEF_(0x80030107L)
 #define STG_E_EXTANTMARSHALLINGS                           _HRESULT_TYPEDEF_(0x80030108L)
+#define STG_E_DOCFILECORRUPT                               _HRESULT_TYPEDEF_(0x80030109L)
 
 #define STG_E_STATUS_COPY_PROTECTION_FAILURE               _HRESULT_TYPEDEF_(0x80030305L)
 #define STG_E_CSS_AUTHENTICATION_FAILURE                   _HRESULT_TYPEDEF_(0x80030306L)