Index: /trunk/include/VBox/VBoxGuest.h
===================================================================
--- /trunk/include/VBox/VBoxGuest.h	(revision 41641)
+++ /trunk/include/VBox/VBoxGuest.h	(revision 41642)
@@ -312,7 +312,4 @@
 #define VBOXGUEST_IOCTL_WRITE_CORE_DUMP             VBOXGUEST_IOCTL_CODE(9, sizeof(VBoxGuestWriteCoreDump))
 
-/** IOCTL to VBoxGuest to update the mouse status features. */
-# define VBOXGUEST_IOCTL_SET_MOUSE_STATUS         VBOXGUEST_IOCTL_CODE_(10, sizeof(uint32_t))
-
 /** Input and output buffer layout of the VBOXGUEST_IOCTL_WRITE_CORE
  *  request. */
@@ -324,4 +321,6 @@
 AssertCompileSize(VBoxGuestWriteCoreDump, 4);
 
+/** IOCTL to VBoxGuest to update the mouse status features. */
+# define VBOXGUEST_IOCTL_SET_MOUSE_STATUS         VBOXGUEST_IOCTL_CODE_(10, sizeof(uint32_t))
 
 #ifdef VBOX_WITH_HGCM
@@ -362,13 +361,20 @@
 #endif /* VBOX_WITH_HGCM */
 
-typedef DECLCALLBACK(void) FNVBOXMOUSENOTIFYCB(void *pvContext);
-typedef FNVBOXMOUSENOTIFYCB *PFNVBOXMOUSENOTIFYCB;
+/** IOCTL to for setting the mouse driver callback. (kernel only)  */
+#define VBOXGUEST_IOCTL_SET_MOUSE_NOTIFY_CALLBACK   VBOXGUEST_IOCTL_CODE_(31, sizeof(VBoxGuestMouseSetNotifyCallback))
+
+/** Input buffer for VBOXGUEST_IOCTL_INTERNAL_SET_MOUSE_NOTIFY_CALLBACK. */
 typedef struct VBoxGuestMouseSetNotifyCallback
 {
-    PFNVBOXMOUSENOTIFYCB pfnNotify;
-    void *pvNotify;
+    /**
+     * Mouse notification callback.
+     *
+     * @param   pvUser      The callback argument.
+     */
+    DECLR0CALLBACKMEMBER(void,  pfnNotify, (void *pvUser));
+    /** The callback argument*/
+    void                       *pvUser;
 } VBoxGuestMouseSetNotifyCallback;
 
-#define VBOXGUEST_IOCTL_INTERNAL_SET_MOUSE_NOTIFY_CALLBACK   VBOXGUEST_IOCTL_CODE_(31, sizeof(VBoxGuestMouseSetNotifyCallback))
 
 #ifdef RT_OS_OS2
Index: /trunk/src/VBox/Additions/WINNT/Mouse/NT5/VBoxMFInternal.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Mouse/NT5/VBoxMFInternal.cpp	(revision 41641)
+++ /trunk/src/VBox/Additions/WINNT/Mouse/NT5/VBoxMFInternal.cpp	(revision 41642)
@@ -150,5 +150,5 @@
     CbInfo.pfnNotify = fRegister ? vboxNewProtMouseEventCb : NULL;
 
-    NTSTATUS Status = vboxGdcSubmit(VBOXGUEST_IOCTL_INTERNAL_SET_MOUSE_NOTIFY_CALLBACK, &CbInfo, sizeof (CbInfo));
+    NTSTATUS Status = vboxGdcSubmit(VBOXGUEST_IOCTL_SET_MOUSE_NOTIFY_CALLBACK, &CbInfo, sizeof (CbInfo));
     if (!NT_SUCCESS(Status))
     {
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp	(revision 41641)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp	(revision 41642)
@@ -843,5 +843,5 @@
     switch (uCmd)
     {
-        case VBOXGUEST_IOCTL_INTERNAL_SET_MOUSE_NOTIFY_CALLBACK:
+        case VBOXGUEST_IOCTL_SET_MOUSE_NOTIFY_CALLBACK:
         {
             PVOID pvBuf = pStack->Parameters.Others.Argument1;
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 41641)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 41642)
@@ -727,6 +727,6 @@
         pDevExt->acMouseFeatureUsage[i] = 0;
     pDevExt->fMouseStatus = 0;
-    pDevExt->MouseSetNotifyCallback.pfnNotify = NULL;
-    pDevExt->MouseSetNotifyCallback.pvNotify = NULL;
+    pDevExt->MouseNotifyCallback.pfnNotify = NULL;
+    pDevExt->MouseNotifyCallback.pvUser = NULL;
     pDevExt->cISR = 0;
 
@@ -1248,13 +1248,14 @@
 {
     Log(("VBoxGuestCommonIOCtl: SET_MOUSE_NOTIFY_CALLBACK\n"));
-    RTSpinlockAcquire(pDevExt->SessionSpinlock);
-    ASMAtomicWriteNullPtr(&pDevExt->MouseSetNotifyCallback.pfnNotify);
-    pDevExt->MouseSetNotifyCallback.pvNotify = pNotify->pvNotify;
-    ASMAtomicWritePtr(&pDevExt->MouseSetNotifyCallback.pfnNotify,
-                      pNotify->pfnNotify);
-    RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock);
-    /* Make sure no one is referencing the old data - hacky but should be
+
+    RTSpinlockAcquire(pDevExt->EventSpinlock);
+    pDevExt->MouseNotifyCallback = *pNotify;
+    RTSpinlockReleaseNoInts(pDevExt->EventSpinlock);
+
+    /* Make sure an active ISR is referencing the old data - hacky but should be
      * effective. */
-    while (pDevExt->cISR > 0);
+    while (pDevExt->cISR > 0)
+        ASMNopPause();
+
     return VINF_SUCCESS;
 }
