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.
103 lines
2.7 KiB
103 lines
2.7 KiB
/*
|
|
* 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;
|
|
}
|