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"));
199 systemState = irpStack->
Parameters.Power.State.SystemState;
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);
257 systemState = irpStack->
Parameters.Power.State.SystemState;
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);
291 deviceState = irpStack->
Parameters.Power.State.DeviceState;
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;
405 systemState = 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"));
604 HandleDeviceSetPower_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";
NTSTATUS NTAPI HandleSystemSetPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
struct _POWER_COMPLETION_CONTEXT * PPOWER_COMPLETION_CONTEXT
LONG NTAPI FreeBT_IoDecrement(IN OUT PDEVICE_EXTENSION DeviceExtension)
#define STATUS_DELETE_PENDING
NTSTATUS NTAPI FinishDevPoUpIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
#define STATUS_INSUFFICIENT_RESOURCES
#define IRP_MN_POWER_SEQUENCE
VOID NTAPI CancelWaitWake(IN PDEVICE_EXTENSION DeviceExtension)
#define IRP_MN_QUERY_POWER
REQUEST_POWER_COMPLETE * PREQUEST_POWER_COMPLETE
NTSTATUS NTAPI HandleDeviceQueryPower(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define STATUS_MORE_PROCESSING_REQUIRED
NTSTATUS NTAPI HandleSystemQueryPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI SysPoCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
VOID NTAPI KeAcquireSpinLockAtDpcLevel(IN PKSPIN_LOCK SpinLock)
VOID NTAPI WWIrpCompletionFunc(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
LONG NTAPI FreeBT_IoIncrement(IN OUT PDEVICE_EXTENSION DeviceExtension)
VOID NTAPI DevPoCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
NTSTATUS NTAPI FreeBT_DispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define InsertTailList(ListHead, Entry)
IoSetCancelRoutine(Irp, CancelRoutine)
NTSTATUS NTAPI HoldIoRequests(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
enum _SYSTEM_POWER_STATE SYSTEM_POWER_STATE
PDEVICE_OBJECT DeviceObject
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
NTSTATUS NTAPI HandleDeviceSetPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define STATUS_INVALID_DEVICE_STATE
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
SYSTEM_POWER_STATE SystemState
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
_In_ PDEVICE_OBJECT DeviceObject
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
NTSTATUS NTAPI FinishDevPoDnIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
_In_ UCHAR _In_ UCHAR MinorFunction
NTSTATUS NTAPI SetDeviceFunctional(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
VOID NTAPI HoldIoRequestsWorkerRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
#define FreeBT_DbgPrint(level, _x_)
PCHAR NTAPI PowerMinorFunctionString(IN UCHAR MinorFunction)
VOID NTAPI ProcessQueuedRequests(IN OUT PDEVICE_EXTENSION DeviceExtension)
#define IoCompleteRequest
enum _DEVICE_POWER_STATE DEVICE_POWER_STATE
#define InterlockedExchangePointer(Target, Value)
#define NT_SUCCESS(StatCode)
#define KeAcquireSpinLock(sl, irql)
DEVICE_POWER_STATE DeviceState
_In_opt_ PVOID _In_ ULONG _In_ PVOID context
#define ExAllocatePool(type, size)
NTSTATUS NTAPI QueueRequest(IN OUT PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp)
#define InterlockedExchange
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
NTSTATUS NTAPI IssueWaitWake(IN PDEVICE_EXTENSION DeviceExtension)
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
#define STATUS_DEVICE_BUSY
#define KeReleaseSpinLock(sl, irql)
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
#define IoSkipCurrentIrpStackLocation(Irp)
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
NTSTATUS NTAPI WaitWakeCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
struct tagContext Context
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
POWER_STATE NTAPI PoSetPowerState(IN PDEVICE_OBJECT DeviceObject, IN POWER_STATE_TYPE Type, IN POWER_STATE State)
VOID NTAPI CancelQueued(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PREQUEST_POWER_COMPLETE CompletionFunction, IN PVOID Context, OUT PIRP *pIrp OPTIONAL)
_In_ SYSTEM_POWER_STATE SystemPowerState
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
VOID NTAPI WaitWakeCallback(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
struct _BEEP_DEVICE_EXTENSION * PDEVICE_EXTENSION
VOID NTAPI SendDeviceIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP SIrp)