104 lines
2.6 KiB
C
104 lines
2.6 KiB
C
|
/*
|
||
|
* 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;
|
||
|
}
|