Fixed skipped events from keyboard:
- Wait for IO if it would be pending - Don't copy into UserBuffer directly in read because it'll be overwritten. Use Irp->AssociatedIrp.SystemBuffer. Modified: trunk/reactos/drivers/input/kbdclass/kbdclass.c Modified: trunk/reactos/subsys/win32k/ntuser/input.c _____
Modified: trunk/reactos/drivers/input/kbdclass/kbdclass.c --- trunk/reactos/drivers/input/kbdclass/kbdclass.c 2005-11-18 06:15:24 UTC (rev 19321) +++ trunk/reactos/drivers/input/kbdclass/kbdclass.c 2005-11-18 10:53:32 UTC (rev 19322) @@ -369,6 +369,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 @@ -382,6 +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, DataStart, @@ -403,8 +407,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 @@ -428,7 +430,6 @@ ClassDeviceExtension->PortData += ReadSize; ClassDeviceExtension->InputCount += ReadSize;
- KeReleaseSpinLock(&ClassDeviceExtension->SpinLock, OldIrql); (*ConsumedCount) += ReadSize; } else @@ -436,6 +437,8 @@ DPRINT("ClassCallBack() entered, InputCount = %lu - DOING NOTHING\n", InputCount); }
+ KeReleaseSpinLock(&ClassDeviceExtension->SpinLock, OldIrql); + if (Irp != NULL) { IoStartNextPacket(ClassDeviceObject, FALSE); @@ -575,11 +578,17 @@
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); + /* FIXME: use SEH */ RtlCopyMemory( - Irp->MdlAddress ? MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) : Irp->UserBuffer, - DeviceExtension->PortData - DeviceExtension->InputCount, - sizeof(KEYBOARD_INPUT_DATA)); + Irp->AssociatedIrp.SystemBuffer, + DeviceExtension->PortData - DeviceExtension->InputCount, + sizeof(KEYBOARD_INPUT_DATA));
if (DeviceExtension->InputCount > 1) { _____
Modified: trunk/reactos/subsys/win32k/ntuser/input.c --- trunk/reactos/subsys/win32k/ntuser/input.c 2005-11-18 06:15:24 UTC (rev 19321) +++ trunk/reactos/subsys/win32k/ntuser/input.c 2005-11-18 10:53:32 UTC (rev 19322) @@ -413,7 +413,6 @@
struct _ETHREAD *FocusThread; extern NTSTATUS Win32kInitWin32Thread(PETHREAD Thread);
- PKEYBOARD_INDICATOR_TRANSLATION IndicatorTrans = NULL; UINT ModifierState = 0; USHORT LastMakeCode = 0; @@ -486,15 +485,33 @@ HWND hWnd; int id;
+ DPRINT("KeyInput @ %08x\n", &KeyInput); + Status = NtReadFile (KeyboardDeviceHandle, + NULL, NULL, NULL, - NULL, &Iosb, &KeyInput, sizeof(KEYBOARD_INPUT_DATA), NULL, NULL); + + if(Status == STATUS_ALERTED && !InputThreadsRunning) + { + break; + } + if(Status == STATUS_PENDING) + { + NtWaitForSingleObject(KeyboardDeviceHandle, FALSE, NULL); + Status = Iosb.Status; + } + if(!NT_SUCCESS(Status)) + { + DPRINT1("Win32K: Failed to read from mouse.\n"); + return; //(Status); + } + DPRINT("KeyRaw: %s %04x\n", (KeyInput.Flags & KEY_BREAK) ? "up" : "down", KeyInput.MakeCode );