mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[KBDCLASS][MOUCLASS] Properly stub power IRP handling. CORE-12148 CORE-17136
This commit is contained in:
parent
23ccd13639
commit
29b49c36ff
2 changed files with 34 additions and 56 deletions
|
@ -20,7 +20,7 @@ static DRIVER_DISPATCH ClassClose;
|
||||||
static DRIVER_DISPATCH ClassCleanup;
|
static DRIVER_DISPATCH ClassCleanup;
|
||||||
static DRIVER_DISPATCH ClassRead;
|
static DRIVER_DISPATCH ClassRead;
|
||||||
static DRIVER_DISPATCH ClassDeviceControl;
|
static DRIVER_DISPATCH ClassDeviceControl;
|
||||||
static DRIVER_DISPATCH IrpStub;
|
static DRIVER_DISPATCH ClassPower;
|
||||||
static DRIVER_ADD_DEVICE ClassAddDevice;
|
static DRIVER_ADD_DEVICE ClassAddDevice;
|
||||||
static DRIVER_STARTIO ClassStartIo;
|
static DRIVER_STARTIO ClassStartIo;
|
||||||
static DRIVER_CANCEL ClassCancelRoutine;
|
static DRIVER_CANCEL ClassCancelRoutine;
|
||||||
|
@ -188,39 +188,31 @@ ClassDeviceControl(
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS NTAPI
|
static NTSTATUS NTAPI
|
||||||
IrpStub(
|
ClassPower(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN PIRP Irp)
|
IN PIRP Irp)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_NOT_SUPPORTED;
|
NTSTATUS Status;
|
||||||
PPORT_DEVICE_EXTENSION DeviceExtension;
|
PPORT_DEVICE_EXTENSION DeviceExtension;
|
||||||
|
|
||||||
DeviceExtension = DeviceObject->DeviceExtension;
|
DeviceExtension = DeviceObject->DeviceExtension;
|
||||||
if (!DeviceExtension->Common.IsClassDO)
|
if (!DeviceExtension->Common.IsClassDO)
|
||||||
{
|
{
|
||||||
/* Forward some IRPs to lower device */
|
/* Forward port DO IRPs to lower device */
|
||||||
switch (IoGetCurrentIrpStackLocation(Irp)->MajorFunction)
|
PoStartNextPowerIrp(Irp);
|
||||||
{
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
case IRP_MJ_POWER:
|
return PoCallDriver(DeviceExtension->LowerDevice, Irp);
|
||||||
PoStartNextPowerIrp(Irp);
|
|
||||||
IoSkipCurrentIrpStackLocation(Irp);
|
|
||||||
return PoCallDriver(DeviceExtension->LowerDevice, Irp);
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
ERR_(CLASS_NAME, "Port DO stub for major function 0x%lx\n",
|
|
||||||
IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
|
|
||||||
ASSERT(FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ERR_(CLASS_NAME, "Class DO stub for major function 0x%lx\n",
|
|
||||||
IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
|
|
||||||
ASSERT(FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Irp->IoStatus.Status = Status;
|
switch (IoGetCurrentIrpStackLocation(Irp)->MinorFunction)
|
||||||
|
{
|
||||||
|
case IRP_MN_SET_POWER:
|
||||||
|
case IRP_MN_QUERY_POWER:
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Status = Irp->IoStatus.Status;
|
||||||
|
PoStartNextPowerIrp(Irp);
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -1047,7 +1039,6 @@ DriverEntry(
|
||||||
IN PUNICODE_STRING RegistryPath)
|
IN PUNICODE_STRING RegistryPath)
|
||||||
{
|
{
|
||||||
PCLASS_DRIVER_EXTENSION DriverExtension;
|
PCLASS_DRIVER_EXTENSION DriverExtension;
|
||||||
ULONG i;
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
Status = IoAllocateDriverObjectExtension(
|
Status = IoAllocateDriverObjectExtension(
|
||||||
|
@ -1094,13 +1085,11 @@ DriverEntry(
|
||||||
DriverObject->DriverExtension->AddDevice = ClassAddDevice;
|
DriverObject->DriverExtension->AddDevice = ClassAddDevice;
|
||||||
DriverObject->DriverUnload = DriverUnload;
|
DriverObject->DriverUnload = DriverUnload;
|
||||||
|
|
||||||
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
|
|
||||||
DriverObject->MajorFunction[i] = IrpStub;
|
|
||||||
|
|
||||||
DriverObject->MajorFunction[IRP_MJ_CREATE] = ClassCreate;
|
DriverObject->MajorFunction[IRP_MJ_CREATE] = ClassCreate;
|
||||||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ClassClose;
|
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ClassClose;
|
||||||
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = ClassCleanup;
|
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = ClassCleanup;
|
||||||
DriverObject->MajorFunction[IRP_MJ_READ] = ClassRead;
|
DriverObject->MajorFunction[IRP_MJ_READ] = ClassRead;
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_POWER] = ClassPower;
|
||||||
DriverObject->MajorFunction[IRP_MJ_PNP] = ClassPnp;
|
DriverObject->MajorFunction[IRP_MJ_PNP] = ClassPnp;
|
||||||
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControl;
|
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControl;
|
||||||
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ForwardIrpAndForget;
|
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ForwardIrpAndForget;
|
||||||
|
|
|
@ -20,7 +20,7 @@ static DRIVER_DISPATCH ClassClose;
|
||||||
static DRIVER_DISPATCH ClassCleanup;
|
static DRIVER_DISPATCH ClassCleanup;
|
||||||
static DRIVER_DISPATCH ClassRead;
|
static DRIVER_DISPATCH ClassRead;
|
||||||
static DRIVER_DISPATCH ClassDeviceControl;
|
static DRIVER_DISPATCH ClassDeviceControl;
|
||||||
static DRIVER_DISPATCH IrpStub;
|
static DRIVER_DISPATCH ClassPower;
|
||||||
static DRIVER_ADD_DEVICE ClassAddDevice;
|
static DRIVER_ADD_DEVICE ClassAddDevice;
|
||||||
static DRIVER_STARTIO ClassStartIo;
|
static DRIVER_STARTIO ClassStartIo;
|
||||||
static DRIVER_CANCEL ClassCancelRoutine;
|
static DRIVER_CANCEL ClassCancelRoutine;
|
||||||
|
@ -165,39 +165,31 @@ ClassDeviceControl(
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS NTAPI
|
static NTSTATUS NTAPI
|
||||||
IrpStub(
|
ClassPower(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN PIRP Irp)
|
IN PIRP Irp)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_NOT_SUPPORTED;
|
NTSTATUS Status;
|
||||||
PPORT_DEVICE_EXTENSION DeviceExtension;
|
PPORT_DEVICE_EXTENSION DeviceExtension;
|
||||||
|
|
||||||
DeviceExtension = DeviceObject->DeviceExtension;
|
DeviceExtension = DeviceObject->DeviceExtension;
|
||||||
if (!DeviceExtension->Common.IsClassDO)
|
if (!DeviceExtension->Common.IsClassDO)
|
||||||
{
|
{
|
||||||
/* Forward some IRPs to lower device */
|
/* Forward port DO IRPs to lower device */
|
||||||
switch (IoGetCurrentIrpStackLocation(Irp)->MajorFunction)
|
PoStartNextPowerIrp(Irp);
|
||||||
{
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
case IRP_MJ_POWER:
|
return PoCallDriver(DeviceExtension->LowerDevice, Irp);
|
||||||
PoStartNextPowerIrp(Irp);
|
|
||||||
IoSkipCurrentIrpStackLocation(Irp);
|
|
||||||
return PoCallDriver(DeviceExtension->LowerDevice, Irp);
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
ERR_(CLASS_NAME, "Port DO stub for major function 0x%lx\n",
|
|
||||||
IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
|
|
||||||
ASSERT(FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ERR_(CLASS_NAME, "Class DO stub for major function 0x%lx\n",
|
|
||||||
IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
|
|
||||||
ASSERT(FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Irp->IoStatus.Status = Status;
|
switch (IoGetCurrentIrpStackLocation(Irp)->MinorFunction)
|
||||||
|
{
|
||||||
|
case IRP_MN_SET_POWER:
|
||||||
|
case IRP_MN_QUERY_POWER:
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Status = Irp->IoStatus.Status;
|
||||||
|
PoStartNextPowerIrp(Irp);
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -1023,7 +1015,6 @@ DriverEntry(
|
||||||
IN PUNICODE_STRING RegistryPath)
|
IN PUNICODE_STRING RegistryPath)
|
||||||
{
|
{
|
||||||
PCLASS_DRIVER_EXTENSION DriverExtension;
|
PCLASS_DRIVER_EXTENSION DriverExtension;
|
||||||
ULONG i;
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
Status = IoAllocateDriverObjectExtension(
|
Status = IoAllocateDriverObjectExtension(
|
||||||
|
@ -1070,13 +1061,11 @@ DriverEntry(
|
||||||
DriverObject->DriverExtension->AddDevice = ClassAddDevice;
|
DriverObject->DriverExtension->AddDevice = ClassAddDevice;
|
||||||
DriverObject->DriverUnload = DriverUnload;
|
DriverObject->DriverUnload = DriverUnload;
|
||||||
|
|
||||||
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
|
|
||||||
DriverObject->MajorFunction[i] = IrpStub;
|
|
||||||
|
|
||||||
DriverObject->MajorFunction[IRP_MJ_CREATE] = ClassCreate;
|
DriverObject->MajorFunction[IRP_MJ_CREATE] = ClassCreate;
|
||||||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ClassClose;
|
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ClassClose;
|
||||||
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = ClassCleanup;
|
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = ClassCleanup;
|
||||||
DriverObject->MajorFunction[IRP_MJ_READ] = ClassRead;
|
DriverObject->MajorFunction[IRP_MJ_READ] = ClassRead;
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_POWER] = ClassPower;
|
||||||
DriverObject->MajorFunction[IRP_MJ_PNP] = ClassPnp;
|
DriverObject->MajorFunction[IRP_MJ_PNP] = ClassPnp;
|
||||||
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControl;
|
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControl;
|
||||||
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ForwardIrpAndForget;
|
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ForwardIrpAndForget;
|
||||||
|
|
Loading…
Reference in a new issue