You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.7 KiB
52 lines
1.7 KiB
#include "pch.h"
|
|
|
|
#ifdef ALLOC_PRAGMA
|
|
#pragma alloc_text(PAGE, HidIrPower)
|
|
#endif
|
|
|
|
/*
|
|
************************************************************
|
|
* HidIrPower
|
|
************************************************************
|
|
*
|
|
* Process Power IRPs sent to this device.
|
|
* Don't have to call PoStartNextPowerIrp, since hidclass does it for us.
|
|
*
|
|
*/
|
|
NTSTATUS HidIrPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
|
|
{
|
|
NTSTATUS status;
|
|
PIO_STACK_LOCATION irpSp;
|
|
PHIDIR_EXTENSION deviceExtension;
|
|
|
|
HidIrKdPrint((3, "HidIrPower Entry"));
|
|
|
|
deviceExtension = GET_MINIDRIVER_HIDIR_EXTENSION( DeviceObject );
|
|
|
|
irpSp = IoGetCurrentIrpStackLocation(Irp);
|
|
|
|
switch (irpSp->MinorFunction) {
|
|
case IRP_MN_SET_POWER:
|
|
if (irpSp->Parameters.Power.Type == DevicePowerState) {
|
|
if (deviceExtension->DevicePowerState != PowerDeviceD0 &&
|
|
irpSp->Parameters.Power.State.DeviceState == PowerDeviceD0) {
|
|
// We are returning from a low power state.
|
|
// Set a timer that will cause hidir to ignore any standby buttons until it triggers
|
|
LARGE_INTEGER timeout;
|
|
timeout.HighPart = -1;
|
|
timeout.LowPart = -50000000; // 5 seconds should be plenty
|
|
KeSetTimer(&deviceExtension->IgnoreStandbyTimer, timeout, NULL);
|
|
}
|
|
deviceExtension->DevicePowerState = irpSp->Parameters.Power.State.DeviceState;
|
|
}
|
|
}
|
|
|
|
IoSkipCurrentIrpStackLocation(Irp);
|
|
status = PoCallDriver(GET_NEXT_DEVICE_OBJECT(DeviceObject), Irp);
|
|
|
|
HidIrKdPrint((3, "HidIrPower Exit: %x", status));
|
|
|
|
return status;
|
|
}
|
|
|
|
|