windows-nt/Source/XPSP1/NT/net/unimodem/sample/sys/power.c

104 lines
2.6 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
* UNIMODEM "Fakemodem" controllerless driver illustrative example
*
* (C) 2000 Microsoft Corporation
* All Rights Reserved
*
*/
#include "fakemodem.h"
#ifdef FAKEMODEM_POWER
VOID
DevicePowerCompleteRoutine(
PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE PowerState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus
)
{
D_POWER(DbgPrint("FAKEMODEM: PoRequestPowerIrp: completion %08lx\n",IoStatus->Status);)
return;
}
#endif
NTSTATUS
FakeModemPower(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS status;
POWER_STATE PowerState;
D_POWER(DbgPrint("FAKEMODEM: Power IRP, MN func=%d\n",irpSp->MinorFunction);)
#ifdef FAKEMODEM_POWER
switch (irpSp->MinorFunction) {
case IRP_MN_SET_POWER:
D_POWER(DbgPrint("FAKEMODEM: IRP_MN_SET_POWER, Type=%s, state=%d\n",irpSp->Parameters.Power.Type == SystemPowerState ? "SystemPowerState" : "DevicePowerState",irpSp->Parameters.Power.State.SystemState);)
if (irpSp->Parameters.Power.Type == SystemPowerState) {
//
// system power state change
//
//
// request the change in device power state based on systemstate map
//
PowerState.DeviceState=deviceExtension->SystemPowerStateMap[irpSp->Parameters.Power.State.SystemState];
PoRequestPowerIrp( deviceExtension->Pdo, IRP_MN_SET_POWER,
PowerState, DevicePowerCompleteRoutine, Irp, NULL);
} else {
//
// changing device state
//
PoSetPowerState( deviceExtension->Pdo,
irpSp->Parameters.Power.Type,
irpSp->Parameters.Power.State);
}
break;
case IRP_MN_QUERY_POWER:
D_POWER(DbgPrint("FAKEMODEM: IRP_MN_QUERY_POWER, Type=%s, state=%d\n",irpSp->Parameters.Power.Type == SystemPowerState ? "SystemPowerState" : "DevicePowerState",irpSp->Parameters.Power.State.DeviceState);)
Irp->IoStatus.Status = STATUS_SUCCESS;
break;
default:
D_POWER(DbgPrint("FAKEMODEM: Power IRP, MN func=%d\n",irpSp->MinorFunction);)
break;
}
#endif
PoStartNextPowerIrp(Irp);
IoSkipCurrentIrpStackLocation(Irp);
status=PoCallDriver(deviceExtension->LowerDevice, Irp);
return status;
}