26 #include "FxInterruptThreadpoolUm.hpp" 29 #include "InterruptObjectUm.tmh" 104 "Waitblock creation failed for CWdfInterrupt object" 114 hr =
deviceStack->InitializeInterrupt((WUDF_INTERRUPT_CONTEXT)
this,
126 PUMDF_VERSION_DATA driverVersion =
deviceStack->GetMinDriverVersion();
128 BOOL preserveCompat =
129 deviceStack->ShouldPreserveIrpCompletionStatusCompatibility();
131 status = CHostFxUtil::NtStatusFromHr(
133 driverVersion->MajorNumber,
134 driverVersion->MinorNumber,
142 "failed to initialize interrupt " 184 StartThreadpoolWaitQueue();
193 &isRdConnectingOrConnected);
196 if (isRdConnectingOrConnected) {
206 "Multiple connection attempts for !WDFINTERRUPT 0x%p",
211 CHECK(
"Multiple interrupt connection attempts",
FALSE),
223 StopAndFlushThreadpoolWaitQueue();
226 PUMDF_VERSION_DATA driverVersion =
deviceStack->GetMinDriverVersion();
227 BOOL preserveCompat =
228 deviceStack->ShouldPreserveIrpCompletionStatusCompatibility();
230 status = CHostFxUtil::NtStatusFromHr(
232 driverVersion->MajorNumber,
233 driverVersion->MinorNumber,
239 "Connect message to reflector returned failure " 257 InterruptControlType controlType;
265 controlType = InterruptControlTypeDisconnect;
271 "Disconnect message to reflector returned failure " 274 FX_VERIFY_WITH_NAME(INTERNAL, TRAPMSG(
"Disconnect message to reflector returned failure. "),
289 StopAndFlushThreadpoolWaitQueue();
324 "SetPolicy message to reflector returned failure " 367 InterruptControlType controlType;
383 controlType = InterruptControlTypeResetInterruptInfo;
389 "ResetInterruptInfo message to reflector returned failure " 404 InterruptControlType controlType;
420 controlType = InterruptControlTypeRevokeResources;
426 "RevokeResources message to reflector returned failure " 448 InterruptControlTypeFlushQueuedDpcs);
453 "FlushQueuedDpcs message to reflector returned failure " 457 TRAPMSG(
"FlushQueuedDpcs message to reflector returned failure"),
482 "Failed to assign interrupt resource to interrupt object" 483 "because interrupt resource is for level-triggered interrupt" 484 "which is not supported on this platform. See the docs for info on" 485 "supported platforms. %!hresult!\n",
hr);
488 "Failed to assign interrupt resource to interrupt object" 489 "because interrupt resource is for level-triggered interrupt" 490 "which is not supported on this platform. See the docs for info on" 491 "supported platforms."),
509 "The resource descriptor indicates that this is a shared " 510 "edge-triggered interrupt. UMDF only supports sharing of " 511 "level-triggered interrupts. Please check if your device " 512 "firmware mistakenly declares this resource as shared " 513 "instead of device exclusive. If the resource is in fact " 514 "shared, then UMDF does not support this device.\n");
532 "AssignResources message to reflector returned failure " 542 FxInterrupt::ThreadpoolWaitCallback(
551 EventWriteEVENT_UMDF_FX_INTERRUPT_NOTIFICATION_RECEIVED(
578 QueueSingleWaitOnInterruptEvent();
596 "AcknowledgeInterrupt message to reflector returned " 597 "failure. Check UMDF log for failure reason. %!hresult!",
hr);
600 "reflector returned failure. Check UMDF log for failure reason. "),
609 FxInterrupt::QueueSingleWaitOnInterruptEvent(
617 FxInterrupt::StartThreadpoolWaitQueue(
623 QueueSingleWaitOnInterruptEvent();
627 FxInterrupt::StopAndFlushThreadpoolWaitQueue(
674 TP_WAIT_RESULT WaitResult
683 fxInterrupt->ThreadpoolWaitCallback();
696 StopAndFlushThreadpoolWaitQueue();
798 FX_VERIFY(INTERNAL,
CHECK(
"Must be Passive Interrupt", isPassive));
virtual VOID DeleteObject(VOID)
KSYNCHRONIZE_ROUTINE * MdInterruptSynchronizeRoutine
static MdInterruptServiceRoutineType _InterruptThunk
_Must_inspect_result_ NTSTATUS ConnectInternal(VOID)
BOOLEAN _SynchronizeExecution(__in MdInterrupt Interrupt, __in MdInterruptSynchronizeRoutine SynchronizeRoutine, __in PVOID SynchronizeContext)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG Configuration
VOID RevokeResourcesInternal(VOID)
#define UNREFERENCED_PARAMETER(P)
WDFDEVICE __inline GetHandle(VOID)
_In_ WDFDPC _In_ BOOLEAN Wait
VOID FlushQueuedWorkitem(VOID)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
static HRESULT _CreateAndInit(_In_ PFX_DRIVER_GLOBALS DriverGlobals, _Out_ FxInterruptThreadpool **ppThreadpool)
BOOLEAN m_DisposeWaitLock
RD_INTERRUPT_CONTEXT m_RdInterruptContext
static HRESULT _CreateAndInit(_In_ FxInterruptThreadpool *Threadpool, _In_ FxInterrupt *Interrupt, _In_ PTP_WAIT_CALLBACK WaitCallback, _Out_ FxInterruptWaitblock **Waitblock)
WDF_TRI_STATE m_ShareVector
IWudfDeviceStack * deviceStack
FxSystemWorkItem * m_SystemWorkItem
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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
#define CHECK(type, val, base, expected)
BOOLEAN QueueDpcForIsr(VOID)
VOID AssignResourcesInternal(__in PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescRaw, __in PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescTrans, __in PWDF_INTERRUPT_INFO InterruptConfig)
FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK(ERROR_STRING_HW_ACCESS_NOT_ALLOWED,(pDevice->IsDirectHardwareAccessAllowed()==TRUE)), DriverGlobals->DriverName)
VOID FlushAndRundownInternal(VOID)
VOID SetInterruptThreadpool(_In_ FxInterruptThreadpool *Pool)
IWudfDeviceStack2 * GetDeviceStack2(VOID)
#define ASSERTMSG(msg, exp)
VOID SetThreadpoolWait(VOID)
virtual void Lock(__out PKIRQL PreviousIrql)=0
VOID DisconnectInternal(VOID)
enum _WDF_INTERRUPT_POLICY WDF_INTERRUPT_POLICY
_Must_inspect_result_ BOOLEAN IsVersionGreaterThanOrEqualTo(__in ULONG Major, __in ULONG Minor)
struct _TP_CALLBACK_INSTANCE * PTP_CALLBACK_INSTANCE
VOID WaitForOutstandingCallbackToComplete(VOID)
BOOLEAN IsLevelTriggered(__in ULONG Flags)
IWudfDeviceStack * GetDeviceStack(VOID)
HANDLE GetEventHandle(VOID)
VOID FlushQueuedDpcs(VOID)
PFX_DRIVER_GLOBALS pFxDriverGlobals
BOOLEAN m_PassiveHandlingByRedirector
FX_VERIFY(INTERNAL, CHECK_NOT_NULL(LoaderInterface->pIWudfHost))
_In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
#define NT_SUCCESS(StatCode)
enum _WDF_INTERRUPT_PRIORITY WDF_INTERRUPT_PRIORITY
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY _In_ KAFFINITY TargetProcessorSet
VOID SetPolicyInternal(__in WDF_INTERRUPT_POLICY Policy, __in WDF_INTERRUPT_PRIORITY Priority, __in PGROUP_AFFINITY TargetProcessorSet)
PFN_WDF_INTERRUPT_WORKITEM m_EvtInterruptWorkItem
VOID FilterResourceRequirements(__inout PIO_RESOURCE_DESCRIPTOR IoResourceDescriptor)
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
VOID WorkItemHandler(VOID)
FxCallbackLock * m_CallbackLock
__inline BOOLEAN IsWakeCapable(VOID)
#define _Must_inspect_result_
PFN_WDF_INTERRUPT_ISR m_EvtInterruptIsr
virtual void Unlock(__in KIRQL PreviousIrql)=0
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_WARNING
_In_ PKSYNCHRONIZE_ROUTINE _In_opt_ __drv_aliasesMem PVOID SynchronizeContext
__inline BOOLEAN IsPassiveHandling(VOID)
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
enum _CM_SHARE_DISPOSITION CM_SHARE_DISPOSITION
FxInterruptThreadpool * GetInterruptThreadpool(VOID)
_Must_inspect_result_ NTSTATUS InitializeInternal(__in FxObject *Parent, __in PWDF_INTERRUPT_CONFIG Configuration)
WDFINTERRUPT GetHandle(VOID)
FxInterruptWaitblock * m_InterruptWaitblock
FX_TRACK_DRIVER(fxDriverGlobals)
_Must_inspect_result_ __inline BOOLEAN FxIsPassiveLevelInterruptSupported(VOID)
BOOLEAN WakeInterruptIsr(VOID)
PFN_WDF_INTERRUPT_DPC m_EvtInterruptDpc
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY Policy
static SERVICE_STATUS status
WDF_INTERRUPT_INFO m_InterruptInfo
VOID ClearThreadpoolWait(VOID)