次の方法で共有


WdfDmaEnablerGetFragmentLength 関数 (wdfdmaenabler.h)

[KMDF にのみ適用]

WdfDmaEnablerGetFragmentLength メソッドは、オペレーティング システムが単一の DMA 転送に対してサポートする最大転送長を返します。

構文

size_t WdfDmaEnablerGetFragmentLength(
  [in] WDFDMAENABLER     DmaEnabler,
  [in] WDF_DMA_DIRECTION DmaDirection
);

パラメーター

[in] DmaEnabler

WdfDmaEnablerCreateへの以前の呼び出しからドライバーが取得した DMA イネーブラー オブジェクトへのハンドル。

[in] DmaDirection

DMA 転送操作の方向を指定する WDF_DMA_DIRECTION型指定された値。 詳細については、次の「解説」セクションを参照してください。

戻り値

WdfDmaEnablerGetFragmentLength は、オペレーティング システムがサポートできる DMA 転送の最大長をバイト単位で返します。DmaDirection パラメーターの値が無効な場合は 0 を返します。

ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。

注釈

オペレーティング システムがサポートできる DMA 転送の最大長は、使用可能なマップ レジスタ 数によって異なります。 十分なマップ レジスタが使用可能な場合、WdfDmaEnablerGetFragmentLength は、WdfDmaEnablerGetMaximumLength が返すのと同じ値を返します。 それ以外の場合、WdfDmaEnablerGetFragmentLength 返される値は、WdfDmaEnablerGetMaximumLength 返される値より小さくなります。

ドライバーは、次のように、BYTE_TO_PAGES マクロを使用して使用可能なマップ レジスタの数を決定できます。

BYTE_TO_PAGES(WdfDmaEnablerGetFragmentLength()) + 1

ドライバーが WdfDmaEnablerCreate 呼び出したときに双方向プロファイルを指定した場合、読み取り操作の最大転送長を取得するには、DmaDirection パラメーターの値を WdfDmaDirectionReadFromDevice し、書き込み操作の最大転送長を取得するには WdfDmaDirectionWriteToDevice する必要があります。 ドライバーが二重プロファイルを指定しなかった場合、ドライバーは、WdfDmaDirectionReadFromDevice または DmaDirectionの WdfDmaDirectionWriteToDevice を指定できます。

ドライバーのデバイスで双方向操作がサポートされている場合、WdfDmaEnablerGetFragmentLength は、DmaDirection パラメーターが指定する読み取りと書き込みの方向に対して異なる値を返すことができます。 この違いは、フレームワークが各方向に対して個別の アダプター オブジェクト を作成し、オペレーティング システムが各アダプター オブジェクトに異なる数のマップ レジスタを提供する可能性があるためです。

例示

次のコード例では、NIC デバイスの読み取り操作を処理するために必要なマップ レジスタの最小数を決定し、使用可能なマップ レジスタの数を計算し、割り当てられたマップ レジスタの数が不十分な場合にエラーを報告します。

ULONG  minimumMapRegisters;
ULONG  maxLengthSupported;
ULONG  mapRegistersAllocated;

miniMapRegisters = BYTES_TO_PAGES(NIC_MAX_PACKET_SIZE) + 1;

maxLengthSupported = 
    (ULONG) WdfDmaEnablerGetFragmentLength(
                                           FdoData->WdfDmaEnabler,
                                           WdfDmaDirectionReadFromDevice
                                           );

mapRegistersAllocated = BYTES_TO_PAGES(maxLengthSupported) + 1;

if (mapRegistersAllocated < minimumMapRegisters) {
    status = STATUS_INSUFFICIENT_RESOURCES;
    return status;
}

必要条件

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

こちらもご覧ください

WDF_DMA_DIRECTION

WdfDmaEnablerCreate

WdfDmaEnablerGetMaximumLength