ShowCursor, gott a internal count to show the mouse or not, and return that value. as msdn descripe.
Modified: trunk/reactos/subsys/win32k/eng/mouse.c
Modified: trunk/reactos/subsys/win32k/include/dc.h
Modified: trunk/reactos/subsys/win32k/ntuser/misc.c
Modified: trunk/reactos/subsys/win32k/ntuser/stubs.c

Modified: trunk/reactos/subsys/win32k/eng/mouse.c
--- trunk/reactos/subsys/win32k/eng/mouse.c	2005-12-31 23:04:53 UTC (rev 20497)
+++ trunk/reactos/subsys/win32k/eng/mouse.c	2006-01-01 01:09:08 UTC (rev 20498)
@@ -211,7 +211,7 @@
       return;
    }
    
-   if (pgp->ShowPointer == 1)
+   if (pgp->ShowPointer < 0)
    {
       return ;
    }

Modified: trunk/reactos/subsys/win32k/include/dc.h
--- trunk/reactos/subsys/win32k/include/dc.h	2005-12-31 23:04:53 UTC (rev 20497)
+++ trunk/reactos/subsys/win32k/include/dc.h	2006-01-01 01:09:08 UTC (rev 20498)
@@ -134,7 +134,7 @@
   HSURF ColorSurface;
   HSURF MaskSurface;
   HSURF SaveSurface;
-  BOOL  ShowPointer;
+  int  ShowPointer; /* counter negtive  do not show the mouse postive show the mouse */
   
   /* public pointer information */
   RECTL Exclude; /* required publicly for SPS_ACCEPT_EXCLUDE */

Modified: trunk/reactos/subsys/win32k/ntuser/misc.c
--- trunk/reactos/subsys/win32k/ntuser/misc.c	2005-12-31 23:04:53 UTC (rev 20497)
+++ trunk/reactos/subsys/win32k/ntuser/misc.c	2006-01-01 01:09:08 UTC (rev 20498)
@@ -191,17 +191,18 @@
       BITMAPOBJ *BitmapObj;
       GDIDEVICE *ppdev;
       GDIPOINTER *pgp;
+      int showpointer=0;
                                                                                 
       if(!(Screen = IntGetScreenDC()))
       {
-        return 1; /* No mouse */
+        return showpointer; /* No mouse */
       }
                        
       PDC dc = DC_LockDc(Screen);
 
       if (!dc)
       {
-        return 1; /* No mouse */
+        return showpointer; /* No mouse */
       }
            
       dcbmp = dc->w.hBitmap;
@@ -211,14 +212,14 @@
       if ( !BitmapObj )
       {
          BITMAPOBJ_UnlockBitmap(BitmapObj); 
-         return 1; /* No Mouse */
+         return showpointer; /* No Mouse */
       }
               
       SurfObj = &BitmapObj->SurfObj;
       if (SurfObj == NULL)
       {
         BITMAPOBJ_UnlockBitmap(BitmapObj); 
-        return 1; /* No mouse */
+        return showpointer; /* No mouse */
       }
            
       ppdev = GDIDEV(SurfObj);
@@ -226,7 +227,7 @@
       if(ppdev == NULL)
       {
         BITMAPOBJ_UnlockBitmap(BitmapObj); 
-        return 1; /* No mouse */
+        return showpointer; /* No mouse */
       }
                   
       pgp = &ppdev->Pointer;
@@ -235,9 +236,11 @@
            
       if (Param == FALSE)
       {
-          if (CurInfo->ShowingCursor != 0)
-          {
-             pgp->ShowPointer = 1;
+          pgp->ShowPointer--;         
+          showpointer = pgp->ShowPointer;
+          
+          if (showpointer >= 0)
+          {          
              //ppdev->SafetyRemoveCount = 1;
              //ppdev->SafetyRemoveLevel = 1;
              EngMovePointer(SurfObj,-1,-1,NULL);               
@@ -247,16 +250,21 @@
        }
        else
        {
+          pgp->ShowPointer++;
+          showpointer = pgp->ShowPointer;
+          
           /* Show Cursor */              
-          pgp->ShowPointer = 0;
-          //ppdev->SafetyRemoveCount = 0;
-          //ppdev->SafetyRemoveLevel = 0;
-          EngMovePointer(SurfObj,-1,-1,NULL);
-          CurInfo->ShowingCursor = CURSOR_SHOWING;
+          if (showpointer < 0) 
+          {
+             //ppdev->SafetyRemoveCount = 0;
+             //ppdev->SafetyRemoveLevel = 0;
+             EngMovePointer(SurfObj,-1,-1,NULL);
+             CurInfo->ShowingCursor = CURSOR_SHOWING;
+          }
        }
                                                     
        BITMAPOBJ_UnlockBitmap(BitmapObj); 
-       return 0;                       
+       return showpointer;                       
        }
          
    

Modified: trunk/reactos/subsys/win32k/ntuser/stubs.c
--- trunk/reactos/subsys/win32k/ntuser/stubs.c	2005-12-31 23:04:53 UTC (rev 20497)
+++ trunk/reactos/subsys/win32k/ntuser/stubs.c	2006-01-01 01:09:08 UTC (rev 20498)
@@ -365,6 +365,35 @@
    int nBufPoints,
    DWORD resolution)
 {
+/*
+   if (cbSize != sizeof (MOUSEMOVEPOINT)
+   {
+       SetLastWin32Error(GMMP_ERR_POINT_NOT_FOUND);
+       return GMMP_ERR_POINT_NOT_FOUND;
+   }
+       
+   if (!lppt)
+   {
+       SetLastWin32Error(GMMP_ERR_POINT_NOT_FOUND);
+       return GMMP_ERR_POINT_NOT_FOUND;
+   }
+   
+   if (!lpptBuf)
+   {
+       SetLastWin32Error(GMMP_ERR_POINT_NOT_FOUND);
+       return GMMP_ERR_POINT_NOT_FOUND;
+   }
+       
+   switch(resolution)
+   {
+     case GMMP_USE_DISPLAY_POINTS:
+     case GMMP_USE_HIGH_RESOLUTION_POINTS:
+          break;
+     default:
+        SetLastWin32Error(GMMP_ERR_POINT_NOT_FOUND);
+        return GMMP_ERR_POINT_NOT_FOUND;
+   }
+  */     
    UNIMPLEMENTED
 
    return 0;