Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.cpp	(revision 24708)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.cpp	(revision 24709)
@@ -1511,5 +1511,5 @@
         Result = vboxUpdatePointerShape(&PointerAttributes, sizeof (PointerAttributes));
 #else
-        Result = vboxUpdatePointerShape(((PDEVICE_EXTENSION)HwDeviceExtension)->pPrimary, &PointerAttributes, sizeof (PointerAttributes));
+        Result = vboxUpdatePointerShape((PDEVICE_EXTENSION)HwDeviceExtension, &PointerAttributes, sizeof (PointerAttributes));
 #endif /* VBOX_WITH_HGSMI */
 
@@ -1762,5 +1762,5 @@
                 Result = vboxUpdatePointerShape(&PointerAttributes, sizeof (PointerAttributes));
 #else
-                Result = vboxUpdatePointerShape(((PDEVICE_EXTENSION)HwDeviceExtension)->pPrimary, &PointerAttributes, sizeof (PointerAttributes));
+                Result = vboxUpdatePointerShape((PDEVICE_EXTENSION)HwDeviceExtension, &PointerAttributes, sizeof (PointerAttributes));
 #endif /* VBOX_WITH_HGSMI */
 
@@ -1811,5 +1811,5 @@
                 Result = vboxUpdatePointerShape(pPointerAttributes, RequestPacket->InputBufferLength);
 #else
-                Result = vboxUpdatePointerShape(((PDEVICE_EXTENSION)HwDeviceExtension)->pPrimary, pPointerAttributes, RequestPacket->InputBufferLength);
+                Result = vboxUpdatePointerShape((PDEVICE_EXTENSION)HwDeviceExtension, pPointerAttributes, RequestPacket->InputBufferLength);
 #endif /* VBOX_WITH_HGSMI */
                 if (!Result)
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h	(revision 24708)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h	(revision 24709)
@@ -307,5 +307,5 @@
                              PVIDEO_PORT_CONFIG_INFO pConfigInfo,
                              ULONG AdapterMemorySize);
-BOOLEAN vboxUpdatePointerShape (PDEVICE_EXTENSION PrimaryExtension,
+BOOLEAN vboxUpdatePointerShape (PDEVICE_EXTENSION DeviceExtension,
                                 PVIDEO_POINTER_ATTRIBUTES pointerAttr,
                                 uint32_t cbLength);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideoHGSMI.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideoHGSMI.cpp	(revision 24708)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideoHGSMI.cpp	(revision 24709)
@@ -900,7 +900,4 @@
     p->fu32Flags = pCtx->pPointerAttr->Enable & 0x0000FFFF;
 
-    /* Even if pointer is invisible, we have to pass following data,
-     * so host could create the pointer with initial status - invisible
-     */
     p->u32HotX   = (pCtx->pPointerAttr->Enable >> 16) & 0xFF;
     p->u32HotY   = (pCtx->pPointerAttr->Enable >> 24) & 0xFF;
@@ -910,4 +907,9 @@
     if (p->fu32Flags & VBOX_MOUSE_POINTER_SHAPE)
     {
+        /* If shape is supplied, then alway create the pointer visible.
+         * See comments in 'vboxUpdatePointerShape'
+         */
+        p->fu32Flags |= VBOX_MOUSE_POINTER_VISIBLE;
+
         /* Copy the actual pointer data. */
         memcpy (p->au8Data, pCtx->pPointerAttr->Pixels, pCtx->cbData);
@@ -929,8 +931,33 @@
 }
 
-BOOLEAN vboxUpdatePointerShape (PDEVICE_EXTENSION PrimaryExtension,
+BOOLEAN vboxUpdatePointerShape (PDEVICE_EXTENSION DeviceExtension,
                                 PVIDEO_POINTER_ATTRIBUTES pointerAttr,
                                 uint32_t cbLength)
 {
+    PDEVICE_EXTENSION PrimaryExtension = DeviceExtension->pPrimary;
+
+    /* In multimonitor case the HW mouse pointer is the same on all screens,
+     * and Windows calls each display driver with the same pointer data: visible for
+     * the screen where the pointer is and invisible for other screens.
+     *
+     * This driver passes the shape to the host only from primary screen and makes
+     * the pointer always visible (in vbvaInitMousePointerShape).
+     *
+     * The simple solution makes it impossible to create the shape and keep the mouse
+     * pointer invisible. New shapes will be created visible.
+     * But:
+     * 1) VBox frontends actually ignore the visibility flag if VBOX_MOUSE_POINTER_SHAPE
+     *    is set and always create new pointers visible.
+     * 2) Windows uses DrvMovePointer to hide the pointer, which will still work.
+     */
+
+    if (DeviceExtension->iDevice != PrimaryExtension->iDevice)
+    {
+        dprintf(("vboxUpdatePointerShape: ignore non primary device %d(%d)\n",
+                 DeviceExtension->iDevice, PrimaryExtension->iDevice));
+        /* Success. */
+        return TRUE;
+    }
+
     uint32_t cbData = 0;
 
