34 #if defined(EVENT_TRACING) 35 #include "InterruptObject.tmh" 179 #if FX_IS_KERNEL_MODE 185 #elif FX_IS_USER_MODE 251 "Destroy Interrupt destroyed without calling WdfObjectDelete, or " 252 "by Framework processing DeviceRemove. Possible reference count problem?");
259 "Destroy Interrupt destroyed without calling WdfObjectDelete, or " 260 "by Framework processing DeviceRemove. Possible reference count problem?");
291 if (
NULL == fxWakeInterruptMachine) {
296 "WDFDEVICE 0x%p failed to allocate FxWakeInterruptMachine. %!STATUS!.",
306 "WDFDEVICE 0x%p failed to initialize FxWakeInterruptMachine. %!STATUS!.",
314 fxWakeInterruptMachine
320 "WDFDEVICE 0x%p failed to init FxWakeInterruptMachine. %!STATUS!.",
334 "WDFDEVICE 0x%p created wake interrupt",
339 if (
NULL != fxWakeInterruptMachine) {
340 delete fxWakeInterruptMachine;
405 "Wake Interrupt ISR is stuck waiting for the device" 406 "to power back up and driver calllback to be processed",
441 "not enough memory to allocate WDFINTERRUPT for WDFDEVICE %p, " 458 "FxInterrupt Commit failed %!STATUS!",
status);
640 (
PVOID*)&pFxSpinLock);
642 pFxSpinLock->SetInterruptSpinLock();
677 "The specified object 0x%p is not a valid parent for a " 678 "WDFINTERRUPT, WDF_INTERRUPT_CONFIG structure 0x%p passed, " 695 passiveCallbacks =
TRUE;
698 passiveCallbacks =
FALSE;
701 passiveCallbacks =
TRUE;
704 passiveCallbacks =
FALSE;
751 WDFWAITLOCK waitLock =
NULL;
765 "Could not allocate waitlock, %!STATUS!",
796 "Could not allocate workitem, %!STATUS!",
952 if (CmDescTrans->u.Interrupt.Group > 0 &&
979 "Driver cannot specify PassiveHandling for MSI interrupts.");
1017 CmDescRaw->u.MessageInterrupt.Raw.MessageCount > 1) {
1064 "Is MSI? %d, MSI-ID %d, AffinityPolicy %!WDF_INTERRUPT_POLICY!, " 1065 "Priority %!WDF_INTERRUPT_PRIORITY!, Group %d, Affinity 0x%I64x, " 1066 "Irql 0x%x, Vector 0x%x\n",
1098 ULONG messageNumber;
1159 "You cannot apply policy at this stage for WDFINTERRUPT 0x%p " 1160 "For interrupts created in EvtDevicePrepareHardware you must use " 1161 "EvtDeviceFilter APIs or use a pre-process routine to handle the " 1162 "IRP_MN_FILTER_RESOURCE_REQUIREMENT, %!STATUS!",
1278 "IoConnectInterrupt(Ex) Failed," 1282 " Synchronize IRQL 0x%x," 1285 " ProcessorGroup %d," 1286 " ProcessorEnableMask 0x%I64x," 1307 #if FX_IS_KERNEL_MODE 1326 "EvtInterruptEnable WDFDEVICE %p, WDFINTERRUPT %p, PKINTERRUPT %p " 1464 "EvtInterruptDisable WDFDEVICE %p, WDFINTERRUPT %p, " 1465 "PKINTERRUPT %p returned %!STATUS!",
1477 #if FX_IS_KERNEL_MODE 1510 #if FX_IS_KERNEL_MODE 1563 #if FX_IS_KERNEL_MODE 1600 "Force disconnect called on WDFDEVICE %p, WDFINTERRUPT %p, PKINTERRUPT %p",
1634 "Force connect called on WDFDEVICE %p, WDFINTERRUPT %p, PKINTERRUPT %p",
1725 p->ReturnVal =
p->Interrupt->InterruptEnableInvokeCallback();
1789 p->ReturnVal =
p->Interrupt->InterruptDisableInvokeCallback();
1822 #if ((FX_CORE_MODE)==(FX_CORE_KERNEL_MODE)) 1834 #if ((FX_CORE_MODE)==(FX_CORE_KERNEL_MODE)) 1838 FX_VERIFY(INTERNAL, TRAPMSG(
"Not expected"));
1873 #pragma prefast(push) 1874 #pragma prefast(disable:__WARNING_UNEXPECTED_IRQL_CHANGE, "Used unannotated pointers previously") 1886 ASSERTMSG(
"Can't synchronize when the interrupt isn't connected: ",
1887 kinterrupt !=
NULL);
1889 if (
NULL != kinterrupt) {
1902 #pragma prefast(pop) 1910 ASSERTMSG(
"TryToAcquireLock is only available for passive-level " 1923 return FxWaitLockInternal::IsLockAcquired(
1928 #pragma prefast(push) 1929 #pragma prefast(disable:__WARNING_UNEXPECTED_IRQL_CHANGE, "Used unannotated pointers previously") 1941 ASSERTMSG(
"Can't synchronize when the interrupt isn't connected: ",
1942 kinterrupt !=
NULL);
1944 if (
NULL != kinterrupt) {
1945 #pragma prefast(suppress:__WARNING_CALLER_FAILING_TO_HOLD, "Unable to annotate ReleaseLock for this case."); 1955 #pragma prefast(suppress:__WARNING_CALLER_FAILING_TO_HOLD, "Unable to annotate ReleaseLock for this case."); 1959 #pragma prefast(pop) 1971 if (
p->Interrupt->m_PassiveHandling) {
1978 p->Interrupt->AcquireLock();
1979 result =
p->Callback(
p->Interrupt->GetHandle(),
p->Context);
1980 p->Interrupt->ReleaseLock();
1983 result =
p->Callback(
p->Interrupt->GetHandle(),
p->Context);
2004 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE) 2005 ASSERTMSG(
"Can't synchronize when the interrupt isn't connected: ",
2006 kinterrupt !=
NULL);
NTSTATUS InterruptEnableInvokeCallback(VOID)
_Must_inspect_result_ NTSTATUS Initialize(__in CfxDevice *Device, __in FxObject *Parent, __in PWDF_INTERRUPT_CONFIG Configuration)
virtual VOID DeleteObject(VOID)
__inline BOOLEAN IsPassiveConnect(VOID)
static MdDeferredRoutineType _InterruptDpcThunk
static EVT_SYSTEMWORKITEM _InterruptWorkItemCallback
static MdInterruptServiceRoutineType _InterruptThunk
virtual BOOLEAN Dispose(VOID)
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PVOID WdmObject, __out FxSystemWorkItem **pObject)
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ NTSTATUS ConnectInternal(VOID)
VOID AssignResources(__in PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescRaw, __in PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescTrans)
PFN_WDF_INTERRUPT_ISR EvtInterruptIsr
PFN_WDF_INTERRUPT_DISABLE EvtInterruptDisable
MdDeviceObject __inline GetDeviceObject(VOID)
_Must_inspect_result_ NTSTATUS Commit(__in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __out_opt WDFOBJECT *ObjectHandle, __in_opt FxObject *Parent=NULL, __in BOOLEAN AssignDriverAsDefaultParent=TRUE)
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
WDF_TRI_STATE ShareVector
static _Must_inspect_result_ NTSTATUS _GetEffectiveLock(__in FxObject *Object, __in_opt IFxHasCallbacks *Callbacks, __in BOOLEAN AutomaticLocking, __in BOOLEAN PassiveCallbacks, __out FxCallbackLock **CallbackLock, __out_opt FxObject **CallbackLockObject)
VOID InvokeWakeInterruptEvtIsr(VOID)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG Configuration
VOID WakeInterruptCreated(VOID)
VOID RevokeResourcesInternal(VOID)
WDFDEVICE __inline GetHandle(VOID)
#define STATUS_INVALID_PARAMETER
enum _WDF_TRI_STATE WDF_TRI_STATE
static MdInterruptSynchronizeRoutineType _InterruptMarkDisconnecting
VOID FlushQueuedWorkitem(VOID)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
BOOLEAN m_IsEdgeTriggeredNonMsiInterrupt
BOOLEAN m_CreatedInPrepareHardware
VOID MarkPassiveDispose(__in FxObjectLockState State=ObjectLock)
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
PFN_WDF_INTERRUPT_DISABLE m_EvtInterruptDisable
BOOLEAN m_DisposeWaitLock
static __inline KIRQL MxAcquireInterruptSpinLock(_Inout_ PKINTERRUPT Interrupt)
RD_INTERRUPT_CONTEXT m_RdInterruptContext
#define STATUS_INVALID_DEVICE_REQUEST
ULONG DbgWaitForWakeInterruptIsrTimeoutInSec
BOOLEAN IsUserModeFramework
NTSTATUS InterruptEnable(VOID)
WDF_TRI_STATE m_ShareVector
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), Fdo, FX_TYPE_DEVICE,(PVOID *)&pFdo)
FxSystemWorkItem * m_SystemWorkItem
virtual VOID SetDeviceTelemetryInfoFlags(_In_ FxDeviceInfoFlags Flag)
VOID WaitForSignal(__in MxEvent *Event, __in PCSTR ReasonForWaiting, __in PVOID Handle, __in ULONG WarningTimeoutInSec, __in ULONG WaitSignalFlags)
#define TRACE_LEVEL_INFORMATION
_Must_inspect_result_ NTSTATUS Init(__inout FxPkgPnp *Pnp, __in PFN_PNP_EVENT_WORKER WorkerRoutine, __in PVOID WorkerContext=NULL)
_Must_inspect_result_ NTSTATUS Disconnect(__in ULONG NotifyFlags)
VOID AssignResourcesInternal(__in PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescRaw, __in PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescTrans, __in PWDF_INTERRUPT_INFO InterruptConfig)
_Must_inspect_result_ NTSTATUS Connect(__in ULONG NotifyFlags)
MxEvent * GetSelfPointer(VOID)
PCM_PARTIAL_RESOURCE_DESCRIPTOR m_CmTranslatedResource
_Must_inspect_result_ NTSTATUS ForceDisconnect(VOID)
VOID FlushAndRundownInternal(VOID)
__inline BOOLEAN TryToEnqueue(__in PFN_WDF_SYSTEMWORKITEM CallbackFunc, __in PVOID Parameter)
static FxDeviceBase * _SearchForDevice(__in FxObject *Object, __out_opt IFxHasCallbacks **Callbacks)
VOID RevokeResources(VOID)
PFN_WDF_INTERRUPT_ENABLE EvtInterruptEnable
CLIPBOARD_GLOBALS Globals
CHECK_RETURN_IF_USER_MODE __inline NTSTATUS Initialize(__in EVENT_TYPE Type, __in BOOLEAN InitialState)
PFN_WDF_INTERRUPT_ENABLE EvtInterruptEnable
_Must_inspect_result_ NTSTATUS Initialize(__in PFX_DRIVER_GLOBALS DriverGlobals)
VOID OnPostReleaseHardware(VOID)
GLenum const GLfloat * params
#define TRACE_LEVEL_VERBOSE
BOOLEAN m_ForceDisconnected
KAFFINITY TargetProcessorSet
EVT_WDF_INTERRUPT_SYNCHRONIZE * PFN_WDF_INTERRUPT_SYNCHRONIZE
struct _WDF_INTERRUPT_CONFIG_V1_9 WDF_INTERRUPT_CONFIG_V1_9
volatile KIRQL m_SynchronizeIrql
#define ASSERTMSG(msg, exp)
static MdInterruptSynchronizeRoutineType _InterruptSynchronizeThunk
WDF_INTERRUPT_POLICY m_Policy
VOID ReportActive(_In_ BOOLEAN Internal=FALSE)
WDF_TRI_STATE ShareVector
VOID MarkDisposeOverride(__in FxObjectLockState State=ObjectLock)
#define STATUS_WDF_INCOMPATIBLE_EXECUTION_LEVEL
VOID DisconnectInternal(VOID)
PFN_WDF_INTERRUPT_WORKITEM EvtInterruptWorkItem
struct _WDF_INTERRUPT_CONFIG_V1_11_BETA WDF_INTERRUPT_CONFIG_V1_11_BETA
enum _WDF_INTERRUPT_POLICY WDF_INTERRUPT_POLICY
struct _KINTERRUPT * m_Interrupt
BOOLEAN IsSoftDisconnectCapable(VOID)
BOOLEAN _SynchronizeExecution(__in MdInterrupt Interrupt, __in MdInterruptSynchronizeRoutine SynchronizeRoutine, __in PVOID SynchronizeContext)
PWDF_INTERRUPT_INFO GetInfo(VOID)
BOOLEAN AutomaticSerialization
WDF_INTERRUPT_PRIORITY m_Priority
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
VOID ProcessEvent(__in FxWakeInterruptEvents Event)
PCM_PARTIAL_RESOURCE_DESCRIPTOR InterruptTranslated
BOOLEAN IsLevelTriggered(__in ULONG Flags)
static MdInterruptSynchronizeRoutineType _InterruptEnableThunk
VOID FlushQueuedDpcs(VOID)
PFX_DRIVER_GLOBALS pFxDriverGlobals
BOOLEAN m_PassiveHandlingByRedirector
FX_VERIFY(INTERNAL, CHECK_NOT_NULL(LoaderInterface->pIWudfHost))
NTSTATUS InterruptDisable(VOID)
#define NT_SUCCESS(StatCode)
EVT_WDF_INTERRUPT_WORKITEM * PFN_WDF_INTERRUPT_WORKITEM
FxInterrupt * pFxInterrupt
enum _WDF_INTERRUPT_PRIORITY WDF_INTERRUPT_PRIORITY
struct _WDF_INTERRUPT_CONFIG_V1_11_BETA * PWDF_INTERRUPT_CONFIG_V1_11_BETA
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY _In_ KAFFINITY TargetProcessorSet
PFN_WDF_INTERRUPT_DISABLE EvtInterruptDisable
ULONG __inline GetDeviceObjectFlags(VOID)
BOOLEAN m_PassiveHandling
VOID FlushAndRundown(VOID)
VOID SetPolicyInternal(__in WDF_INTERRUPT_POLICY Policy, __in WDF_INTERRUPT_PRIORITY Priority, __in PGROUP_AFFINITY TargetProcessorSet)
PFN_WDF_INTERRUPT_WORKITEM m_EvtInterruptWorkItem
EVT_WDF_INTERRUPT_ISR * PFN_WDF_INTERRUPT_ISR
static __inline KIRQL MxGetCurrentIrql()
ULONG m_InterruptObjectCount
PFN_WDF_INTERRUPT_ISR EvtInterruptIsr
EVT_WDF_INTERRUPT_ENABLE * PFN_WDF_INTERRUPT_ENABLE
_Must_inspect_result_ __inline BOOLEAN FxIsProcessorGroupSupported(VOID)
BOOLEAN m_UseSoftDisconnect
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
PFN_WDF_INTERRUPT_DPC EvtInterruptDpc
VOID SetPolicy(__in WDF_INTERRUPT_POLICY Policy, __in WDF_INTERRUPT_PRIORITY Priority, __in PGROUP_AFFINITY TargetProcessorSet)
__inline WDF_DEVICE_PNP_STATE GetDevicePnpState()
BOOLEAN Synchronize(__in PFN_WDF_INTERRUPT_SYNCHRONIZE Callback, __in WDFCONTEXT Context)
_Must_inspect_result_ NTSTATUS InitializeWorker(__in FxObject *Parent, __in PWDF_INTERRUPT_CONFIG Configuration)
CfxDeviceBase * m_DeviceBase
struct _WDF_INTERRUPT_CONFIG_V1_9 * PWDF_INTERRUPT_CONFIG_V1_9
FxCallbackLock * m_CallbackLock
VOID MarkNoDeleteDDI(__in FxObjectLockState State=ObjectLock)
__inline BOOLEAN IsWakeCapable(VOID)
static __inline VOID MxReleaseInterruptSpinLock(_Inout_ PKINTERRUPT Interrupt, _In_ KIRQL OldIrql)
#define _Must_inspect_result_
_Must_inspect_result_ _In_ WDFDEVICE Device
FxLibraryGlobalsType FxLibraryGlobals
PFN_WDF_INTERRUPT_ISR m_EvtInterruptIsr
PFN_WDF_INTERRUPT_ENABLE m_EvtInterruptEnable
#define TRACE_LEVEL_ERROR
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
#define InitializeListHead(ListHead)
PFX_DRIVER_GLOBALS fxDriverGlobals
static MdInterruptSynchronizeRoutineType _InterruptDisableThunk
static VOID _ProcessEventInner(__inout FxPkgPnp *PkgPnp, __inout FxPostProcessInfo *Info, __in PVOID WorkerContext)
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS DriverGlobals, __in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __in_opt FxObject *ParentObject, __in BOOLEAN AssignDriverAsDefaultParent, __out WDFWAITLOCK *LockHandle)
_Must_inspect_result_ NTSTATUS ForceReconnect(VOID)
EVT_WDF_INTERRUPT_DISABLE * PFN_WDF_INTERRUPT_DISABLE
BOOLEAN TryToAcquireLock(VOID)
_Must_inspect_result_ NTSTATUS InitializeInternal(__in FxObject *Parent, __in PWDF_INTERRUPT_CONFIG Configuration)
WDFINTERRUPT GetHandle(VOID)
BOOLEAN QueueWorkItemForIsr(VOID)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
_Must_inspect_result_ NTSTATUS CreateWakeInterruptMachine(VOID)
FxInterrupt(__in PFX_DRIVER_GLOBALS FxDriverGlobals)
VOID DeleteFromFailedCreate(VOID)
PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
struct tagContext Context
FxInterruptWaitblock * m_InterruptWaitblock
VOID AddInterruptObject(__in FxInterrupt *Interrupt)
#define CM_RESOURCE_INTERRUPT_LATCHED
_Must_inspect_result_ __inline BOOLEAN FxIsPassiveLevelInterruptSupported(VOID)
return &pObject m_DescriptorClone
#define RtlZeroMemory(Destination, Length)
BOOLEAN WakeInterruptIsr(VOID)
static _Must_inspect_result_ NTSTATUS _CreateAndInit(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in CfxDevice *Device, __in_opt FxObject *Parent, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in PWDF_INTERRUPT_CONFIG Configuration, __out FxInterrupt **Interrupt)
PFN_WDF_INTERRUPT_DPC m_EvtInterruptDpc
GROUP_AFFINITY m_Processors
virtual VOID DeleteObject(VOID)
PFN_WDF_INTERRUPT_DPC EvtInterruptDpc
virtual ~FxInterrupt(VOID)
FxWakeInterruptMachine * m_WakeInterruptMachine
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
VOID ReportInactive(_In_ BOOLEAN Internal=FALSE)
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY Policy
VOID SetActiveForWake(__in BOOLEAN ActiveForWake)
static BOOLEAN _IsMessageInterrupt(__in USHORT ResourceFlags)
BOOLEAN AutomaticSerialization
NTSTATUS InterruptDisableInvokeCallback(VOID)
static SERVICE_STATUS status
PCM_PARTIAL_RESOURCE_DESCRIPTOR InterruptRaw
BOOLEAN IsActiveForWake(VOID)
struct _KINTERRUPT * m_InterruptCaptured
VOID RemoveInterruptObject(__in FxInterrupt *Interrupt)
static __inline BOOLEAN MxInsertQueueDpc(__inout PRKDPC Dpc, __in_opt PVOID SystemArgument1, __in_opt PVOID SystemArgument2)
WDF_INTERRUPT_INFO m_InterruptInfo
FxVerifierDbgBreakPoint(pFxDriverGlobals)
EVT_WDF_INTERRUPT_DPC * PFN_WDF_INTERRUPT_DPC
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
struct _KINTERRUPT * GetInterruptPtr(VOID)
FORCEINLINE VOID WDF_INTERRUPT_INFO_INIT(_Out_ PWDF_INTERRUPT_INFO Info)
_In_opt_ PVOID DeferredContext