4 #ifndef _FXDMATRANSACTION_HPP_ 5 #define _FXDMATRANSACTION_HPP_ 71 #define FX_STRONG_REF_TAG 0x1 76 #define FX_ENCODE_POINTER(T,p,tag) ((T*) ((ULONG_PTR) p | (ULONG_PTR) tag)) 77 #define FX_DECODE_POINTER(T,p,tag) ((T*) ((ULONG_PTR) p & ~(ULONG_PTR) tag)) 78 #define FX_IS_POINTER_ENCODED(p,tag) ((((ULONG_PTR) p & (ULONG_PTR) tag) == tag) ? TRUE : FALSE) 84 #define UNDEFINED_DMA_COMPLETION_STATUS ((DMA_COMPLETION_STATUS) -1) 103 __in size_t CurrentOffset,
106 __out size_t *NextOffset
114 __in size_t CurrentOffset,
330 size_t MaximumFragmentLength
333 if (MaximumFragmentLength < m_AdapterInfo->MaximumFragmentLength) {
589 __in size_t CurrentOffset,
661 __in size_t CurrentOffset,
703 ScatterGatherBufferLength,
721 ScatterGatherBufferLength);
979 #pragma prefast(suppress:__WARNING_FAILING_TO_ACQUIRE_MEDIUM_CONFIDENCE, "transferring lock name to 'this->TransferStateLock'") 980 #pragma prefast(suppress:__WARNING_FAILING_TO_RELEASE_MEDIUM_CONFIDENCE, "transferring lock name to 'this->TransferStateLock'") 991 #pragma prefast(suppress:__WARNING_FAILING_TO_RELEASE_MEDIUM_CONFIDENCE, "transferring lock name from 'this->TransferStateLock'") 996 #pragma prefast(suppress:__WARNING_CALLER_FAILING_TO_HOLD, "transferring lock name from 'this->TransferStateLock'") 1060 if (MapRegistersReserved ==
FALSE) {
1063 "Allocating %d map registers for " 1064 "WDFDMATRANSACTION %p",
1072 "Using %d reserved map registers for " 1073 "WDFDMATRANSACTION %p",
1084 if (MapRegistersReserved ==
FALSE)
1099 #pragma prefast(suppress:__WARNING_PASSING_FUNCTION_UNEXPECTED_NULL, "_AdapterControl does not actually use the IRP parameter."); 1109 ASSERTMSG(
"Prereserved map registers are not compatible with DMA V2",
1110 MapRegistersReserved ==
FALSE);
1127 "Allocating DMA resources (%d map registers) for WDFDMATRANSACTION %p " 1128 "returned %!STATUS!",
1163 NT_ASSERTMSG(
"Mapping requires too many map registers",
1182 "Mapping transfer for WDFDMATRANSACTION %p. " 1183 "MDL %p, Offset %I64x, Length %x, MapRegisterBase %p",
1205 ScatterGatherListCb,
1211 "With these parameters, MapTransferEx should never fail",
1216 NT_ASSERTMSG(
"cannot use DMA completion routine with DMAv2",
1220 "scatter gather list length must be large enough for at least one element",
1236 ScatterGatherList->NumberOfElements = 1;
1237 ScatterGatherList->Reserved = 0;
1238 ScatterGatherList->Elements[0].Address =
1247 ScatterGatherList->Elements[0].Length = *TransferLength;
1254 "MapTransfer mapped next %d bytes of " 1255 "WDFDMATRANSACTION %p - status %!STATUS!",
1283 NT_ASSERTMSG(
"Mapping requires too many map registers",
1289 "Flushing DMA buffers for WDFDMATRANSACTION %p. " 1290 "MDL %p, Offset %I64x, Length %I64x",
1323 "Flushing DMA buffers for WDFDMATRANSACTION %p (" 1324 "MDL %p, Offset %I64x, Length %I64x)" 1325 "completed with %!STATUS!",
1350 if (mapRegisterBase ==
NULL) {
1353 "Skipping free of %d map registers for WDFDMATRANSACTION %p " 1354 "because base was NULL",
1369 "Freeing %d map registers for WDFDMATRANSACTION %p " 1402 ASSERTMSG(
"EvtDmaCompleted is not a valid callback for " 1403 "a packet-mode transaction",
1491 "Freeing adapter channel for WDFDMATRANSACTION %p",
1523 "Stopping WDFDMATRANSACTION %p returned status %!STATUS!",
1563 #endif // _FXDMATRANSACTION_HPP_ #define FX_IS_POINTER_ENCODED(p, tag)
BOOLEAN CancelMappedTransfer(VOID)
#define FX_STRONG_REF_TAG
VOID AddIrpReference(VOID)
size_t m_TransactionLength
__drv_restoresIRQL KIRQL __in BOOLEAN Unlock
enum _IO_ALLOCATION_ACTION IO_ALLOCATION_ACTION
FORCEINLINE VOID ReleaseDevice(VOID)
virtual _Must_inspect_result_ NTSTATUS StageTransfer(VOID)=0
__forceinline VOID SetMaximumFragmentLength(size_t MaximumFragmentLength)
_In_ ULONG _In_ ULONG _In_ ULONG Length
virtual _Must_inspect_result_ NTSTATUS StartTransfer(VOID)
EVT_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE * PFN_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE
static VOID _ComputeNextTransferAddress(__in PMDL CurrentMdl, __in size_t CurrentOffset, __in ULONG Transferred, __deref_out PMDL *NextMdl, __out size_t *NextOffset)
_Out_ PULONG NumberOfMapRegisters
FxDmaTransactionConfigureChannel m_ConfigureChannelFunction
DMA_COMPLETION_STATUS CompletionStatus
ULONG m_MapRegistersNeeded
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE _In_opt_ __drv_aliasesMem WDFCONTEXT CompletionContext
static VOID _AdapterListControl(__in DEVICE_OBJECT *DeviceObject, __in IRP *Irp, __in SCATTER_GATHER_LIST *SgList, __in VOID *Context)
WDF_EXTERN_C_START typedef _In_ WDFDEVICE _In_ WDFCONTEXT _In_ WDF_DMA_DIRECTION Direction
#define MmGetMdlVirtualAddress(_Mdl)
__forceinline VOID ClearRequest(VOID)
#define __drv_restoresIRQL
virtual _Must_inspect_result_ NTSTATUS StageTransfer(VOID)
size_t m_CurrentFragmentLength
virtual PDMA_COMPLETION_ROUTINE GetTransferCompletionRoutine(VOID)
__forceinline size_t GetBytesTransferred(VOID)
VOID SetImmediateExecution(__in BOOLEAN Value)
__forceinline FxRequest * GetRequest(VOID)
PMDL m_CurrentFragmentMdl
virtual _Must_inspect_result_ NTSTATUS InitializeResources(VOID)=0
FORCEINLINE NTSTATUS FlushAdapterBuffers(VOID)
PGET_SCATTER_GATHER_LIST_EX GetScatterGatherListEx
VOID SetDeviceAddressOffset(__in ULONG Offset)
FxDmaTransactionTransferComplete m_TransferCompleteFunction
_Requires_lock_held_(this) _Releases_lock_(this) VOID UnlockTransferState(__in __drv_restoresIRQL KIRQL OldIrql)
BOOLEAN IsMapRegisterBaseSet(VOID)
PMAP_TRANSFER_EX MapTransferEx
_In_ WDFDMATRANSACTION _Out_opt_ ULONG * MapRegisterCount
friend FxDmaPacketTransaction
struct _DMA_OPERATIONS * DmaOperations
void ClearMapRegisterBase(VOID)
virtual BOOLEAN Dispose(VOID)
PFLUSH_ADAPTER_BUFFERS_EX FlushAdapterBuffersEx
size_t m_MaxFragmentLength
FxDmaDescription * m_AdapterInfo
VOID ReleaseAdapter(VOID)
virtual _Must_inspect_result_ NTSTATUS TransferCompleted(VOID)
ULONG m_MapRegistersReserved
_In_ PDEVICE_OBJECT DeviceObject
PSCATTER_GATHER_LIST m_SGList
virtual _Must_inspect_result_ NTSTATUS TransferCompleted(VOID)
static IO_ALLOCATION_ACTION STDCALL _AdapterControl(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp, __in PVOID MapRegisterBase, __in PVOID Context)
_Must_inspect_result_ NTSTATUS ReserveAdapter(__in ULONG NumberOfMapRegisters, __in WDF_DMA_DIRECTION Direction, __in PFN_WDF_RESERVE_DMA Callback, __in_opt PVOID Context)
#define __drv_raisesIRQL(irql)
#define TRACE_LEVEL_VERBOSE
PKTHREAD CurrentStagingThread
#define ASSERTMSG(msg, exp)
_Must_inspect_result_ NTSTATUS GetScatterGatherList(__in PMDL Mdl, __in size_t CurrentOffset, __in ULONG Length, __in PDRIVER_LIST_CONTROL ExecutionRoutine, __in PVOID Context)
_Must_inspect_result_ NTSTATUS BuildScatterGatherList(__in PMDL Mdl, __in size_t CurrentOffset, __in ULONG Length, __in PDRIVER_LIST_CONTROL ExecutionRoutine, __in PVOID Context, __in PVOID ScatterGatherBuffer, __in ULONG ScatterGatherBufferLength)
PVOID __inline GetObjectHandle(VOID)
VOID SetTransferCompleteCallback(__in_opt PFN_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE Callback, __in_opt PVOID Context)
__forceinline BOOLEAN IsRequestReferenced(VOID)
_Must_inspect_result_ BOOLEAN IsVersionGreaterThanOrEqualTo(__in ULONG Major, __in ULONG Minor)
EVT_WDF_RESERVE_DMA * PFN_WDF_RESERVE_DMA
BOOLEAN DmaCompleted(__in size_t TransferredLength, __out NTSTATUS *ReturnStatus, __in FxDmaCompletionType CompletionType)
EVT_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL * PFN_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL
PVOID GetTransferContext(VOID)
PBUILD_SCATTER_GATHER_LIST_EX BuildScatterGatherListEx
struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST
__forceinline WDFDMATRANSACTION GetHandle(VOID)
virtual IO_ALLOCATION_ACTION GetAdapterControlReturnValue(VOID)
virtual _Must_inspect_result_ NTSTATUS TransferCompleted(VOID)=0
_In_ WDFDMAENABLER _In_ WDF_DMA_DIRECTION DmaDirection
#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size)
typedef DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) UCHAR UCHAR_MEMORY_ALIGNED
virtual _Must_inspect_result_ NTSTATUS StageTransfer(VOID)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
#define FX_ENCODE_POINTER(T, p, tag)
DMA_COMPLETION_ROUTINE * PDMA_COMPLETION_ROUTINE
_Acquires_lock_(this) VOID __drv_raisesIRQL(DISPATCH_LEVEL) LockTransferState(__out __drv_deref(__drv_savesIRQL) KIRQL *OldIrql)
__in __drv_restoresIRQL KIRQL OldIrql
PFX_DRIVER_GLOBALS pFxDriverGlobals
BOOLEAN CancelResourceAllocation(VOID)
_In_ WDFDMATRANSACTION _In_ size_t TransferredLength
#define NT_SUCCESS(StatCode)
VOID ReleaseForReuse(__in BOOLEAN ForceRelease)
PVOID m_ConfigureChannelContext
__forceinline FxDmaEnabler * GetDmaEnabler(VOID)
struct FxDmaPacketTransaction::@4107 m_TransferState
VOID FreeMapRegistersAndAdapter(VOID)
#define __WARNING_CLASS_MISMATCH_NONE
__forceinline VOID ReleaseButRetainRequest(VOID)
__forceinline VOID SetRequest(__in FxRequest *Request)
ULONG m_DeviceAddressOffset
static DMA_COMPLETION_ROUTINE _SystemDmaCompletion
virtual _Must_inspect_result_ NTSTATUS InitializeResources(VOID)
#define STATUS_UNSUCCESSFUL
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in FxDmaEnabler *DmaEnabler, __out WDFDMATRANSACTION *Transaction)
WDF_EXTERN_C_START typedef _In_ WDFDEVICE _In_ WDFCONTEXT _In_ WDF_DMA_DIRECTION _In_ PSCATTER_GATHER_LIST SgList
virtual VOID ReleaseResources(__in BOOLEAN ForceRelease)
#define __drv_deref(annotes)
static PVOID GetStartVaFromOffset(__in PMDL Mdl, __in size_t Offset)
_Must_inspect_result_ NTSTATUS Initialize(__in PFN_WDF_PROGRAM_DMA ProgramDmaFunction, __in WDF_DMA_DIRECTION DmaDirection, __in PMDL Mdl, __in size_t Offset, __in ULONG Length)
__forceinline size_t GetCurrentFragmentLength(VOID)
#define _Must_inspect_result_
FORCEINLINE NTSTATUS MapTransfer(__out_bcount_opt(ScatterGatherListCb) PSCATTER_GATHER_LIST ScatterGatherList, __in ULONG ScatterGatherListCb, __in_opt PDMA_COMPLETION_ROUTINE CompletionRoutine, __in_opt PVOID CompletionContext, __out ULONG *TransferLength)
virtual VOID ReleaseResources(__in BOOLEAN ForceRelease)=0
virtual VOID CallEvtDmaCompleted(__in DMA_COMPLETION_STATUS)
CfxDevice * GetDevice(VOID)
_Must_inspect_result_ __in WDFKEY __in PCUNICODE_STRING __in ULONG __out_bcount_opt(ValueLength) PVOID Value
__forceinline VOID ReferenceRequest(VOID)
PVOID m_TransferCompleteContext
#define TRACE_LEVEL_ERROR
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
_In_ ULONG _In_ ULONG Offset
virtual BOOLEAN Dispose(VOID)
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in FxDmaEnabler *DmaEnabler, __out WDFDMATRANSACTION *Transaction)
WDF_DMA_DIRECTION m_DmaDirection
_Inout_ struct _IRP _In_ PVOID MapRegisterBase
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
PDMA_ADAPTER AdapterObject
_Must_inspect_result_ NTSTATUS Execute(__in PVOID Context)
virtual PDMA_COMPLETION_ROUTINE GetTransferCompletionRoutine(VOID)
VOID ReleaseIrpReference(VOID)
size_t m_CurrentFragmentOffset
EVT_WDF_PROGRAM_DMA * PFN_WDF_PROGRAM_DMA
IO_ALLOCATION_ACTION GetAdapterControlReturnValue(VOID)
DRIVER_LIST_CONTROL * PDRIVER_LIST_CONTROL
__inline _Must_inspect_result_ NTSTATUS AcquireDmaPacketTransaction(VOID)
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE CompletionRoutine
FxDmaTransactionState GetTransactionState(VOID)
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
virtual BOOLEAN PreMapTransfer(VOID)
virtual _Must_inspect_result_ NTSTATUS StartTransfer(VOID)
_In_ struct _IRP _In_ struct _SCATTER_GATHER_LIST * ScatterGather
FxDmaTransactionProgramOrReserveDma m_DmaAcquiredFunction
PVOID m_DmaAcquiredContext
VOID GetTransferInfo(__out_opt ULONG *MapRegisterCount, __out_opt ULONG *ScatterGatherElementCount)
VOID NTAPI KeRaiseIrql(KIRQL NewIrql, PKIRQL OldIrql)
FxRequest * m_EncodedRequest
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
__forceinline size_t GetMaximumFragmentLength(VOID)
#define FX_DECODE_POINTER(T, p, tag)
PFN_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE Method
virtual BOOLEAN PreMapTransfer(VOID)
_Must_inspect_result_ _In_ WDFDMAENABLER DmaEnabler
VOID CallEvtDmaCompleted(__in DMA_COMPLETION_STATUS Status)
_Releases_lock_(this->m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) __inline VOID Unlock(__in __drv_restoresIRQL KIRQL PreviousIrql)
struct tagContext Context
virtual VOID ReleaseResources(__in BOOLEAN ForceRelease)
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
_In_ PDEVICE_OBJECT _In_ ULONG _In_ PDRIVER_CONTROL ExecutionRoutine
FxDmaTransactionState m_State
struct _SCATTER_GATHER_LIST * PSCATTER_GATHER_LIST
enum _WDF_DMA_DIRECTION WDF_DMA_DIRECTION
_Must_inspect_result_ NTSTATUS AllocateAdapterChannel(__in BOOLEAN MapRegistersReserved)
void SetMapRegisterBase(__in PVOID Value)
VOID SetConfigureChannelCallback(__in_opt PFN_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL Callback, __in_opt PVOID Context)
FxDmaTransactionBase(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in USHORT ObjectSize, __in USHORT ExtraSize, __in FxDmaEnabler *DmaEnabler)
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in FxDmaEnabler *DmaEnabler, __out WDFDMATRANSACTION *Transaction)
VOID NTAPI KeLowerIrql(KIRQL NewIrql)
static _Must_inspect_result_ NTSTATUS _CalculateRequiredMapRegisters(__in PMDL Mdl, __in size_t CurrentOffset, __in ULONG Length, __in ULONG AvailableMapRegisters, __out_opt PULONG PossibleTransferLength, __out PULONG MapRegistersRequired)
VOID PutScatterGatherList(__in PSCATTER_GATHER_LIST ScatterGather)
virtual VOID FreeMapRegistersAndAdapter(VOID)
virtual _Must_inspect_result_ NTSTATUS StartTransfer(VOID)=0
__inline VOID ReleaseDmaPacketTransaction(VOID)
FxDmaSystemTransaction(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in USHORT ExtraSize, __in FxDmaEnabler *DmaEnabler)
FxDmaPacketTransaction(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in USHORT ObjectSize, __in USHORT ExtraSize, __in FxDmaEnabler *DmaEnabler)
static SERVICE_STATUS status
_Must_inspect_result_ NTSTATUS AcquireDevice(VOID)
FxDmaScatterGatherTransaction(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in USHORT ExtraSize, __in FxDmaEnabler *DmaEnabler)
#define MEMORY_ALLOCATION_ALIGNMENT
BOOLEAN m_MapRegisterBaseSet
PALLOCATE_ADAPTER_CHANNEL_EX AllocateAdapterChannelEx
virtual _Must_inspect_result_ NTSTATUS InitializeResources(VOID)
PVOID GetMapRegisterBase(VOID)
FxDmaEnabler * m_DmaEnabler
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
_In_ WDFDMATRANSACTION _Out_opt_ ULONG _Out_opt_ ULONG * ScatterGatherElementCount