次の方法で共有


WdfDmaTransactionAllocateResources 関数 (wdfdmatransaction.h)

[KMDF にのみ適用]

WdfDmaTransactionAllocateResources メソッドは、指定されたトランザクション オブジェクトで排他的 (および繰り返し) 使用するために、単一パケットまたはシステム モード DMA イネーブラーを予約します。 ドライバーは、予約済みリソースを保持しながら、トランザクションを複数回初期化して開始できます。

構文

NTSTATUS WdfDmaTransactionAllocateResources(
  [in] WDFDMATRANSACTION   DmaTransaction,
  [in] WDF_DMA_DIRECTION   DmaDirection,
  [in] ULONG               RequiredMapRegisters,
  [in] PFN_WDF_RESERVE_DMA EvtReserveDmaFunction,
  [in] PVOID               EvtReserveDmaContext
);

パラメーター

[in] DmaTransaction

DMA リソースを予約する必要がある DMA トランザクション オブジェクトへのハンドル。

[in] DmaDirection

リソースが予約されている DMA 転送方向を指定する WDF_DMA_DIRECTION型指定された値。 ドライバーが双方向プロファイルを指定しなかった場合、フレームワークはこの値を無視します。

[in] RequiredMapRegisters

ドライバーが予約するマップ レジスタの数。 0 の場合、フレームワークは初期化されたトランザクションから必要な数のマップ レジスタを派生させます。

[in] EvtReserveDmaFunction

ドライバーの EvtReserveDma イベント コールバック関数へのポインター。

[in] EvtReserveDmaContext

ドライバーの EvtReserveDma イベント コールバック関数に提供されるコンテキストを含むバッファーへのポインター。

戻り値

WdfDmaTransactionAllocateResources 、操作が成功した場合にSTATUS_SUCCESSを返します。 それ以外の場合、このメソッドは次のいずれかの値を返します。

リターン コード 説明
STATUS_INVALID_PARAMETER
DmaDirection パラメーターに無効な値が含まれています。
STATUS_INSUFFICIENT_RESOURCES
マップ レジスタ要求の数が、イネーブラーに割り当てられた数を超えているか、以前に WdfDmaTransactionSetImmediateExecution 呼び出されたドライバーで、要求に必要なリソースを使用できません。
STATUS_INVALID_DEVICE_REQUEST
DMA バージョン 3 以降が有効になっていないか、ドライバーが分散収集 DMA イネーブラーに対してこのメソッドを呼び出しました。

注釈

WdfDmaTransactionAllocateResources 、マップ レジスタの要求をシステム DMA エンジンに送信します。 要求が満たされると、フレームワークはドライバーの EvtReserveDma イベント コールバック関数を呼び出します。 リソースの予約の詳細については、「DMA リソースの予約」を参照してください。

フレームワーク ベースのドライバーは、通常、I/O 要求ハンドラー内から WdfDmaTransactionAllocateResources を呼び出します。 ドライバーは、DMA イネーブラー オブジェクトを作成した後、EvtDriverDeviceAdd コールバック関数から WdfDmaTransactionAllocateResources を呼び出すこともできます。

散布図/収集 DMA イネーブラーを使用して呼び出されると、WdfDmaTransactionAllocateResources 検証ツールのバグ チェックが発生します。

ドライバーは、WdfDmaTransactionAllocateResourcesを呼び出す前に、DmaTransaction で指定されたトランザクションを作成する必要があります。 WdfDmaTransactionAllocateResources 呼び出した後、ドライバーはトランザクションを初期化して開始します。 ドライバーは、マップ レジスタが HAL に解放され、再割り当てされたトランザクション間で発生する遅延を回避し、同じトランザクション オブジェクトを複数回再初期化および再初期化できます。

ドライバーは、次の状況 WdfDmaTransactionAllocateResources を呼び出す可能性があります。

  • ドライバーは、EvtDevicePrepareHardware コールバック関数で DMA チャネルのセットを受け取ります。 EvtDevicePrepareHardwareでは、ドライバーは DMA トランザクションを初期化し、WdfDmaTransactionAllocateResources を呼び出して、このトランザクションで排他的に使用できるようにイネーブラーを予約します。 または、ドライバーは、要求ハンドラー から WdfDmaTransactionAllocateResources を呼び出し、トランザクションを複数回開始できます。
  • ドライバーは、イネーブラーで一連のトランザクションを実行する必要があります。 ドライバーは、イネーブラーを予約し、同じトランザクション オブジェクトを使用して複数のトランザクションを初期化して開始してから、イネーブラーを解放します。
WdfDmaTransactionAllocateResources 呼び出す前に、ドライバーは、この予約を使用して開始するトランザクションに必要なマップ レジスタの数を決定する必要があります。 これを行うには、ドライバーは [ADDRESS_AND_SIZE_TO_SPAN_PAGES](.. を呼び出すことができます。/wdm/nf-wdm-address_and_size_to_span_pages.md) マクロまたは WdfDmaTransactionGetTransferInfo します。

WdfDmaTransactionAllocateResources 呼び出すとき、ドライバーはイネーブラーの作成時に要求した数よりも多くのマップ レジスタを要求しないでください。

WdfDmaTransactionAllocateResources を非ブロッキング方式で呼び出すには、最初に WdfDmaTransactionSetImmediateExecution 呼び出す必要があります。

WdfDmaTransactionAllocateResources DMA バージョン 3 が必要です。 DMA バージョン 3 を選択するには、WDF_DMA_ENABLER_CONFIGWdmDmaVersionOverride メンバーを 3 に設定します。

必要条件

要件 価値
ターゲット プラットフォーム 普遍
最小 KMDF バージョン 1.11
ヘッダー wdfdmatransaction.h (Wdf.h を含む)
図書館 Wdf01000.sys (フレームワーク ライブラリのバージョン管理を参照)。
IRQL <=DISPATCH_LEVEL
DDI コンプライアンス規則 する DriverCreate(kmdf)

こちらもご覧ください

EvtDevicePrepareHardware

WdfDmaEnablerCreate

WdfDmaTransactionCreate

WdfDmaTransactionExecute

WdfDmaTransactionFreeResources

WdfDmaTransactionSetImmediateExecution