24 #include "../fxtargetsshared.hpp" 27 #if defined(EVENT_TRACING) 28 #include "FxIoTarget.tmh" 119 "WDFIOTARGET %p, setting Dispose event %p",
128 #if (FX_CORE_MODE==FX_CORE_USER_MODE) 141 "WDFIOTARGET %p, Waiting on Dispose event %p",
145 event->EnterCRAndWaitAndLeave();
218 "Sending Pended WDFREQUEST %p, Irp %p",
219 Request->GetTraceObjectHandle(),
232 "Completing Pended WDFREQUEST %p, Irp %p, %!STATUS!",
297 "WDFIOTARGET %p started status %!STATUS!",
302 #define START_TAG ((PVOID) ('trtS')) 332 "WDFIOTARGET %p is being started while it is being stopped or " 333 "purged by another thread. WdfIoTargetStart and " 334 "WdfIoTargetStop/WdfIoTargetPurge must be called synchronously. " 335 "After the driver calls one of these functions, it must not call " 336 "the other function before the first one returns.",
439 if (RequestWillBeResent) {
464 if (
FALSE == enqueue) {
483 "WDFIOTARGET %p, WDFREQUEST %p is being canceled on another thread," 484 " allowing other thread to complete request, not resending",
568 while (RequestListHead->Next !=
NULL) {
597 for (
ple = SendList->Blink;
ple != SendList;
ple =
ple->Blink) {
638 BOOLEAN getSentList, wait, added;
670 "WDFIOTARGET %p stopped, but it is currently in the " 671 "%!WDF_IO_TARGET_STATE! state, not started or stopped",
694 "WDFIOTARGET %p is already in the process of being stopped " 695 "or purged from another thread. Driver must wait for the " 696 "first WdfIoTargetStop or WdfIoTargetPurge to complete " 697 "before calling it again.",
843 "WDFIOTARGET %p purged, but it is currently in the " 844 "%!WDF_IO_TARGET_STATE! state, not started, stopped or purged",
861 if (added ==
FALSE) {
873 "WDFIOTARGET %p is already in the process of being purged " 874 "or stopped from another thread. Driver must wait for the " 875 "first WdfIoTargetPurge or WdfIoTargetStop to complete " 876 "before calling it again.",
973 BOOLEAN sentAdded, ignoredAdded;
984 "WDFIOTARGET %p is being deleted while it is being stopped/purged " 985 "by another thread. Driver must wait for WdfIoTargetStop or " 986 "WdfIoTargetPurge to complete before deleting the object.",
1028 if (sentAdded || ignoredAdded) {
1144 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE) 1149 "Init WDFIOTARGET %p, unexpected NULL, m_InStackDevice %p, " 1150 "m_TargetDevice %p, m_TargetPdo %p, m_Driver %p",
1160 "Init WDFIOTARGET %p, unexpected NULL, m_InStackDevice %p, " 1206 "WDFREQUEST %p has not been formatted, cannot send, %!STATUS!",
1216 "WDFREQUEST %p is already pending on a WDFIOTARGET",
1217 Request->GetTraceObjectHandle());
1233 "WDFREQUEST %p, PIRP %p does not have enough stack locations %d" 1234 " for this WDFIOTARGET %p (requires %d locations), %!STATUS!",
1296 stateIgnored =
FALSE;
1304 if (
Request->m_IrpCompletionReferenceCount != 0) {
1307 "WDFREQUEST %p already sent to a target",
1308 Request->GetTraceObjectHandle());
1349 "WDFREQUEST %p, could not create timer, %!STATUS!",
1376 "WDFIOTARGET %p state %!WDF_IO_TARGET_STATE!, sending " 1377 "WDFREQUEST %p cannot ignore current state, %!STATUS!",
1388 "ignoring WDFIOTARGET %p state, sending WDFREQUEST %p, state " 1389 "%!WDF_IO_TARGET_STATE!",
1395 stateIgnored =
TRUE;
1423 "failing WDFREQUEST %p, WDFIOTARGET %p not accepting requests, " 1424 "state %!WDF_IO_TARGET_STATE!",
Request->GetTraceObjectHandle(),
1482 Request->m_IrpCompletionReferenceCount = 1;
1557 "Pending WDFREQUEST %p, WDFIOTARGET %p is paused, %!STATUS!",
1601 "Starting timer on WDFREQUEST %p",
1602 Request->GetTraceObjectHandle());
1669 "WDFIOTARGET %p, WDFREQUEST %p",
1672 #if (FX_CORE_MODE == FX_CORE_USER_MODE) 1681 "Failed to initialize sync event for " 1682 "WDFIOTARGET %p, WDFREQUEST %p",
1691 clearContext =
Request->ShouldClearContext();
1718 params.OrigTargetCompletionContext =
Request->m_TargetCompletionContext;
1719 params.OrigTargetCompletionRoutine =
1720 Request->m_CompletionRoutine.m_Completion;
1744 "WDFREQUEST %p, Action 0x%x",
Request->GetTraceObjectHandle(),
1759 "Sending WDFREQUEST %p, Irp %p",
Request->GetTraceObjectHandle(),
1829 Request->m_TargetCompletionContext =
params.OrigTargetCompletionContext;
1830 Request->m_CompletionRoutine.m_Completion =
1831 params.OrigTargetCompletionRoutine;
1853 params.SynchEvent.EnterCRAndWaitAndLeave();
1870 Request->ContextReleaseAndRestore();
1949 Request->GetTraceObjectHandle());
2080 BOOLEAN completeRequest, setStopEvent;
2081 LONG completionRefCount;
2083 completeRequest =
FALSE;
2084 setStopEvent =
FALSE;
2088 Request->GetTraceObjectHandle());
2104 completeRequest =
Request->CanComplete();
2120 &
Request->m_IrpCompletionReferenceCount);
2121 ASSERT(completionRefCount != 0);
2133 completeRequest =
Request->CanComplete();
2139 if (completeRequest) {
2160 if (completeRequest) {
2163 "WDFREQUEST %p completed in timer callback",
2164 Request->GetTraceObjectHandle());
2171 "WDFIOTARGET %p, setting stop event %p in timer callback",
2177 if (completeRequest) {
2210 "WDFREQUEST %p completed in from cancel",
2211 Request->GetTraceObjectHandle());
2216 "WDFIOTARGET %p, setting stop event %p",
2248 "WDFREQUEST %p",
Request->GetTraceObjectHandle());
2250 setStopEvent =
FALSE;
2289 "WDFREQUEST %p completed in completion routine",
2290 Request->GetTraceObjectHandle());
2295 "WDFIOTARGET %p, setting stop event %p",
2324 BOOLEAN completeRequest, setStopEvent;
2327 "WDFREQUEST %p",
Request->GetTraceObjectHandle());
2330 setStopEvent =
FALSE;
2331 completeRequest =
FALSE;
2354 completeRequest =
Request->CanComplete();
2357 if (completeRequest) {
2378 "WDFREQUEST %p deferring completion due to outstanding completion " 2379 "references",
Request->GetTraceObjectHandle());
2384 if (completeRequest) {
2386 "WDFREQUEST %p completed in completion routine",
2387 Request->GetTraceObjectHandle());
2393 "WDFIOTARGET %p, setting stop event %p",
2398 if (completeRequest) {
2477 if (pContext ==
NULL) {
2480 "Could not allocate context for request");
2485 Request->SetContext(pContext);
2516 "Could not retrieve buffer %d, status %!STATUS!",
i+1,
status);
2518 Request->ContextReleaseAndRestore();
2525 Request->VerifierSetFormatted();
2583 pThis->Unlock(
irql);
2649 "Cancelling pending I/O on WDFIOTARGET %p ",
2685 "Ignoring WDFIOTARGET %p state to send request",
2711 "WDFIOTARGET %p has changed IoType with outstanding IO",
__in MdIrp __in PMdIoCsqIrpContext __in KIRQL CallerIrql
__inline ULONG ClearTargetFlags(__in UCHAR Flags)
static __inline FxRequestBase * _FromDrainEntry(__in PSINGLE_LIST_ENTRY Entry)
__drv_restoresIRQL KIRQL __in BOOLEAN Unlock
FORCEINLINE VOID WDF_REQUEST_SEND_OPTIONS_INIT(_Out_ PWDF_REQUEST_SEND_OPTIONS Options, _In_ ULONG Flags)
MdDeviceObject m_TargetDevice
WDFCONTEXT OrigTargetCompletionContext
enum _WDF_IO_TARGET_PURGE_IO_ACTION WDF_IO_TARGET_PURGE_IO_ACTION
virtual VOID GotoPurgeState(__in WDF_IO_TARGET_PURGE_IO_ACTION Action, __in PLIST_ENTRY PendedRequestListHead, __in PSINGLE_LIST_ENTRY SentRequestListHead, __out PBOOLEAN Wait, __in BOOLEAN LockSelf)
VOID SetMajorFunction(__in UCHAR MajorFunction)
CHECK_RETURN_IF_USER_MODE NTSTATUS Initialize(__in BOOLEAN InitialState=FALSE)
#define STATUS_INSUFFICIENT_RESOURCES
VOID CompletePendedRequestList(__in PLIST_ENTRY RequestListHead)
FxTransactionedEntry m_TransactionedEntry
VOID PrintDisposeMessage(VOID)
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
VOID SetStatus(__in NTSTATUS Status)
_Must_inspect_result_ NTSTATUS PendRequestLocked(__in FxRequestBase *Request)
CCHAR GetCurrentIrpStackLocationIndex()
#define STATUS_MORE_PROCESSING_REQUIRED
MdIrp GetNextRequest(__out PMdIoCsqIrpContext *pCsqContext)
struct outqueuenode * head
#define UNREFERENCED_PARAMETER(P)
virtual BOOLEAN Dispose(VOID)
_Must_inspect_result_ NTSTATUS FX_VF_METHOD(FxIoTarget, VerifySubmitLocked)(_In_ PFX_DRIVER_GLOBALS FxDriverGlobals
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
_In_ WDFDPC _In_ BOOLEAN Wait
#define WDF_REQUEST_SEND_INTERNAL_OPTION_FAIL_ON_PEND
_Must_inspect_result_ NTSTATUS FormatInternalIoctlOthersRequest(__in FxRequestBase *Request, __in ULONG Ioctl, __in FxRequestBuffer *Buffers)
static EVT_WDF_REQUEST_COMPLETION_ROUTINE _SyncCompletionRoutine
#define CheckState(OldState, NewState)
__inline VOID CopyFileObjectAndFlags(__in FxRequestBase *Request)
VOID MarkPassiveDispose(__in FxObjectLockState State=ObjectLock)
BOOLEAN m_WaitingForSentIo
BOOLEAN IsCurrentIrpStackLocationValid(VOID)
VOID DrainPendedRequestsLocked(__in PLIST_ENTRY RequestListHead, __in BOOLEAN RequestWillBeResent)
_Must_inspect_result_ BOOLEAN CancelTimer(VOID)
__inline FxIrp * GetSubmitFxIrp(VOID)
#define FX_REQUEST_NUM_OTHER_PARAMS
#define STATUS_REQUEST_NOT_ACCEPTED
_Must_inspect_result_ NTSTATUS SubmitSync(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options=NULL, __out_opt PULONG Action=NULL)
VOID SetTransactionedObject(__in FxObject *Object)
VOID SetDeviceBase(__in CfxDeviceBase *DeviceBase)
VOID ClearCompletedRequestVerifierFlags(__in FxRequestBase *Request)
VOID GetSentRequestsListLocked(__in PSINGLE_LIST_ENTRY RequestListHead, __in PLIST_ENTRY SendList, __out PBOOLEAN AddedToList)
VOID CompletePendedRequest(__in FxRequestBase *Request)
#define InsertTailList(ListHead, Entry)
VOID FailPendedRequest(__in FxRequestBase *Request, __in NTSTATUS Status)
#define TRACE_LEVEL_INFORMATION
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
_Must_inspect_result_ NTSTATUS InitModeSpecific(__in CfxDeviceBase *Device)
GLbitfield GLuint64 timeout
virtual VOID RemoveIoTarget(__inout FxIoTarget *IoTarget)
WDF_IO_TARGET_STATE m_State
FxCREvent * GetSelfPointer(VOID)
#define FxVerifierBugCheck(FxDriverGlobals, Error,...)
ULONG Submit(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options, __in_opt ULONG Flags)
VOID PropagatePendingReturned(VOID)
MdDeviceObject m_InStackDevice
#define STATUS_INVALID_DEVICE_STATE
__inline VOID IncrementIoCount(VOID)
_Must_inspect_result_ __in WDFIOTARGET __in_opt WDFREQUEST __in ULONG Ioctl
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
enum _WDF_IO_TARGET_SENT_IO_ACTION WDF_IO_TARGET_SENT_IO_ACTION
static VOID _CancelSentRequest(__in FxRequestBase *Request)
WDFIOTARGET GetHandle(VOID)
FxCREvent m_DisposeEventUm
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ NTSTATUS SubmitSyncRequestIgnoreTargetState(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS RequestOptions)
static void startTimer(void)
__inline UCHAR GetTargetFlags(VOID)
VOID SetNextIrpStackLocation(VOID)
GLenum const GLfloat * params
#define TRACE_LEVEL_VERBOSE
#define STATUS_WDF_DEVICE_REMOVED_NOT_SENT
VOID UpdateTargetIoType(VOID)
BOOLEAN m_AddedToDeviceList
VOID MarkDisposeOverride(__in FxObjectLockState State=ObjectLock)
PVOID __inline GetObjectHandle(VOID)
PVOID * GetNextStackParameterOthersArgument4Pointer()
VOID SkipCurrentIrpStackLocation(VOID)
FxIoTarget(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in USHORT ObjectSize)
MdFileObject m_TargetFileObject
__inline PVOID GetTraceObjectHandle(VOID)
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
VOID ClearNextStackLocation(VOID)
MdDeviceObject m_TargetPdo
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)
FORCEINLINE PSINGLE_LIST_ENTRY PopEntryList(_Inout_ PSINGLE_LIST_ENTRY ListHead)
virtual VOID Remove(VOID)
VOID RequestCompletionRoutine(__in FxRequestBase *Request)
_Must_inspect_result_ NTSTATUS InsertTailRequest(__inout MdIrp Irp, __in_opt PMdIoCsqIrpContext CsqContext, __out_opt ULONG *pRequestCount)
UCHAR GetTargetIoType(VOID)
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
_Must_inspect_result_ _In_ ULONG Flags
PFX_DRIVER_GLOBALS pFxDriverGlobals
WDF_EXTERN_C_START enum _WDF_IO_TARGET_STATE WDF_IO_TARGET_STATE
#define NT_SUCCESS(StatCode)
__inline VOID CompleteRequest(__in FxRequestBase *Request)
PFN_WDF_REQUEST_COMPLETION_ROUTINE OrigTargetCompletionRoutine
VOID SetInformation(__in ULONG_PTR Information)
HRESULT Next([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] STATPROPSETSTG *rgelt, [out] ULONG *pceltFetched)
VOID TimerCallback(__in FxRequestBase *Request)
virtual VOID GotoStopState(__in WDF_IO_TARGET_SENT_IO_ACTION Action, __in PSINGLE_LIST_ENTRY SentRequestListHead, __out PBOOLEAN Wait, __in BOOLEAN LockSelf)
_Must_inspect_result_ BOOLEAN IsVerificationEnabled(__in ULONG Major, __in ULONG Minor, __in FxVerifierDownlevelOption DownLevel)
static __inline KIRQL MxGetCurrentIrql()
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
VOID CompleteCanceledRequest(__in FxRequestBase *Request)
BOOLEAN RemoveCompletedRequestLocked(__in FxRequestBase *Request)
#define STATUS_UNSUCCESSFUL
static const PVOID m_SentRequestTag
struct _SINGLE_LIST_ENTRY * Next
#define InterlockedDecrement
_Must_inspect_result_ NTSTATUS _In_ FxRequestBase * Request
VOID HandleFailedResubmit(__in FxRequestBase *Request)
CfxDeviceBase * m_DeviceBase
void CheckError(HRESULT hr)
LIST_ENTRY m_SentIoListHead
virtual VOID Purge(__in WDF_IO_TARGET_PURGE_IO_ACTION Action)
virtual _Must_inspect_result_ NTSTATUS Start(VOID)
__inline BOOLEAN CanComplete(VOID)
#define _Must_inspect_result_
_Must_inspect_result_ _In_ WDFDEVICE Device
FxCREvent * m_DisposeEvent
virtual VOID ClearTargetPointers(VOID)
static MdCompletionRoutineType _RequestCompletionRoutine
MxDeviceObject deviceObject
NTSTATUS _Must_inspect_result_ QueryInterface(__inout FxQueryInterfaceParams *Params)
_Must_inspect_result_ NTSTATUS Init(__in CfxDeviceBase *Device)
static __inline FxRequestBase * _FromCsqContext(__in PMdIoCsqIrpContext Context)
static VOID _RequestCancelled(__in FxIrpQueue *Queue, __in MdIrp Irp, __in PMdIoCsqIrpContext pCsqContext, __in KIRQL CallerIrql)
virtual VOID WaitForSentIoToComplete(VOID)
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_WARNING
virtual _Must_inspect_result_ MdDeviceObject GetTargetDeviceObject(_In_ CfxDeviceBase *Device)
PVOID * GetNextStackParameterOthersArgument2Pointer()
virtual _Must_inspect_result_ NTSTATUS GotoStartState(__in PLIST_ENTRY RequestListHead, __in BOOLEAN Lock=TRUE)
ULONG SubmitLocked(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options, __in ULONG Flags)
FxRequestCompletionCallback m_CompletionRoutine
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
__inline LONG FxInterlockedIncrementGTZero(__inout LONG volatile *Target)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
SINGLE_LIST_ENTRY m_DrainSingleEntry
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
PFN_WDF_REQUEST_COMPLETION_ROUTINE m_Completion
virtual VOID WaitForDisposeEvent(VOID)
__inline VOID CallCleanup(VOID)
#define InitializeListHead(ListHead)
__inline VOID SetObject(__in_opt MdDeviceObject DeviceObject)
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
virtual VOID GotoRemoveState(__in WDF_IO_TARGET_STATE NewState, __in PLIST_ENTRY PendedRequestListHead, __in PSINGLE_LIST_ENTRY SentRequestListHead, __in BOOLEAN Lock, __out PBOOLEAN Wait)
__inline VOID SetTargetFlags(__in UCHAR Flags)
#define STATUS_IO_TIMEOUT
PVOID * GetNextStackParameterOthersArgument1Pointer()
static VOID _CancelSentRequests(__in PSINGLE_LIST_ENTRY RequestListHead)
VOID SubmitPendedRequest(__in FxRequestBase *Request)
VOID StoreAndReferenceOtherMemories(__in FxRequestBuffer *Buffer1, __in FxRequestBuffer *Buffer2, __in FxRequestBuffer *Buffer4)
VOID SetCompletionRoutine(__in FxRequestBase *Request)
VOID Initialize(__in FxNonPagedObject *LockObject, __in PFN_IRP_QUEUE_CANCEL Callback)
LIST_ENTRY m_IgnoredIoListHead
VOID SetParameterIoctlCode(__in ULONG DeviceIoControlCode)
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS RequestOptions
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
#define RtlCopyMemory(Destination, Source, Length)
static __inline FxRequestBase * _FromListEntry(__in PLIST_ENTRY Entry)
virtual _Must_inspect_result_ NTSTATUS QueryInterface(__in FxQueryInterfaceParams *Params)
virtual VOID Send(_In_ MdIrp Irp)
#define STATUS_WDF_QUEUED
__inline VOID DecrementIoCount(VOID)
VOID SubmitPendedRequests(__in PLIST_ENTRY RequestListHeadHead)
FxVerifierDbgBreakPoint(pFxDriverGlobals)
virtual VOID Stop(__in WDF_IO_TARGET_SENT_IO_ACTION Action)