29#if defined(EVENT_TRACING)
30#include "FxIoQueue.tmh"
42 m_CallbackSpinLock(FxDriverGlobals),
43 m_CallbackMutexLock(FxDriverGlobals),
184 "Memory allocation failed: %!STATUS!",
status);
195 InitialPowerStateOn);
198 "Could not configure queue: %!STATUS!",
status);
254#if (FX_CORE_MODE==FX_CORE_USER_MODE)
278 "Invalid dispatch type "
279 "specified %d, Queue 0x%p %!STATUS!",
280 pConfig->DispatchType,
291 (pConfig->EvtIoDefault ==
NULL)) {
293 if ((pConfig->EvtIoDefault ==
NULL) &&
294 (pConfig->EvtIoRead ==
NULL) &&
295 (pConfig->EvtIoWrite ==
NULL) &&
296 (pConfig->EvtIoDeviceControl ==
NULL) &&
297 (pConfig->EvtIoInternalDeviceControl ==
NULL)) {
300 "At least one of EvtIoDefault|EvtIoRead|EvtIoWrite|"
301 "EvtIoDeviceControl|EvtIoInternalDeviceControl "
313 if ((pConfig->EvtIoDefault !=
NULL) ||
314 (pConfig->EvtIoRead !=
NULL) ||
315 (pConfig->EvtIoWrite !=
NULL) ||
316 (pConfig->EvtIoDeviceControl !=
NULL) ||
317 (pConfig->EvtIoInternalDeviceControl !=
NULL)) {
320 "Cannot set io callback events "
321 "on a manual WDFQUEUE 0x%p %!STATUS!",
335 if (pConfig->Settings.Parallel.NumberOfPresentedRequests != 0 &&
340 "Cannot have NumberOfPresentedRequests other "
341 "than 0 on a Sequential or manual WDFQUEUE 0x%p."
342 "Make Sure you set NumberOfPresentedRequests"
352 pConfig->Settings.Parallel.NumberOfPresentedRequests;
368 "Could not allocate workitem: %!STATUS!",
Status);
373 m_Type = pConfig->DispatchType;
375 switch(pConfig->PowerManaged) {
393 ASSERTMSG(
"Invalid value in WDF_IO_QUEUE_CONFIG PowerManaged field\n",
FALSE);
409 if (InitialPowerStateOn) {
422 "EvtIoDefault 0x%p, EvtIoRead 0x%p, EvtIoWrite 0x%p, "
423 "EvtIoDeviceControl 0x%p for WDFQUEUE 0x%p",
424 pConfig->EvtIoDefault,
509 DispatchEvents(
irql);
517 "waiting for the queue to be deleted, WDFQUEUE",
GetHandle(),
595 BOOLEAN AutomaticLockingRequired;
597 AutomaticLockingRequired =
FALSE;
674 "WDFQUEUE 0x%p Synchronization scope is set to "
675 "device; WDF extension drivers are not allowed "
676 "to use this type of synchronization, %!STATUS!",
691 "WDFQUEUE 0x%p Synchronization scope is set to device"
692 " but the Device ExecutionLevel: 0x%x"
693 " doesn't match Queue ExecutionLevel: 0x%x, %!STATUS!",
702 AutomaticLockingRequired =
TRUE;
713 AutomaticLockingRequired =
TRUE;
719 if (AutomaticLockingRequired) {
824 if ((
int)NewStatus & ~AllowedBits) {
826 "Invalid WDFQUEUE 0x%p state",
853 "WDFQUEUE 0x%p is shut down, preventing queue "
854 "from accepting requests",
899 if (FxDriverGlobals->IsVersionGreaterThanOrEqualTo(1,11)) {
904 "WdfIoQueueRetrieveFoundRequest is allowed "
905 "only on a manual queue 0x%p, %!STATUS!",
928 "Driver called WdfIoQueueRetrieveNextRequest on a sequential WDFQUEUE 0x%p with no "
929 "outstanding requests. This can cause a race with automatically dispatched "
930 "requests. Call WdfIoQueueRetrieveNextRequest before completing the current request(s)",
1005 "Cannot be called on a parallel WDFQUEUE 0x%p, %!STATUS!",
1019 "WDFQUEUE 0x%p is powered off, %!STATUS!",
1031 "WDFQUEUE 0x%p is stopped, %!STATUS!",
1037 #pragma warning(disable:4127)
1040 #pragma warning(default:4127)
1095 "Zero length WDFREQUEST 0x%p completed automatically by WDFQUEUE 0x%p",
1110 "Zero length WDFREQUEST 0x%p completed automatically by WDFQUEUE 0x%p",
1245 "FindRequest is allowed only on a manaul queue 0x%p, %!STATUS!",
1427 oldState =
Request->SetCompletionState(oldState);
1461 DispatchInternalEvents(
irql);
1485 if (m_Device->m_ParentDevice ==
NULL) {
1488 "No parent device for WDFQUEUE 0x%p Device, %!STATUS!",
1496 status =
Request->VerifyRequestIsDriverOwned(FxDriverGlobals);
1499 status =
Request->VerifyRequestIsNotCancelable(FxDriverGlobals);
1511 "Cannot forward a request to the same WDFQUEUE 0x%p"
1520 "Cannot forward a request to "
1521 "a different WDFDEVICE 0x%p which is not the "
1522 "parent, %!STATUS!",
1532 "Cannot forward reserved WDFREQUEST 0x%p to a "
1533 "parent WDFDEVICE 0x%p, %!STATUS!",
1551 if (m_Device->IsPnp()
1553 m_Device->GetPdoPkg()->m_AllowForwardRequestToParent ==
FALSE) {
1556 "WdfPdoInitSetForwardRequestToParent not called on "
1557 "WDFDEVICE 0x%p, %!STATUS!", m_Device->GetHandle(),
1608 BOOLEAN forwardRequestToParent;
1615 forwardRequestToParent =
Request->m_ForwardRequestToParent;
1657 Request->m_ForwardRequestToParent = forwardRequestToParent;
1680 status =
pRequest->VerifyRequestIsNotCancelable(FxDriverGlobals);
1691 "Cannot forward a request to the same WDFQUEUE 0x%p"
1701 "Cannot forward a request to a different WDFDEVICE 0x%p",
1778 status =
Request->VerifyRequestIsNotCancelable(FxDriverGlobals);
1881 Request->SetDeviceBase(origDeviceBase);
1884 Request->SetVerifierFlags(oldFlags);
1895 Request->m_Irp.ClearNextStack();
1918 status =
pRequest->VerifyRequestIsNotCancelable(FxDriverGlobals);
1953 "Requeue is allowed only for "
1954 "a manual queue, WDFREQUEST 0x%p "
2039 DispatchEvents(
irql);
2070 status =
pRequest->VerifyRequestIsNotCancelable(FxDriverGlobals);
2170 else if (FailIfIrpIsCancelled ==
FALSE) {
2295 "WDFQUEUE 0x%p is not accepting requests, "
2296 "state is %!WDF_IO_QUEUE_STATE!, %s"
2297 "completing WDFREQUEST 0x%p %!STATUS!",
2300 "power stopping (Drain) in progress," :
"",
2319 "Queuing WDFREQUEST 0x%p on WDFQUEUE 0x%p",
2389 "WDFQUEUE 0x%p is not accepting requests "
2390 "state is %!WDF_IO_QUEUE_STATE!, %s"
2391 "WDFREQUEST 0x%p %!STATUS!",
2394 "power stopping (Drain) in progress," :
"",
2403 "Queuing WDFREQUEST 0x%p on WDFQUEUE 0x%p",
2468 DispatchEvents(
irql);
2500 DispatchEvents(
irql);
2545 DispatchEvents(
irql);
2609 (*Request)->CompleteWithInformation(
status, 0);
2616 (*Request)->SetCurrentQueue(
this);
2662 "Current thread 0x%p is not at the passive-level"
2663 " %!irql!, posting to worker thread for WDFQUEUE"
2696 "Presentation lock for WDFQUEUE 0x%p is "
2697 "already held, deferring to dpc or workitem",
2800 if (CanThreadDispatchEventsLocked(PreviousIrql) ==
FALSE) {
2809 m_RequeueDeferredDispatcher =
TRUE;
2814 InsertNewRequest(&NewRequest, PreviousIrql);
2827 "Thread %p is processing WDFQUEUE 0x%p",
2839 #pragma warning(disable:4127)
2841 #pragma warning(default:4127)
2846 totalIoCount = m_Queue.GetRequestCount() + m_DriverIoCount;
2851 totalIoCount += ((NewRequest !=
NULL) ? 1 : 0);
2854 status = InsertNewRequest(&NewRequest, PreviousIrql);
2864 if(ProcessCancelledRequests(&PreviousIrql)) {
2870 status = InsertNewRequest(&NewRequest, PreviousIrql);
2880 if (ProcessCancelledRequestsOnQueue(&PreviousIrql)) {
2885 if (m_IdleComplete.Method !=
NULL &&
2886 m_Dispatching == 1L &&
2887 m_DriverIoCount == 0
L) {
2889 InsertNewRequest(&NewRequest, PreviousIrql);
2892 m_CancelDispatchedRequests =
FALSE;
2895 ProcessIdleComplete(&PreviousIrql);
2899 if (m_PurgeComplete.Method !=
NULL &&
2900 totalIoCount == 0
L &&
2901 m_Dispatching == 1L) {
2903 InsertNewRequest(&NewRequest, PreviousIrql);
2906 m_CancelDispatchedRequests =
FALSE;
2909 ProcessPurgeComplete(&PreviousIrql);
2913 if (m_IsDevicePowerPolicyOwner &&
2915 m_PowerReferenced &&
2916 totalIoCount == 0
L &&
2917 m_Dispatching == 1L) {
2923 m_Device->m_PkgPnp->PowerDereference();
2924 m_PowerReferenced =
FALSE;
2935 "WDFQUEUE 0x%p Power Transition State "
2939 status = InsertNewRequest(&NewRequest, PreviousIrql);
2946 if (ProcessPowerEvents(&PreviousIrql)) {
2967 totalIoCount == 0
L &&
2968 m_Dispatching == 1L) {
2981 m_FinishDisposing.Set();
2991 status = InsertNewRequest(&NewRequest, PreviousIrql);
3005 "WDFQUEUE 0x%p not in dispatching state, "
3006 "current state is %!WDF_IO_QUEUE_STATE!",
3009 status = InsertNewRequest(&NewRequest, PreviousIrql);
3022 status = InsertNewRequest(&NewRequest, PreviousIrql);
3027 if (m_ReadyNotify.Method !=
NULL && m_TransitionFromEmpty) {
3030 ProcessReadyNotify(&PreviousIrql);
3038 status = InsertNewRequest(&NewRequest, PreviousIrql);
3051 (
ULONG)m_DriverIoCount >= m_MaxParallelQueuePresentedRequests) {
3052 status = InsertNewRequest(&NewRequest, PreviousIrql);
3064 if (m_Queue.GetRequestCount() > 0
L) {
3073 InsertNewRequest(&NewRequest, PreviousIrql);
3083 SetTransitionFromEmpty();
3100 Lock(&PreviousIrql);
3137 WDFREQUEST hRequest;
3151#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
3222 if ((readLength == 0) &&
3227 "Zero length WDFREQUEST 0x%p completed automatically "
3244 "Calling driver EvtIoRead for WDFREQUEST 0x%p",
3260 if ((writeLength == 0) &&
3265 "Zero length WDFREQUEST 0x%p completed automatically "
3283 "Calling driver EvtIoWrite for WDFREQUEST 0x%p",
3297 "Calling driver EvtIoDeviceControl for "
3298 "WDFREQUEST 0x%p", hRequest);
3315 "Calling driver EvtIoInternalDeviceControl for WDFREQUEST 0x%p",
3335 "Calling driver EvtIoDefault for WDFREQUEST 0x%p", hRequest);
3350 "Zero length WDFREQUEST 0x%p completed automatically "
3372 "Zero length WDFREQUEST 0x%p completed automatically "
3395 "Driver has no event callback "
3396 "for %!WDF_REQUEST_TYPE!, completing WDFREQUEST 0x%p with "
3469 "not a Manual queue, ReadyNotify is only valid "
3470 "on a manual Queue, %!STATUS!",
3493 "already has a ReadyNotify callback 0x%p"
3515 "does not have a ReadyNotify to cancel, %!STATUS!",
3530 "should be stopped before clearing ReadyNotify callback "
3546 DispatchEvents(
irql);
3577 DispatchEvents(
irql);
3623 "WDFQUEUE 0x%p is already deleted, %!STATUS!",
3634 if (IdleComplete !=
NULL) {
3643 "WDFQUEUE 0x%p already has a "
3644 "IdleComplete callback registered 0x%p, "
3665 if (CancelRequests) {
3680 #pragma warning(disable:4127)
3682 #pragma warning(default:4127)
3698#pragma prefast(suppress:__WARNING_PASSING_FUNCTION_UNEXPECTED_NULL, "This is the tag value used in the ADDREF of Peek()")
3715 if (CancelRequests) {
3716 #pragma warning(disable:4127)
3718 #pragma warning(default:4127)
3727 "All WDFQUEUE 0x%p requests cancelled",
3751 "Cancelling WDFREQUEST 0x%p, WDFQUEUE 0x%p",
3770 #pragma warning(disable:4127)
3772 #pragma warning(default:4127)
3781 "All driver cancellable requests cancelled "
3782 " in WDFQUEUE 0x%p",
3826 DispatchEvents(
irql);
3856#if (FX_CORE_MODE==FX_CORE_USER_MODE)
3872 "Waiting for %d requests to complete "
3877 Mx::MxEnterCriticalRegion();
3880 "waiting for queue to stop, WDFQUEUE",
GetHandle(),
3885 Mx::MxLeaveCriticalRegion();
3943 "WDFQUEUE 0x%p is already deleted %!STATUS!",
3963 "WDFQUEUE 0x%p already has a "
3964 "PurgeComplete callback registered 0x%p "
3979 if (CancelQueueRequests && CancelDriverRequests &&
3998 if (CancelQueueRequests) {
3999 #pragma warning(disable:4127)
4001 #pragma warning(default:4127)
4009 "All WDFQUEUE 0x%p requests cancelled",
4018 "Cancelling WDFREQUEST 0x%p, WDFQUEUE 0x%p",
4035 if (CancelDriverRequests) {
4041 #pragma warning(disable:4127)
4043 #pragma warning(default:4127)
4051 "All driver cancellable requests cancelled "
4052 " in WDFQUEUE 0x%p",
4094 DispatchEvents(
irql);
4121#if (FX_CORE_MODE==FX_CORE_USER_MODE)
4137 "Waiting for %d requests to complete "
4142 Mx::MxEnterCriticalRegion();
4145 "waiting for queue to purge, WDFQUEUE",
GetHandle(),
4149 Mx::MxLeaveCriticalRegion();
4190#if (FX_CORE_MODE==FX_CORE_USER_MODE)
4206 "Waiting for %d requests to complete "
4211 Mx::MxEnterCriticalRegion();
4214 "waiting for queue to drain, WDFQUEUE",
GetHandle(),
4218 Mx::MxLeaveCriticalRegion();
4244 if (pQueuedRequests !=
NULL) {
4248 if (pDriverPendingRequests !=
NULL) {
4286 #pragma warning(disable:4127)
4288 #pragma warning(default:4127)
4321 DispatchEvents(
irql);
4357 "was cancelled while on WDFQUEUE 0x%p",
4363 pRequest->MarkRemovedFromIrpQueue();
4376 if(m_IoCanceledOnQueue.Method &&
pRequest->m_Presented) {
4413 Lock(&PreviousIrql);
4417 DispatchInternalEvents(PreviousIrql);
4459 ioQueue->ADDREF(
Irp);
4471 ioQueue->RELEASE(
Irp);
4501 "WDFREQUEST 0x%p is on a cancellation list for WDFQUEUE 0x%p",
4519 "was cancelled in driver for WDFQUEUE 0x%p",
4526 "WDFREQUEST 0x%p is "
4527 "already on list, FxRequest::m_ListEntry is busy!, "
4560 VerifyCancelForDriver(FxDriverGlobals,
pRequest);
4608 DispatchInternalEvents(
irql);
4653 ioQueue->ADDREF(
Irp);
4664 ioQueue->RELEASE(
Irp);
4669FxIoQueue::ProcessIdleComplete(
4707 "WDFQUEUE 0x%p is idle, calling driver callback",
4722FxIoQueue::ProcessPurgeComplete(
4758 "WDFQUEUE 0x%p is purged, calling driver callback",
4773FxIoQueue::ProcessReadyNotify(
4822 "ReadyNotify notify method is NULL "
4835FxIoQueue::ProcessCancelledRequests(
4879 "Calling CancelRoutine routine "
4880 "for WDFREQUEST 0x%p on WDFQUEUE 0x%p",
4919FxIoQueue::ProcessCancelledRequestsOnQueue(
4963 "Calling CanceledOnQueue routine "
4964 "for WDFREQUEST 0x%p on WDFQUEUE 0x%p",
4992FxIoQueue::ProcessPowerEvents(
5129 "Power Stop: WDFQUEUE 0x%p is powering off "
5130 "with in-flight requests",
5151 "Power Stop: WDFQUEUE 0x%p is powering off without "
5173 "Power Stop: WDFQUEUE 0x%p is purging with "
5193 "Power purge: WDFQUEUE 0x%p is purging without "
5251 "Power Stop Notifying Driver, WDFQUEUE 0x%p, WDFREQUEST 0x%p",
5332 "Power Purge Notifying Driver "
5333 "WDFQUEUE 0x%p, WDFREQUEST 0x%p",
5378 for (thisEntry = listHead->
Flink;
5379 thisEntry != listHead;
5380 thisEntry = nextEntry) {
5385 nextEntry = thisEntry->
Flink;
5410 continueProcessing =
TRUE;
5426 "Power Stop: Waiting for Driver to complete or "
5427 "acknowledge in-flight requests on WDFQUEUE 0x%p",
5430 return continueProcessing;
5440 "Power Stop: Waiting for Driver to complete or "
5441 "acknowledge in-flight requests on WDFQUEUE 0x%p",
5444 return continueProcessing;
5462 "Power Stop: WDFQUEUE 0x%p is now powered off with no "
5481 "Power Stop: Driver has acknowledged all in-flight "
5482 "requests, but WDFQUEUE 0x%p has outstanding callbacks",
5485 return continueProcessing;
5503 "Power Resume: Driver has power paused requests "
5523 "Power Resume: Driver has no power paused requests "
5572 "Power Resume, Notifying Driver, WDFQUEUE 0x%p, "
5590 "Power Resume: Driver has no callback for "
5601 "Power Resume: WDFQUEUE 0x%p is now powered on and "
5625FxIoQueue::ProcessAcknowledgedRequests(
5650 requeue =
Request->IsPowerStopAcknowledgedWithRequeue();
5653 "Acknowledging WDFREQUEST %p on WDFQUEUE %p %s requeue option",
5655 (requeue ?
"with" :
"without"));
5657 Request->ClearPowerStopState();
5826 "Waiting for all threads to stop dispatching requests"
5827 " so that WDFQUEUE 0x%p can be powered off",
5831 "waiting for all threads to stop dispatching requests so "
5832 "that queue can be powered off, WDFQUEUE",
GetHandle(),
5985 "Waiting for all inflight requests to be acknowledged "
5986 " on WDFQUEUE 0x%p",
5990 "waiting for all inflight requests "
5991 "to be acknowledged on WDFQUEUE",
6040 DispatchEvents(
irql);
6095 DispatchEvents(
irql);
6257 "Dispatching requests from worker thread");
6288 "Dispatching requests from DPC");
6398 "Failure to allocate request %!STATUS!",
status);
6421 "Failure from m_IoReservedResourcesAllocate callback %!STATUS!",
6496 ULONG countOfInUseRequests;
6497 ULONG countOfFreeRequests;
6500 countOfInUseRequests = 0;
6504 for(thisEntry = listHead->
Flink;
6505 thisEntry != listHead;
6506 thisEntry = nextEntry)
6508 nextEntry = thisEntry->
Flink;
6509 countOfInUseRequests++;
6512 countOfFreeRequests = 0;
6516 for(thisEntry = listHead->
Flink;
6517 thisEntry != listHead;
6518 thisEntry = nextEntry)
6520 nextEntry = thisEntry->
Flink;
6521 countOfFreeRequests++;
6524 ASSERT(countOfFreeRequests + countOfInUseRequests ==
virtual _Must_inspect_result_ BOOLEAN IsOwner(VOID)=0
virtual void Initialize(FxObject *ParentObject)
virtual void Initialize(FxObject *ParentObject)
WDFDEVICE __inline GetHandle(VOID)
FxCallbackLock * GetCallbackLockPtr(__out_opt FxObject **LockObject)
VOID GetConstraints(__out_opt WDF_EXECUTION_LEVEL *ExecutionLevel, __out_opt WDF_SYNCHRONIZATION_SCOPE *SynchronizationScope)
MdDeviceObject __inline GetDeviceObject(VOID)
__inline BOOLEAN IsPnp(VOID)
CfxDevice * m_ParentDevice
__inline PWDF_OBJECT_ATTRIBUTES GetRequestAttributes(VOID)
__inline BOOLEAN IsLegacy(VOID)
__inline BOOLEAN IsFilter()
PFN_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST Method
_Must_inspect_result_ NTSTATUS Invoke(__in WDFQUEUE Queue, __in WDFREQUEST Request)
PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE Method
void Invoke(__in WDFQUEUE Queue, __in WDFREQUEST Request)
PFN_WDF_IO_QUEUE_IO_DEFAULT Method
void Invoke(__in WDFQUEUE Queue, __in WDFREQUEST Request)
PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL Method
void Invoke(__in WDFQUEUE Queue, __in WDFREQUEST Request, __in ULONG OutputBufferLength, __in ULONG InputBufferLength, __in ULONG IoControlCode)
PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL Method
void Invoke(__in WDFQUEUE Queue, __in WDFREQUEST Request, __in ULONG OutputBufferLength, __in ULONG InputBufferLength, __in ULONG IoInternalControlCode)
void Invoke(__in WDFQUEUE Queue, __in WDFREQUEST Request, __in ULONG Length)
PFN_WDF_IO_QUEUE_IO_READ Method
void Invoke(__in WDFQUEUE Queue, __in WDFREQUEST Request)
PFN_WDF_IO_QUEUE_IO_RESUME Method
PFN_WDF_IO_QUEUE_STATE Method
PFN_WDF_IO_QUEUE_IO_STOP Method
void Invoke(__in WDFQUEUE Queue, __in WDFREQUEST Request, __in ULONG ActionFlags)
void Invoke(__in WDFQUEUE Queue, __in WDFREQUEST Request, __in ULONG Length)
PFN_WDF_IO_QUEUE_IO_WRITE Method
DECLSPEC_NORETURN VOID FatalError(__in NTSTATUS Status)
__inline VOID InsertInDriverOwnedList(__in FxRequest *Request)
__inline FxCxDeviceInfo * GetCxDeviceInfo(VOID)
_Must_inspect_result_ NTSTATUS QueueIdle(__in BOOLEAN CancelQueueRequests, __in_opt PFN_WDF_IO_QUEUE_STATE IdleComplete, __in_opt WDFCONTEXT Context)
FxObject * m_CallbackLockObjectPtr
_Must_inspect_result_ NTSTATUS ForwardRequest(__in FxIoQueue *pDestQueue, __in FxRequest *pRequest)
FxSystemWorkItem * m_SystemWorkItem
_Must_inspect_result_ NTSTATUS QueueDrainSynchronously(VOID)
__inline BOOLEAN IsForwardProgressQueue(VOID)
WDFCONTEXT m_ReadyNotifyContext
FxIoQueueIoDefault m_IoDefault
BOOLEAN m_RequeueDeferredDispatcher
MxEvent m_RequestWaitEventUm
WDF_SYNCHRONIZATION_SCOPE m_SynchronizationScope
__inline BOOLEAN IsState(__in WDF_IO_QUEUE_STATE State)
BOOLEAN m_IsDevicePowerPolicyOwner
static EVT_WDF_IO_QUEUE_STATE _IdleComplete
__inline VOID RemoveFromDriverOwnedList(__in FxRequest *Request)
PFXIO_FORWARD_PROGRESS_CONTEXT m_FwdProgContext
volatile BOOLEAN m_CancelDispatchedRequests
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS DriverGlobals, __in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __in PWDF_IO_QUEUE_CONFIG Config, __in_opt FxDriver *Caller, __in FxPkgIo *PkgIo, __in BOOLEAN InitialPowerStateOn, __deref_out FxIoQueue **Object)
FxCallbackSpinLock m_CallbackSpinLock
VOID VerifierVerifyFwdProgListsLocked(VOID)
_Must_inspect_result_ NTSTATUS RequestCancelable(__in FxRequest *pRequest, __in BOOLEAN Cancelable, __in_opt PFN_WDF_REQUEST_CANCEL EvtRequestCancel, __in BOOLEAN FailIfIrpIsCancelled)
volatile LONG m_TwoPhaseCompletions
FxCallbackMutexLock m_CallbackMutexLock
FxIoQueueIoDeviceControl m_IoDeviceControl
_Must_inspect_result_ NTSTATUS QueueRequest(__in FxRequest *pRequest)
WDF_EXECUTION_LEVEL m_ExecutionLevel
_Must_inspect_result_ NTSTATUS QueueRequestFromForward(__in FxRequest *pRequest)
FxIoQueueIoState m_PurgeComplete
static EVT_SYSTEMWORKITEM _DeferredDispatchThreadThunk
volatile LONG m_DriverIoCount
FxIoQueueIoCanceledOnQueue m_IoCanceledOnQueue
_Must_inspect_result_ NTSTATUS ForwardRequestToParent(__in FxIoQueue *DestQueue, __in FxRequest *Request, __in PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions)
VOID GetRequestCount(__out_opt PULONG pQueuedRequests, __out_opt PULONG pDriverPendingRequests)
volatile BOOLEAN m_Disposing
volatile ULONG m_Dispatching
_Must_inspect_result_ BOOLEAN CanThreadDispatchEventsLocked(__in KIRQL PreviousIrql)
_Must_inspect_result_ NTSTATUS ReadyNotify(__in PFN_WDF_IO_QUEUE_STATE QueueReady, __in_opt WDFCONTEXT Context)
_Must_inspect_result_ NTSTATUS QueueIdleSynchronously(__in BOOLEAN CancelRequests)
BOOLEAN IsIoEventHandlerRegistered(__in WDF_REQUEST_TYPE RequestType)
static EVT_IRP_QUEUE_CANCEL _IrpCancelForDriver
FxIrpQueue m_DriverCancelable
VOID FlushByFileObject(__in MdFileObject FileObject)
FxIoQueueIoInternalDeviceControl m_IoInternalDeviceControl
volatile BOOLEAN m_ForceTransitionFromEmptyWhenAddingNewRequest
WDF_IO_QUEUE_DISPATCH_TYPE m_Type
VOID DeferredDispatchRequestsFromDpc(VOID)
__inline VOID CheckTransitionFromEmpty(VOID)
BOOLEAN m_SupportForwardProgress
FX_IO_QUEUE_STATE m_QueueState
FxCallbackLock * m_IoCancelCallbackLockPtr
FxCxDeviceInfo * m_CxDeviceInfo
NTSTATUS InsertNewRequestLocked(__deref_in FxRequest **Request, __in KIRQL PreviousIrql)
ULONG m_MaxParallelQueuePresentedRequests
VOID CancelIrps(__in PLIST_ENTRY IrpListHead)
__in __drv_restoresIRQL KIRQL PreviousIrql
_Must_inspect_result_ NTSTATUS GetRequest(__in_opt MdFileObject FileObject, __in_opt FxRequest *TagRequest, __deref_out FxRequest **pOutRequest)
MxEvent m_FinishDisposing
_Must_inspect_result_ NTSTATUS PeekRequest(__in_opt FxRequest *TagRequest, __in_opt MdFileObject FileObject, __out_opt PWDF_REQUEST_PARAMETERS Parameters, __deref_out FxRequest **pOutRequest)
FxIoQueueIoState m_ReadyNotify
WDF_IO_QUEUE_STATE GetState(__out_opt PULONG pQueueCount, __out_opt PULONG pDriverCount)
FxIoQueue(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxPkgIo *PkgIo)
VOID CancelForDriver(__in FxRequest *pRequest)
WDFCONTEXT m_PurgeCompleteContext
VOID StartPowerTransitionOff(VOID)
VOID FreeAllReservedRequests(__in BOOLEAN Verify)
SINGLE_LIST_ENTRY m_PowerSListEntry
VOID SetStateForShutdown(VOID)
_Must_inspect_result_ NTSTATUS QueuePurge(__in BOOLEAN CancelQueueRequests, __in BOOLEAN CancelDriverRequests, __in_opt PFN_WDF_IO_QUEUE_STATE PurgeComplete, __in_opt WDFCONTEXT Context)
_Must_inspect_result_ NTSTATUS Requeue(__in FxRequest *pRequest)
_Must_inspect_result_ NTSTATUS QueuePurgeSynchronously(VOID)
FxIoQueueIoState m_IdleComplete
__inline BOOLEAN IsPowerStateNotifyingDriver(VOID)
_Must_inspect_result_ NTSTATUS AllocateReservedRequest(__deref_out FxRequest **Request)
VOID ResetStateForRestart(VOID)
VOID PurgeForwardProgressIrps(__in_opt MdFileObject FileObject)
_Must_inspect_result_ NTSTATUS Initialize(__in PWDF_IO_QUEUE_CONFIG pConfig, __in_opt PWDF_OBJECT_ATTRIBUTES QueueAttributes, __in_opt FxDriver *Caller, __in BOOLEAN InitialPowerStateOn)
LIST_ENTRY m_PowerDriverNotified
FxIoQueueIoWrite m_IoWrite
BOOLEAN m_AllowZeroLengthRequests
static MdDeferredRoutineType _DeferredDispatchDpcThunk
_Must_inspect_result_ NTSTATUS QueueDriverCreatedRequest(__in FxRequest *Request, __in BOOLEAN ParentQueue)
VOID FlushQueuedDpcs(VOID)
_Must_inspect_result_ NTSTATUS ConfigureConstraints(__in_opt PWDF_OBJECT_ATTRIBUTES ObjectAttributes, __in_opt FxDriver *Caller)
VOID ResumeProcessingForPower(VOID)
LIST_ENTRY m_CanceledOnQueueList
FxIoQueueIoResume m_IoResume
VOID GetForwardProgressIrps(__in PLIST_ENTRY IrpListHead, __in_opt MdFileObject FileObject)
_Must_inspect_result_ NTSTATUS QueueDrain(__in_opt PFN_WDF_IO_QUEUE_STATE DrainComplete, __in_opt WDFCONTEXT Context)
volatile BOOLEAN m_TransitionFromEmpty
WDFCONTEXT m_IdleCompleteContext
volatile BOOLEAN m_Deleted
VOID InsertQueueDpc(VOID)
FXIOQUEUE_POWER_STATE m_PowerState
FxCallbackLock * m_CallbackLockPtr
volatile BOOLEAN m_PowerReferenced
VOID StopProcessingForPower(__in FxIoStopProcessingForPowerAction Action)
virtual BOOLEAN Dispose(VOID)
_Must_inspect_result_ NTSTATUS ForwardRequestWorker(__in FxRequest *Request, __in FxIoQueue *DestQueue)
VOID SetState(__in FX_IO_QUEUE_SET_STATE NewStatus)
VOID StartPowerTransitionOn(VOID)
VOID DeferredDispatchRequestsFromWorkerThread(VOID)
VOID DispatchRequestToDriver(__in FxRequest *pRequest)
static EVT_IRP_QUEUE_CANCEL _IrpCancelForQueue
static EVT_WDF_IO_QUEUE_STATE _PurgeComplete
VOID Initialize(__in FxNonPagedObject *LockObject, __in PFN_IRP_QUEUE_CANCEL Callback)
UCHAR GetMajorFunction(VOID)
ULONG GetParameterWriteLength(VOID)
VOID CompleteRequest(__in_opt CCHAR PriorityBoost=IO_NO_INCREMENT)
MdDeviceObject GetDeviceObject(VOID)
ULONG GetParameterIoctlCode(VOID)
MdCompletionRoutine GetNextCompletionRoutine(VOID)
ULONG GetParameterIoctlOutputBufferLength(VOID)
VOID SetNextIrpStackLocation(VOID)
VOID SkipCurrentIrpStackLocation(VOID)
VOID SetStatus(__in NTSTATUS Status)
PIO_STACK_LOCATION GetCurrentIrpStackLocation(VOID)
static MdIrp GetIrpFromListEntry(__in PLIST_ENTRY Ple)
VOID CopyCurrentIrpStackLocationToNext(VOID)
VOID SetInformation(__in ULONG_PTR Information)
ULONG GetParameterIoctlInputBufferLength(VOID)
VOID SetCurrentDeviceObject(__in MdDeviceObject DeviceObject)
ULONG GetParameterReadLength(VOID)
void SetCallbackLockPtr(FxCallbackLock *Lock)
PVOID __inline GetObjectHandle(VOID)
VOID MarkPassiveDispose(__in FxObjectLockState State=ObjectLock)
VOID SetDeviceBase(__in CfxDeviceBase *DeviceBase)
virtual VOID DeleteObject(VOID)
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
__drv_restoresIRQL KIRQL __in BOOLEAN Unlock
CfxDeviceBase * GetDeviceBase(VOID)
CfxDevice * GetDevice(VOID)
virtual BOOLEAN Dispose(VOID)
VOID DeleteFromFailedCreate(VOID)
VOID MarkPassiveCallbacks(__in FxObjectLockState State=ObjectLock)
VOID MarkDisposeOverride(__in FxObjectLockState State=ObjectLock)
BOOLEAN IsCommitted(VOID)
VOID RemoveQueueReferences(__inout FxIoQueue *pQueue)
BOOLEAN IsPowerPolicyOwner(VOID)
__inline VOID SetVerifierFlags(__in SHORT Flags)
__inline VOID ClearVerifierFlags(__in SHORT Flags)
__inline WDFREQUEST GetHandle(VOID)
BOOLEAN __inline IsAllocatedFromIo(VOID)
__inline VOID SetCompleted(__in BOOLEAN Value)
__inline SHORT GetVerifierFlags(VOID)
FxRequestCancelCallback m_CancelRoutine
void InvokeCancel(__in FxCallbackLock *Lock, __in WDFREQUEST Request)
PFN_WDF_REQUEST_CANCEL m_Cancel
__inline NTSTATUS CompleteWithInformation(__in NTSTATUS Status, __in ULONG_PTR Information)
_Must_inspect_result_ FxIoQueue * GetCurrentQueue(VOID)
_Must_inspect_result_ NTSTATUS InsertHeadIrpQueue(__in FxIrpQueue *IrpQueue, __out_opt ULONG *pRequestCount)
static _Must_inspect_result_ FxRequest * GetNextRequest(__in FxIrpQueue *IrpQueue)
__inline PLIST_ENTRY GetListEntry(__in FxListEntryNames Index)
VOID ClearPowerStopState(VOID)
VOID __inline SetPresented(VOID)
static __inline FxRequest * RetrieveFromCsqContext(__in PMdIoCsqIrpContext pCsqContext)
__inline BOOLEAN IsInIrpQueue(__in FxIrpQueue *pIrpQueue)
FxRequestCompletionState SetCompletionState(__in FxRequestCompletionState NewState)
_Must_inspect_result_ NTSTATUS InsertTailIrpQueue(__in FxIrpQueue *IrpQueue, __out_opt ULONG *pRequestCount)
__inline VOID SetCurrentQueue(__in FxIoQueue *Queue)
__inline NTSTATUS Complete(__in NTSTATUS Status)
__inline VOID SetReserved()
__inline VOID MarkRemovedFromIrpQueue(VOID)
__inline BOOLEAN IsPowerStopAcknowledged(VOID)
__inline VOID SetForwardProgressQueue(__in FxIoQueue *Queue)
static _Must_inspect_result_ NTSTATUS _CreateForPackage(__in CfxDevice *Device, __in PWDF_OBJECT_ATTRIBUTES RequestAttributes, __in MdIrp Irp, __deref_out FxRequest **Request)
PIO_STACK_LOCATION GetCurrentIrpStackLocation(VOID)
_Must_inspect_result_ NTSTATUS GetIrp(__deref_out MdIrp *ppIrp)
__inline BOOLEAN IsReserved()
static _Must_inspect_result_ NTSTATUS PeekRequest(__in FxIrpQueue *IrpQueue, __in_opt FxRequest *TagRequest, __in_opt MdFileObject FileObject, __out_opt PWDF_REQUEST_PARAMETERS Parameters, __deref_out FxRequest **ppOutRequest)
_Must_inspect_result_ NTSTATUS RemoveFromIrpQueue(__in FxIrpQueue *IrpQueue)
static FxRequest * _FromOwnerListEntry(__in FxListEntryNames Index, __in PLIST_ENTRY OwnerListEntry)
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PVOID WdmObject, __out FxSystemWorkItem **pObject)
__inline BOOLEAN Enqueue(__in PFN_WDF_SYSTEMWORKITEM CallbackFunc, __in PVOID Parameter)
CHECK_RETURN_IF_USER_MODE __inline NTSTATUS Initialize(__in EVENT_TYPE Type, __in BOOLEAN InitialState)
MxEvent * GetSelfPointer(VOID)
__inline VOID Uninitialize()
static __inline MxThread MxGetCurrentThread()
#define _Releases_lock_(lock)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
#define __drv_restoresIRQL
#define __drv_requiresIRQL(irql)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
PFX_DRIVER_GLOBALS pFxDriverGlobals
return pObject GetObjectHandle()
PFX_DRIVER_GLOBALS fxDriverGlobals
FxVerifierDbgBreakPoint(pFxDriverGlobals)
@ WaitSignalBreakUnderVerifier
_Must_inspect_result_ NTSTATUS _In_ FxRequest * TagRequest
_Must_inspect_result_ NTSTATUS _In_ FxRequest _In_ BOOLEAN Cancelable
DoTraceLevelMessage(FxDriverGlobals, TRACE_LEVEL_WARNING, TRACINGIO, "WDFREQUEST 0x%p " "was cancelled in driver for WDFQUEUE 0x%p", Request->GetHandle(), GetObjectHandle())
_Must_inspect_result_ NTSTATUS _In_ FxIoQueue * DestQueue
VOID _In_ FxRequest * pRequest
_Must_inspect_result_ NTSTATUS _In_ FxIoQueue * pDestQueue
SHORT _In_ FxRequest * Request
@ FxIoQueueSetAcceptRequests
@ FxIoQueueClearDispatchRequests
@ FxIoQueueSetDispatchRequests
@ FxIoQueueClearAcceptRequests
@ FxIoQueuePowerStartingTransition
@ FxIoQueuePowerPurgeDriverNotified
@ FxIoQueuePowerRestarting
@ FxIoQueuePowerStoppingDriverNotified
@ FxIoQueuePowerRestartingNotifyingDriver
@ FxIoQueuePowerStoppingNotifyingDriver
@ FxIoQueuePowerPurgeNotifyingDriver
@ FxIoQueuePowerRestartingDriverNotified
enum _FX_IO_QUEUE_STATE FX_IO_QUEUE_STATE
enum _FX_IO_QUEUE_SET_STATE FX_IO_QUEUE_SET_STATE
__in WDFQUEUE __out_opt PULONG __out_opt PULONG DriverCount
#define FX_VF_METHOD(classname, fnName)
FxIoStopProcessingForPowerAction
@ FxIoStopProcessingForPowerHold
@ FxIoStopProcessingForPowerPurgeNonManaged
@ FxIoStopProcessingForPowerPurgeManaged
void FxPoolFree(__in_xcount(ptr is at an offset from AllocationStart) PVOID ptr)
#define FXREQUEST_STATE_TAG
#define FXREQUEST_HOLD_TAG
#define FXREQUEST_COMPLETE_TAG
#define FXREQUEST_FWDPRG_TAG
#define FXREQUEST_QUEUE_TAG
@ FXREQUEST_FLAG_TAG_REQUEST
@ FXREQUEST_FLAG_CANCELLED
@ FXREQUEST_FLAG_DRIVER_CANCELABLE
@ FXREQUEST_FLAG_DRIVER_IN_EVTIOSTOP_CONTEXT
@ FXREQUEST_FLAG_FORWARDED
@ FXREQUEST_FLAG_DRIVER_DISPATCH
@ FXREQUEST_FLAG_DRIVER_OWNED
@ FxRequestCompletionStateQueue
@ FxRequestCompletionStateNone
#define FxVerifierBugCheck(FxDriverGlobals, Error,...)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
static IPrintDialogCallback callback
PFILE_OBJECT MdFileObject
#define _Must_inspect_result_
#define ASSERTMSG(msg, exp)
#define DECLSPEC_NORETURN
#define UNREFERENCED_PARAMETER(P)
#define STATUS_DELETE_PENDING
#define STATUS_NO_MORE_ENTRIES
#define IRP_MJ_DEVICE_CONTROL
#define TRACE_LEVEL_WARNING
#define TRACE_LEVEL_VERBOSE
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_INFORMATION
base of all file and directory entries
WDF_OBJECT_ATTRIBUTES RequestAttributes
LIST_ENTRY m_ReservedRequestInUseList
FxIoQueueForwardProgressAllocateResourcesReserved m_IoReservedResourcesAllocate
LIST_ENTRY m_PendedIrpList
MxLockNoDynam m_PendedReserveLock
LIST_ENTRY m_ReservedRequestList
ULONG m_NumberOfReservedRequests
_Must_inspect_result_ BOOLEAN IsVersionGreaterThanOrEqualTo(__in ULONG Major, __in ULONG Minor)
VOID WaitForSignal(__in MxEvent *Event, __in PCSTR ReasonForWaiting, __in PVOID Handle, __in ULONG WarningTimeoutInSec, __in ULONG WaitSignalFlags)
struct _LIST_ENTRY * Blink
struct _LIST_ENTRY * Flink
struct _SINGLE_LIST_ENTRY * Next
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_INVALID_PARAMETER
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_CHILD_LIST_CONFIG Config
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
_Must_inspect_result_ _In_ WDFDRIVER Driver
enum _WDF_REQUEST_TYPE WDF_REQUEST_TYPE
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
@ WdfRequestTypeDeviceControlInternal
@ WdfRequestTypeDeviceControl
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFQUEUE _In_ _Strict_type_match_ WDF_REQUEST_TYPE RequestType
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
EVT_WDF_IO_QUEUE_STATE * PFN_WDF_IO_QUEUE_STATE
_In_ WDFQUEUE _In_opt_ PFN_WDF_IO_QUEUE_STATE PurgeComplete
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_IO_QUEUE_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES QueueAttributes
@ WdfIoQueueDriverNoRequests
@ WdfIoQueueAcceptRequests
@ WdfIoQueueDispatchRequests
_In_ WDFREQUEST _In_ ULONG ActionFlags
@ WdfIoQueueDispatchSequential
@ WdfIoQueueDispatchInvalid
@ WdfIoQueueDispatchParallel
@ WdfIoQueueDispatchManual
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ PFN_WDF_IO_QUEUE_STATE QueueReady
enum _WDF_IO_QUEUE_STATE WDF_IO_QUEUE_STATE
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
@ WdfSynchronizationScopeInheritFromParent
@ WdfSynchronizationScopeQueue
@ WdfSynchronizationScopeDevice
@ WdfExecutionLevelPassive
@ WdfExecutionLevelInheritFromParent
WDF_EXTERN_C_START enum _WDF_EXECUTION_LEVEL WDF_EXECUTION_LEVEL
enum _WDF_SYNCHRONIZATION_SCOPE WDF_SYNCHRONIZATION_SCOPE
_Must_inspect_result_ _In_ WDFREQUEST _In_ WDFQUEUE _In_ PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions
@ WdfRequestStopRequestCancelable
@ WdfRequestStopActionSuspend
@ WdfRequestStopActionPurge
EVT_WDF_REQUEST_CANCEL * PFN_WDF_REQUEST_CANCEL
_In_ WDFREQUEST _In_ PFN_WDF_REQUEST_CANCEL EvtRequestCancel
#define STATUS_WDF_PAUSED
#define STATUS_WDF_NO_CALLBACK
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
_In_opt_ PVOID DeferredContext
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
_Inout_opt_ PVOID Parameter