From 8fdcfb28ce8ed8c84e1037f278d75dc7329597d2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 21 Jan 2012 02:59:46 +0000 Subject: [PATCH] [USB-BRINGUP-TRUNK] - Open a file handle to the port driver like Windows does - USB mice are working now svn path=/branches/usb-bringup-trunk/; revision=55041 --- drivers/input/kbdclass/kbdclass.c | 67 +++++++++++++++++++++++++++++++ drivers/input/kbdclass/kbdclass.h | 1 + drivers/input/mouclass/mouclass.c | 67 +++++++++++++++++++++++++++++++ drivers/input/mouclass/mouclass.h | 1 + 4 files changed, 136 insertions(+) diff --git a/drivers/input/kbdclass/kbdclass.c b/drivers/input/kbdclass/kbdclass.c index 3cf6c9511af..03be367be9d 100644 --- a/drivers/input/kbdclass/kbdclass.c +++ b/drivers/input/kbdclass/kbdclass.c @@ -824,6 +824,72 @@ HandleReadIrp( return Status; } +static NTSTATUS NTAPI +ClassPnp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status; + + switch (IrpSp->MinorFunction) + { + case IRP_MN_START_DEVICE: + Status = ForwardIrpAndWait(DeviceObject, Irp); + if (NT_SUCCESS(Status)) + { + InitializeObjectAttributes(&ObjectAttributes, + &DeviceExtension->InterfaceName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); + + Status = ZwOpenFile(&DeviceExtension->FileHandle, + FILE_READ_DATA, + &ObjectAttributes, + &Iosb, + 0, + 0); + if (!NT_SUCCESS(Status)) + DeviceExtension->FileHandle = NULL; + } + else + DeviceExtension->FileHandle = NULL; + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + + case IRP_MN_REMOVE_DEVICE: + case IRP_MN_STOP_DEVICE: + if (DeviceExtension->FileHandle) + { + ZwClose(DeviceExtension->FileHandle); + DeviceExtension->FileHandle = NULL; + } + Status = STATUS_SUCCESS; + break; + + default: + Status = Irp->IoStatus.Status; + break; + } + + Irp->IoStatus.Status = Status; + if (NT_SUCCESS(Status)) + { + IoSkipCurrentIrpStackLocation(Irp); + return IoCallDriver(DeviceExtension->LowerDevice, Irp); + } + else + { + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + } +} + static VOID NTAPI ClassStartIo( IN PDEVICE_OBJECT DeviceObject, @@ -1021,6 +1087,7 @@ DriverEntry( DriverObject->MajorFunction[IRP_MJ_CLOSE] = ClassClose; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = ClassCleanup; DriverObject->MajorFunction[IRP_MJ_READ] = ClassRead; + DriverObject->MajorFunction[IRP_MJ_PNP] = ClassPnp; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControl; DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ForwardIrpAndForget; DriverObject->DriverStartIo = ClassStartIo; diff --git a/drivers/input/kbdclass/kbdclass.h b/drivers/input/kbdclass/kbdclass.h index f68386e2b6d..8defeb68d14 100644 --- a/drivers/input/kbdclass/kbdclass.h +++ b/drivers/input/kbdclass/kbdclass.h @@ -48,6 +48,7 @@ typedef struct _PORT_DEVICE_EXTENSION PORT_DEVICE_STATE PnpState; PDEVICE_OBJECT LowerDevice; PDEVICE_OBJECT ClassDO; + HANDLE FileHandle; UNICODE_STRING InterfaceName; } PORT_DEVICE_EXTENSION, *PPORT_DEVICE_EXTENSION; diff --git a/drivers/input/mouclass/mouclass.c b/drivers/input/mouclass/mouclass.c index 99818bb6b5e..662263387a5 100644 --- a/drivers/input/mouclass/mouclass.c +++ b/drivers/input/mouclass/mouclass.c @@ -800,6 +800,72 @@ HandleReadIrp( return Status; } +static NTSTATUS NTAPI +ClassPnp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status; + + switch (IrpSp->MinorFunction) + { + case IRP_MN_START_DEVICE: + Status = ForwardIrpAndWait(DeviceObject, Irp); + if (NT_SUCCESS(Status)) + { + InitializeObjectAttributes(&ObjectAttributes, + &DeviceExtension->InterfaceName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); + + Status = ZwOpenFile(&DeviceExtension->FileHandle, + FILE_READ_DATA, + &ObjectAttributes, + &Iosb, + 0, + 0); + if (!NT_SUCCESS(Status)) + DeviceExtension->FileHandle = NULL; + } + else + DeviceExtension->FileHandle = NULL; + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + + case IRP_MN_REMOVE_DEVICE: + case IRP_MN_STOP_DEVICE: + if (DeviceExtension->FileHandle) + { + ZwClose(DeviceExtension->FileHandle); + DeviceExtension->FileHandle = NULL; + } + Status = STATUS_SUCCESS; + break; + + default: + Status = Irp->IoStatus.Status; + break; + } + + Irp->IoStatus.Status = Status; + if (NT_SUCCESS(Status)) + { + IoSkipCurrentIrpStackLocation(Irp); + return IoCallDriver(DeviceExtension->LowerDevice, Irp); + } + else + { + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + } +} + static VOID NTAPI ClassStartIo( IN PDEVICE_OBJECT DeviceObject, @@ -993,6 +1059,7 @@ DriverEntry( DriverObject->MajorFunction[IRP_MJ_CLOSE] = ClassClose; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = ClassCleanup; DriverObject->MajorFunction[IRP_MJ_READ] = ClassRead; + DriverObject->MajorFunction[IRP_MJ_PNP] = ClassPnp; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControl; DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ForwardIrpAndForget; DriverObject->DriverStartIo = ClassStartIo; diff --git a/drivers/input/mouclass/mouclass.h b/drivers/input/mouclass/mouclass.h index cd70beefead..5bf7e15c7e5 100644 --- a/drivers/input/mouclass/mouclass.h +++ b/drivers/input/mouclass/mouclass.h @@ -48,6 +48,7 @@ typedef struct _PORT_DEVICE_EXTENSION PORT_DEVICE_STATE PnpState; PDEVICE_OBJECT LowerDevice; PDEVICE_OBJECT ClassDO; + HANDLE FileHandle; UNICODE_STRING InterfaceName; } PORT_DEVICE_EXTENSION, *PPORT_DEVICE_EXTENSION; -- 2.17.1