Improve mouse driver stability a bit
authorJason Filby <jason.filby@gmail.com>
Wed, 30 May 2001 08:07:48 +0000 (08:07 +0000)
committerJason Filby <jason.filby@gmail.com>
Wed, 30 May 2001 08:07:48 +0000 (08:07 +0000)
svn path=/trunk/; revision=1930

reactos/drivers/input/mouclass/mouclass.c
reactos/drivers/input/psaux/mouse.c

index 00c905c..e978005 100644 (file)
@@ -17,7 +17,7 @@
 
 BOOLEAN AlreadyOpened = FALSE;
 
-VOID MouseClassCallBack(PDEVICE_OBJECT ClassDeviceObject, PMOUSE_INPUT_DATA MouseDataStart,
+BOOLEAN MouseClassCallBack(PDEVICE_OBJECT ClassDeviceObject, PMOUSE_INPUT_DATA MouseDataStart,
                        PMOUSE_INPUT_DATA MouseDataEnd, PULONG InputCount)
 {
    PDEVICE_EXTENSION ClassDeviceExtension = ClassDeviceObject->DeviceExtension;
@@ -49,34 +49,40 @@ VOID MouseClassCallBack(PDEVICE_OBJECT ClassDeviceObject, PMOUSE_INPUT_DATA Mous
       IoCompleteRequest(Irp, IO_MOUSE_INCREMENT);      
       ClassDeviceExtension->ReadIsPending = FALSE;
    } */
-   if(*InputCount>0)
-   {
-      // FIXME: If we exceed the buffer, mouse data gets thrown away.. better solution?
-
-      if(ClassDeviceExtension->InputCount + *InputCount > MOUSE_BUFFER_SIZE)
-      {
-         ReadSize = MOUSE_BUFFER_SIZE - ClassDeviceExtension->InputCount;
-      } else {
-         ReadSize = *InputCount;
-      }
-
-      // Move the mouse input data from the port data queue to our class data queue
-      RtlMoveMemory(ClassDeviceExtension->PortData, (PCHAR)MouseDataStart,
-                    sizeof(MOUSE_INPUT_DATA) * ReadSize);
-
-      // Move the pointer and counter up
-      ClassDeviceExtension->PortData += ReadSize;
-      ClassDeviceExtension->InputCount += ReadSize;
-
-     // Throw data up to GDI callback
-     if(*(PGDI_SERVICE_CALLBACK_ROUTINE)ClassDeviceExtension->GDIInformation.CallBack != NULL) {
-        (*(PGDI_SERVICE_CALLBACK_ROUTINE)ClassDeviceExtension->GDIInformation.CallBack)
-          (ClassDeviceExtension->PortData - ReadSize, ReadSize);
-        ClassDeviceExtension->PortData -= ReadSize;
-        ClassDeviceExtension->InputCount -= ReadSize;
-        ClassDeviceExtension->ReadIsPending = FALSE;
-     }
+
+  // If we have data from the port driver and a higher service to send the data to
+  if((*InputCount>0) && (*(PGDI_SERVICE_CALLBACK_ROUTINE)ClassDeviceExtension->GDIInformation.CallBack != NULL))
+  {
+    if(ClassDeviceExtension->InputCount + *InputCount > MOUSE_BUFFER_SIZE)
+    {
+       ReadSize = MOUSE_BUFFER_SIZE - ClassDeviceExtension->InputCount;
+    } else {
+       ReadSize = *InputCount;
+    }
+
+    // FIXME: If we exceed the buffer, mouse data gets thrown away.. better solution?
+
+
+    // Move the mouse input data from the port data queue to our class data queue
+    RtlMoveMemory(ClassDeviceExtension->PortData, (PCHAR)MouseDataStart,
+                  sizeof(MOUSE_INPUT_DATA) * ReadSize);
+
+    // Move the pointer and counter up
+    ClassDeviceExtension->PortData += ReadSize;
+    ClassDeviceExtension->InputCount += ReadSize;
+
+    // Throw data up to GDI callback
+    if(*(PGDI_SERVICE_CALLBACK_ROUTINE)ClassDeviceExtension->GDIInformation.CallBack != NULL) {
+      (*(PGDI_SERVICE_CALLBACK_ROUTINE)ClassDeviceExtension->GDIInformation.CallBack)
+        (ClassDeviceExtension->PortData - ReadSize, ReadSize);
+    }
+
+    ClassDeviceExtension->PortData -= ReadSize;
+    ClassDeviceExtension->InputCount -= ReadSize;
+    ClassDeviceExtension->ReadIsPending = FALSE;
   }
+
+  return TRUE;
 }
 
 NTSTATUS ConnectMousePortDriver(PDEVICE_OBJECT ClassDeviceObject)
@@ -189,7 +195,7 @@ VOID MouseClassStartIo(PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
    if(DeviceExtension->InputCount>0)
    {
-      // FIXME: We should not send to much input data.. depends on the max buffer size of the win32k
+      // FIXME: We should not send too much input data.. depends on the max buffer size of the win32k
       ReadSize = DeviceExtension->InputCount * sizeof(MOUSE_INPUT_DATA);
 
       // Bring the PortData back to base so that it can be copied
index 2576815..f99b1c1 100644 (file)
@@ -27,6 +27,9 @@ BOOLEAN ps2_mouse_handler(PKINTERRUPT Interrupt, PVOID ServiceContext)
   unsigned status = controller_read_status();
   scancode = controller_read_input();
 
+  // Don't handle the mouse event if we aren't connected to the mouse class driver
+  if(DeviceExtension->ClassInformation.CallBack == NULL) return FALSE;
+
   if((status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) != 0)
   {
     // mouse_handle_event(scancode); proceed to handle it