From 434caf81e7d67a301ef20f0e5bf01b751fc3ec6e Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 25 May 2009 16:15:33 +0000 Subject: [PATCH] - i8042MouInternalDeviceControl: Implement IoControlCode of IOCTL_INTERNAL_I8042_HOOK_MOUSE. - ForwardIrpAndWait: Don't use IoForwardIrpSynchronously to Forward IRPs as it fails if no next stack location is available, which prevents the mouse from initializing. Changed it to match implementation of our other input drivers. Mouse pointer now works with VBoxMouse driver loaded. svn path=/trunk/; revision=41119 --- reactos/drivers/input/i8042prt/misc.c | 31 ++++++++++++++++++++++---- reactos/drivers/input/i8042prt/mouse.c | 13 ++++++++++- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/input/i8042prt/misc.c b/reactos/drivers/input/i8042prt/misc.c index 102dd1dc121..1c8784a8dfa 100644 --- a/reactos/drivers/input/i8042prt/misc.c +++ b/reactos/drivers/input/i8042prt/misc.c @@ -11,20 +11,43 @@ #include "i8042prt.h" /* FUNCTIONS *****************************************************************/ +static IO_COMPLETION_ROUTINE ForwardIrpAndWaitCompletion; + +static NTSTATUS NTAPI +ForwardIrpAndWaitCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context) +{ + if (Irp->PendingReturned) + KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); + return STATUS_MORE_PROCESSING_REQUIRED; +} NTSTATUS NTAPI ForwardIrpAndWait( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { + KEVENT Event; + NTSTATUS Status; PDEVICE_OBJECT LowerDevice = ((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerDevice; - ASSERT(LowerDevice); - if (!IoForwardIrpSynchronously(LowerDevice, Irp)) - return STATUS_UNSUCCESSFUL; + KeInitializeEvent(&Event, NotificationEvent, FALSE); + IoCopyCurrentIrpStackLocationToNext(Irp); - return Irp->IoStatus.Status; + IoSetCompletionRoutine(Irp, ForwardIrpAndWaitCompletion, &Event, TRUE, TRUE, TRUE); + + Status = IoCallDriver(LowerDevice, Irp); + if (Status == STATUS_PENDING) + { + Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL); + if (NT_SUCCESS(Status)) + Status = Irp->IoStatus.Status; + } + + return Status; } NTSTATUS NTAPI diff --git a/reactos/drivers/input/i8042prt/mouse.c b/reactos/drivers/input/i8042prt/mouse.c index a53d5b74898..18710ea9bd8 100644 --- a/reactos/drivers/input/i8042prt/mouse.c +++ b/reactos/drivers/input/i8042prt/mouse.c @@ -482,8 +482,19 @@ cleanup: } case IOCTL_INTERNAL_I8042_HOOK_MOUSE: { + PINTERNAL_I8042_HOOK_MOUSE MouseHook; TRACE_(I8042PRT, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_INTERNAL_I8042_HOOK_MOUSE\n"); - /* Nothing to do here */ + if (Stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(CONNECT_DATA)) + { + Status = STATUS_INVALID_PARAMETER; + break; + } + MouseHook = (PINTERNAL_I8042_HOOK_MOUSE)Stack->Parameters.DeviceIoControl.Type3InputBuffer; + + DeviceExtension->MouseHook.Context = MouseHook->Context; + if (MouseHook->IsrRoutine) + DeviceExtension->MouseHook.IsrRoutine = MouseHook->IsrRoutine; + Status = STATUS_SUCCESS; break; }