@@ -2540,8 +2541,7 @@
 
 #ifndef RT_OS_WINDOWS  /* Windows has its own implementation of this. */
-            case VBOXGUEST_IOCTL_INTERNAL_SET_MOUSE_NOTIFY_CALLBACK:
+            case VBOXGUEST_IOCTL_SET_MOUSE_NOTIFY_CALLBACK:
                 CHECKRET_RING0("SET_MOUSE_NOTIFY_CALLBACK");
-                CHECKRET_SIZE("SET_MOUSE_NOTIFY_CALLBACK",
-                           sizeof(VBoxGuestMouseSetNotifyCallback));
+                CHECKRET_SIZE("SET_MOUSE_NOTIFY_CALLBACK", sizeof(VBoxGuestMouseSetNotifyCallback));
                 rc = VBoxGuestCommonIOCtl_SetMouseNotifyCallback(pDevExt, (VBoxGuestMouseSetNotifyCallback *)pvData);
                 break;
@@ -2639,8 +2639,11 @@
 bool VBoxGuestCommonISR(PVBOXGUESTDEVEXT pDevExt)
 {
-    bool                    fMousePositionChanged = false;
-    VMMDevEvents volatile  *pReq                  = pDevExt->pIrqAckEvents;
-    int                     rc                    = 0;
-    bool                    fOurIrq;
+#ifndef RT_OS_WINDOWS
+    VBoxGuestMouseSetNotifyCallback MouseNotifyCallback   = { NULL, NULL };
+#endif
+    bool                            fMousePositionChanged = false;
+    VMMDevEvents volatile          *pReq                  = pDevExt->pIrqAckEvents;
+    int                             rc                    = 0;
+    bool                            fOurIrq;
 
     /*
@@ -2681,4 +2684,5 @@
             if (fEvents & VMMDEV_EVENT_MOUSE_POSITION_CHANGED)
             {
+                MouseNotifyCallback = pDevExt->MouseNotifyCallback;
                 fMousePositionChanged = true;
                 fEvents &= ~VMMDEV_EVENT_MOUSE_POSITION_CHANGED;
@@ -2760,6 +2764,6 @@
         VBoxGuestNativeISRMousePollEvent(pDevExt);
 #ifndef RT_OS_WINDOWS
-        if (pDevExt->MouseSetNotifyCallback.pfnNotify)
-            pDevExt->MouseSetNotifyCallback.pfnNotify(pDevExt->MouseSetNotifyCallback.pvNotify);
+        if (MouseNotifyCallback.pfnNotify)
+            MouseNotifyCallback.pfnNotify(MouseNotifyCallback.pvUser);
 #endif
     }
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h	(revision 41641)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h	(revision 41642)
@@ -167,9 +167,9 @@
      * together inside the session spinlock. */
     uint32_t volatile           fMouseStatus;
-    /** Callback and user data for a kernel mouse handler. */
-    VBoxGuestMouseSetNotifyCallback volatile MouseSetNotifyCallback;
     /** Counter of number of active ISRs.  Currently used for safely removing
      * the mouse handler callback. */
     uint32_t volatile           cISR;
+    /** Callback and user data for a kernel mouse handler. */
+    VBoxGuestMouseSetNotifyCallback MouseNotifyCallback;
 
     /** Windows part. */
