40 if (
Removed == deviceExtension->DeviceState)
48 Irp->IoStatus.Information = 0;
55 if (
NotStarted == deviceExtension->DeviceState)
61 return PoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
81 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_DispatchPower: IRP_MN_SET_POWER\n"));
107 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_DispatchPower: IRP_MN_QUERY_POWER\n"));
133 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_DispatchPower: IRP_MN_WAIT_WAKE\n"));
145 ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
148 FreeBT_DbgPrint(1, (
"FBTUSB: Lower drivers failed the wait-wake Irp\n"));
156 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_DispatchPower: IRP_MN_WAIT_WAKE::"));
164 FreeBT_DbgPrint(3, (
"FBTUSB: FreeBT_DispatchPower: IRP_MN_POWER_SEQUENCE\n"));
169 ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
172 FreeBT_DbgPrint(1, (
"FBTUSB: FreeBT_DispatchPower: Lower drivers failed this Irp\n"));
201 FreeBT_DbgPrint(3, (
"FBTUSB: HandleSystemQueryPower: Query for system power state S%X\n"
202 "FBTUSB: HandleSystemQueryPower: Current system power state S%X\n",
204 deviceExtension->SysPower - 1));
207 if ((deviceExtension->WaitWakeEnable) && (systemState > deviceExtension->DeviceCapabilities.SystemWake))
209 FreeBT_DbgPrint(1, (
"FBTUSB: HandleSystemQueryPower: Query for an incompatible system power state\n"));
213 Irp->IoStatus.Information = 0;
224 if((systemState > deviceExtension->SysPower) && (deviceExtension->WaitWakeEnable))
239 ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
259 FreeBT_DbgPrint(3, (
"FBTUSB: HandleSystemSetPower: Set request for system power state S%X\n"
260 "FBTUSB: HandleSystemSetPower: Current system power state S%X\n",
262 deviceExtension->SysPower - 1));
273 ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
293 FreeBT_DbgPrint(3, (
"FBTUSB: HandleDeviceQueryPower: Query for device power state D%X\n"
294 "FBTUSB: HandleDeviceQueryPower: Current device power state D%X\n",
296 deviceExtension->DevPower - 1));
298 if (deviceExtension->WaitWakeEnable && deviceState > deviceExtension->DeviceCapabilities.DeviceWake)
302 Irp->IoStatus.Information = 0;
312 if (deviceState < deviceExtension->DevPower)
332 Irp->IoStatus.Status = ntStatus;
333 Irp->IoStatus.Information = 0;
343 ntStatus=PoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
362 ntStatus =
Irp->IoStatus.Status;
381 DeviceExtension->SysPower = irpStack->
Parameters.
Power.State.SystemState;
413 devState = deviceExtension->DeviceCapabilities.DeviceState[systemState];
419 FreeBT_DbgPrint(1, (
"FBTUSB: SendDeviceIrp: Failed to alloc memory for powerContext\n"));
427 powerContext->
SIrp = SIrp;
431 deviceExtension->PhysicalDeviceObject,
449 SIrp->IoStatus.Status = ntStatus;
450 SIrp->IoStatus.Information = 0;
476 sIrp = powerContext->
SIrp;
509 oldDevState = deviceExtension->DevPower;
513 FreeBT_DbgPrint(3, (
"FBTUSB: HandleDeviceSetPower: Set request for device power state D%X\n"
514 "FBTUSB: HandleDeviceSetPower: Current device power state D%X\n",
516 deviceExtension->DevPower - 1));
518 if (newDevState < oldDevState)
521 FreeBT_DbgPrint(3, (
"FBTUSB: HandleDeviceSetPower: Adding power to the device\n"));
532 ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
543 if(
PowerDeviceD0 == oldDevState && newDevState > oldDevState)
546 FreeBT_DbgPrint(3, (
"FBTUSB: HandleDeviceSetPower: Removing power from the device\n"));
552 Irp->IoStatus.Status = ntStatus;
553 Irp->IoStatus.Information = 0;
565 goto HandleDeviceSetPower_Exit;
576 FreeBT_DbgPrint(3, (
"FBTUSB: HandleDeviceSetPower: A SetD0 request\n"));
595 ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
598 FreeBT_DbgPrint(1, (
"FBTUSB: HandleDeviceSetPower: Lower drivers failed a power Irp\n"));
604HandleDeviceSetPower_Exit:
618 ntStatus =
Irp->IoStatus.Status;
619 if(
Irp->PendingReturned)
652 ntStatus =
Irp->IoStatus.Status;
656 oldDevState = DeviceExtension->DevPower;
661 DeviceExtension->DevPower = newDevState;
679 Irp->IoStatus.Information = 0;
699 ntStatus =
Irp->IoStatus.Status;
754 FreeBT_DbgPrint(3, (
"FBTUSB: HoldIoRequests: Failed to allocate memory for workitem\n"));
764 FreeBT_DbgPrint(1, (
"FBTUSB: HoldIoRequests: Failed to alloc memory for worker thread context\n"));
782 FreeBT_DbgPrint(3, (
"FBTUSB: HoldIoRequestsWorkerRoutine: Entered\n"));
816 ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject,
irp);
819 FreeBT_DbgPrint(1, (
"FBTUSB: HoldIoRequestsWorkerRoutine: Lower driver fail a power Irp\n"));
826 FreeBT_DbgPrint(3, (
"FBTUSB: HoldIoRequestsWorkerRoutine: Leaving\n"));
843 InsertTailList(&DeviceExtension->NewRequestsQueue, &
Irp->Tail.Overlay.ListEntry);
863 oldIrql =
Irp->CancelIrql;
878 Irp->IoStatus.Information = 0;
903 poState.
SystemState = DeviceExtension->DeviceCapabilities.SystemWake;
909 &DeviceExtension->WaitWakeIrp);
938 Irp->IoStatus.Information = 0;
952 if(
Irp->PendingReturned)
1012 FreeBT_DbgPrint(3, (
"FBTUSB: WaitWakeCallback: Device already powered up...\n"));
1029 if(deviceExtension->WaitWakeEnable)
1047 return "IRP_MN_SET_POWER\n";
1050 return "IRP_MN_QUERY_POWER\n";
1053 return "IRP_MN_POWER_SEQUENCE\n";
1056 return "IRP_MN_WAIT_WAKE\n";
1059 return "IRP_MN_?????\n";
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define InterlockedExchange
#define NT_SUCCESS(StatCode)
struct _BEEP_DEVICE_EXTENSION * PDEVICE_EXTENSION
#define InterlockedExchangePointer(Target, Value)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeReleaseSpinLock(sl, irql)
#define KeAcquireSpinLock(sl, irql)
VOID NTAPI WWIrpCompletionFunc(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
VOID NTAPI ProcessQueuedRequests(IN OUT PDEVICE_EXTENSION DeviceExtension)
LONG NTAPI FreeBT_IoDecrement(IN OUT PDEVICE_EXTENSION DeviceExtension)
LONG NTAPI FreeBT_IoIncrement(IN OUT PDEVICE_EXTENSION DeviceExtension)
VOID NTAPI CancelQueued(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI HandleSystemQueryPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI WaitWakeCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI SetDeviceFunctional(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
VOID NTAPI WaitWakeCallback(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
NTSTATUS NTAPI HandleSystemSetPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI FinishDevPoDnIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
VOID NTAPI CancelWaitWake(IN PDEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI FinishDevPoUpIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI IssueWaitWake(IN PDEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI QueueRequest(IN OUT PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp)
NTSTATUS NTAPI HandleDeviceSetPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PCHAR NTAPI PowerMinorFunctionString(IN UCHAR MinorFunction)
NTSTATUS NTAPI FreeBT_DispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI SysPoCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI HoldIoRequests(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID NTAPI SendDeviceIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP SIrp)
NTSTATUS NTAPI HandleDeviceQueryPower(PDEVICE_OBJECT DeviceObject, PIRP Irp)
VOID NTAPI HoldIoRequestsWorkerRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
VOID NTAPI DevPoCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
struct _POWER_COMPLETION_CONTEXT * PPOWER_COMPLETION_CONTEXT
#define FreeBT_DbgPrint(level, _x_)
#define ExAllocatePool(type, size)
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
IoSetCancelRoutine(Irp, CancelRoutine)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
#define IoSkipCurrentIrpStackLocation(Irp)
#define IoCopyCurrentIrpStackLocationToNext(Irp)
#define IoCompleteRequest
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
POWER_STATE NTAPI PoSetPowerState(IN PDEVICE_OBJECT DeviceObject, IN POWER_STATE_TYPE Type, IN POWER_STATE State)
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
NTSTATUS NTAPI PoRequestPowerIrp(_In_ PDEVICE_OBJECT DeviceObject, _In_ UCHAR MinorFunction, _In_ POWER_STATE PowerState, _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction, _In_opt_ __drv_aliasesMem PVOID Context, _Outptr_opt_ PIRP *pIrp)
enum _DEVICE_POWER_STATE DEVICE_POWER_STATE
enum _SYSTEM_POWER_STATE SYSTEM_POWER_STATE
#define STATUS_DELETE_PENDING
#define KeAcquireSpinLockAtDpcLevel(SpinLock)
#define STATUS_MORE_PROCESSING_REQUIRED
union _IO_STACK_LOCATION::@1583 Parameters
struct _IO_STACK_LOCATION::@3982::@4018 Power
PDEVICE_OBJECT DeviceObject
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_DEVICE_BUSY
#define STATUS_INSUFFICIENT_RESOURCES
DEVICE_POWER_STATE DeviceState
SYSTEM_POWER_STATE SystemState
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
_In_ UCHAR _In_ UCHAR MinorFunction
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
#define IRP_MN_POWER_SEQUENCE
_In_ SYSTEM_POWER_STATE SystemPowerState
#define IRP_MN_QUERY_POWER
REQUEST_POWER_COMPLETE * PREQUEST_POWER_COMPLETE