- Don't use buffered I/O, to prevent some lag
- mouclass: Change the critical section place, to follow changes done in kbdclass in r19322
Modified: trunk/reactos/drivers/input/kbdclass/kbdclass.c
Modified: trunk/reactos/drivers/input/mouclass/mouclass.c

Modified: trunk/reactos/drivers/input/kbdclass/kbdclass.c
--- trunk/reactos/drivers/input/kbdclass/kbdclass.c	2005-11-18 16:42:41 UTC (rev 19324)
+++ trunk/reactos/drivers/input/kbdclass/kbdclass.c	2005-11-18 17:28:19 UTC (rev 19325)
@@ -329,7 +329,7 @@
 	DeviceExtension->ReadIsPending = FALSE;
 	DeviceExtension->InputCount = 0;
 	DeviceExtension->PortData = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->DataQueueSize * sizeof(KEYBOARD_INPUT_DATA));
-	Fdo->Flags |= DO_POWER_PAGABLE | DO_BUFFERED_IO;
+	Fdo->Flags |= DO_POWER_PAGABLE;
 	Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
 
 	/* Add entry entry to HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\[DeviceBaseName] */
@@ -384,10 +384,8 @@
 
 		/* A read request is waiting for input, so go straight to it */
 		/* FIXME: use SEH */
-		DPRINT("Immediate Completion: %x\n", DataStart->MakeCode);
-
 		RtlCopyMemory(
-			Irp->MdlAddress ? MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) : Irp->AssociatedIrp.SystemBuffer,
+			Irp->MdlAddress ? MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) : Irp->UserBuffer,
 			DataStart,
 			sizeof(KEYBOARD_INPUT_DATA));
 
@@ -523,7 +521,6 @@
 	RtlZeroMemory(DeviceExtension, sizeof(CLASS_DEVICE_EXTENSION));
 	DeviceExtension->Common.IsClassDO = FALSE;
 	DeviceExtension->PnpState = dsStopped;
-	Fdo->Flags |= DO_POWER_PAGABLE;
 	Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
 	if (!NT_SUCCESS(Status))
 	{
@@ -531,7 +528,10 @@
 		IoDeleteDevice(Fdo);
 		return Status;
 	}
-	Fdo->Flags |= DO_BUFFERED_IO;
+	if (DeviceExtension->LowerDevice->Flags & DO_POWER_PAGABLE)
+		Fdo->Flags |= DO_POWER_PAGABLE;
+	if (DeviceExtension->LowerDevice->Flags & DO_BUFFERED_IO)
+		Fdo->Flags |= DO_BUFFERED_IO;
 
 	if (DriverExtension->ConnectMultiplePorts)
 		Status = ConnectPortDriver(Fdo, DriverExtension->MainClassDeviceObject);
@@ -578,17 +578,16 @@
 
 		KeAcquireSpinLock(&DeviceExtension->SpinLock, &oldIrql);
 
-		DPRINT("Mdl: %x, UserBuffer: %x, InputCount: %d, Data: %x\n",
-		       Irp->MdlAddress,
-		       Irp->UserBuffer,
-		       DeviceExtension->InputCount,
-		       (DeviceExtension->PortData-DeviceExtension->InputCount)->MakeCode);
+		DPRINT("Mdl: %p, UserBuffer: %p, InputCount: %lu\n",
+			Irp->MdlAddress,
+			Irp->UserBuffer,
+			DeviceExtension->InputCount);
 
 		/* FIXME: use SEH */
 		RtlCopyMemory(
-		    Irp->AssociatedIrp.SystemBuffer,
-		    DeviceExtension->PortData - DeviceExtension->InputCount,
-		    sizeof(KEYBOARD_INPUT_DATA));
+			Irp->MdlAddress ? MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) : Irp->UserBuffer,
+			DeviceExtension->PortData - DeviceExtension->InputCount,
+			sizeof(KEYBOARD_INPUT_DATA));
 
 		if (DeviceExtension->InputCount > 1)
 		{

Modified: trunk/reactos/drivers/input/mouclass/mouclass.c
--- trunk/reactos/drivers/input/mouclass/mouclass.c	2005-11-18 16:42:41 UTC (rev 19324)
+++ trunk/reactos/drivers/input/mouclass/mouclass.c	2005-11-18 17:28:19 UTC (rev 19325)
@@ -359,6 +359,8 @@
 
 	ASSERT(ClassDeviceExtension->Common.IsClassDO);
 
+	KeAcquireSpinLock(&ClassDeviceExtension->SpinLock, &OldIrql);
+
 	DPRINT("ClassCallback()\n");
 	/* A filter driver might have consumed all the data already; I'm
 	 * not sure if they are supposed to move the packets when they
@@ -393,8 +395,6 @@
 	/* If we have data from the port driver and a higher service to send the data to */
 	if (InputCount != 0)
 	{
-		KeAcquireSpinLock(&ClassDeviceExtension->SpinLock, &OldIrql);
-
 		if (ClassDeviceExtension->InputCount + InputCount > ClassDeviceExtension->DriverExtension->DataQueueSize)
 			ReadSize = ClassDeviceExtension->DriverExtension->DataQueueSize - ClassDeviceExtension->InputCount;
 		else
@@ -418,7 +418,6 @@
 		ClassDeviceExtension->PortData += ReadSize;
 		ClassDeviceExtension->InputCount += ReadSize;
 
-		KeReleaseSpinLock(&ClassDeviceExtension->SpinLock, OldIrql);
 		(*ConsumedCount) += ReadSize;
 	}
 	else
@@ -426,6 +425,8 @@
 		DPRINT("ClassCallBack() entered, InputCount = %lu - DOING NOTHING\n", InputCount);
 	}
 
+	KeReleaseSpinLock(&ClassDeviceExtension->SpinLock, OldIrql);
+
 	if (Irp != NULL)
 	{
 		IoStartNextPacket(ClassDeviceObject, FALSE);
@@ -510,7 +511,6 @@
 	RtlZeroMemory(DeviceExtension, sizeof(CLASS_DEVICE_EXTENSION));
 	DeviceExtension->Common.IsClassDO = FALSE;
 	DeviceExtension->PnpState = dsStopped;
-	Fdo->Flags |= DO_POWER_PAGABLE;
 	Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
 	if (!NT_SUCCESS(Status))
 	{
@@ -518,7 +518,10 @@
 		IoDeleteDevice(Fdo);
 		return Status;
 	}
-	Fdo->Flags |= DO_BUFFERED_IO;
+	if (DeviceExtension->LowerDevice->Flags & DO_POWER_PAGABLE)
+		Fdo->Flags |= DO_POWER_PAGABLE;
+	if (DeviceExtension->LowerDevice->Flags & DO_BUFFERED_IO)
+		Fdo->Flags |= DO_BUFFERED_IO;
 
 	if (DriverExtension->ConnectMultiplePorts)
 		Status = ConnectPortDriver(Fdo, DriverExtension->MainClassDeviceObject);
@@ -565,6 +568,11 @@
 
 		KeAcquireSpinLock(&DeviceExtension->SpinLock, &oldIrql);
 
+		DPRINT("Mdl: %p, UserBuffer: %p, InputCount: %lu\n",
+			Irp->MdlAddress,
+			Irp->UserBuffer,
+			DeviceExtension->InputCount);
+
 		/* FIXME: use SEH */
 		RtlCopyMemory(
 			Irp->MdlAddress ? MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) : Irp->UserBuffer,